GML и его особенности

GML (Geography Markup Language) представляет собой XML-основанный стандарт OGC, предназначенный для описания географических объектов, их геометрии, свойств и пространственных отношений. Основная задача формата заключается в унификации представления векторных данных, что позволяет использовать его как универсальный транспортный слой в веб-ГИС и серверных системах.

Ключевая особенность GML заключается в строгой структуре XML-документа, где каждый географический объект описывается как элемент с набором атрибутов и вложенных геометрических конструкций. Это обеспечивает совместимость между различными ГИС-платформами и сервисами, включая WFS (Web Feature Service).

Структура GML-документа

Базовая модель GML опирается на три уровня:

  • описание объекта (feature)
  • описание геометрии
  • пространственная система координат

Географический объект обычно представлен через элемент <gml:Feature> или производные типы, определённые в схемах приложений (application schemas).

Типичная структура включает:

  • идентификатор объекта
  • набор атрибутов (properties)
  • геометрический элемент (Point, LineString, Polygon и др.)

Пример упрощённой структуры:

<gml:featureMember>
  <app:Road>
    <app:name>Main Street</app:name>
    <app:geometry>
      <gml:LineString srsName="EPSG:4326">
        <gml:coordinates>
          30.5,50.5 30.6,50.6
        </gml:coordinates>
      </gml:LineString>
    </app:geometry>
  </app:Road>
</gml:featureMember>

В более современных версиях GML вместо gml:coordinates используется конструкция gml:posList, обеспечивающая более строгую и расширяемую модель координат.

Геометрические примитивы GML

Формат поддерживает набор базовых геометрий OGC Simple Features:

  • Point
  • LineString
  • Polygon
  • MultiPoint
  • MultiLineString
  • MultiPolygon
  • GeometryCollection

Каждая геометрия описывается через XML-элементы, соответствующие структуре узлов и координат.

Polygon, например, включает внешнюю границу и внутренние кольца (holes), что позволяет описывать сложные области с вырезами.

Пространственные системы координат

Одной из ключевых характеристик GML является явное указание системы координат через атрибут srsName.

Пример:

<gml:Point srsName="EPSG:3857">
  <gml:pos>4183421 7512345</gml:pos>
</gml:Point>

Использование EPSG-кодов обеспечивает совместимость с проекциями, применяемыми в веб-картографии и серверных ГИС.

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

Версии GML и их различия

Существует несколько версий стандарта:

  • GML 2.x — ранняя версия, ограниченная поддержка геометрий
  • GML 3.x — расширенная модель, поддержка сложных типов
  • GML 3.2 — наиболее распространённая в WFS 2.0

Основные различия:

  • замена gml:coordinates на gml:pos и gml:posList
  • более строгие XML-схемы
  • расширенные типы геометрий
  • поддержка временных и динамических объектов

GML в контексте WFS

GML тесно связан с сервисом WFS, где используется как основной формат передачи объектов между сервером и клиентом.

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

  1. клиент отправляет запрос GetFeature
  2. сервер возвращает XML-документ в формате GML
  3. клиент парсит документ и извлекает геометрию и атрибуты

WFS может возвращать данные в различных версиях GML, что требует поддержки нескольких парсеров на стороне клиента.

Работа с GML в OpenLayers

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

Он обеспечивает:

  • чтение GML-документов
  • запись объектов в GML
  • преобразование векторных объектов OpenLayers

Основной класс:

import GML from 'ol/format/GML';

Чтение GML

Парсинг входящего XML выполняется через метод readFeatures:

import GML from 'ol/format/GML';

const format = new GML({
  featureNS: 'http://example.com/ns',
  featureType: 'Road'
});

const features = format.readFeatures(gmlString, {
  dataProjection: 'EPSG:4326',
  featureProjection: 'EPSG:3857'
});

Ключевые параметры:

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

Преобразование координат выполняется автоматически через встроенные трансформации OpenLayers.

Запись GML

Экспорт в GML осуществляется методом writeFeatures:

const gml = format.writeFeatures(features, {
  featureProjection: 'EPSG:3857',
  dataProjection: 'EPSG:4326'
});

Результатом является XML-строка, соответствующая выбранной версии GML.

Конфигурация GML в OpenLayers

Класс ol/format/GML поддерживает параметры конфигурации:

  • srsName — определение системы координат
  • featureNS — XML namespace
  • featureType — тип объекта
  • surface — поддержка поверхностей
  • curve — поддержка кривых

Пример настройки:

const format = new GML({
  srsName: 'EPSG:3857',
  featureNS: 'http://example.com/roads',
  featureType: 'road',
  surface: true
});

GML 2 и GML 3 в OpenLayers

OpenLayers поддерживает несколько реализаций:

  • ol/format/GML2
  • ol/format/GML3

Различия проявляются в структуре XML и поддерживаемых геометриях.

GML2 использует более простую модель координат, тогда как GML3 опирается на gml:posList и расширенные схемы OGC.

Пример GML3:

<gml:Point srsName="EPSG:4326">
  <gml:pos>30.5 50.5</gml:pos>
</gml:Point>

Особенности обработки XML

GML основан на XML, что накладывает ряд технических особенностей:

  • чувствительность к пространствам имён (namespaces)
  • необходимость строгого соответствия схемам XSD
  • высокая нагрузка при парсинге больших документов
  • необходимость DOM-парсинга или SAX-подходов

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

Пространственные ограничения и точность

Координаты в GML хранятся в текстовом виде, что влияет на точность и объём данных:

  • отсутствие бинарного представления геометрии
  • возможные потери точности при сериализации
  • увеличение размера по сравнению с GeoJSON или WKB

Это делает GML менее эффективным для высоконагруженных веб-карт, но удобным для межсистемного обмена.

Интеграция GML с слоями OpenLayers

GML часто используется совместно с векторными слоями:

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

const vectorSource = new VectorSource({
  format: new GML(),
  url: 'https://example.com/wfs?service=WFS&request=GetFeature'
});

const vectorLayer = new VectorLayer({
  source: vectorSource
});

В этом сценарии OpenLayers автоматически выполняет запрос, получает GML, парсит его и добавляет объекты на карту.

Пространственные преобразования

При работе с GML критически важна корректная обработка проекций:

  • исходные данные часто приходят в EPSG:4326
  • веб-карта обычно использует EPSG:3857
  • требуется трансформация координат

OpenLayers выполняет преобразования через модуль ol/proj, обеспечивая согласованность отображения.

Ограничения и технические нюансы

GML обладает рядом ограничений:

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

Несмотря на это, формат остаётся стандартом в OGC-инфраструктурах, особенно в корпоративных ГИС и государственных системах.

Совместимость и экосистема

GML активно используется в:

  • WFS-сервисах
  • корпоративных ГИС
  • пространственных базах данных с экспортом XML
  • инфраструктуре INSPIRE

OpenLayers выступает клиентским компонентом, обеспечивающим интерпретацию и визуализацию данных без необходимости ручной обработки XML.