В Mapbox GL JS стилизация слоёв опирается на декларативную модель, в которой визуальные свойства напрямую зависят от состояния карты, включая уровень масштаба. Zoom-зависимые стили позволяют изменять внешний вид геометрии при изменении масштаба, обеспечивая адаптивную визуализацию данных без перерисовки источников.
В системе стилей Mapbox GL каждый слой описывается объектом, где
визуальные параметры задаются через свойства paint и
layout. Эти параметры могут быть статическими или
вычисляемыми на основе выражений.
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. Они определяют диапазон, в
котором слой участвует в рендеринге.
{
"id": "roads",
"type": "line",
"source": "vector-source",
"minzoom": 5,
"maxzoom": 14
}
Такой механизм снижает нагрузку на рендеринг и позволяет управлять уровнем детализации без вычисления дополнительных выражений.
Zoom-зависимые стили тесно связаны с концепцией генерализации данных. При уменьшении масштаба отображаются упрощённые представления объектов, при увеличении — более детализированные.
Векторные тайлы в Mapbox GL JS уже содержат данные, разделённые по уровням детализации, однако стилизация дополнительно адаптирует визуальное восприятие:
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-зависимые стили напрямую влияют на количество активных слоёв и вычислений в рендерере Mapbox GL JS. Оптимизация достигается за счёт:
minzoom /
maxzoomЧем сложнее выражение, тем выше стоимость пересчёта при изменении масштаба.
Zoom используется как инструмент построения визуальной иерархии:
symbol-placement: "point",
text-size: [
"interpolate",
["linear"],
["zoom"],
4, 0,
6, 10,
12, 16
]
Такой подход позволяет управлять информационной плотностью без изменения источников данных.