Tiles, bounds, minzoom, maxzoom

В основе Mapbox GL JS лежит тайловая (tile-based) модель рендеринга карт, при которой географическое пространство разбивается на квадратные сегменты фиксированного размера. Эти сегменты — tiles — загружаются и отрисовываются динамически в зависимости от текущего положения карты, масштаба и видимой области.

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

Принцип работы тайлов

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

  • zoom level 0 — один тайл, покрывающий всю карту
  • zoom level 1 — 4 тайла
  • zoom level 2 — 16 тайлов
  • zoom level n — 4ⁿ тайлов

Каждый следующий уровень увеличивает детализацию, уменьшая площадь покрытия одного тайла. Тайлы идентифицируются координатами x, y и уровнем z.

Mapbox GL JS использует этот механизм как для растровых, так и для векторных слоёв, однако векторные тайлы дополнительно содержат структурированные геометрии и стили, применяемые на клиенте.


Bounds: ограничение области отображения

Параметр bounds задаёт географические границы, в пределах которых разрешено перемещение карты. Он определяет прямоугольник в координатах долготы и широты, ограничивая центрирование и панорамирование.

Формат bounds обычно представляет собой массив:

map.setMaxBounds([
  [west, south],
  [east, north]
]);

Где:

  • west — минимальная долгота
  • south — минимальная широта
  • east — максимальная долгота
  • north — максимальная широта

Поведение ограничения bounds

При установке границ карта перестаёт позволять пользователю:

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

При этом zoom-операции остаются активными, если не ограничены отдельно через minzoom и maxzoom.

Внутренне Mapbox GL JS корректирует центр карты таким образом, чтобы видимый viewport всегда оставался внутри допустимого прямоугольника, что требует пересчёта координат при каждом изменении состояния камеры.


minzoom: минимальный уровень масштаба

Параметр minzoom определяет минимальный уровень увеличения карты, ниже которого пользователь не может уменьшить масштаб.

map.setMinZoom(5);

Поведение при достижении minzoom

При попытке уменьшить масштаб ниже установленного значения:

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

Влияние на тайловую систему

Так как тайлы привязаны к уровням масштабирования, minzoom ограничивает доступ к более «глобальным» представлениям карты. Это особенно важно при работе с кастомными слоями, где низкие уровни zoom могут содержать агрегированные или упрощённые данные.

Пример практического эффекта:

  • при minzoom = 10 уровень 0–9 полностью исключается из рендеринга
  • сервер тайлов не получает запросов на эти уровни
  • клиентская часть не выполняет интерполяцию данных для запрещённых zoom-уровней

maxzoom: максимальный уровень масштаба

Параметр maxzoom задаёт верхнюю границу увеличения карты.

map.setMaxZoom(18);

Поведение при достижении maxzoom

При достижении максимального масштаба:

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

Роль в производительности и данных

Ограничение maxzoom используется для контроля:

  • объёма загружаемых данных
  • уровня детализации рендеринга
  • нагрузки на сеть и GPU

На высоких zoom-уровнях количество тайлов экспоненциально возрастает, поэтому ограничение помогает стабилизировать производительность.


Связь bounds и zoom-ограничений

bounds, minzoom и maxzoom работают совместно как система ограничения камеры.

Географические ограничения (bounds)

Контролируют:

  • положение центра карты
  • допустимую область перемещения

Масштабные ограничения (minzoom, maxzoom)

Контролируют:

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

При одновременном использовании:

  • bounds корректируют позицию камеры независимо от масштаба
  • zoom-ограничения фиксируют диапазон детализации
  • итоговое состояние камеры всегда удовлетворяет обоим условиям

Тайлы и пересечение с границами (clipping)

При движении карты на границе bounds происходит обрезка видимой области. Это влияет на загрузку тайлов:

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

Векторный рендеринг использует clipping на уровне слоя, где геометрия обрезается по viewport и bounds одновременно.


Поведение тайлов при изменении zoom

При каждом изменении масштаба происходит переход между уровнями тайловой пирамиды:

  • при увеличении zoom — загрузка более детализированных тайлов
  • при уменьшении zoom — возврат к менее детализированным уровням

Mapbox GL JS применяет механизм плавного интерполирования между уровнями:

  • тайлы соседних zoom уровней могут отображаться одновременно
  • используется cross-fade между слоями
  • данные переиспользуются через кеширование

Кеширование тайлов и влияние zoom-ограничений

Кеширование играет ключевую роль в производительности:

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

Ограничения zoom фактически определяют границы кешируемого пространства.


Практическое поведение системы при комбинированных ограничениях

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

  • setMaxBounds
  • setMinZoom
  • setMaxZoom

формируется замкнутая камера с четырьмя ограничениями:

  • западная граница
  • восточная граница
  • северная граница
  • южная граница
  • минимальный zoom
  • максимальный zoom

Камера перестаёт быть свободной системой навигации и превращается в детерминированное пространство, где каждое движение проверяется на соответствие ограничениям.


Особенности работы с глобальными и локальными данными

Векторные стили и источники данных часто имеют разные уровни доступности по zoom:

  • административные границы — доступны на средних zoom уровнях
  • здания и объекты — только на высоких zoom
  • континентальные слои — на низких zoom

minzoom и maxzoom используются для согласования этих слоёв, предотвращая ситуации, когда слой активен вне диапазона доступных данных.


Взаимодействие с источниками данных tileset

В конфигурации источников:

source: {
  type: 'vector',
  tiles: ['https://.../{z}/{x}/{y}.pbf'],
  minzoom: 0,
  maxzoom: 14
}

эти параметры задают собственные ограничения источника данных, которые работают совместно с глобальными minzoom и maxzoom карты.

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

  • тайлы не запрашиваются
  • слой может исчезнуть или перейти в fallback-режим
  • рендеринг продолжается на основе доступных данных

Тайловая синхронизация при инерции и анимациях

Во время анимаций карты:

  • zoom изменяется непрерывно
  • система предсказывает нужные тайлы заранее
  • выполняется prefetch соседних уровней

Если достигается maxzoom:

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

Если достигается minzoom:

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

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

Zoom в Mapbox GL JS можно интерпретировать как логарифмическую шкалу масштабирования:

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

Это объясняет экспоненциальный рост количества тайлов:

  • 1 → 4 → 16 → 64 → 256 …

Ограничения minzoom и maxzoom фактически обрезают эту экспоненциальную шкалу на определённом диапазоне.