GetFeatureInfo является стандартным запросом протокола WMS (Web Map Service), позволяющим получать атрибутивную информацию об объектах карты по координате запроса. В отличие от отображения тайлов, этот механизм возвращает не изображение, а структурированные данные о пространственных объектах, попадающих в указанную точку.
Основная схема взаимодействия:
GetFeatureInfo;GetFeatureInfo опирается на параметры уже выполненного
GetMap запроса, дополняя его координатной информацией.
Ключевые параметры:
В 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);
});
}
});
Наиболее удобный формат для клиентской обработки. Обычно используется
в GeoServer с опцией GeoJSON.
Структура:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"name": "Object A",
"id": 1
},
"geometry": null
}
]
}
Используется в классических WMS-сервисах. Требует дополнительного парсинга:
Формат часто применяется в GeoServer для быстрого отображения атрибутов без клиентской обработки.
GetFeatureInfo может выполняться сразу по нескольким слоям:
'QUERY_LAYERS': 'roads,buildings,parcels'
Особенности:
OpenLayers автоматически учитывает преобразование координат между экранной системой и пространственной.
Ключевые моменты:
event.coordinate уже находится в системе карты;view.getProjection() обязателен для корректного
запроса;Типичные проекции:
Параметр resolution критически важен для корректного
определения объектов:
const resolution = view.getResolution();
Он влияет на:
При неверном resolution сервер может вернуть:
Наиболее распространённая серверная реализация WMS.
Конфигурационные аспекты:
application/json;Пример запроса, генерируемого 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
}
Расширенные параметры зависят от сервера:
Основные ограничения механизма:
Снижение нагрузки достигается за счёт:
FEATURE_COUNT;Типовые сценарии ошибок:
Пример безопасной обработки:
fetch(url)
.then(res => {
if (!res.ok) throw new Error('Request failed');
return res.json();
})
.catch(err => {
console.error(err);
});
GetFeatureInfo часто комбинируется с векторным слоем OpenLayers:
Механика взаимодействия:
Особенности обработки:
На сервере часто применяется:
При высокой нагрузке запросы выполняются параллельно:
Promise.all(urls.map(u => fetch(u)))
.then(responses => Promise.all(responses.map(r => r.json())))
.then(results => {
console.log(results);
});
GetFeatureInfo зависит от текущего масштаба карты:
Хотя WMS визуализируется как тайлы, GetFeatureInfo работает поверх:
Различия:
X/Y;I/J;OpenLayers автоматически адаптирует параметры, но серверная реализация может требовать ручной корректировки.
Расширение логики обработки ответа:
function parseFeatureInfo(data) {
return data.features.map(f => ({
id: f.id,
name: f.properties.name
}));
}
Позволяет:
Некоторые серверы возвращают geometry:
ol/format/GeoJSON;Если несколько объектов попадают в пиксель:
Обработка:
const topFeature = data.features[0];
или фильтрация по атрибутам.
OpenLayers не выполняет:
Вся логика определяется WMS-сервером.
Используются дополнительные подходы: