GetFeatureInfo запросы

Принцип работы GetFeatureInfo

GetFeatureInfo является стандартным запросом протокола WMS (Web Map Service), позволяющим получать атрибутивную информацию об объектах карты по координате запроса. В отличие от отображения тайлов, этот механизм возвращает не изображение, а структурированные данные о пространственных объектах, попадающих в указанную точку.

Основная схема взаимодействия:

  • клиент отображает WMS-слой как набор тайлов;
  • пользователь выполняет клик по карте;
  • координаты клика преобразуются в параметры запроса;
  • формируется HTTP-запрос GetFeatureInfo;
  • сервер возвращает описание объектов (JSON, XML, HTML).

Архитектура запроса

GetFeatureInfo опирается на параметры уже выполненного GetMap запроса, дополняя его координатной информацией.

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

  • QUERY_LAYERS — слои, по которым выполняется запрос;
  • INFO_FORMAT — формат ответа;
  • I / J или X / Y — пиксельные координаты точки;
  • CRS / SRS — система координат;
  • BBOX — границы текущего вида карты;
  • WIDTH / HEIGHT — размеры viewport;
  • RESOLUTION — разрешение отображения.

Формирование запроса в OpenLayers

В OpenLayers формирование GetFeatureInfo чаще всего выполняется через метод источника WMS:

const url = wmsSource.getFeatureInfoUrl(
  coordinate,
  viewResolution,
  viewProjection,
  {
    'INFO_FORMAT': 'application/json',
    'QUERY_LAYERS': 'layer_name',
    'FEATURE_COUNT': 10
  }
);

Ключевые параметры функции:

  • coordinate — координаты клика в пространстве карты;
  • viewResolution — текущая масштабная привязка;
  • viewProjection — проекция карты;
  • объект параметров — расширяет стандартный запрос.

Обработка клика по карте

Типовой сценарий реализуется через событие:

map.on('singleclick', function (event) {
  const view = map.getView();
  const source = wmsLayer.getSource();

  const url = source.getFeatureInfoUrl(
    event.coordinate,
    view.getResolution(),
    view.getProjection(),
    {
      INFO_FORMAT: 'application/json',
      FEATURE_COUNT: 5
    }
  );

  if (url) {
    fetch(url)
      .then(response => response.json())
      .then(data => {
        console.log(data);
      });
  }
});

Форматы ответа сервера

JSON (application/json)

Наиболее удобный формат для клиентской обработки. Обычно используется в GeoServer с опцией GeoJSON.

Структура:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "name": "Object A",
        "id": 1
      },
      "geometry": null
    }
  ]
}

XML / GML

Используется в классических WMS-сервисах. Требует дополнительного парсинга:

  • GML 2 / GML 3;
  • сложная структура узлов;
  • необходимость XPath или XML-парсинга.

HTML

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


Работа с несколькими слоями

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

'QUERY_LAYERS': 'roads,buildings,parcels'

Особенности:

  • порядок слоёв влияет на приоритет результата;
  • сервер возвращает объединённый ответ;
  • возможно дублирование объектов при перекрытии геометрий.

Координаты и проекции

OpenLayers автоматически учитывает преобразование координат между экранной системой и пространственной.

Ключевые моменты:

  • event.coordinate уже находится в системе карты;
  • view.getProjection() обязателен для корректного запроса;
  • несоответствие проекций приводит к пустым ответам.

Типичные проекции:

  • EPSG:3857 — веб-меркатор;
  • EPSG:4326 — географическая;
  • EPSG:326xx — UTM зоны.

Разрешение и масштаб

Параметр resolution критически важен для корректного определения объектов:

const resolution = view.getResolution();

Он влияет на:

  • точность выбора объектов;
  • соответствие тайловой сетке;
  • корректность BBOX в запросе.

При неверном resolution сервер может вернуть:

  • пустой результат;
  • смещённые объекты;
  • неполные атрибуты.

Работа с GeoServer

Наиболее распространённая серверная реализация WMS.

Конфигурационные аспекты:

  • включение опции Enable FeatureInfo;
  • настройка слоя как queryable;
  • выбор формата application/json;
  • настройка CORS.

Пример запроса, генерируемого GeoServer:

SERVICE=WMS&
VERSION=1.3.0&
REQUEST=GetFeatureInfo&
QUERY_LAYERS=workspace:layer&
INFO_FORMAT=application/json&
I=120&
J=80&
WIDTH=256&
HEIGHT=256&
BBOX=...

Обработка ответа

Типовая схема обработки:

fetch(url)
  .then(res => res.json())
  .then(data => {
    if (data.features && data.features.length > 0) {
      const feature = data.features[0];
      const properties = feature.properties;

      console.log(properties);
    }
  });

При большом количестве объектов часто применяется:

  • фильтрация по атрибутам;
  • выбор ближайшего объекта;
  • приоритизация по слою.

Кастомизация запроса

OpenLayers позволяет расширять запрос дополнительными параметрами:

{
  INFO_FORMAT: 'application/json',
  FEATURE_COUNT: 20,
  BUFFER: 10
}

Расширенные параметры зависят от сервера:

  • FILTER (OGC фильтры);
  • CQL_FILTER (GeoServer);
  • TIME (временные слои);
  • ELEVATION (3D-данные).

Ограничения GetFeatureInfo

Основные ограничения механизма:

  • зависимость от сервера WMS;
  • отсутствие поддержки в некоторых слоях;
  • ограничение по FEATURE_COUNT;
  • чувствительность к проекциям;
  • возможные задержки при сложных запросах.

Оптимизация производительности

Снижение нагрузки достигается за счёт:

  • ограничения FEATURE_COUNT;
  • запроса только активных слоёв;
  • использования JSON вместо XML;
  • кэширования результатов;
  • уменьшения количества слоёв в QUERY_LAYERS.

Обработка ошибок

Типовые сценарии ошибок:

  • 404 — неверный URL WMS;
  • 400 — некорректные параметры BBOX/I/J;
  • CORS blocking — отсутствие заголовков сервера;
  • пустой ответ — слой не queryable.

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

fetch(url)
  .then(res => {
    if (!res.ok) throw new Error('Request failed');
    return res.json();
  })
  .catch(err => {
    console.error(err);
  });

Интеграция с векторным отображением

GetFeatureInfo часто комбинируется с векторным слоем OpenLayers:

  • запрос возвращает атрибуты;
  • векторный слой подсвечивает объект;
  • используется overlay для popup.

Механика взаимодействия:

  • координата клика → запрос WMS;
  • ответ → создание Feature;
  • Feature → отображение на карте.

Работа с точечными и площадными объектами

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

  • точечные объекты возвращаются точно по координате;
  • линейные объекты требуют допуска (tolerance);
  • полигональные могут возвращаться несколькими записями.

На сервере часто применяется:

  • radius selection;
  • spatial index query;
  • geometry simplification.

Асинхронные сценарии

При высокой нагрузке запросы выполняются параллельно:

Promise.all(urls.map(u => fetch(u)))
  .then(responses => Promise.all(responses.map(r => r.json())))
  .then(results => {
    console.log(results);
  });

Поведение при масштабировании

GetFeatureInfo зависит от текущего масштаба карты:

  • на малых масштабах возвращаются агрегированные данные;
  • на крупных — детальные объекты;
  • некоторые серверы используют scale-dependent rendering.

Взаимодействие с тайловыми слоями

Хотя WMS визуализируется как тайлы, GetFeatureInfo работает поверх:

  • каждый тайл — часть BBOX;
  • клик определяется в пределах tile grid;
  • сервер сопоставляет пиксель с географией.

Поддержка WMS 1.1.1 и 1.3.0

Различия:

  • 1.1.1 использует X/Y;
  • 1.3.0 использует I/J;
  • различается порядок осей в EPSG:4326.

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


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

Расширение логики обработки ответа:

function parseFeatureInfo(data) {
  return data.features.map(f => ({
    id: f.id,
    name: f.properties.name
  }));
}

Позволяет:

  • унифицировать данные разных сервисов;
  • адаптировать под UI;
  • нормализовать структуру.

Геометрическая привязка результата

Некоторые серверы возвращают geometry:

  • используется для подсветки объекта;
  • требует преобразования в ol/format/GeoJSON;
  • может отсутствовать при INFO_FORMAT = text.

Поведение при перекрытии объектов

Если несколько объектов попадают в пиксель:

  • сервер возвращает список;
  • порядок зависит от слоя;
  • возможна сортировка по z-index или priority.

Обработка:

const topFeature = data.features[0];

или фильтрация по атрибутам.


Клиентские ограничения

OpenLayers не выполняет:

  • пространственные запросы локально (в WMS режиме);
  • интерпретацию GML без парсера;
  • оптимизацию серверных фильтров.

Вся логика определяется WMS-сервером.


Расширенные сценарии

Используются дополнительные подходы:

  • комбинирование WMS + WFS;
  • предварительная загрузка атрибутов;
  • кеширование результатов GetFeatureInfo;
  • объединение с IndexedDB для офлайн анализа.