Web Map Service

Web Map Service (WMS) — стандарт распространения растровых карт по HTTP, разработанный Open Geospatial Consortium. Основная идея заключается в том, что сервер формирует изображение карты на основе запроса клиента и возвращает его в виде PNG, JPEG или другого растрового формата.

В контексте CesiumJS WMS используется как источник изображений (Imagery Provider), который накладывается на 3D-глобус или 2D-карту. В отличие от тайловых сервисов (XYZ, WMTS), WMS генерирует изображение динамически, что обеспечивает гибкость, но требует внимательного подхода к производительности.


Архитектура WMS в геоинформационных системах

WMS основан на модели «запрос — изображение». Клиент формирует HTTP-запрос к серверу с параметрами:

  • географический bounding box
  • размер изображения (width/height)
  • система координат (CRS / SRS)
  • список слоёв
  • стиль отображения
  • формат ответа

Сервер возвращает готовое растровое изображение, которое не содержит векторной структуры.

Ключевые операции WMS:

  • GetCapabilities — описание доступных слоёв и параметров
  • GetMap — получение изображения карты
  • GetFeatureInfo — получение информации о конкретной точке

Подключение WMS в CesiumJS

В CesiumJS для работы с WMS используется класс WebMapServiceImageryProvider.

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

const viewer = new Cesium.Viewer("cesiumContainer");

const wmsProvider = new Cesium.WebMapServiceImageryProvider({
    url: "https://your-wms-server.com/geoserver/wms",
    layers: "workspace:layer_name",
    parameters: {
        service: "WMS",
        version: "1.1.1",
        request: "GetMap",
        styles: "",
        format: "image/png",
        transparent: true
    }
});

viewer.imageryLayers.addImageryProvider(wmsProvider);

Основные параметры WebMapServiceImageryProvider

url

Адрес WMS-сервера. Часто это GeoServer, MapServer или QGIS Server.


layers

Список слоёв, разделённых запятыми.

Примеры:

  • roads
  • workspace:buildings
  • hydrography,landuse

parameters

Объект параметров WMS-запроса:

  • service — всегда WMS
  • version — 1.1.1 или 1.3.0
  • request — GetMap
  • styles — стиль слоя (может быть пустым)
  • format — формат изображения (image/png, image/jpeg)
  • transparent — прозрачность фона

getFeatureInfoFormat (при расширенной настройке)

Позволяет задать формат ответа GetFeatureInfo:

getFeatureInfoFormat: new Cesium.GetFeatureInfoFormat("application/json", parseFunction)

Системы координат и проекции

WMS поддерживает разные CRS:

  • EPSG:4326 (географические координаты)
  • EPSG:3857 (Web Mercator)
  • локальные проекции

CesiumJS по умолчанию работает в 3D-глобальной системе координат WGS84, поэтому наиболее совместимым вариантом является EPSG:4326.

При несовпадении проекций сервер выполняет репроекцию «на лету», что увеличивает нагрузку.


Прозрачность и наложение слоёв

WMS часто используется как дополнительный слой поверх базовой карты:

  • спутниковые снимки
  • тематические слои (зонирование, экология)
  • инфраструктура

Для корректного наложения важно:

  • transparent: true
  • формат PNG (поддерживает альфа-канал)
  • корректный порядок слоёв в Cesium
viewer.imageryLayers.addImageryProvider(wmsProvider);
wmsProvider.alpha = 0.7;

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

WMS позволяет комбинировать слои на сервере:

layers: "roads,buildings,landuse"

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

  • порядок слоёв важен
  • стили могут различаться для каждого слоя
  • сервер может ограничивать комбинации

Динамические параметры (time, elevation, filters)

Многие WMS-сервера поддерживают расширения:

Временные слои

parameters: {
    time: "2025-01-01T00:00:00Z"
}

Используется для:

  • погодных данных
  • спутниковых снимков по времени
  • мониторинга изменений

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

Некоторые серверы поддерживают CQL или FILTER:

parameters: {
    CQL_FILTER: "population > 10000"
}

GetFeatureInfo и интерактивность

WMS может возвращать информацию о точке запроса.

В CesiumJS это реализуется через picking:

const handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);

handler.setInputAction(function (movement) {
    const cartesian = viewer.camera.pickEllipsoid(movement.position);
    if (!cartesian) return;

    const pickedLayer = viewer.imageryLayers.pickImageryLayerFeatures(movement.position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

Сервер возвращает:

  • JSON
  • XML
  • HTML

Производительность WMS в CesiumJS

WMS — один из самых «тяжёлых» источников данных.

Основные проблемы:

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

Оптимизационные подходы:

Кэширование на сервере

GeoServer + GeoWebCache значительно ускоряют WMS.

Ограничение разрешения

Уменьшение width и height запросов снижает нагрузку.

Использование WMTS вместо WMS

Если доступен WMTS, он предпочтительнее.


Отличия WMS от WMTS и XYZ

Параметр WMS WMTS XYZ
Генерация динамическая тайлы тайлы
Производительность низкая высокая высокая
Гибкость высокая средняя низкая
Настройка слоёв серверная ограниченная нет

Использование WMS через proxy

Из-за CORS многие WMS-серверы требуют прокси:

url: new Cesium.Resource({
    url: "/proxy?url=https://server.com/wms"
})

Причины:

  • отсутствие CORS-заголовков
  • защита серверов
  • корпоративные сети

Поддержка GeoServer

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

Типичная структура:

  • workspace
  • datastore
  • layers
  • styles (SLD)

Пример слоя:

workspace:urban_zones

CesiumJS напрямую работает с опубликованным WMS endpoint.


Работа с ошибками WMS

Частые проблемы:

Invalid CRS

Сервер не поддерживает запрошенную проекцию.

Решение:

  • переключение на EPSG:4326
  • настройка сервера

Empty images

Причины:

  • неверный bbox
  • отсутствие данных в области
  • стиль не применён

Timeout

Причины:

  • слишком сложный слой
  • высокая нагрузка сервера

Расширенные настройки WebMapServiceImageryProvider

const provider = new Cesium.WebMapServiceImageryProvider({
    url: "https://example.com/wms",
    layers: "cities",
    rectangle: Cesium.Rectangle.fromDegrees(-180, -90, 180, 90),
    minimumLevel: 0,
    maximumLevel: 18,
    tileWidth: 256,
    tileHeight: 256,
    tilingScheme: new Cesium.GeographicTilingScheme()
});

Интеграция с другими источниками данных

WMS часто комбинируется с:

  • GeoJSON слоями
  • 3D Tiles
  • Terrain Provider
  • CZML анимацией

Пример гибридной сцены:

  • WMS: административные границы
  • 3D Tiles: здания
  • Terrain: рельеф

Особенности рендеринга в CesiumJS

WMS-слой в Cesium:

  • рендерится как Imagery Layer
  • накладывается на эллипсоид Земли
  • участвует в системе уровней детализации (LOD)

При увеличении масштаба Cesium пересчитывает bounding box и запрашивает новые изображения у WMS.


Практика проектирования WMS-слоёв

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

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

WMS в реальных GIS-сценариях

Типовые применения:

  • кадастровые карты
  • экологический мониторинг
  • транспортные сети
  • градостроительное планирование
  • спутниковая аналитика

CesiumJS позволяет визуализировать эти данные в глобальном 3D-контексте, сохраняя совместимость с классическими GIS-серверами.