13.4.3 Поддерживаемые форматы пространственных данных
Для представления геометрических объектов в запросах используются два стандартных формата пространственных данных:
Формат Well-Known Text (WKT)
Формат Well-Known Binary (WKB)
Внутренне MySQL хранит значения геометрии в формате, не идентичном ни WKT, ни WKB. (Внутренний формат похож на WKB, но с начальными 4 байтами для указания SRID.)
Доступны функции для преобразования между различными форматами данных; см. Раздел 14.16.6, «Функции преобразования форматов геометрии».
В следующих разделах описываются форматы пространственных данных, используемые MySQL:
Формат Well-Known Text (WKT)
Представление Well-Known Text (WKT) значений геометрии предназначено для обмена данными геометрии в формате ASCII. Спецификация OpenGIS предоставляет грамматику Бэкуса-Наура, которая определяет формальные правила написания значений WKT (см. Раздел 13.4, «Типы пространственных данных»).
Примеры представлений геометрических объектов в формате WKT:
-
Точка:
POINT(15 20)
Координаты точки указаны без разделительной запятой. Это отличается от синтаксиса функции SQL
Point(), которая требует запятой между координатами. Следует соблюдать синтаксис, соответствующий контексту данного пространственного оператора. Например, следующие операторы используютST_X()для извлечения координаты X из объектаPoint. Первый производит объект напрямую, используя функциюPoint(). Второй использует представление WKT, преобразованное в объектPointс помощьюST_GeomFromText().mysql>
SELECT ST_X(Point(15, 20));+---------------------+ | ST_X(POINT(15, 20)) | +---------------------+ | 15 | +---------------------+ mysql>SELECT ST_X(ST_GeomFromText('POINT(15 20)'));+---------------------------------------+ | ST_X(ST_GeomFromText('POINT(15 20)')) | +---------------------------------------+ | 15 | +---------------------------------------+ -
Линия с четырьмя точками:
LINESTRING(0 0, 10 10, 20 25, 50 60)
Пары координат точек разделены запятыми.
-
Многоугольник с одной внешней и одной внутренней областью:
POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))
-
Многоугольник с тремя значениями точек:
MULTIPOINT(0 0, 20 20, 60 60)
Пространственные функции, такие как
ST_MPointFromText()иST_GeomFromText(), принимающие представления значений точек в формате WKT, допускают размещение отдельных точек внутри значений в скобках. Например, оба следующих вызова функций являются допустимыми:ST_MPointFromText('MULTIPOINT (1 1, 2 2, 3 3)') ST_MPointFromText('MULTIPOINT ((1 1), (2 2), (3 3))') -
Многоугольник с двумя значениями точек:
MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
-
Многоугольник с двумя значениями точек:
MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
-
Многоугольник, состоящий из двух значений точек и одного значения многоугольника:
GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
Формат Well-Known Binary (WKB)
Представление Well-Known Binary (WKB) геометрических значений используется для обмена данными геометрии как двоичных потоков, представленных значениями BLOB, содержащими геометрическую информацию WKB. Этот формат определен в спецификации OpenGIS (см. Раздел 13.4, «Типы пространственных данных»). Он также определен в стандарте ISO SQL/MM Part 3: Spatial.
WKB использует 1-байтовые беззнаковые целые числа, 4-байтовые беззнаковые целые числа и 8-байтовые числа двойной точности (формат IEEE 754). Байты состоят из восьми бит.
Например, значение WKB, соответствующее POINT(1
-1), состоит из следующей последовательности из 21 байта, каждый из которых представлен двумя шестнадцатеричными цифрами:
0101000000000000000000F03F000000000000F0BF
Последовательность состоит из компонентов, показанных в следующей таблице.
Таблица 13.2 Пример компонентов WKB
| Компонент | Размер | Значение |
|---|---|---|
| Порядок байтов | 1 байт | 01 |
| Тип WKB | 4 байта | 01000000 |
| Координата X | 8 байтов | 000000000000F03F |
| Координата Y | 8 байтов | 000000000000F0BF |
Представление компонентов:
Индикатор порядка байтов — это 1 или 0, указывающие на хранение в формате little-endian или big-endian соответственно. Порядки байтов little-endian и big-endian также известны как Network Data Representation (NDR) и External Data Representation (XDR) соответственно.
Тип WKB — это код, указывающий тип геометрии. MySQL использует значения от 1 до 7 для обозначения
Point,LineString,Polygon,MultiPoint,MultiLineString,MultiPolygonиGeometryCollection.Значение точки имеет координаты X и Y, каждая из которых представлена значением двойной точности.
Значения WKB для более сложных геометрических значений имеют более сложные структуры данных, подробно описанные в спецификации OpenGIS.
Внутренний формат хранения геометрии
MySQL хранит значения геометрии, используя 4 байта для указания SRID, за которыми следует представление WKB значения. Описание формата WKB см. в Формат Well-Known Binary (WKB).
Для части WKB применяются следующие специфичные для MySQL соображения:
Индикатор порядка байтов равен 1, так как MySQL хранит геометрии как значения little-endian.
MySQL поддерживает типы геометрии
Point,LineString,Polygon,MultiPoint,MultiLineString,MultiPolygonиGeometryCollection. Другие типы геометрии не поддерживаются.Только
GeometryCollectionможет быть пустым. Такое значение хранится с 0 элементами.Полигональные кольца могут быть заданы как по часовой, так и против часовой стрелки. MySQL автоматически переворачивает кольца при чтении данных.
Декартовы координаты хранятся в единицах измерения пространственной системы отсчета, значения X — в координатах X, значения Y — в координатах Y. Направления осей — те, что указаны в пространственной системе отсчета.
Географические координаты хранятся в угловых единицах пространственной системы отсчета, значения долготы — в координатах X, значения широты — в координатах Y. Направления осей и меридиан — те, что указаны в пространственной системе отсчета.
Функция LENGTH() возвращает занимаемое значение место в байтах. Пример:
mysql> SET @g = ST_GeomFromText('POINT(1 -1)');
mysql> SELECT LENGTH(@g);
+------------+
| LENGTH(@g) |
+------------+
| 25 |
+------------+
mysql> SELECT HEX(@g);
+----------------------------------------------------+
| HEX(@g) |
+----------------------------------------------------+
| 000000000101000000000000000000F03F000000000000F0BF |
+----------------------------------------------------+
Длина значения составляет 25 байтов, состоящих из следующих компонентов (как видно из шестнадцатеричного значения):
4 байта для целого SRID (0)
1 байт для целого порядка байтов (1 = little-endian)
4 байта для целой информации о типе (1 =
Point)8 байтов для координаты X двойной точности (1)
8 байтов для координаты Y двойной точности (−1)
© 2025 Oracle
Licensed under the GPLv2 License.