Spec-Zone.ru › MySQL 8.4

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 Binary (WKB)

  • Внутренний формат хранения геометрии

Формат 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

Таблица 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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/gis-data-formats.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API