Tile Map Service

Общая модель работы Tile Map Service

Tile Map Service (TMS) представляет собой стандартизированный способ публикации растровых тайлов изображений карты по фиксированной схеме разбиения пространства. Основная идея заключается в предварительном рендеринге карты на набор квадратных изображений (тайлов), которые хранятся на сервере и загружаются клиентом по запросу в зависимости от текущего положения камеры и уровня детализации.

Ключевая особенность TMS — иерархическая структура уровней масштабирования. Каждый последующий уровень увеличивает детализацию, разбивая тайлы предыдущего уровня на четыре дочерних:

  • уровень 0 — один тайл (вся карта)
  • уровень 1 — 2×2 тайла
  • уровень 2 — 4×4 тайла
  • уровень N — 2ⁿ × 2ⁿ тайлов

Такая структура обеспечивает предсказуемую загрузку данных и упрощает кеширование.

В контексте CesiumJS TMS используется как один из типов источников подложки (imagery provider), обеспечивая интеграцию классических 2D-карт в глобальную 3D-сцену.


Архитектура Tile Map Service

TMS-сервер обычно содержит три ключевых компонента:

1. Метаданные слоя Файл tilemapresource.xml описывает:

  • систему координат
  • bounding box слоя
  • форматы изображений
  • диапазон уровней масштабирования
  • размер тайла (обычно 256×256)

2. Дерево тайлов Файловая структура обычно выглядит следующим образом:

/{z}/{x}/{y}.png

или

/zoom/x/y.png

Где:

  • z — уровень масштабирования
  • x — индекс столбца
  • y — индекс строки

3. Статические изображения Каждый тайл — это готовое изображение, чаще всего PNG или JPEG, без динамической генерации на сервере.


Отличие TMS от других тайловых стандартов

TMS часто сравнивается с другими системами разбиения карты:

  • XYZ (Slippy Map Tiles) Использует обратную нумерацию оси Y (origin вверху слева)

  • WMTS (Web Map Tile Service) Более формализованный OGC-стандарт с поддержкой различных матриц тайлов

  • TMS Использует origin внизу слева, что является ключевым отличием

Это различие критично при интеграции источников данных, так как неправильная трактовка оси Y приводит к инверсии карты.


TileMapServiceImageryProvider в CesiumJS

В CesiumJS работа с TMS реализуется через TileMapServiceImageryProvider.

Базовая схема подключения:

import * as Cesium from "cesium";

const viewer = new Cesium.Viewer("cesiumContainer", {
    imageryProvider: false,
    baseLayerPicker: false
});

const tmsProvider = new Cesium.TileMapServiceImageryProvider({
    url: "https://example.com/tms/",
    fileExtension: "png",
    maximumLevel: 18
});

viewer.imageryLayers.addImageryProvider(tmsProvider);

Параметры TileMapServiceImageryProvider

url Базовый адрес TMS-сервера. Должен указывать на корень слоя, где расположен tilemapresource.xml.

fileExtension Формат тайлов:

  • png — без потерь, поддержка прозрачности
  • jpg — меньший размер, но без альфа-канала

maximumLevel Ограничивает максимальный уровень детализации, загружаемый клиентом. Используется для:

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

minimumLevel Минимальный уровень отображения слоя. Полезен для предотвращения чрезмерного увеличения глобальных тайлов.


Механизм загрузки тайлов в CesiumJS

При перемещении камеры CesiumJS выполняет следующие шаги:

  1. Определение текущего положения камеры в географических координатах
  2. Вычисление необходимого уровня детализации (LOD)
  3. Разбиение видимой области на сетку тайлов
  4. Формирование URL запросов к TMS-серверу
  5. Асинхронная загрузка изображений
  6. Кеширование тайлов в памяти и на диске

Система LOD в Cesium учитывает:

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

Геопривязка и проекции

TMS традиционно использует проекцию Web Mercator (EPSG:3857), что обеспечивает совместимость с большинством веб-картографических систем.

Однако важно учитывать:

  • искажения на высоких широтах
  • невозможность точного отображения полярных областей
  • линейное масштабирование по широте

CesiumJS автоматически преобразует координаты между:

  • WGS84 (географическая система)
  • Cartesian3 (внутренняя 3D-сцена)
  • Web Mercator (тайловая сетка)

Поведение тайлов при наклоне камеры

В 3D-сцене CesiumJS тайлы TMS не просто накладываются на плоскость, а проецируются на эллипсоид Земли.

При наклоне камеры:

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

Это достигается за счёт системы terrain and imagery layering, где TMS-слой комбинируется с геометрией поверхности.


Кеширование и оптимизация

CesiumJS использует многоуровневое кеширование:

1. Memory cache Хранит недавно использованные тайлы в оперативной памяти.

2. Request scheduler Контролирует количество одновременных HTTP-запросов.

3. Disk cache (через browser storage) Позволяет повторно использовать ранее загруженные тайлы между сессиями.


Обработка отсутствующих тайлов

Если сервер возвращает отсутствующий тайл:

  • CesiumJS может использовать fallback на более низкий уровень детализации
  • применяется правило parent tile substitution
  • визуально заполняется пробел ближайшим доступным изображением

Это предотвращает появление “дыр” в карте при неполных наборах данных.


Интеграция TMS с другими слоями

TMS-слои в CesiumJS могут комбинироваться с:

  • terrain providers (Cesium World Terrain)
  • vector tile layers
  • 3D Tiles (объекты зданий и инфраструктуры)
  • dynamic imagery (WMS/WMTS)

Порядок наложения влияет на визуальный результат:

  1. Terrain
  2. Imagery (TMS)
  3. 3D Tiles
  4. Labels и annotations

Пример комбинированной сцены

const viewer = new Cesium.Viewer("cesiumContainer");

const tmsLayer = new Cesium.TileMapServiceImageryProvider({
    url: "https://example.com/tms/roads/",
    fileExtension: "png"
});

viewer.imageryLayers.addImageryProvider(tmsLayer);

viewer.camera.setView({
    destination: Cesium.Cartesian3.fromDegrees(71.4304, 51.1282, 20000)
});

Масштабирование и производительность

Производительность TMS в CesiumJS зависит от:

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

Оптимизационные практики включают:

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

Ограничения Tile Map Service

Несмотря на простоту, TMS имеет ряд ограничений:

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

В современных системах TMS часто используется как базовый слой, поверх которого строятся более гибкие векторные или 3D-решения.


Внутреннее взаимодействие CesiumJS с TMS

Внутри CesiumJS TMS-интеграция проходит через abstraction layer imagery providers:

  • ImageryLayer — управление слоями
  • ImageryProvider — источник данных
  • TileDiscardPolicy — обработка пустых тайлов
  • RequestScheduler — контроль загрузки

Каждый тайл проходит жизненный цикл:

  • creation
  • request initiation
  • download
  • texture upload to GPU
  • rendering
  • eviction from cache

Роль TMS в современных веб-ГИС системах

TMS остаётся важной частью экосистемы веб-картографии благодаря:

  • простоте реализации серверной части
  • предсказуемости нагрузки
  • совместимости с legacy системами
  • легкости интеграции в WebGL-клиенты

В связке с CesiumJS он часто используется как базовый слой, обеспечивающий визуальную подложку для более сложных 3D-данных и аналитических сцен.