Параметр clusterMaxZoom определяет максимальный уровень масштабирования карты, на котором выполняется кластеризация точек в GeoJSON-источнике. При достижении или превышении этого значения кластеризация отключается, и вместо агрегированных кластеров отображаются отдельные точки.
В контексте Mapbox GL JS кластеризация реализуется на уровне
источника данных (GeoJSONSource) и тесно связана с
алгоритмом разбиения точек на группы. Основная цель — уменьшение
визуальной перегрузки и оптимизация производительности при работе с
большим количеством объектов.
Кластеризация включается через параметр cluster: true в
источнике GeoJSON. Внутри используется алгоритм, основанный на
пространственной индексации (в частности, Supercluster, используемый в
экосистеме Mapbox).
Основные параметры:
cluster: true — включает кластеризациюclusterRadius — радиус объединения точек в
пикселяхclusterMaxZoom — максимальный zoom, на котором
создаются кластерыПример конфигурации источника:
map.addSource('points', {
type: 'geojson',
data: 'points.geojson',
cluster: true,
clusterRadius: 50,
clusterMaxZoom: 14
});
При достижении значения clusterMaxZoom происходит
следующее:
point_count,
cluster_id) больше не генерируются для новых уровней
масштабирования;cluster: true, перестают
обновлять агрегацию.Это поведение критично для баланса между производительностью и точностью отображения.
Кластеризация в Mapbox GL JS основана на многократном разбиении данных по уровням zoom. На каждом уровне создаётся набор кластеров, которые могут быть рекурсивно разбиты на более мелкие кластеры.
clusterMaxZoom задаёт верхнюю границу этой иерархии.
Упрощённо процесс выглядит так:
Эти параметры часто путаются, но они управляют разными аспектами:
Таким образом:
clusterRadius регулирует как сильно
объединятьclusterMaxZoom регулирует когда перестать
объединятьПри увеличении масштаба карта проходит несколько стадий отображения:
Низкий zoom
Средний zoom
Высокий zoom (но ниже clusterMaxZoom)
zoom ≥ clusterMaxZoom
Типичная реализация включает три слоя:
map.addLayer({
id: 'clusters',
type: 'circle',
source: 'points',
filter: ['has', 'point_count'],
paint: {
'circle-color': '#51bbd6',
'circle-radius': 18
}
});
map.addLayer({
id: 'cluster-count',
type: 'symbol',
source: 'points',
filter: ['has', 'point_count'],
layout: {
'text-field': '{point_count_abbreviated}'
}
});
map.addLayer({
id: 'unclustered-point',
type: 'circle',
source: 'points',
filter: ['!', ['has', 'point_count']],
paint: {
'circle-color': '#f28cb1',
'circle-radius': 6
}
});
На zoom >= clusterMaxZoom слой clusters перестаёт
получать данные, удовлетворяющие фильтру point_count.
clusterMaxZoom напрямую влияет на баланс нагрузки:
слишком высокий clusterMaxZoom
слишком низкий clusterMaxZoom
В экосистеме Mapbox оптимальные значения обычно подбираются эмпирически в зависимости от плотности данных.
При переходе через порог zoom может наблюдаться резкая визуальная смена:
Если точки распределены неравномерно:
При обновлении источника (setData) перерасчёт кластеров
происходит заново, и clusterMaxZoom применяется повторно ко всей
структуре.
clusterMaxZoom не является визуальным фильтром в стиле слоя — это параметр источника. Однако его поведение может косвенно сочетаться с фильтрами:
['has', 'point_count'] — определяет кластер['!', ['has', 'point_count']] — одиночная точкаПосле достижения clusterMaxZoom второй фильтр становится единственным активным.
Внутри GeoJSONSource параметр clusterMaxZoom влияет на:
Это снижает необходимость пересчёта кластеров на клиенте при каждом изменении zoom.
Типичные конфигурации:
Если параметр не задан:
Это может приводить к избыточной агрегации на средних уровнях масштаба.
В интерфейсах карт, построенных на Mapbox GL JS, clusterMaxZoom часто используется для:
При этом логика UI часто опирается на событие zoomend,
где проверяется текущий zoom относительно clusterMaxZoom для
переключения режимов отображения.