Mapbox GL JS строится вокруг принципа тайловой пирамиды, где данные представлены на множестве уровней масштабирования. Каждый уровень zoom соответствует набору квадратных тайлов, содержащих географическую информацию в векторном или растровом виде.
Векторные тайлы делят мир на дискретную сетку:
Это ключевая основа уровней детализации (Level of Detail, LOD) в Mapbox GL JS. Вместо загрузки всех данных сразу, система динамически выбирает только те тайлы, которые соответствуют текущему масштабу и области просмотра.
LOD в данном контексте решает две задачи:
Zoom-уровень является центральной переменной всей визуальной модели. Он управляет:
Каждый слой в стиле может иметь ограничения:
minzoom — минимальный zoom, при котором слой
появляется;maxzoom — максимальный zoom, после которого слой
скрывается.Пример логики:
map.addLayer({
id: 'buildings',
type: 'fill-extrusion',
source: 'composite',
'source-layer': 'building',
minzoom: 15,
maxzoom: 22,
paint: {
'fill-extrusion-height': ['get', 'height']
}
});
Такой механизм позволяет разгружать рендерер и управлять детализацией не через условные конструкции, а декларативно.
LOD в Mapbox GL JS тесно связан с форматом векторных тайлов. Геометрия внутри тайлов упрощается на низких zoom-уровнях и становится более точной при увеличении масштаба.
Типичная стратегия генерации данных:
Такое разбиение позволяет избегать перегрузки GPU и CPU при отрисовке.
Mapbox использует этот принцип в своей инфраструктуре генерации тайлов, где данные предобрабатываются с учётом уровней детализации и оптимизируются под рендеринг в браузере.
Одной из ключевых возможностей LOD в Mapbox GL JS является zoom-адаптивная стилизация. Любое свойство может зависеть от масштаба через выражения.
'circle-radius': [
'interpolate',
['linear'],
['zoom'],
5, 2,
10, 6,
15, 12
]
Это означает, что радиус точки плавно увеличивается по мере приближения карты. Такой подход заменяет дискретные LOD-уровни плавной непрерывной моделью.
'text-size': [
'step',
['zoom'],
10,
8, 12,
12, 16
]
Здесь детализация текста меняется ступенчато: при достижении определённых уровней масштабирования включаются новые параметры отображения.
Каждый слой может существовать только в определённом диапазоне масштабов. Это фундаментальная часть управления детализацией.
minzoom: 0,
maxzoom: 6minzoom: 5,
maxzoom: 10minzoom: 9, maxzoom: 14minzoom: 14, maxzoom: 22Такой перекрывающийся диапазон позволяет избежать резких скачков визуализации.
LOD невозможен без генерализации геометрии. На низких zoom-уровнях:
Это снижает количество вершин, передаваемых в WebGL-пайплайн.
Векторные тайлы уже содержат упрощённые версии объектов, поэтому клиентская часть не выполняет тяжелую геометрическую обработку.
LOD также проявляется через плотность отображаемых объектов.
'filter': ['>=', ['zoom'], 10]
или более сложные условия:
'filter': [
'all',
['>=', ['zoom'], 12],
['has', 'population']
]
Это позволяет скрывать мелкие или несущественные объекты на низких уровнях масштабирования.
Для больших наборов точек применяется кластеризация. Она фактически является формой уровней детализации:
map.addSource('points', {
type: 'geojson',
data: 'data.geojson',
cluster: true,
clusterMaxZoom: 14,
clusterRadius: 50
});
Кластеры уменьшают нагрузку на рендеринг и повышают читаемость карты.
LOD проявляется не только в 2D, но и в 3D-слоях.
Пример: extrusion зданий
WebGL-пайплайн автоматически адаптирует уровень геометрической сложности под текущий масштаб.
LOD может зависеть не только от zoom, но и от состояния данных:
'fill-color': [
'case',
['>=', ['zoom'], 10],
'#ffcc00',
'#888888'
]
или комбинированные выражения:
[
'interpolate',
['linear'],
['zoom'],
8, ['get', 'lowColor'],
14, ['get', 'highColor']
]
Так создаётся контекстная детализация, где визуальная насыщенность растёт вместе с масштабом.
LOD в Mapbox GL JS поддерживается системой кеширования:
Это снижает стоимость переходов между уровнями масштаба.
Резкие скачки между zoom-уровнями сглаживаются:
LOD здесь работает не как дискретная система, а как непрерывная функция детализации.
LOD напрямую определяет нагрузку на рендеринг:
Mapbox GL JS использует WebGL как основу рендеринга, поэтому корректная настройка уровней детализации критически влияет на FPS и стабильность отображения.
Типичная архитектура карты строится слоями:
Каждый уровень активируется строго по zoom, создавая многоуровневую систему детализации, которая заменяет традиционные LOD-деревья из 3D-графики.
Разные источники данных могут иметь собственные уровни детализации:
Mapbox GL JS синхронизирует их через общий zoom-контекст, обеспечивая согласованное отображение независимо от типа источника.