Spec-Zone.ru › MySQL 5.7

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

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

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

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

Spec-Zone.ru

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