WMTS источники

Архитектура WMTS и принцип работы тайлового сервиса

WMTS (Web Map Tile Service) представляет собой стандарт распространения картографических данных в виде заранее подготовленных тайлов фиксированных размеров. В отличие от динамических WMS-запросов, WMTS опирается на предрасчитанные изображения, что обеспечивает высокую производительность и предсказуемую нагрузку на сервер.

Open Geospatial Consortium формализует спецификацию WMTS, определяя структуру запросов, наборы тайловых матриц и правила адресации ресурсов.

Ключевая особенность WMTS заключается в разбиении карты на:

  • уровни масштабов (zoom levels)
  • сетку тайлов (tile matrix)
  • фиксированные размеры тайлов (обычно 256×256 или 512×512 пикселей)

Каждый тайл идентифицируется тройкой параметров:

  • TileMatrix (уровень масштаба)
  • TileRow (строка)
  • TileCol (столбец)

Поддержка WMTS в OpenLayers

OpenLayers предоставляет специализированный источник ol/source/WMTS, предназначенный для подключения тайловых сервисов, соответствующих стандарту WMTS.

Базовая задача слоя WMTS — синхронизировать:

  • систему координат карты (projection)
  • матрицу тайлов (tile matrix set)
  • разрешения (resolutions)
  • сетку координат тайлов

Структура WMTS Capabilities

Для корректной настройки источника WMTS используется XML-документ Capabilities, содержащий описание сервиса.

Основные секции:

  • Contents

    • список слоёв (Layers)
    • TileMatrixSet
  • TileMatrixSet

    • список масштабов
    • границы (BoundingBox)
    • разрешения
  • OperationsMetadata

    • шаблоны запросов GetTile

Пример URL Capabilities:

https://example.com/wmts?service=WMTS&request=GetCapabilities

Создание WMTS-источника

В 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 и его роль

TileMatrixSet определяет геометрическую структуру тайловой сетки. Это ключевой элемент WMTS, обеспечивающий соответствие между координатами карты и индексами тайлов.

Каждый уровень TileMatrix включает:

  • идентификатор масштаба (Identifier)
  • масштаб (ScaleDenominator)
  • верхнюю левую точку (TopLeftCorner)
  • размер тайла (TileWidth / TileHeight)
  • число тайлов по осям

В OpenLayers эти параметры отражаются через WMTSTileGrid, где:

  • origin соответствует TopLeftCorner
  • resolutions соответствует ScaleDenominator
  • matrixIds соответствует Identifier

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

WMTS строго зависит от системы координат. Наиболее распространённые варианты:

  • EPSG:3857 — Web Mercator
  • EPSG:4326 — географическая система координат

Несоответствие проекции между клиентом и WMTS-сервисом приводит к:

  • смещению тайлов
  • искажению масштаба
  • неправильной загрузке изображений

OpenLayers выполняет трансформацию координат через модуль ol/proj, но TileGrid должен быть согласован с серверной матрицей.


Формирование URL тайлов

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

{TileMatrix}/{TileRow}/{TileCol}.png

или через query string:

...&TileMatrix={z}&TileRow={y}&TileCol={x}

В OpenLayers этот механизм инкапсулирован внутри WMTS source, но логика подстановки зависит от:

  • matrixIds
  • tileGrid
  • request encoding (KVP или REST)

KVP и REST encoding

WMTS поддерживает два основных способа формирования запросов:

KVP (Key-Value Pair)

Запрос формируется через параметры URL:

?SERVICE=WMTS&REQUEST=GetTile&LAYER=basic&STYLE=default
&TILEMATRIXSET=EPSG:3857
&TILEMATRIX=3&TILEROW=4&TILECOL=2

REST

Использует URL-шаблон:

https://example.com/wmts/basic/default/EPSG:3857/3/4/2.png

REST-формат предпочтителен из-за кэшируемости и простоты CDN-интеграции.


Кэширование и производительность

WMTS проектировался для оптимизации загрузки картографических данных:

  • тайлы неизменяемы для конкретного масштаба
  • легко кэшируются браузером и CDN
  • минимальная серверная логика

В OpenLayers это усиливается механизмами:

  • TileCache
  • shared tile loading
  • lazy rendering

Обработка ограничений (extent)

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 определяет детализацию карты.

Принцип:

  • каждый следующий уровень увеличивает детализацию в 2 раза
  • разрешение = meters per pixel

Типичная схема:

zoom 0 → весь мир
zoom 1 → континенты
zoom 2 → крупные регионы
...

Несоответствие resolutions с сервером приводит к:

  • пустым тайлам
  • смещению сетки
  • неправильному масштабированию

Стиль и визуальные варианты

Параметр style позволяет выбирать визуальное представление слоя:

  • default — стандартная картография
  • grayscale — серые тона
  • satellite — спутниковый слой

OpenLayers передаёт стиль напрямую в запрос WMTS, не изменяя его локально.


Ошибки интеграции WMTS

Типовые проблемы при подключении WMTS:

  • неверный matrixSet
  • несовпадение EPSG
  • неправильные matrixIds
  • отсутствие matching resolutions
  • использование WMS-конфигурации вместо WMTS Capabilities

Каждая ошибка приводит к симптомам:

  • пустая карта
  • «разорванные» тайлы
  • смещение слоя относительно базовой карты

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

В сложных системах конфигурация 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 с другими слоями

WMTS часто используется как базовый слой в комбинации с:

  • векторными слоями (VectorLayer)
  • растровыми WMS-слоями
  • интерактивными объектами

Порядок отрисовки критичен:

  • WMTS обычно находится в нижнем слое
  • векторные данные накладываются поверх
  • прозрачность регулируется через opacity