WMTS (Web Map Tile Service) — стандарт OGC для публикации картографических данных в виде заранее подготовленных тайлов. В отличие от WMS, где сервер формирует изображение по запросу, WMTS предоставляет уже сгенерированные плитки фиксированного размера и масштаба. Такой подход значительно снижает нагрузку на сервер и ускоряет отображение карты.
WMTS широко применяется для публикации:
В экосистеме MapLibre GL JS работа с WMTS обычно осуществляется через
подключение тайловых источников (raster) или, реже, через
векторные тайлы (vector), если WMTS-сервис предоставляет
данные в таком формате.
WMTS основан на концепции матрицы тайлов.
Каждый уровень масштабирования содержит сетку плиток:
+-----+-----+-----+
| 0/0 | 1/0 | 2/0 |
+-----+-----+-----+
| 0/1 | 1/1 | 2/1 |
+-----+-----+-----+
| 0/2 | 1/2 | 2/2 |
+-----+-----+-----+
Положение плитки определяется тремя параметрами:
TileMatrix — уровень масштаба;TileRow — строка;TileCol — столбец.Типичный WMTS-запрос выглядит следующим образом:
https://server.example.com/wmts?
SERVICE=WMTS&
REQUEST=GetTile&
VERSION=1.0.0&
LAYER=basemap&
STYLE=default&
TILEMATRIXSET=WebMercatorQuad&
TILEMATRIX=10&
TILEROW=345&
TILECOL=512&
FORMAT=image/png
MapLibre GL JS автоматически подставляет значения масштаба, строки и столбца через шаблон URL.
Стандарт определяет два основных способа получения тайлов.
Все параметры передаются через строку запроса:
https://example.com/wmts?
SERVICE=WMTS&
REQUEST=GetTile&
VERSION=1.0.0&
LAYER=world&
STYLE=default&
TILEMATRIXSET=GoogleMapsCompatible&
TILEMATRIX={z}&
TILEROW={y}&
TILECOL={x}&
FORMAT=image/png
Это наиболее распространённый вариант подключения в MapLibre.
Параметры встраиваются непосредственно в путь URL:
https://example.com/wmts/world/default/
GoogleMapsCompatible/{z}/{y}/{x}.png
Такая схема проще для кеширования и часто используется в современных геосервисах.
Каждый сервис WMTS предоставляет XML-документ возможностей:
https://example.com/wmts?SERVICE=WMTS&REQUEST=GetCapabilities
Документ содержит описание:
Фрагмент документа:
<Layer>
<ows:Identifier>basemap</ows:Identifier>
<Style isDefault="true">
<ows:Identifier>default</ows:Identifier>
</Style>
<Format>image/png</Format>
<TileMatrixSetLink>
<TileMatrixSet>GoogleMapsCompatible</TileMatrixSet>
</TileMatrixSetLink>
</Layer>
Перед подключением WMTS в MapLibre обычно анализируется именно этот документ.
Наиболее распространённый сценарий — использование растровых тайлов.
Создание карты:
const map = new maplibregl.Map({
container: 'map',
style: {
version: 8,
sources: {},
layers: []
},
center: [37.62, 55.75],
zoom: 6
});
Добавление WMTS-источника:
map.on('load', () => {
map.addSource('wmts-source', {
type: 'raster',
tiles: [
'https://server.example.com/wmts?' +
'SERVICE=WMTS&' +
'REQUEST=GetTile&' +
'VERSION=1.0.0&' +
'LAYER=basemap&' +
'STYLE=default&' +
'TILEMATRIXSET=GoogleMapsCompatible&' +
'TILEMATRIX={z}&' +
'TILEROW={y}&' +
'TILECOL={x}&' +
'FORMAT=image/png'
],
tileSize: 256
});
map.addLayer({
id: 'wmts-layer',
type: 'raster',
source: 'wmts-source'
});
});
После загрузки карты слой автоматически начинает запрашивать тайлы соответствующего масштаба.
Для балансировки нагрузки некоторые WMTS-сервисы используют несколько поддоменов.
Пример:
map.addSource('wmts', {
type: 'raster',
tiles: [
'https://a.example.com/wmts/{z}/{y}/{x}.png',
'https://b.example.com/wmts/{z}/{y}/{x}.png',
'https://c.example.com/wmts/{z}/{y}/{x}.png'
],
tileSize: 256
});
MapLibre автоматически распределяет запросы между указанными серверами.
Большинство WMTS использует плитки 256×256 пикселей.
Настройка:
tileSize: 256
Некоторые сервисы предоставляют тайлы размером 512×512:
tileSize: 512
Неверно указанный размер приводит к:
Информация о размере тайла обычно содержится в документе Capabilities.
Растровый слой можно сделать полупрозрачным.
map.addLayer({
id: 'wmts-layer',
type: 'raster',
source: 'wmts-source',
paint: {
'raster-opacity': 0.6
}
});
Это полезно при наложении тематических карт поверх базовой подложки.
MapLibre предоставляет набор параметров визуальной коррекции.
Повышение контраста:
paint: {
'raster-contrast': 0.4
}
Изменение яркости:
paint: {
'raster-brightness-min': 0.1,
'raster-brightness-max': 0.9
}
Повышение насыщенности:
paint: {
'raster-saturation': 0.5
}
Эти настройки выполняются на стороне клиента без изменения исходных данных WMTS.
Одна карта может содержать несколько независимых сервисов.
Пример:
map.addSource('satellite', {
type: 'raster',
tiles: [
'https://server1.com/wmts/{z}/{y}/{x}.jpg'
],
tileSize: 256
});
map.addSource('cadastral', {
type: 'raster',
tiles: [
'https://server2.com/wmts/{z}/{y}/{x}.png'
],
tileSize: 256
});
Создание слоев:
map.addLayer({
id: 'satellite-layer',
type: 'raster',
source: 'satellite'
});
map.addLayer({
id: 'cadastral-layer',
type: 'raster',
source: 'cadastral',
paint: {
'raster-opacity': 0.5
}
});
Управление видимостью выполняется через свойство
visibility.
Скрытие слоя:
map.setLayoutProperty(
'wmts-layer',
'visibility',
'none'
);
Отображение:
map.setLayoutProperty(
'wmts-layer',
'visibility',
'visible'
);
Подобный подход используется при создании переключателей картографических подложек.
Некоторые WMTS поддерживают только определённые уровни масштабирования.
Для ограничения отображения:
map.addLayer({
id: 'wmts-layer',
type: 'raster',
source: 'wmts-source',
minzoom: 5,
maxzoom: 14
});
При выходе за указанный диапазон слой автоматически скрывается.
Наиболее распространённая матрица тайлов WMTS:
GoogleMapsCompatible
Она соответствует проекции Web Mercator (EPSG:3857), используемой MapLibre GL JS.
Однако государственные геопорталы часто публикуют данные в системах:
MapLibre GL JS ориентирован на Web Mercator, поэтому прямое подключение WMTS возможно только при наличии совместимой матрицы тайлов.
Если сервис предоставляет исключительно локальную проекцию, обычно требуется:
Часто возникает путаница между WMTS и TMS.
Запрос:
https://example.com/{z}/{x}/{y}.png
Запрос:
SERVICE=WMTS
REQUEST=GetTile
TILEMATRIX={z}
TILEROW={y}
TILECOL={x}
Фактически оба подхода используют тайлы, однако WMTS дополнительно стандартизирует:
Для MapLibre различие часто сводится только к формату URL.
При создании собственного стиля можно сразу определить источник.
const style = {
version: 8,
sources: {
wmts: {
type: 'raster',
tiles: [
'https://server.example.com/wmts/' +
'{z}/{y}/{x}.png'
],
tileSize: 256
}
},
layers: [
{
id: 'base',
type: 'raster',
source: 'wmts'
}
]
};
Создание карты:
const map = new maplibregl.Map({
container: 'map',
style
});
Такой подход позволяет хранить конфигурацию карты в одном объекте.
Для диагностики полезно отслеживать ошибки.
map.on('error', (event) => {
console.error(event.error);
});
Дополнительно можно анализировать сетевые запросы через инструменты разработчика браузера.
Наиболее частые причины ошибок:
Одно из главных преимуществ WMTS — возможность эффективного кеширования.
Кеширование происходит на нескольких уровнях:
Повторный запрос уже загруженной плитки обычно не требует её повторной генерации.
Благодаря этому WMTS способен обслуживать большое количество пользователей одновременно.
При работе с крупными картографическими сервисами рекомендуется:
Для спутниковых снимков и ортофотопланов предпочтительно использовать формат JPEG:
FORMAT=image/jpeg
Для карт с прозрачностью обычно применяется PNG:
FORMAT=image/png
Некоторые сервисы требуют токен доступа.
Пример:
map.addSource('secured-wmts', {
type: 'raster',
tiles: [
'https://example.com/wmts?' +
'token=YOUR_TOKEN&' +
'SERVICE=WMTS&' +
'REQUEST=GetTile&' +
'TILEMATRIX={z}&' +
'TILEROW={y}&' +
'TILECOL={x}'
],
tileSize: 256
});
Иногда используются:
При работе с защищёнными сервисами важно учитывать сроки действия токенов и механизмы их обновления.
Наиболее распространённый сценарий использования — подключение WMTS в качестве базового слоя карты.
Типичная схема:
WMTS Спутник
↓
WMTS Рельеф
↓
Векторные данные MapLibre
↓
Маркеры
↓
Всплывающие окна
Такое сочетание позволяет использовать преимущества обоих подходов: