Проверьте правильную и / или правильную геометрию в MySQL

При переносе таблицы MariaDB с геометрическими данными в MySql некоторые данные не могут быть вставлены, потому что они плохо сформированы, даже если это не проблема для MariaDB.

Этот запрос работает на MariaDB (10.2).

CREATE TABLE IF NOT EXISTS geo (
    id INT AUTO_INCREMENT NOT NULL,
    value GEOMETRY NOT NULL,
    SPATIAL INDEX idx_value (value),
    PRIMARY KEY(id)
) ENGINE = InnoDB;
INSERT INTO geo (value) SELECT ST_GeomFromText('LINESTRING(1 2)');

Не на MySql (5.7.20), где ошибка:

3037 - неверные данные ГИС, предоставленные функции st_geometryfromtext.

В MySql есть три функции для определения таких геометрий: ST_IsSimple(), ST_IsValid(), а также ST_Validate() но они не работают с плохо отформатированными геометриями:

SELECT ST_IsSimple(ST_GeomFromText('LINESTRING(1 2)'));
SELECT ST_IsValid(ST_GeomFromText('LINESTRING(1 2)'));
SELECT ST_AsText(ST_Validate(ST_GeomFromText('LINESTRING(1 1)')));

3055 - Строка байтов Geometry должна иметь младший порядок.

Этот пример взят из https://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html, но он не работает. Так что это странно (документ не обновлялся для 5.7). Подробнее о действительности на mysql: https://dev.mysql.com/doc/refman/5.7/en/geometry-well-formedness-validity.html (mysql принимает любой синтаксически правильно сформированный ввод, но не геометрически неверный),

Подобные проблемы здесь:

Но ни один из них не отвечает на вопрос: как определить плохо отформатированные геометрии в MySQL 5.7?

1 ответ

LineString нужно как минимум две точки. Возможно, 5,6 был небрежным в указании на это.

mysql> SELECT hex(ST_GeomFromText('LINESTRING(1 1)'));
ERROR 3037 (22023): Invalid GIS data provided to function st_geometryfromtext.

mysql> SELECT hex(ST_GeomFromText('LINESTRING(1 1, 2 3)'));
+--------------------------------------------------------------------------------------------+
| hex(ST_GeomFromText('LINESTRING(1 1, 2 3)'))                                               |
+--------------------------------------------------------------------------------------------+
| 00000000010200000002000000000000000000F03F000000000000F03F00000000000000400000000000000840 |
+--------------------------------------------------------------------------------------------+

mysql> SELECT @@version;
+-----------+
| @@version |
+-----------+
| 5.7.15    |
+-----------+
Другие вопросы по тегам