В источниках типа geojson в Mapbox GL JS включается
механизм кластеризации, позволяющий объединять близко расположенные
точки в единые визуальные группы. При взаимодействии с такими группами
часто требуется получить исходные объекты, входящие в конкретный
кластер. Для этого используется метод getClusterLeaves,
предоставляемый источником данных (GeoJSONSource).
getClusterLeavesМетод предназначен для извлечения «листьев» кластера — исходных точек, которые были агрегированы в один кластер.
Сигнатура:
source.getClusterLeaves(clusterId, limit, offset, callback);
clusterId (number) Идентификатор кластера,
полученный из свойства cluster_id. Используется для
указания конкретного кластера, из которого необходимо извлечь
элементы.
limit (number) Максимальное количество возвращаемых элементов. Используется для ограничения объёма выборки и управления производительностью при больших кластерах.
offset (number) Смещение в списке элементов кластера. Позволяет реализовать постраничную выборку (pagination), когда кластер содержит большое количество точек.
callback (function) Функция обратного вызова, которая вызывается после получения данных.
Сигнатура callback:
function(error, features)
error — объект ошибки, если операция завершилась
неудачноfeatures — массив GeoJSON Feature объектов, входящих в
кластерМетод выполняет запрос к источнику данных и возвращает исходные точки, которые были агрегированы в указанный кластер. Эти данные соответствуют исходным GeoJSON-объектам до применения алгоритма кластеризации.
Особенности поведения:
limit и
offsetmap.on('click', 'clusters-layer', (e) => {
const features = map.queryRenderedFeatures(e.point, {
layers: ['clusters-layer']
});
const clusterId = features[0].properties.cluster_id;
const source = map.getSource('earthquakes');
source.getClusterLeaves(clusterId, 10, 0, (err, leaves) => {
if (err) return;
console.log(leaves);
});
});
В данном примере:
cluster_idПри работе с крупными кластерами часто используется комбинация
limit и offset.
function loadAllLeaves(source, clusterId, accumulated = [], offset = 0) {
source.getClusterLeaves(clusterId, 100, offset, (err, leaves) => {
if (err) return;
accumulated.push(...leaves);
if (leaves.length === 100) {
loadAllLeaves(source, clusterId, accumulated, offset + 100);
} else {
console.log('Все элементы кластера:', accumulated);
}
});
}
Такой подход позволяет последовательно извлечь все элементы, избегая перегрузки памяти и сетевых операций.
cluster: true)getClusterLeaves применяется в сценариях, где требуется
детальный доступ к данным внутри кластера:
Mapbox GL JS предоставляет несколько методов для работы с кластерами:
getClusterExpansionZoom — вычисляет уровень
масштабирования для раскрытия кластераgetClusterChildren — возвращает непосредственные
дочерние элементы кластераgetClusterLeaves — возвращает конечные исходные точки
кластераВ отличие от getClusterChildren, метод
getClusterLeaves всегда возвращает именно исходные
геообъекты, а не промежуточные кластеры, что делает его более затратным
при больших наборах данных, но точным для детального анализа.
Типичные ситуации, приводящие к ошибке:
clusterIdОбработка ошибки выполняется через первый аргумент callback:
source.getClusterLeaves(id, 10, 0, (err, leaves) => {
if (err) {
console.error(err);
return;
}
// обработка данных
});