В Mapbox GL JS масштаб (zoom) является одной из ключевых координат сцены наряду с центром карты и углом поворота. В отличие от классической двумерной графики, где объект фиксирован в системе координат, карта представляет собой многослойную проекцию данных, зависящую от уровня детализации.
Каждый уровень масштабирования определяет:
Zoom в Mapbox GL JS — не просто «увеличение», а переключатель семантики отображения данных.
Векторные и растровые тайлы организованы по схеме:
Каждый слой источника данных может иметь ограничения:
map.addSource('cities', {
type: 'vector',
url: 'mapbox://examples.cities'
});
И слой, использующий zoom-ограничения:
map.addLayer({
id: 'city-points',
type: 'circle',
source: 'cities',
'source-layer': 'places',
minzoom: 3,
maxzoom: 10
});
minzoom — слой начинает участвовать в рендере только с
указанного масштабаmaxzoom — слой перестаёт рендериться выше этого
масштабаВажно: это не фильтрация данных, а управление участием слоя в рендер-пайплайне.
Zoom становится встроенной переменной в системе выражений стилей.
["zoom"]
Используется внутри выражений:
map.addLayer({
id: 'roads',
type: 'line',
source: 'streets',
'source-layer': 'road',
paint: {
'line-width': [
'interpolate',
['linear'],
['zoom'],
5, 0.5,
10, 2,
15, 6
],
'line-opacity': [
'step',
['zoom'],
0,
8, 1
]
}
});
Наиболее частый способ масштабирования визуальных параметров:
"circle-radius": [
"interpolate",
["linear"],
["zoom"],
0, 1,
10, 4,
16, 10
]
Механика:
"line-width": [
"interpolate",
["exponential", 1.5],
["zoom"],
5, 0.5,
12, 5
]
Используется для более «естественного» роста толщины линий.
Иногда требуется дискретная смена стиля:
"text-size": [
"step",
["zoom"],
10,
10, 12,
14, 16,
18, 20
]
Поведение:
Step используется для резких переключений уровней детализации.
"fill-opacity": [
"interpolate",
["linear"],
["zoom"],
5, 0,
8, 0.7,
12, 1
]
filter: [
"all",
[">=", ["zoom"], 8]
]
Однако чаще используется minzoom/maxzoom, так как
фильтры вычисляются иначе и могут влиять на производительность.
Zoom используется для переключения уровней абстракции данных.
map.addLayer({
id: 'major-roads',
type: 'line',
source: 'streets',
'source-layer': 'road',
filter: ['==', ['get', 'class'], 'primary'],
minzoom: 5,
paint: {
'line-width': [
'interpolate',
['linear'],
['zoom'],
5, 1,
10, 2,
15, 6
]
}
});
map.addLayer({
id: 'minor-roads',
type: 'line',
source: 'streets',
'source-layer': 'road',
filter: ['==', ['get', 'class'], 'secondary'],
minzoom: 10,
paint: {
'line-width': [
'interpolate',
['linear'],
['zoom'],
10, 0.5,
15, 3
]
}
});
Система обеспечивает:
"text-size": [
"interpolate",
["linear"],
["zoom"],
3, 10,
10, 14,
16, 22
]
"text-opacity": [
"interpolate",
["linear"],
["zoom"],
5, 0,
7, 1
]
На низких zoom подписи часто скрываются, чтобы избежать:
При работе с точечными данными zoom напрямую влияет на кластеризацию:
map.addSource('points', {
type: 'geojson',
data: 'points.geojson',
cluster: true,
clusterMaxZoom: 12,
clusterRadius: 50
});
clusterMaxZoom точки объединяются в кластерыЭто один из наиболее важных zoom-dependent механизмов.
Zoom определяет количество отрисовываемых объектов:
Mapbox GL JS не масштабирует геометрию напрямую — вместо этого используются стили:
"circle-radius": [
"interpolate",
["linear"],
["zoom"],
0, 2,
10, 6,
18, 20
]
Это позволяет:
"circle-color": [
"interpolate",
["linear"],
["zoom"],
0, "#2c3e50",
10, "#e74c3c"
]
"icon-size": [
"case",
[">", ["zoom"], 12],
1.5,
1
]
Zoom фактически реализует концепцию Level of Detail:
Каждый слой карты строится с учётом этой шкалы.
Mapbox GL JS автоматически интерполирует стили между zoom-уровнями, обеспечивая плавность:
Пример:
transition: {
duration: 300,
delay: 0
}
Хотя transition не привязан напрямую к zoom, он усиливает визуальный эффект zoom-переходов.
Правильная архитектура карты строится вокруг zoom-слоёв:
Каждый слой проектируется с учётом диапазона видимости и поведения на границах zoom.
Сложные выражения interpolate на каждом свойстве слоя
могут ухудшить производительность.
Одновременное использование:
minzoomfilter с zoomможет приводить к неожиданным пропускам данных.
Приводит к:
Zoom в Mapbox GL JS — это не параметр камеры в классическом смысле, а фундаментальная переменная, управляющая:
Все стили, слои и источники фактически проектируются вокруг зависимости от масштаба.