У меня есть карта с двумя типами маркеров, и до сих пор я предоставлял 2 флажка, которые давали возможность отображать / скрывать эти маркеры с помощью этого кода:
Флажки
<input type = "checkbox" id = "suggested" name = "suggested" onclick = "toggleMarkers('suggested')">
<label for = "suggested"> Suggested</label>
<input type = "checkbox" id = "organized" name = "organized" onclick = "toggleMarkers('organized')">
<label for = "organized"> Organized</label>
JavaScript
function toggleMarkers(type) {
switch(type)
{
case 'suggested':
for (var i = 0; i < suggested.length; i++) {
if (suggested[i].getMap() === null) {
suggested[i].setMap(map);
} else {
suggested[i].setMap(null);
}
}
break;
case 'organized':
for (var i = 0; i < organized.length; i++) {
if (organized[i].getMap() === null) {
organized[i].setMap(map);
} else {
organized[i].setMap(null);
}
}
break;
default: break;
}
}
где suggested
и organized
- 2 массива, содержащие маркеры соответствующего типа. Теперь я заметил, что при большом количестве маркеров этого недостаточно и карта может сбивать с толку, поэтому я решил ввести кластер маркеров. Я мог это сделать, достаточно было импортировать библиотеку и добавить
let suggestedCluster = new MarkerClusterer(map, suggested, {gridSize:80, styles:styles[0]});
let organizedCluster = new MarkerClusterer(map, organized, {gridSize:80, styles:styles[1]});
Проблема в том, что я хочу оставить функцию отображения / скрытия категории маркеров, но приведенный выше код больше не подходит для этого, он ведет себя неправильно. Как я могу показать / скрыть категорию кластеров, а также маркеры той же категории, которые не включены в кластер?
Согласно ссылка, MarkerClusterer
имеет методы addMarkers
и clearMarkers
.
function toggleClusterer(type){
switch(type)
{
case 'suggested':
toggle(suggestedCluster, suggested);
break;
case 'organized':
toggle(organizedCluster, organized);
break;
}
function toggle(clusterer, markers) {
if (clusterer.getMarkers().length == 0){
clusterer.addMarkers(markers);
} else {
clusterer.clearMarkers();
}
}
}
При этом я получаю в консоли сообщение TypeError: this.ma.remove is not a function
, относящееся к clusterer.setMap(null);
.
Почти готово. Теперь кластеризатор удаляется с карты, но при втором щелчке по флажку он больше не отображается. Я получил эту подсказку от моей IDE Invalid number of arguments, expected 1
для инструкции clusterer.setMap(map, markers);
, фактически глядя на подпись функции setMap, она принимает только карту в качестве параметра.
Ооо! Глупая ошибка. Эта строка должна читать clusterer.setMarkers(markers);
Функция setMarkers()
не определена. Я использую библиотеку v 1.0.3 для GMaps v3.
Я надеюсь, что это последняя правка. setMarkers
должен быть addMarkers
Конечно, теперь, когда я представил кластер маркеров, я больше не буду использовать простые маркеры, это было просто для объяснения ситуации. Я постараюсь реализовать то, что вы предложили.