441 votes

API Google Maps v3 : comment supprimer tous les marqueurs ?

Dans l'API Google Maps v2, si je voulais supprimer tous les marqueurs de carte, je pouvais simplement le faire :

map.clearOverlays();

Comment faire dans l'API de Google Maps v3 ?

En regardant le API de référence c'est pas clair pour moi.

3 votes

J'ai trouvé un peu de code au lien ci-dessous, mais bon sang - c'est beaucoup de code pour simuler la précédente ligne de code dans la v2 de l'API. lootogo.com/googlemapsapi3/markerPlugin.html

2 votes

N'oubliez pas que maps 3.0 est censé être TRÈS léger afin que les appareils mobiles puissent l'utiliser avec le moins de décalage possible...

1 votes

Les solutions proposées ici semblent ne pas fonctionner à partir du 29/07/2010. J'aimerais avoir une version fonctionnelle à proposer à la place.

495voto

Il suffit de faire ce qui suit :

I. Déclarer une variable globale :

var markersArray = [];

II. Définissez une fonction :

function clearOverlays() {
  for (var i = 0; i < markersArray.length; i++ ) {
    markersArray[i].setMap(null);
  }
  markersArray.length = 0;
}

OU

google.maps.Map.prototype.clearOverlays = function() {
  for (var i = 0; i < markersArray.length; i++ ) {
    markersArray[i].setMap(null);
  }
  markersArray.length = 0;
}

III. Placez les marqueurs dans le 'markerArray' avant d'appeler ce qui suit :

markersArray.push(marker);
google.maps.event.addListener(marker,"click",function(){});

IV. Appelez le clearOverlays(); ou map.clearOverlays(); à chaque fois que cela est nécessaire.

C'est ça !

33 votes

For..in boucle avec un Array ? cela ne peut pas être bon sûrement ? ..voir : stackoverflow.com/questions/500504/

5 votes

Vous pouvez également masquer les marqueurs à l'aide de la fonction marker.setVisible(false).

0 votes

De cette façon, les marqueurs sont juste cachés de la carte, ou ils sont complètement supprimés ? Je pose cette question car après les avoir supprimés, je dois ajouter de nouveaux marqueurs à la carte.

85voto

Pons Points 1010

Même problème. Ce code ne fonctionne plus.

Je l'ai corrigé, changez la méthode clearMarkers de cette façon :

set_map(null) ---> setMap(null)

google.maps.Map.prototype.clearMarkers = function() {
    for(var i=0; i < this.markers.length; i++){
        this.markers[i].setMap(null);
    }
    this.markers = new Array();
};

La documentation a été mise à jour pour inclure des détails sur ce sujet : https://developers.google.com/maps/documentation/javascript/markers#remove

1 votes

La façon dont j'ai finalement réussi à le faire fonctionner était d'itérer à travers la collection de marqueurs où je les ai stockés et d'utiliser setMap(null)

4 votes

Mais est-ce que cela efface les marqueurs de la mémoire ? Je sais que JavaScript dispose d'un système de collecte automatique des déchets, mais comment savoir si l'API de Google ne détient pas une référence au marqueur lorsque setMap(null) est appelé ? Dans mon application, j'ajoute et je "supprime" une tonne de marqueurs, et je ne voudrais pas que tous ces marqueurs "supprimés" consomment de la mémoire.

0 votes

@Nick : ajoutez 'delete this.markers[i];' après le bit setMap(null).

49voto

Maiku Mori Points 4329

Il semble qu'une telle fonction n'existe pas encore dans la V3.

Les gens suggèrent de garder les références à tous les marqueurs que vous avez sur la carte dans un tableau. Ensuite, lorsque vous souhaitez tous les supprimer, il suffit de parcourir le tableau en boucle et d'appeler la méthode .setMap(null) sur chacune des références.

Voir cette question pour plus d'informations/code.

Ma version :

google.maps.Map.prototype.markers = new Array();

google.maps.Map.prototype.getMarkers = function() {
    return this.markers
};

google.maps.Map.prototype.clearMarkers = function() {
    for(var i=0; i<this.markers.length; i++){
        this.markers[i].setMap(null);
    }
    this.markers = new Array();
};

google.maps.Marker.prototype._setMap = google.maps.Marker.prototype.setMap;

google.maps.Marker.prototype.setMap = function(map) {
    if (map) {
        map.markers[map.markers.length] = this;
    }
    this._setMap(map);
}

Le code est une version éditée de ce code http://www.lootogo.com/googlemapsapi3/markerPlugin.html J'ai supprimé la nécessité d'appeler addMarker manuellement.

Pour

  • De cette façon, le code reste compact et se trouve à un seul endroit (il ne pollue pas l'espace de noms).
  • Vous n'avez plus besoin de garder la trace des marqueurs vous-même, vous pouvez toujours trouver tous les marqueurs sur la carte en appelant map.getMarkers()

Cons

  • L'utilisation de prototypes et de wrappers comme je l'ai fait rend mon code dépendant de celui de Google. S'ils apportent un changement majeur à leur source, le code sera cassé.
  • Si vous ne le comprenez pas, vous ne serez pas en mesure de le réparer en cas de panne. Il y a peu de chances qu'ils changent quoi que ce soit qui puisse casser ça, mais quand même
  • Si vous supprimez un marqueur manuellement, sa référence sera toujours présente dans le tableau des marqueurs. (Vous pouvez modifier ma méthode setMap pour résoudre ce problème, mais au prix d'une boucle dans le tableau des marqueurs et de la suppression de la référence).

1 votes

+1 de ma part. Mais votre réponse serait meilleure si vous incluiez le wrapper pour appeler addMarker automatiquement !

0 votes

Je suppose que vous faites référence à la réponse d'Andrews en fait. Pourriez-vous montrer avec un code ce que vous feriez différemment et pourquoi ? Merci

0 votes

Meh désolé pour le retard, je me retenais de poster le code parce que je n'avais aucun moyen de le tester rapidement.

29voto

rolinger Points 872

C'est la solution la plus simple parmi toutes celles qui ont été proposées à l'origine par YingYang 11 Mar '14 à 15:049 sous la réponse originale à la question originale de l'utilisateur

J'utilise la même solution 2,5 ans plus tard avec google maps v3.18 et cela fonctionne à merveille.

markersArray.push(newMarker) ;
while(markersArray.length) { markersArray.pop().setMap(null); }

// No need to clear the array after that.

21voto

Andrew Points 4086
google.maps.Map.prototype.markers = new Array();

google.maps.Map.prototype.addMarker = function(marker) {
    this.markers[this.markers.length] = marker;
};

google.maps.Map.prototype.getMarkers = function() {
    return this.markers
};

google.maps.Map.prototype.clearMarkers = function() {
    for(var i=0; i<this.markers.length; i++){
        this.markers[i].setMap(null);
    }
    this.markers = new Array();
};

Je ne pense pas qu'il y en ait une dans la V3, j'ai donc utilisé l'implémentation personnalisée ci-dessus.

Disclaimer : Je n'ai pas écrit ce code mais j'ai oublié de conserver une référence lorsque je l'ai fusionné dans ma base de code donc je ne sais pas d'où il vient.

0 votes

+1 de ma part. J'ajouterais un wrapper autour du constructeur google.maps.Marker (ou la méthode setMap car je pense que le constructeur l'appelle en interne) qui appelle addMarker automatiquement, mais quand même une bonne réponse :).

0 votes

@Maiku Mari, pourriez-vous montrer avec le code ce que vous feriez différemment et pourquoi. Merci

0 votes

En quoi cela n'est-il pas la solution ? Vous supprimez les marqueurs en utilisant set_map(null) sur le marqueur particulier que vous voulez effacer, si vous voulez tous les effacer alors bouclez en utilisant cette fonction. Si vous voulez quelque chose de plus, demandez-le ici : code.google.fr/p/gmaps-api-issues/issues/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X