WMS (Web Map Service) — стандарт публикации картографических данных, разработанный организацией OGC (Open Geospatial Consortium). В отличие от векторных источников и растровых тайлов XYZ, WMS генерирует изображение карты на сервере в момент запроса.
MapLibre GL JS ориентирован прежде всего на работу с векторными и растровыми тайлами, однако WMS-сервисы также могут использоваться в качестве источников данных через механизм растровых слоёв.
Основные преимущества WMS:
Недостатки:
При каждом запросе клиент отправляет серверу набор параметров:
Сервер формирует изображение и возвращает его клиенту.
Типичный WMS-запрос выглядит следующим образом:
https://server.example.com/wms?
service=WMS&
request=GetMap&
layers=roads&
bbox=10,20,30,40&
width=256&
height=256&
format=image/png
MapLibre GL JS отображает полученное изображение как растровый слой.
Стандарт WMS определяет несколько операций.
Возвращает описание сервиса.
Пример:
https://server.example.com/wms?service=WMS&request=GetCapabilities
Ответ содержит:
Основной запрос для получения изображения карты.
Параметры:
| Параметр | Назначение |
|---|---|
| service | Тип сервиса |
| version | Версия WMS |
| request | Тип запроса |
| layers | Список слоёв |
| styles | Стили отображения |
| bbox | Границы карты |
| width | Ширина изображения |
| height | Высота изображения |
| crs/srs | Система координат |
| format | Формат изображения |
Позволяет получать информацию об объектах на карте.
Запрос отправляется после клика по изображению.
Пример:
https://server.example.com/wms?
service=WMS&
request=GetFeatureInfo&
layers=buildings&
query_layers=buildings&
i=150&
j=200
Ответ может содержать:
MapLibre напрямую не поддерживает WMS как отдельный тип источника,
однако WMS можно использовать через растровый источник
(raster source).
Базовая схема выглядит следующим образом:
map.addSource('wms-source', {
type: 'raster',
tiles: [
'https://server.example.com/wms?' +
'service=WMS' +
'&version=1.1.1' +
'&request=GetMap' +
'&layers=my_layer' +
'&styles=' +
'&format=image/png' +
'&transparent=true' +
'&srs=EPSG:3857' +
'&bbox={bbox-epsg-3857}' +
'&width=256' +
'&height=256'
],
tileSize: 256
});
map.addLayer({
id: 'wms-layer',
type: 'raster',
source: 'wms-source'
});
MapLibre автоматически подставляет значение
{bbox-epsg-3857} для каждого тайла.
Наиболее распространённый WMS-сервер — GeoServer.
Пример подключения слоя из GeoServer:
map.addSource('countries', {
type: 'raster',
tiles: [
'http://localhost:8080/geoserver/wms?' +
'service=WMS' +
'&version=1.1.1' +
'&request=GetMap' +
'&layers=world:countries' +
'&styles=' +
'&format=image/png' +
'&transparent=true' +
'&srs=EPSG:3857' +
'&bbox={bbox-epsg-3857}' +
'&width=256' +
'&height=256'
],
tileSize: 256
});
map.addLayer({
id: 'countries-layer',
type: 'raster',
source: 'countries'
});
После добавления слой отображается поверх базовой карты.
Очень часто WMS используется как наложение поверх базовой карты.
Для этого применяется параметр:
transparent=true
Полный пример:
tiles: [
'https://server.example.com/wms?' +
'service=WMS' +
'&request=GetMap' +
'&layers=roads' +
'&format=image/png' +
'&transparent=true' +
'&bbox={bbox-epsg-3857}' +
'&width=256' +
'&height=256'
]
Формат PNG обеспечивает поддержку альфа-канала.
После подключения WMS прозрачность можно регулировать средствами MapLibre.
map.setPaintProperty(
'wms-layer',
'raster-opacity',
0.5
);
Или при создании слоя:
map.addLayer({
id: 'wms-layer',
type: 'raster',
source: 'wms-source',
paint: {
'raster-opacity': 0.6
}
});
Для растровых слоёв доступны дополнительные настройки.
Яркость:
paint: {
'raster-brightness-min': 0.2,
'raster-brightness-max': 0.9
}
Контрастность:
paint: {
'raster-contrast': 0.5
}
Насыщенность:
paint: {
'raster-saturation': 0.7
}
Эти параметры особенно полезны при работе с ортофотопланами и спутниковыми снимками через WMS.
На одной карте может отображаться несколько сервисов одновременно.
map.addLayer({
id: 'roads',
type: 'raster',
source: 'roads-source'
});
map.addLayer({
id: 'buildings',
type: 'raster',
source: 'buildings-source'
});
map.addLayer({
id: 'parcels',
type: 'raster',
source: 'parcels-source'
});
Порядок добавления определяет порядок отрисовки.
Скрытие слоя:
map.setLayoutProperty(
'wms-layer',
'visibility',
'none'
);
Показ слоя:
map.setLayoutProperty(
'wms-layer',
'visibility',
'visible'
);
Переключение:
const visible =
map.getLayoutProperty(
'wms-layer',
'visibility'
);
map.setLayoutProperty(
'wms-layer',
'visibility',
visible === 'visible'
? 'none'
: 'visible'
);
Наиболее распространены версии:
Пример для версии 1.1.1:
version=1.1.1
&srs=EPSG:3857
Для версии 1.3.0:
version=1.3.0
&crs=EPSG:3857
Ключевое отличие заключается в использовании параметров:
| Версия | Параметр |
|---|---|
| 1.1.1 | srs |
| 1.3.0 | crs |
Некоторые серверы требуют строго определённую версию.
WMS поддерживает различные форматы.
PNG:
format=image/png
JPEG:
format=image/jpeg
GIF:
format=image/gif
Сравнение:
| Формат | Прозрачность | Размер |
|---|---|---|
| PNG | Да | Средний |
| JPEG | Нет | Малый |
| GIF | Да | Малый |
Для наложений практически всегда используется PNG.
Стандартный размер тайла:
tileSize: 256
Для экранов высокой плотности:
tileSize: 512
Соответственно изменяются параметры запроса:
width=512
height=512
Это повышает детализацию изображения.
Слой можно отображать только на определённых масштабах.
map.addLayer({
id: 'wms-layer',
type: 'raster',
source: 'wms-source',
minzoom: 5,
maxzoom: 15
});
Такой подход уменьшает количество запросов к серверу.
Для реализации идентификации объектов обычно используется обработчик клика.
map.on('click', async (e) => {
const point = e.point;
const url =
buildGetFeatureInfoUrl(point);
const response =
await fetch(url);
const data =
await response.json();
console.log(data);
});
Функция формирования URL должна учитывать:
Каждый запрос WMS потенциально генерирует новое изображение.
Для повышения производительности применяются:
Схема работы:
MapLibre
↓
Кэш-сервер
↓
WMS
При наличии кэша большинство запросов обслуживается значительно быстрее.
При использовании WMS необходимо учитывать ряд особенностей.
Отсутствует доступ к объектам слоя:
map.queryRenderedFeatures();
не сможет получить объекты WMS, поскольку клиент получает только изображение.
Также невозможно:
Для таких задач предпочтительнее использовать:
| Характеристика | WMS | Vector Tiles |
|---|---|---|
| Формат передачи | Изображение | Геометрия |
| Клиентская стилизация | Нет | Да |
| Производительность | Ниже | Выше |
| Объём трафика | Больше | Меньше |
| Интерактивность | Ограничена | Высокая |
| Поддержка старых ГИС | Отличная | Ограниченная |
| Серверная визуализация | Да | Нет |
WMS остаётся важным стандартом в инфраструктуре ГИС благодаря совместимости с многочисленными геопорталами, государственными кадастровыми системами, картографическими серверами и корпоративными геоинформационными платформами. В экосистеме MapLibre GL JS такие сервисы обычно используются для подключения готовых картографических слоёв, ортофотопланов, спутниковых снимков, тематических карт и архивных геоданных, публикуемых через GeoServer, MapServer, ArcGIS Server и другие WMS-совместимые решения.