WMTS (Web Map Tile Service) представляет собой стандарт распространения картографических данных в виде заранее подготовленных тайлов фиксированных размеров. В отличие от динамических WMS-запросов, WMTS опирается на предрасчитанные изображения, что обеспечивает высокую производительность и предсказуемую нагрузку на сервер.
Open Geospatial Consortium формализует спецификацию WMTS, определяя структуру запросов, наборы тайловых матриц и правила адресации ресурсов.
Ключевая особенность WMTS заключается в разбиении карты на:
Каждый тайл идентифицируется тройкой параметров:
OpenLayers предоставляет специализированный источник
ol/source/WMTS, предназначенный для подключения тайловых
сервисов, соответствующих стандарту WMTS.
Базовая задача слоя WMTS — синхронизировать:
Для корректной настройки источника WMTS используется XML-документ Capabilities, содержащий описание сервиса.
Основные секции:
Contents
TileMatrixSet
OperationsMetadata
Пример URL Capabilities:
https://example.com/wmts?service=WMTS&request=GetCapabilities
В OpenLayers WMTS подключается через ol/source/WMTS
совместно с ol/tilegrid/WMTS.
import Map from 'ol/Map';
import View from 'ol/View';
import TileLayer from 'ol/layer/Tile';
import WMTS from 'ol/source/WMTS';
import WMTSTileGrid from 'ol/tilegrid/WMTS';
import { getTopLeft } from 'ol/extent';
import { get as getProjection } from 'ol/proj';
const projection = getProjection('EPSG:3857');
const tileGrid = new WMTSTileGrid({
origin: getTopLeft(projection.getExtent()),
resolutions: [
156543.03392804097,
78271.51696402048,
39135.75848201024,
19567.87924100512,
9783.93962050256
],
matrixIds: ['0', '1', '2', '3', '4']
});
const wmtsSource = new WMTS({
url: 'https://example.com/wmts',
layer: 'basic',
matrixSet: 'EPSG:3857',
format: 'image/png',
projection: projection,
tileGrid: tileGrid,
style: 'default',
wrapX: true
});
const layer = new TileLayer({
source: wmtsSource
});
const map = new Map({
target: 'map',
layers: [layer],
view: new View({
projection: projection,
center: [0, 0],
zoom: 2
})
});
TileMatrixSet определяет геометрическую структуру тайловой сетки. Это ключевой элемент WMTS, обеспечивающий соответствие между координатами карты и индексами тайлов.
Каждый уровень TileMatrix включает:
В OpenLayers эти параметры отражаются через
WMTSTileGrid, где:
origin соответствует TopLeftCornerresolutions соответствует ScaleDenominatormatrixIds соответствует IdentifierWMTS строго зависит от системы координат. Наиболее распространённые варианты:
Несоответствие проекции между клиентом и WMTS-сервисом приводит к:
OpenLayers выполняет трансформацию координат через модуль
ol/proj, но TileGrid должен быть согласован с серверной
матрицей.
WMTS использует шаблон подстановки параметров:
{TileMatrix}/{TileRow}/{TileCol}.png
или через query string:
...&TileMatrix={z}&TileRow={y}&TileCol={x}
В OpenLayers этот механизм инкапсулирован внутри WMTS
source, но логика подстановки зависит от:
WMTS поддерживает два основных способа формирования запросов:
Запрос формируется через параметры URL:
?SERVICE=WMTS&REQUEST=GetTile&LAYER=basic&STYLE=default
&TILEMATRIXSET=EPSG:3857
&TILEMATRIX=3&TILEROW=4&TILECOL=2
Использует URL-шаблон:
https://example.com/wmts/basic/default/EPSG:3857/3/4/2.png
REST-формат предпочтителен из-за кэшируемости и простоты CDN-интеграции.
WMTS проектировался для оптимизации загрузки картографических данных:
В OpenLayers это усиливается механизмами:
WMTS слой может быть ограничен географическим прямоугольником.
const wmtsSource = new WMTS({
url: 'https://example.com/wmts',
layer: 'restricted_layer',
matrixSet: 'EPSG:3857',
format: 'image/png',
tileGrid: tileGrid,
extent: [ -20037508, -20037508, 20037508, 20037508 ]
});
Extent влияет на:
Массив resolutions определяет детализацию карты.
Принцип:
Типичная схема:
zoom 0 → весь мир
zoom 1 → континенты
zoom 2 → крупные регионы
...
Несоответствие resolutions с сервером приводит к:
Параметр style позволяет выбирать визуальное
представление слоя:
OpenLayers передаёт стиль напрямую в запрос WMTS, не изменяя его локально.
Типовые проблемы при подключении WMTS:
matrixSetmatrixIdsКаждая ошибка приводит к симптомам:
В сложных системах конфигурация WMTS строится автоматически:
import WMTS from 'ol/source/WMTS';
import { optionsFromCapabilities } from 'ol/source/WMTS';
fetch('https://example.com/wmts?service=WMTS&request=GetCapabilities')
.then(res => res.text())
.then(text => {
const options = optionsFromCapabilities(text, {
layer: 'basic_layer',
matrixSet: 'EPSG:3857'
});
const source = new WMTS(options);
});
Такой подход снижает вероятность ошибок ручной конфигурации и обеспечивает синхронизацию с сервером.
WMTS часто используется как базовый слой в комбинации с:
VectorLayer)Порядок отрисовки критичен: