Загрузка данных через WFS

Работа с Web Feature Service основана на получении векторных геоданных через HTTP-запросы к серверу, который возвращает пространственные объекты в структурированном формате. В контексте веб-картографии WFS используется для передачи именно геометрий и атрибутов объектов, в отличие от растровых сервисов.

В OpenLayers загрузка WFS реализуется через комбинацию:

  • ol/source/Vector — источник данных
  • ol/format/WFS или альтернативные форматы парсинга
  • стратегии загрузки (loadingStrategy)
  • HTTP-запросы GetFeature

Ключевая особенность WFS — работа с выборками данных, а не с тайлами изображений, что делает его критически важным для интерактивных слоёв редактирования и анализа.


Структура запроса GetFeature

Основной механизм взаимодействия — запрос 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 — пространственные или атрибутивные фильтры

Форматы данных: GML и GeoJSON

WFS традиционно использует GML, однако современные серверы часто поддерживают GeoJSON.

GML (Geography Markup Language)

  • стандарт OGC
  • сложная XML-структура
  • высокая совместимость
  • требует парсинга через ol/format/WFS

GeoJSON

  • легковесный формат
  • проще парсится в браузере
  • быстрее при больших объёмах данных
  • поддерживается напрямую через ol/format/GeoJSON

Базовая конфигурация VectorSource

В 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, отвечающий за динамическую подгрузку данных.


Стратегии загрузки данных

Загрузка по bbox

Наиболее распространённый подход — загрузка данных в пределах видимой области карты.

Используется стратегия:

  • loadingStrategy: bbox

Принцип:

  • при изменении viewport вычисляется extent
  • формируется запрос GetFeature с параметром bbox
  • сервер возвращает только объекты внутри области

Преимущество — минимальный объём данных.


Полная загрузка (all strategy)

Используется редко при небольших наборах данных.

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

Недостатки:

  • высокая нагрузка на сеть
  • долгий initial load
  • возможные проблемы с памятью браузера

Тайловая стратегия

Для больших наборов данных применяется разбиение на сетку:

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

Подходит для:

  • кадастровых данных
  • транспортных сетей
  • плотных городских слоёв

Использование фильтров в WFS

WFS поддерживает фильтрацию через OGC Filter Encoding.

Примеры:

Атрибутивный фильтр

propertyIsEqualTo

В запросе:

<Filter>
  <PropertyIsEqualTo>
    <PropertyName>type</PropertyName>
    <Literal>road</Literal>
  </PropertyIsEqualTo>
</Filter>

Пространственный фильтр

  • Intersects
  • Within
  • BBOX

Генерация WFS-запросов через OpenLayers

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

Использование bbox-фильтра

Снижает нагрузку на сервер и сеть.

Динамическая подгрузка

  • загрузка при панорамировании
  • debounce на события moveend

Кэширование

  • хранение уже загруженных bbox
  • предотвращение повторных запросов

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

Ответ WFS может быть:

  • GeoJSON
  • GML3
  • XML с вложенными структурами

Парсинг:

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-T (Transaction)

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

  • Insert
  • Update
  • Delete

Пример создания объекта:

const insert = wfs.writeTransaction(
  [feature],
  null,
  null,
  {
    featureNS: 'http://example.com/workspace',
    featurePrefix: 'workspace',
    featureType: 'layer',
    srsName: 'EPSG:3857'
  }
);

Используется в системах:

  • кадастровых платформ
  • GIS-редакторах
  • системах учёта объектов

Типовые проблемы интеграции

Несовпадение CRS

  • сервер возвращает EPSG:4326
  • карта использует EPSG:3857
  • возникает смещение объектов

Огромные ответы сервера

  • медленный парсинг XML
  • блокировка main thread
  • необходимость pagination

Отсутствие CORS

  • блокировка запросов браузером
  • необходимость прокси-сервера

Неконсистентный outputFormat

  • GeoJSON не поддерживается сервером
  • fallback на GML

Архитектурные подходы

Клиентская фильтрация

  • загрузка больших наборов
  • локальная обработка

Минус — память и производительность.


Серверная фильтрация

  • bbox
  • attribute filters
  • paging

Оптимальный подход для WFS.


Гибридная модель

  • базовая фильтрация на сервере
  • локальная дофильтрация
  • кэширование результатов

Связка Vector Tile и WFS

WFS часто используется совместно с:

  • WMS для визуализации
  • Vector Tiles для производительности
  • WFS-T для редактирования

Такая архитектура позволяет разделять:

  • отображение
  • анализ
  • редактирование данных