Zoom-зависимые стили

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

Принцип масштабной зависимости в стилях

В системе стилей Mapbox GL каждый слой описывается объектом, где визуальные параметры задаются через свойства paint и layout. Эти параметры могут быть статическими или вычисляемыми на основе выражений.

Zoom рассматривается как непрерывная числовая переменная. На его основе изменяются такие свойства, как:

  • толщина линий
  • радиус точек
  • прозрачность заливок
  • видимость элементов
  • размеры символов

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

Zoom как входная переменная выражений

В Mapbox GL JS используется выражение ["zoom"], которое возвращает текущий уровень масштабирования карты. Оно применяется внутри выражений интерполяции и ступенчатых функций.

Пример линейной интерполяции:

circle-radius: [
  "interpolate",
  ["linear"],
  ["zoom"],
  5, 2,
  10, 8,
  15, 20
]

В этом случае радиус точек увеличивается по мере увеличения масштаба, обеспечивая читаемость данных при увеличении детализации.

Ступенчатое изменение свойств

Для дискретного поведения применяется выражение step, позволяющее задавать пороговые значения zoom:

line-width: [
  "step",
  ["zoom"],
  1,
  8, 2,
  12, 4,
  16, 8
]

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

Интерполяция и плавные переходы

Функция interpolate обеспечивает непрерывное изменение визуальных параметров. На практике это снижает визуальные артефакты при масштабировании карты.

fill-opacity: [
  "interpolate",
  ["linear"],
  ["zoom"],
  3, 0.2,
  6, 0.6,
  10, 1
]

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

Зависимость символов от масштаба

Текстовые и иконографические слои в Mapbox GL JS активно используют zoom-зависимость для управления:

  • размером шрифта
  • приоритетом отображения
  • появлением/исчезновением подписей
text-size: [
  "interpolate",
  ["linear"],
  ["zoom"],
  6, 10,
  10, 14,
  14, 20
]

Дополнительно применяются выражения видимости:

text-opacity: [
  "step",
  ["zoom"],
  0,
  8, 1
]

minzoom и maxzoom как ограничители диапазона

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

{
  "id": "roads",
  "type": "line",
  "source": "vector-source",
  "minzoom": 5,
  "maxzoom": 14
}

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

Масштабная генерализация геометрии

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

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

  • уменьшение количества визуальных элементов
  • увеличение толщины ключевых объектов
  • скрытие второстепенной информации

Комбинация zoom и data-driven styling

Zoom-зависимые стили часто комбинируются с атрибутами данных. В выражениях можно использовать как ["zoom"], так и свойства геометрии.

circle-radius: [
  "interpolate",
  ["linear"],
  ["zoom"],
  5, ["get", "base_size"],
  12, ["*", ["get", "base_size"], 3]
]

Такой подход позволяет одновременно учитывать масштаб и семантику данных.

Использование экспоненциальной интерполяции

Помимо линейной интерполяции поддерживается экспоненциальная, позволяющая нелинейно изменять визуальные параметры:

line-width: [
  "interpolate",
  ["exponential", 1.5],
  ["zoom"],
  5, 0.5,
  10, 2,
  15, 10
]

Это особенно полезно для имитации восприятия человеческого зрения, где изменения плотности карты не воспринимаются линейно.

Влияние zoom на производительность отрисовки

Zoom-зависимые стили напрямую влияют на количество активных слоёв и вычислений в рендерере Mapbox GL JS. Оптимизация достигается за счёт:

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

Чем сложнее выражение, тем выше стоимость пересчёта при изменении масштаба.

Управление визуальной иерархией через масштаб

Zoom используется как инструмент построения визуальной иерархии:

  • на малых масштабах отображаются агрегированные объекты
  • на средних масштабах появляются категории
  • на больших масштабах раскрываются детальные элементы
symbol-placement: "point",
text-size: [
  "interpolate",
  ["linear"],
  ["zoom"],
  4, 0,
  6, 10,
  12, 16
]

Такой подход позволяет управлять информационной плотностью без изменения источников данных.