Кластеризация нескольких слоев с помощью markercluster
В настоящее время я работаю над визуализацией карты с помощью библиотеки Leaflet. Я также использую плагин markercluster для кластеризации своих очков.
Итак, мой вопрос сейчас заключается в следующем:
У меня есть 3 разных категории маркеров в 3 разных слоях. Например, рестораны, кафе и бары. И я хочу объединить все активные слои в определенный кластер.
На данный момент записи сгруппированы отдельно, но я хочу объединить их вместе.
Следующим шагом будет раскраска кластера в соответствии с childMarkers. Например, кластер включает маркеры ресторанов и баров => наполовину красные / наполовину зеленые, только рестораны => только красные и т. Д.
Я надеюсь, что кто-нибудь может помочь мне найти решение. Спасибо!
1 ответ
В своем вопросе вы упомянули 2 разных запроса:
- Имеет 3 разных типа маркеров, но все они должны объединяться. Сложная часть, если вы хотите скрыть / показать определенный тип (возможно, через Layers Control).
- Настройка внешнего вида кластеров в зависимости от количества маркеров каждого типа.
Что касается пункта 1, очевидно, что вы можете добавить все 3 типа маркеров в одну и ту же группу MarkerClusterGroup, чтобы они могли объединяться в кластеры. Если у вас уже есть их в разных LayerGroups, вы можете просто сделать myMCG.addLayers([layerGroup1, layerGroup2, layerGroup3]);
и MCG добавит все отдельные маркеры. Но воздержитесь от добавления / удаления этих LayerGroups на / с карты позже!
Сложная часть - это когда вы хотите иметь возможность динамически добавлять / удалять маркеры определенного типа с карты. Вместо того, чтобы просто map.removeLayer(layerGroupX);
вам нужно будет перебрать все отдельные маркеры и удалить их из MCG, например:
layerGroupX.eachLayer(function (marker) {
myMCG.removeLayer(marker);
});
Смотрите также эту проблему на сайте плагинов MarkerClusterGroup по причинам и некоторым дополнительным примерам. Сделайте обратное для добавления маркеров обратно в MCG.
Изменить: с тех пор я опубликовал плагин https://github.com/ghybs/Leaflet.FeatureGroup.SubGroup, который решает этот конкретный случай использования. См. Также Использование нескольких групп кластеров маркеров, отображающих перекрывающиеся кластеры.
Что касается пункта 2, просто обратитесь к разделу " Настройка кластерных маркеров " документации плагина. В основном, вы используете опцию iconCreateFunction
при инициализации MCG. Вы передаете функцию, которая принимает один аргумент (например, cluster
) и вы можете использовать cluster.getAllChildMarkers();
чтобы получить массив содержащихся маркеров в стилизуемом кластере. Затем просто выполните итерацию по этому массиву, чтобы посчитать количество маркеров каждого типа, и соответственно создайте значок.
Вы также можете попробовать этот другой плагин: q-cluster. Но это не оживляет, так что это гораздо меньше, чем MCG...