TileGrid и кастомные сетки

TileGrid — ключевой механизм управления тем, как пространственные данные разбиваются на тайлы и как эти тайлы соотносятся с координатами карты. В основе большинства слоёв с тайловой структурой (XYZ, WMTS, WMTS-KVP, XYZ raster, vector tiles) лежит именно TileGrid, определяющий масштабирование, разрешения, границы и систему индексации.

TileGrid описывает дискретную пространственную сетку, в которой карта представляется набором квадратных (или в редких случаях прямоугольных) тайлов фиксированного размера, обычно 256×256 пикселей. Каждый уровень масштабирования соответствует собственной сетке с уникальным разрешением.


Базовая модель TileGrid

Каждая тайловая сетка в OpenLayers определяется набором параметров:

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

Ключевая идея заключается в том, что каждый zoom level соответствует фиксированному коэффициенту пересчёта между пикселями и координатами карты.


TileGrid в XYZ-схеме

XYZ-схема является наиболее распространённой моделью тайлов. В ней:

  • координата X растёт слева направо
  • координата Y растёт сверху вниз
  • уровень zoom определяет степень детализации

Поведение сетки XYZ

На нулевом уровне (zoom = 0) вся карта представлена одним тайлом. При увеличении zoom каждый тайл делится на 4:

  • zoom 0 → 1 тайл
  • zoom 1 → 4 тайла
  • zoom 2 → 16 тайлов
  • zoom n → 4ⁿ тайлов

Математически это выражается через удвоение количества тайлов по каждой оси:

  • количество по X: 2ⁿ
  • количество по Y: 2ⁿ

Определение TileGrid для XYZ

import TileGrid from 'ol/tilegrid/TileGrid';
import { getWidth } from 'ol/extent';

const extent = [-20037508.342789244, -20037508.342789244,
                 20037508.342789244, 20037508.342789244];

const tileGrid = new TileGrid({
  extent: extent,
  tileSize: 256,
  resolutions: (function () {
    const resolutions = [];
    const maxResolution = getWidth(extent) / 256;

    for (let i = 0; i < 20; i++) {
      resolutions[i] = maxResolution / Math.pow(2, i);
    }

    return resolutions;
  })()
});

В этом примере создаётся классическая Web Mercator сетка, совпадающая с большинством онлайн-картографических сервисов.


Разрешения (resolutions) как основа масштабирования

Массив resolutions определяет, сколько единиц координат приходится на один пиксель.

Формула:

  • resolution = worldWidth / (tileSize × 2^zoom)

Где:

  • worldWidth — ширина охвата в координатах проекции
  • tileSize — размер тайла в пикселях

Значение resolutions

  • меньший resolution → более детализированная карта
  • больший resolution → более «грубое» отображение

Именно этот массив управляет визуальной логикой масштабирования слоя.


origin и система координат

Origin определяет начальную точку отсчёта сетки. В большинстве случаев используется:

  • верхний левый угол extent

Это связано с тем, что большинство тайловых схем (XYZ, WMTS) используют ось Y, направленную вниз.


Кастомные TileGrid

Кастомизация TileGrid используется в случаях:

  • нестандартных проекций
  • локальных координатных систем
  • оффлайн-карт
  • серверов WMTS с фиксированной матрицей
  • данных с ограниченным extent
  • неравномерных уровней масштабирования

TileGrid для локальной системы координат

const customExtent = [0, 0, 1000000, 1000000];

const customGrid = new TileGrid({
  extent: customExtent,
  origin: [0, 1000000],
  tileSize: 512,
  resolutions: [2000, 1000, 500, 250, 125]
});

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

  • отсутствует Web Mercator зависимость
  • zoom levels определены вручную
  • каждый уровень может иметь произвольное масштабирование

Несимметричные resolutions

В отличие от стандартной схемы 2ⁿ, кастомные сетки допускают произвольные коэффициенты:

resolutions: [1000, 750, 500, 300, 100]

Такая модель используется в кадастровых системах, инженерных ГИС и специализированных картографических сервисах.


TileGrid и WMTS

WMTS (Web Map Tile Service) требует строгого соответствия между серверной матрицей и клиентской сеткой.

Matrix IDs

Каждый zoom level в WMTS связан с matrixId:

const matrixIds = ['0', '1', '2', '3', '4'];

Пример WMTS TileGrid

const wmtsGrid = new TileGrid({
  origin: [-20037508, 20037508],
  resolutions: [156543.0339, 78271.5169, 39135.7584],
  matrixIds: ['0', '1', '2'],
  tileSize: 256
});

Связь TileGrid и проекций

TileGrid всегда связан с конкретной проекцией:

  • EPSG:3857 — стандарт для веб-карт
  • EPSG:4326 — географические координаты
  • кастомные EPSG — локальные системы

Проекция определяет:

  • единицы измерения
  • форму пространства
  • интерпретацию extent

TileGrid, в свою очередь, накладывает дискретную структуру на это пространство.


Ограничение области (extent clipping)

TileGrid может ограничивать загрузку тайлов рамками:

extent: [10, 10, 500, 500]

Это приводит к:

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

Поведение при выходе за extent

Если координаты выходят за пределы extent:

  • тайлы не запрашиваются
  • отображение становится пустым
  • некоторые источники используют wrapX для повторения мира

wrapX и глобальные сетки

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

wrapX: true

Это позволяет:

  • повторять мир по оси X
  • реализовать бесконечную прокрутку
  • корректно работать с XYZ плитками

TileGrid в этом случае предполагает глобальный extent.


Оптимизация TileGrid

Ключевые аспекты оптимизации:

1. Ограничение уровней zoom

Слишком большой диапазон zoom увеличивает количество вычислений:

  • лишние resolutions увеличивают память
  • увеличивается время расчёта tile coordinate

2. Подбор tileSize

  • 256×256 — стандарт
  • 512×512 — уменьшает количество запросов
  • 1024×1024 — используется в высокопроизводительных системах

TileGrid для векторных тайлов

Векторные тайлы используют ту же модель сетки, но:

  • данные хранятся в бинарном формате
  • стили применяются на клиенте
  • важна точная синхронизация resolutions

TileGrid обеспечивает согласованность геометрии и индексации.


Множественные TileGrid в одном проекте

Сложные карты могут использовать несколько сеток:

  • базовый слой (XYZ)
  • ортофото (WMTS)
  • кадастровый слой (custom grid)
  • векторные тайлы (Mapbox-like grid)

Каждый слой имеет собственный TileGrid, несовместимый по структуре с другими.


Смещение origin и нестандартные сетки

Изменение origin приводит к:

  • сдвигу всей сетки тайлов
  • изменению индексации X/Y
  • несовместимости с стандартными XYZ источниками

Пример:

origin: [minX, minY]

или

origin: [0, 0]

TileGrid и точность вычислений

При работе с большими extent возникают:

  • ошибки округления координат
  • смещения тайлов на высоких zoom уровнях
  • несоответствие между сервером и клиентом

Решение заключается в строгом согласовании:

  • resolutions
  • origin
  • matrixIds
  • tileSize

Итоговая структура TileGrid

TileGrid фактически объединяет:

  • географическую модель
  • дискретную сетку
  • систему масштабирования
  • индексирование тайлов
  • правила взаимодействия с сервером

Именно через TileGrid в OpenLayers реализуется универсальный механизм работы с тайловыми слоями любых форматов и уровней сложности.