Работа с Web Feature Service основана на получении векторных геоданных через HTTP-запросы к серверу, который возвращает пространственные объекты в структурированном формате. В контексте веб-картографии WFS используется для передачи именно геометрий и атрибутов объектов, в отличие от растровых сервисов.
В OpenLayers загрузка WFS реализуется через комбинацию:
ol/source/Vector — источник данныхol/format/WFS или альтернативные форматы парсингаloadingStrategy)GetFeatureКлючевая особенность WFS — работа с выборками данных, а не с тайлами изображений, что делает его критически важным для интерактивных слоёв редактирования и анализа.
Основной механизм взаимодействия — запрос GetFeature,
формируемый автоматически или вручную.
Типовой HTTP-запрос:
GET /geoserver/wfs?
service=WFS&
version=2.0.0&
request=GetFeature&
typeName=workspace:layer&
outputFormat=application/json&
srsName=EPSG:3857
Параметры:
typeName — имя слояoutputFormat — формат ответа (GML, GeoJSON)srsName — система координатbbox — ограничивающий прямоугольникfilter — пространственные или атрибутивные фильтрыWFS традиционно использует GML, однако современные серверы часто поддерживают GeoJSON.
ol/format/WFSol/format/GeoJSONВ OpenLayers WFS-слой обычно строится через
VectorSource:
import VectorSource from 'ol/source/Vector';
import VectorLayer from 'ol/layer/Vector';
import WFS from 'ol/format/WFS';
const wfsFormat = new WFS();
const vectorSource = new VectorSource({
format: wfsFormat,
loader: function (extent, resolution, projection) {
const url =
'https://example.com/geoserver/wfs?' +
'service=WFS&' +
'version=2.0.0&' +
'request=GetFeature&' +
'typeName=workspace:layer&' +
'outputFormat=application/json&' +
'srsName=' + projection.getCode() +
'&bbox=' + extent.join(',') + ',' + projection.getCode();
fetch(url)
.then(response => response.json())
.then(json => {
const features = new GeoJSON().readFeatures(json);
vectorSource.addFeatures(features);
});
}
});
const vectorLayer = new VectorLayer({
source: vectorSource
});
Ключевой элемент — loader, отвечающий за динамическую
подгрузку данных.
Наиболее распространённый подход — загрузка данных в пределах видимой области карты.
Используется стратегия:
loadingStrategy: bboxПринцип:
extentGetFeature с параметром
bboxПреимущество — минимальный объём данных.
Используется редко при небольших наборах данных.
Недостатки:
Для больших наборов данных применяется разбиение на сетку:
Подходит для:
WFS поддерживает фильтрацию через OGC Filter Encoding.
Примеры:
propertyIsEqualTo
В запросе:
<Filter>
<PropertyIsEqualTo>
<PropertyName>type</PropertyName>
<Literal>road</Literal>
</PropertyIsEqualTo>
</Filter>
OpenLayers предоставляет ol/format/WFS, который умеет
формировать XML-запросы:
import WFS from 'ol/format/WFS';
import {bbox as bboxStrategy} from 'ol/loadingstrategy';
const wfs = new WFS();
const featureRequest = wfs.writeGetFeature({
srsName: 'EPSG:3857',
featureNS: 'http://example.com/workspace',
featurePrefix: 'workspace',
featureTypes: ['layer'],
outputFormat: 'application/json',
filter: null
});
Однако во многих современных проектах используется ручная сборка URL
с fetch, поскольку это проще и прозрачнее.
WFS часто возвращает данные в EPSG:4326, тогда как карта
работает в EPSG:3857.
Трансформация:
import {transform} from 'ol/proj';
const coord = transform([lon, lat], 'EPSG:4326', 'EPSG:3857');
При загрузке геометрий важно:
srsNameПри работе с WFS критично учитывать объём данных.
maxFeatures=500
Снижает нагрузку на сервер и сеть.
moveendОтвет WFS может быть:
Парсинг:
import GeoJSON from 'ol/format/GeoJSON';
const format = new GeoJSON();
const features = format.readFeatures(response, {
featureProjection: 'EPSG:3857'
});
При использовании GML:
import WFS from 'ol/format/WFS';
const format = new WFS();
const features = format.readFeatures(xmlResponse);
При изменении данных важно управлять состоянием источника:
clear() — очистка слояaddFeatures() — добавление новых объектовrefresh() — перезагрузка источникаПример обновления:
vectorSource.clear();
vectorSource.refresh();
Расширение WFS позволяет выполнять операции:
Пример создания объекта:
const insert = wfs.writeTransaction(
[feature],
null,
null,
{
featureNS: 'http://example.com/workspace',
featurePrefix: 'workspace',
featureType: 'layer',
srsName: 'EPSG:3857'
}
);
Используется в системах:
Минус — память и производительность.
Оптимальный подход для WFS.
WFS часто используется совместно с:
Такая архитектура позволяет разделять: