При работе с большим количеством точек на карте кластеризация позволяет объединять близко расположенные объекты в группы и отображать их как единый кластер. По мере увеличения масштаба карты кластеры постепенно распадаются на более мелкие группы, а затем на отдельные точки.
Одним из важнейших параметров кластеризации в MapLibre GL JS является
clusterMaxZoom. Этот параметр определяет
максимальный уровень масштабирования, на котором движок продолжает
формировать кластеры.
Понимание принципов работы данного параметра позволяет добиться правильного поведения карты, улучшить производительность и повысить удобство взаимодействия с геоданными.
Параметр задаётся внутри источника GeoJSON:
map.addSource('earthquakes', {
type: 'geojson',
data: 'earthquakes.geojson',
cluster: true,
clusterMaxZoom: 12
});
Значение clusterMaxZoom определяет последний уровень
масштаба, на котором выполняется объединение объектов в кластеры.
Например:
clusterMaxZoom: 12
Означает следующее:
| Zoom | Поведение |
|---|---|
| 0–12 | Кластеризация активна |
| 13+ | Кластеры больше не создаются |
После превышения указанного уровня каждая точка начинает отображаться самостоятельно.
Если параметр не указан:
map.addSource('places', {
type: 'geojson',
data: data,
cluster: true
});
MapLibre использует значение по умолчанию:
clusterMaxZoom: 14
То есть кластеризация работает до масштаба 14 включительно.
Практически это означает, что на городском уровне карта может всё ещё отображать группы объектов, а при дальнейшем приближении показывать отдельные точки.
Предположим, карта поддерживает масштабирование до 20:
new maplibregl.Map({
container: 'map',
style: style,
zoom: 5,
maxZoom: 20
});
Источник данных:
clusterMaxZoom: 10
Тогда поведение будет следующим:
Zoom 5 → крупные кластеры
Zoom 8 → кластеры мельче
Zoom 10 → последние кластеры
Zoom 11 → отдельные точки
Zoom 20 → отдельные точки
Важно понимать, что после достижения порога кластеризация полностью отключается для текущего представления карты.
Рассмотрим источник с большим количеством объектов.
map.addSource('restaurants', {
type: 'geojson',
data: restaurants,
cluster: true,
clusterMaxZoom: 15,
clusterRadius: 50
});
Параметры означают:
При увеличении масштаба:
Zoom 5 → большие группы ресторанов
Zoom 10 → средние группы
Zoom 15 → последние группы
Zoom 16 → отдельные рестораны
Иногда требуется быстро раскрывать кластеры.
Пример:
clusterMaxZoom: 8
Такой подход полезен для:
Поведение:
Zoom 0–8 → кластеры
Zoom 9+ → отдельные точки
Преимущества:
Недостатки:
Для очень плотных наборов данных часто используют большие значения.
Например:
clusterMaxZoom: 18
Такой вариант подходит для:
Поведение:
Zoom 0–18 → кластеризация
Zoom 19+ → отдельные точки
Преимущества:
Недостатки:
Часто возникает путаница между двумя параметрами:
maxZoom
и
clusterMaxZoom
Это совершенно разные настройки.
Определяет максимальный масштаб карты.
maxZoom: 20
Пользователь не сможет приблизить карту сильнее.
Определяет максимальный масштаб кластеризации.
clusterMaxZoom: 14
После 14 уровня отображаются отдельные объекты.
Пример:
maxZoom: 22
clusterMaxZoom: 12
Тогда:
0–12 → кластеры
13–22 → отдельные точки
Параметр максимального масштаба тесно связан с радиусом кластера.
Пример:
clusterRadius: 80,
clusterMaxZoom: 16
Большой радиус создаёт крупные группы.
На масштабе 16 кластеры всё ещё будут содержать значительное количество объектов.
Другой пример:
clusterRadius: 20,
clusterMaxZoom: 16
Кластеры начнут распадаться значительно раньше.
Поэтому настройка этих параметров обычно выполняется совместно.
До нескольких тысяч объектов:
clusterMaxZoom: 10
или
clusterMaxZoom: 12
Такси, кафе, магазины:
clusterMaxZoom: 14
или
clusterMaxZoom: 15
Сотни тысяч объектов:
clusterMaxZoom: 16
или
clusterMaxZoom: 17
Очень плотные данные:
clusterMaxZoom: 18
или
clusterMaxZoom: 19
MapLibre предоставляет информацию о кластере через специальные методы.
Например:
map.on('click', 'clusters', (e) => {
const features = map.queryRenderedFeatures(
e.point,
{ layers: ['clusters'] }
);
const clusterId =
features[0].properties.cluster_id;
const source =
map.getSource('sensors');
source.getClusterExpansionZoom(
clusterId,
(err, zoom) => {
if (err) return;
map.easeTo({
center: features[0].geometry.coordinates,
zoom: zoom
});
}
);
});
Метод:
getClusterExpansionZoom()
возвращает масштаб, на котором выбранный кластер распадётся на более мелкие кластеры либо на отдельные точки.
Этот механизм автоматически учитывает значение
clusterMaxZoom.
Сама кластеризация выполняется эффективно благодаря использованию алгоритмов пространственной индексации.
Однако выбор неправильного значения может влиять на производительность интерфейса.
Слишком низкое значение:
clusterMaxZoom: 6
может привести к отображению десятков тысяч объектов одновременно.
Слишком высокое значение:
clusterMaxZoom: 20
сохраняет производительность, но может ухудшать удобство анализа данных.
Поэтому необходимо находить баланс между:
Источник данных с объектами недвижимости:
map.addSource('properties', {
type: 'geojson',
data: properties,
cluster: true,
clusterRadius: 60,
clusterMaxZoom: 15
});
Слои отображения:
map.addLayer({
id: 'clusters',
type: 'circle',
source: 'properties',
filter: ['has', 'point_count']
});
map.addLayer({
id: 'cluster-count',
type: 'symbol',
source: 'properties',
filter: ['has', 'point_count']
});
map.addLayer({
id: 'unclustered',
type: 'circle',
source: 'properties',
filter: ['!', ['has', 'point_count']]
});
Результат работы:
Масштаб 5 → крупные группы объектов
Масштаб 10 → районы и кварталы
Масштаб 15 → небольшие локальные группы
Масштаб 16 → отдельные здания
Масштаб 20 → максимальная детализация
Подобная схема считается одной из наиболее распространённых для карт недвижимости, сервисов доставки, каталогов организаций и городских геоинформационных систем.
При настройке кластеризации полезно учитывать несколько правил:
clusterMaxZoom;14–16;10–12;clusterRadius;Грамотная настройка clusterMaxZoom позволяет добиться
плавного перехода от обзорной карты с компактными кластерами к
детальному представлению отдельных географических объектов без потери
производительности и удобства работы.