В библиотеке Mapbox GL JS кластеризация точек реализуется через
алгоритм Supercluster, обеспечивающий эффективное объединение
географических объектов в кластеры на разных уровнях масштабирования.
Поведение кластеризации полностью определяется набором параметров,
которые передаются при создании экземпляра
Supercluster.
radius определяет радиус кластеризации
в пикселях. Этот параметр задаёт максимальное расстояние между точками
на экране, при котором они объединяются в один кластер.
40Увеличение radius приводит к более агрессивной
кластеризации: больше точек объединяются в меньшие группы. Уменьшение,
наоборот, делает кластеры более детализированными.
Практическое влияние:
maxZoom определяет максимальный уровень
масштабирования, на котором происходит кластеризация.
16При увеличении зума выше maxZoom кластеры перестают
формироваться, и отображаются отдельные точки.
Ключевые особенности:
minZoom задаёт минимальный уровень
масштабирования, с которого начинается кластеризация.
0Если установлен высокий minZoom, то на малых масштабах
точки отображаются отдельно, без объединения.
Используется для:
extent задаёт размер тайловой сетки в
пикселях, используемой для разбиения данных при построении индекса.
512Алгоритм Supercluster делит карту на квадратные тайлы, внутри которых
происходит группировка точек. Параметр extent определяет
разрешение этой сетки.
Влияние:
Обычно используется значение 512 как компромисс между точностью и производительностью.
nodeSize определяет размер узла дерева
индекса в байтах.
64Этот параметр влияет на структуру R-tree, используемую для хранения точек.
Эффекты изменения:
Рекомендуемые сценарии:
Функция map вызывается для каждого
объекта перед кластеризацией. Позволяет преобразовать свойства
данных.
Сигнатура:
map: (props) => {
return {
category: props.type,
value: props.value
};
}
Используется для:
Функция reduce выполняется при
объединении точек в кластер и отвечает за агрегацию пользовательских
свойств.
reduce: (accumulated, props) => {
accumulated.count += props.count;
accumulated.totalValue += props.value;
}
Особенности:
log — отладочный параметр.
falseПри включении выводит информацию о процессе построения кластеров. Используется для диагностики производительности и проверки корректности данных.
Типичная конфигурация для интерактивных карт с большим количеством точек:
import Supercluster from 'supercluster';
const index = new Supercluster({
radius: 40,
maxZoom: 16,
minZoom: 0,
extent: 512,
nodeSize: 64,
map: props => ({
category: props.category
}),
reduce: (acc, props) => {
acc.count += 1;
}
});
Кластеризация является вычислительно затратной операцией при больших объёмах данных, поэтому параметры напрямую влияют на:
Наиболее критичные параметры:
nodeSize (баланс памяти и скорости)extent (точность vs производительность)radius (количество кластеров и нагрузка на рендер)При использовании кластеров в Mapbox GL JS Supercluster работает
скрыто через GeoJSON source с параметром cluster: true.
Пример конфигурации источника:
map.addSource('points', {
type: 'geojson',
data: geojsonData,
cluster: true,
clusterRadius: 40,
clusterMaxZoom: 16
});
Параметры clusterRadius и clusterMaxZoom
являются прямым отражением radius и maxZoom
Supercluster, но применяются на уровне API карты.
Кластеризация строится заранее для всех уровней zoom, что позволяет:
При изменении параметров требуется полная пересборка индекса, что важно учитывать в динамических приложениях.
При использовании map и reduce формируется
структура кластера, которая затем доступна через свойства объекта:
cluster_idpoint_countПример расширенной агрегации:
reduce: (acc, props) => {
acc.sum += props.price;
acc.max = Math.max(acc.max, props.price);
}
Такая модель позволяет строить аналитические слои поверх географических данных без дополнительной обработки на стороне UI.