WKT и WKB

Векторные данные в веб-картографии часто требуют сериализации в стандартизированные текстовые или бинарные форматы. Среди наиболее распространённых — WKT (Well-Known Text) и WKB (Well-Known Binary). Эти форматы используются для обмена геометриями между GIS-системами, базами данных (PostGIS, Oracle Spatial) и библиотеками клиентской визуализации, включая OpenLayers.

WKT и WKB представляют геометрию независимо от визуального слоя или картографического движка, описывая только пространственную структуру объектов.


Структура и особенности WKT

WKT — текстовый формат, представляющий геометрию в виде читаемой строки. Он удобен для отладки, логирования и обмена данными в человекочитаемом виде.

Основные типы геометрий WKT:

  • POINT — точка
  • LINESTRING — линия
  • POLYGON — полигон
  • MULTIPOINT, MULTILINESTRING, MULTIPOLYGON — коллекции
  • GEOMETRYCOLLECTION — смешанные геометрии

Примеры:

POINT (30 10)
LINESTRING (30 10, 10 30, 40 40)
POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))

Ключевая особенность WKT — строгая последовательность координат и вложенность скобок для сложных объектов.


Чтение WKT в OpenLayers

В OpenLayers для работы с WKT используется класс ol/format/WKT.

Базовый процесс десериализации:

import WKT from 'ol/format/WKT';

const wktReader = new WKT();

const feature = wktReader.readFeature(
  'POINT (30 10)',
  {
    dataProjection: 'EPSG:4326',
    featureProjection: 'EPSG:3857'
  }
);

Результатом является объект ol/Feature, который можно добавлять в векторный слой.


Запись геометрии в WKT

Обратная операция позволяет преобразовать объект карты в строковое представление:

import WKT from 'ol/format/WKT';

const wktWriter = new WKT();

const wktString = wktWriter.writeFeature(feature);

Дополнительно можно контролировать систему координат:

const wktString = wktWriter.writeFeature(feature, {
  featureProjection: 'EPSG:3857',
  dataProjection: 'EPSG:4326'
});

Это критично при интеграции с серверными GIS-системами, где ожидается географическая система координат.


Геометрия и трансформация координат

WKT сам по себе не содержит информации о проекции. Поэтому при чтении и записи важно явно задавать:

  • dataProjection — исходная система координат
  • featureProjection — система карты

На практике чаще всего используется:

  • EPSG:4326 (WGS84, долгота/широта)
  • EPSG:3857 (Web Mercator)

Ошибки в этих параметрах приводят к смещению объектов на карте.


WKB: бинарное представление геометрии

WKB (Well-Known Binary) является бинарным аналогом WKT. Он используется там, где важны:

  • компактность хранения
  • скорость передачи
  • интеграция с СУБД

WKB не предназначен для ручного чтения, так как представляет данные в виде байтовой последовательности.

Пример концептуального представления:

0101000000000000000000F03F0000000000000040

Работа с WKB в OpenLayers

В OpenLayers WKB также поддерживается через ol/format/WKB.

Чтение бинарных данных:

import WKB from 'ol/format/WKB';

const wkbReader = new WKB();

const feature = wkbReader.readFeature(arrayBuffer, {
  dataProjection: 'EPSG:4326',
  featureProjection: 'EPSG:3857'
});

Где arrayBuffer — бинарный буфер, полученный, например, из API или базы данных.


Запись в WKB

import WKB from 'ol/format/WKB';

const wkbWriter = new WKB();

const buffer = wkbWriter.writeFeature(feature, {
  featureProjection: 'EPSG:3857',
  dataProjection: 'EPSG:4326'
});

Результатом является ArrayBuffer, пригодный для передачи по сети или сохранения.


Сравнение WKT и WKB

WKT

  • текстовый формат
  • легко читается человеком
  • больше по размеру
  • удобен для логирования и тестирования

WKB

  • бинарный формат
  • компактный
  • быстрее при передаче и парсинге
  • используется в GIS-базах данных

Типы геометрий и поддержка в форматах

И WKT, и WKB поддерживают одинаковую модель геометрий OGC:

  • простые примитивы (POINT, LINESTRING, POLYGON)
  • многокомпонентные структуры (MULTI*)
  • вложенные коллекции (GEOMETRYCOLLECTION)

В OpenLayers эти геометрии преобразуются в классы:

  • ol/geom/Point
  • ol/geom/LineString
  • ol/geom/Polygon
  • ol/geom/MultiPoint
  • ol/geom/MultiLineString
  • ol/geom/MultiPolygon

Особенности обработки многополигонов

При работе с MULTIPOLYGON важно учитывать вложенность:

WKT:

MULTIPOLYGON (
  ((30 10, 40 40, 20 40, 10 20, 30 10)),
  ((60 60, 70 80, 50 80, 60 60))
)

При десериализации OpenLayers создаёт единый объект мультиполигона с набором контуров.


Использование векторных слоёв

WKT и WKB часто применяются при загрузке данных в VectorSource:

import VectorSource from 'ol/source/Vector';
import VectorLayer from 'ol/layer/Vector';
import WKT from 'ol/format/WKT';

const format = new WKT();

const source = new VectorSource({
  features: [
    format.readFeature('LINESTRING (0 0, 10 10)')
  ]
});

const layer = new VectorLayer({
  source: source
});

Обработка массивов объектов

При работе с API часто поступает массив WKT-строк:

const wktList = [
  'POINT (10 20)',
  'POINT (30 40)',
  'POINT (50 60)'
];

const features = wktList.map(wkt =>
  wktReader.readFeature(wkt, {
    dataProjection: 'EPSG:4326',
    featureProjection: 'EPSG:3857'
  })
);

Такая схема используется при пакетной загрузке данных.


Ошибки парсинга WKT и WKB

Наиболее частые проблемы:

  • некорректная вложенность скобок
  • перепутанный порядок координат (lat/lon)
  • отсутствие замыкания полигона
  • несоответствие проекции
  • повреждённые бинарные данные WKB

OpenLayers обычно выбрасывает исключение при невозможности интерпретировать геометрию.


Взаимодействие с серверными GIS

WKT и WKB широко применяются при интеграции с:

  • PostGIS
  • GeoServer
  • MapServer
  • пространственными REST API

Типичный сценарий:

  1. сервер возвращает WKT/WKB
  2. клиент преобразует в Feature
  3. отображение на карте
  4. при редактировании — обратная сериализация

Производительность и выбор формата

При проектировании систем важно учитывать:

  • WKT подходит для низких нагрузок и отладки
  • WKB предпочтителен для потоковых данных и больших наборов
  • при масштабировании WKB снижает нагрузку на сеть
  • WKT увеличивает читаемость логов и упрощает диагностику

Координатные системы и согласованность данных

Корректная работа с WKT/WKB в OpenLayers требует строгого соблюдения CRS-цепочки:

  • входные данные → dataProjection
  • карта → featureProjection

При нарушении этой схемы возможны геометрические искажения, особенно при работе с глобальными данными.


Расширенные сценарии использования

WKT и WKB применяются не только для отображения, но и для:

  • пространственных запросов
  • фильтрации объектов
  • вычисления пересечений на сервере
  • передачи геометрий в аналитические модули
  • кэширования векторных данных

В связке с OpenLayers они обеспечивают единый слой взаимодействия между клиентом и геопространственной инфраструктурой.