Схемы тайловых сеток

Тайловая сетка (tile grid) определяет структуру разбиения карты на фиксированные прямоугольные изображения-тайлы. В OpenLayers именно тайловая сетка задаёт, какие тайлы запрашиваются, в каком масштабе и с какими координатными привязками.

Основные характеристики тайловой сетки:

  • система координат (projection)
  • набор масштабов (resolutions)
  • географический охват (extent)
  • начальная точка отсчёта (origin)
  • размер тайла (tileSize)
  • идентификаторы уровней масштаба (zoom levels / matrixIds)

XYZ-схема тайлов

Наиболее распространённая модель — XYZ, используемая в большинстве веб-картографических сервисов.

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

  • ось X увеличивается слева направо
  • ось Y увеличивается сверху вниз
  • координаты тайла имеют вид z/x/y
  • каждая ступень зума увеличивает число тайлов в 2 раза по каждой оси

Базовая логика:

  • при zoom = 0 существует один тайл
  • при zoom = 1 — 2×2
  • при zoom = 2 — 4×4 и так далее

В OpenLayers эта схема реализуется через createXYZ:

import TileLayer from 'ol/layer/Tile';
import XYZ from 'ol/source/XYZ';
import {createXYZ} from 'ol/tilegrid';

const tileGrid = createXYZ({
  tileSize: 256,
  maxZoom: 19
});

const layer = new TileLayer({
  source: new XYZ({
    url: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
    tileGrid: tileGrid
  })
});

Ключевая особенность XYZ-схемы — универсальность и отсутствие необходимости в дополнительной метаинформации о матрицах.


WMTS и матричная модель тайлов

WMTS (Web Map Tile Service) использует более строгую модель — Tile Matrix Set.

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

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

В OpenLayers это реализуется через ol/tilegrid/WMTS.

Основные элементы:

  • origin — точка отсчёта (обычно верхний левый угол)
  • resolutions — массив разрешений для каждого уровня
  • matrixIds — идентификаторы уровней
  • tileSize — размер тайла (обычно 256 или 512)

Пример настройки WMTS:

import WMTS from 'ol/source/WMTS';
import WMTSTileGrid from 'ol/tilegrid/WMTS';

const tileGrid = new WMTSTileGrid({
  origin: [-20037508.3428, 20037508.3428],
  resolutions: [
    156543.0339,
    78271.5169,
    39135.7584,
    19567.8792
  ],
  matrixIds: ['0', '1', '2', '3'],
  tileSize: 256
});

const source = new WMTS({
  url: 'https://example.com/wmts',
  layer: 'layer_name',
  matrixSet: 'EPSG:3857',
  format: 'image/png',
  tileGrid: tileGrid
});

WMTS требует строгого соответствия между сервером и клиентской конфигурацией. Несовпадение resolutions или matrixIds приводит к смещению тайлов.


Resolutions и связь с масштабами

Массив resolutions является центральным элементом тайловой сетки.

Каждое значение определяет:

  • сколько метров в одном пикселе на данном уровне
  • плотность отображаемой информации
  • фактический zoom level

Типичная схема для EPSG:3857:

resolutions: [
  156543.033928,
  78271.516964,
  39135.758482,
  19567.879241,
  9783.939620,
  4891.969810
]

Связь между zoom и resolution:

  • увеличение zoom → уменьшение resolution в 2 раза
  • переход между уровнями является дискретным

Origin и система отсчёта

origin задаёт точку, от которой начинается разбиение на тайлы.

Чаще всего используются два варианта:

Верхний левый угол (WMTS, Google XYZ)

origin: [-20037508.342789244, 20037508.342789244]

Нижний левый угол (TMS)

Используется реже и требует инверсии оси Y.

Разница между схемами:

  • XYZ: Y растёт вниз
  • TMS: Y растёт вверх

OpenLayers по умолчанию ориентирован на XYZ-логику.


TileGrid и географический extent

extent ограничивает область, в которой действуют тайлы.

extent: [-180, -85, 180, 85]

В проекции EPSG:3857 extent обычно задаётся в метрах:

extent: [-20037508, -20037508, 20037508, 20037508]

Использование extent влияет на:

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

createXYZ и автоматическая генерация сетки

Функция createXYZ формирует стандартную сетку для большинства веб-карт.

import {createXYZ} from 'ol/tilegrid';

const grid = createXYZ({
  extent: undefined,
  tileSize: 256,
  maxZoom: 22,
  minZoom: 0
});

Алгоритм работы:

  • вычисляется начальная resolution
  • далее она делится пополам на каждом zoom
  • формируется равномерная сетка

Эта модель оптимизирована под:

  • OSM
  • Google Maps
  • Bing Maps
  • большинство XYZ-источников

Нестандартные тайловые сетки

OpenLayers позволяет задавать произвольные схемы:

Изменённый размер тайлов

tileSize: 512

Увеличение размера тайла уменьшает количество HTTP-запросов, но увеличивает нагрузку на рендеринг.


Неполные или ограниченные уровни масштабов

resolutions: [
  1000,
  500,
  200,
  100
]

Используется при работе с:

  • внутренними ГИС
  • CAD-данными
  • локальными картографическими системами

Смещённые origin и локальные системы координат

origin: [0, 0]

Применяется в:

  • игровых картах
  • инженерных схемах
  • плоских координатных системах

Связь TileGrid с источниками данных

TileGrid напрямую используется в различных источниках OpenLayers:

  • ol/source/XYZ
  • ol/source/WMTS
  • ol/source/TileWMS
  • ol/source/TileImage

Пример с WMS:

import TileWMS from 'ol/source/TileWMS';

const source = new TileWMS({
  url: 'https://example.com/wms',
  params: {
    LAYERS: 'layer'
  },
  tileGrid: tileGrid
});

При несоответствии сетки сервер возвращает:

  • смещённые изображения
  • пустые тайлы
  • артефакты наложения

MatrixIds и идентификаторы уровней

В WMTS каждый zoom level имеет свой идентификатор:

matrixIds: ['0', '1', '2', '3', '4']

Или более сложные схемы:

matrixIds: ['EPSG:3857:0', 'EPSG:3857:1', 'EPSG:3857:2']

Назначение:

  • соответствие серверным конфигурациям
  • возможность нестандартной нумерации уровней
  • интеграция с государственными ГИС

Координатная привязка тайлов

Каждый тайл определяется формулой:

  • X = (longitude + 180) / 360 × 2^z
  • Y зависит от проекции Mercator

В OpenLayers преобразования выполняются через внутренние функции проекций (ol/proj), что позволяет поддерживать:

  • EPSG:3857
  • EPSG:4326
  • пользовательские CRS

Кэширование и влияние тайловой сетки

Тайловая сетка напрямую влияет на стратегию кеширования:

  • одинаковые tileGrid → повторное использование кеша
  • разные resolutions → раздельные кеши
  • разные origin → несовместимые тайлы

Ключ кеша формируется из:

  • z/x/y
  • projection
  • tileGrid параметров

Сложные схемы и комбинированные тайловые сетки

В некоторых системах используются гибридные подходы:

  • разные tileGrid для разных слоёв
  • переключение сеток в зависимости от масштаба
  • адаптивные resolutions

Пример:

const gridLowZoom = createXYZ({ maxZoom: 10 });
const gridHighZoom = createXYZ({ minZoom: 10, maxZoom: 22 });

Такая схема применяется при:

  • объединении растровых и векторных данных
  • оптимизации производительности
  • смешанных источниках

Ограничения и поведение при несоответствии сеток

Если tileGrid не соответствует серверу:

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

Критические параметры:

  • resolution mismatch
  • wrong origin
  • incorrect matrixIds
  • неверный tileSize

Каждый из этих факторов приводит к геометрическому расхождению слоёв.


Геометрическая интерпретация тайловой сетки

Тайловая сетка представляет собой:

  • дискретизацию непрерывного пространства
  • иерархическую систему разбиения
  • структуру пространственного индекса

В математическом смысле:

  • карта проецируется в квадратную решётку
  • каждый zoom — отдельная масштабная дискретизация
  • каждый тайл — элемент сетки с фиксированной областью покрытия