11.4.3 Поддерживаемые форматы пространственных данных
Для представления объектов геометрии в запросах используются два стандартных формата пространственных данных:
Формат Well-Known Text (WKT)
Формат Well-Known Binary (WKB)
Внутри MySQL значения геометрии хранятся в формате, не идентичном ни WKT, ни WKB. (Внутренний формат похож на WKB, но с начальными 4 байтами для указания SRID.)
Для преобразования между различными форматами данных доступны функции; см. Раздел 12.16.6, «Функции преобразования форматов геометрии».
В следующих разделах описываются форматы пространственных данных, используемые MySQL:
Формат Well-Known Text (WKT)
Представление Well-Known Text (WKT) значений геометрии предназначено для обмена данными геометрии в формате ASCII. Спецификация OpenGIS предоставляет грамматику Бэкуса-Наура, которая определяет формальные правила записи значений WKT (см. Раздел 11.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)
Начиная с MySQL 5.7.9, такие пространственные функции, как
ST_MPointFromText()иST_GeomFromText(), которые принимают представления значенийMultiPointв формате WKT, допускают, чтобы отдельные точки внутри значений были заключены в скобки. Например, оба следующих вызова функций допустимы, тогда как до MySQL 5.7.9 второй вызывал ошибку:ST_MPointFromText('MULTIPOINT (1 1, 2 2, 3 3)') ST_MPointFromText('MULTIPOINT ((1 1), (2 2), (3 3))')Начиная с MySQL 5.7.9, вывод для значений
MultiPointвключает скобки вокруг каждой точки. Например:mysql>
SET @mp = 'MULTIPOINT(1 1, 2 2, 3 3)';mysql>SELECT ST_AsText(ST_GeomFromText(@mp));+---------------------------------+ | ST_AsText(ST_GeomFromText(@mp)) | +---------------------------------+ | MULTIPOINT((1 1),(2 2),(3 3)) | +---------------------------------+До MySQL 5.7.9 вывод для того же значения не включает скобки вокруг каждой точки:
mysql>
SET @mp = 'MULTIPOINT(1 1, 2 2, 3 3)';mysql>SELECT ST_AsText(ST_GeomFromText(@mp));+---------------------------------+ | ST_AsText(ST_GeomFromText(@mp)) | +---------------------------------+ | 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 (см. Раздел 11.4, «Типы пространственных данных»). Он также определен в стандарте ISO SQL/MM Part 3: Spatial.
WKB использует 1-байтовые целые без знака, 4-байтовые целые без знака и 8-байтовые числа с двойной точностью (формат IEEE 754). Байту соответствует 8 бит.
Например, значение WKB, соответствующее POINT(1
-1), состоит из этой последовательности из 21 байта, каждый из которых представлен двумя шестнадцатеричными цифрами:
0101000000000000000000F03F000000000000F0BF
Последовательность состоит из компонентов, показанных в следующей таблице.
Таблица 11.2 Пример компонентов WKB
| Компонент | Размер | Значение |
|---|---|---|
| Порядок байтов | 1 байт | 01 |
| Тип WKB | 4 байта | 01000000 |
| Координата X | 8 байт | 000000000000F03F |
| Координата Y | 8 байт | 000000000000F0BF |
Представление компонентов выглядит следующим образом:
Индикатор порядка байтов равен 1 или 0, чтобы указать хранение little-endian или big-endian. Порядок байтов little-endian и big-endian также известны как сетевое представление данных (NDR) и внешнее представление данных (XDR) соответственно.
Тип WKB — это код, который указывает тип геометрии. MySQL использует значения от 1 до 7 для указания
Point,LineString,Polygon,MultiPoint,MultiLineString,MultiPolygonиGeometryCollection.Значение
Pointимеет координаты 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. Другие типы геометрии не поддерживаются.
Функция 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.