Como mostrar/ocultar um MarkerCluster no Google Maps V3?
-
27-09-2019 - |
Pergunta
Eu preciso ter marcadores diferentes para diferentes mapType
s, e eu estou empurrando -os para um MarkerClusterer.
Eu "escondo" os marcadores com:
cluster.set("map", null);
cluster.resetViewport();
cluster.redraw();
E "mostre -os" com:
cluster.set("map", MAP);
cluster.resetViewport();
cluster.redraw();
O problema é que Markerclusterrer parece não gostar set("map", null)
; joga o erro TypeError: Object #<a MarkerClusterer> has no method 'remove'
. Como posso mostrá -los/escondê -los da maneira correta?
Solução 5
Eu lutei para resolver isso por um pequeno macaco e um pequeno hack. Ainda estou esperando uma resposta limpa, mas isso é Uma solução para o meu problema, então também estou postando isso:
MarkerClusterer.prototype.remove = function () {}
[..]
cluster.set("map", HIDDEN_MAP); // remove the clusterer
cluster.resetViewport();
cluster.redraw();
Outras dicas
Maneira elegante de limpar o cluster
cluster.clearMarkers();
Na API JavaScript V3, é suficiente dizer:
clusterer.setMap(null);
Se você definir seu mapa de volta para o objeto de mapa existente, os clusters reaparecerão.
clusterer.setMap( this.map );
Além disso, sugiro não nomear seu cluster 'Cluster', como no seu exemplo. O MarkerClusterer contém objetos de cluster, que são os marcadores em cluster e não o próprio cluster.
Aqui está uma solução mais completa:
em .html add:
<div id="map-canvas-hidden" style="display:none"></div>
<div id="map-canvas-shown" style="width:500px; height:500px"></div>
em .js adicione:
MarkerClusterer.prototype.remove = function() { };
var HIDDEN_MAP = new google.maps.Map(document.getElementById("map-canvas-hidden"), {});
var gmap = new google.maps.Map(document.getElementById("map-canvas-shown"), {});
Para mostrar os grupos:
cluster.setMap(gmap);
cluster.resetViewport();
cluster.redraw();
para esconder os aglomerados:
cluster.setMap(HIDDEN_MAP);
cluster.resetViewport();
cluster.redraw();
Finalmente, eu precisava dos seguintes remendos para MarkerClusterer.js:
--- markerclusterer.js.orig 2013-12-06 18:02:32.887516000 +0100
+++ markerclusterer.js 2013-12-06 18:03:25.487516924 +0100
@@ -620,6 +620,7 @@
*/
MarkerClusterer.prototype.getExtendedBounds = function(bounds) {
var projection = this.getProjection();
+ if (!projection) return null;
// Turn the bounds into latlng.
var tr = new google.maps.LatLng(bounds.getNorthEast().lat(),
@@ -657,7 +658,7 @@
* @private
*/
MarkerClusterer.prototype.isMarkerInBounds_ = function(marker, bounds) {
- return bounds.contains(marker.getPosition());
+ return bounds ? bounds.contains(marker.getPosition()) : false;
};
espero que isto ajude
Aqui está o meu código para mostrar/ocultar clusters facilmente no mapa (atualizado para as versões atuais da API do MAPS e do JS-Cluster Renderper). Obrigado Gabi.
MarkerClusterer.prototype.remove = function() {};
MarkerClusterer.prototype.hide = function() {
this.setMap(null);
this.resetViewport();
};
MarkerClusterer.prototype.show = function() {
this.setMap(map); // replace map with your reference to the map object
this.redraw();
};
// To hide the clusters:
cluster.hide();
// To show the clusters:
cluster.show();