Mise à jour de MarkerClusters
-
14-11-2019 - |
Question
J'ai une carte Google configurée avec des marqueurs fournis via un flux JSON. Puisqu'il y a un grand nombre de marqueurs impliqués (plus de 600), j'ai utilisé MarkerCluster V3 pour accélérer les choses. Tout fonctionne bien jusqu'à ce que j'essaie de modifier les marqueurs affichés via des boutons d'option. J'ai cette fonction affectée aux boutons radio:
function activities(markerarray,mapused,actType) {
for(i in markerarray) {
if(markerarray[i].activity[actType] == null) {
markerarray[i].setMap(null);
}
else {
markerarray[i].setMap(mapused);
}
}
return markerarray;
}
Cela empêchera les marqueurs de s'afficher sur la carte et fonctionne bien pour les marqueurs Google réels. Cependant, je ne semble pas pouvoir trouver comment mettre à jour le cluster qui a été créé lorsque la page est chargée.
La solution
J'ai eu le même problème et d'après ce que je pouvais dire, être la lecture du code source ... vous ne pouvez pas.
Je cache tous les éléments en arrière-plan en tant que marqueurs individuels, filtrez-les lorsque cela est nécessaire
displayItems: function(infilter){
this.markerCluster.clearMarkers();
var matches = infilter.matches(this.markers);
this.markerCluster.addMarkers(matches);
}
This.markers est mon cache de marqueurs et ce.markerCluster est mon objet de barre de MarkerC - les deux sont globaux.
Vous ne pouvez pas modifier directement un cluster, mais vous pouvez ajouter et supprimer des marqueurs à l'objet MarkerCluster à l'aide de Addmarker / Removemarker qui à son tour les supprimera d'un cluster et le redessier.
Autres conseils
Afin de mettre à jour un cluster, vous devez d'abord appeler resetViewport();
Méthode pour le cacher qu'utiliser redraw();
Méthode pour recalculer les clusters.
L'utilisation d'une fonction setMap (null) sur un marqueur ne le désinscrivez pas à partir d'un markercluster, pour ne pas vous inscrire, vous pouvez utiliser removeMarkers(marker, opt_nodraw)
ou removeMarkers(markers, opt_nodraw)
les fonctions. D'après mon expérience, ce sont des opérations coûteuses. Paramètre opt_nodraw
fonctionner pour true
Forcera aucun redessier qui améliorera la performance.
Vous pouvez d'abord supprimer un tas de marqueurs avec opt_nodraw
mis à true
et que resetViewport();
redraw();
plus tard manuellement.