Supprimer un marqueur d'une carte Google

124

Dans la nouvelle API Google Maps pour Android, nous pouvons ajouter un marqueur , mais il n'y a aucun moyen d'en supprimer (facilement) un.

Ma solution est de garder les marqueurs dans une carte et de redessiner la carte lorsque je veux supprimer un marqueur, mais ce n'est pas très efficace.

private final Map<String, MarkerOptions> mMarkers = new ConcurrentHashMap<String, MarkerOptions>();

private void add(String name, LatLng ll) {
  final MarkerOptions marker = new MarkerOptions().position(ll).title(name);
  mMarkers.put(name, marker);

  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      mMap.addMarker(marker);
    }
  });
}

private void remove(String name) {
  mMarkers.remove(name);

  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      mMap.clear();

      for (MarkerOptions item : mMarkers.values()) {
        mMap.addMarker(item);
      }
    }
  });
}

Quelqu'un a-t-il une meilleure idée?

Jonas
la source
Pourquoi utilisez-vous un Runnable () pour ajouter les marqueurs?
user3927312
Pour le faire sur le fil UI
Jonas
utilisez mMap.clear () pour effacer tous les marqueurs
Bahaa Salaheldin

Réponses:

260

La signature de méthode pour addMarkerest:

public final Marker addMarker (MarkerOptions options)

Ainsi, lorsque vous ajoutez un marqueur à un GoogleMapen spécifiant les options du marqueur, vous devez enregistrer l' Markerobjet qui est retourné (au lieu de l' MarkerOptionsobjet que vous avez utilisé pour le créer). Cet objet vous permet de modifier ultérieurement l'état du marqueur. Lorsque vous avez terminé avec le marqueur, vous pouvez appeler Marker.remove()pour le supprimer de la carte.

En passant, si vous ne souhaitez le masquer que temporairement, vous pouvez basculer la visibilité du marqueur en appelant Marker.setVisible(boolean).

Anthony
la source
1
Cela ne fonctionne pas pour moi. marker.setVisible (false), marker.remove (), même markerManager.remove (marker) n'affecte pas la carte. Des marqueurs subsistent encore. des indices?
Totalys
1
Voir mon commentaire ci-dessous sur le maintien d'un marqueur, alors qu'il est peu utile après qu'il a été supprimé de la carte, si vous devez décider d'examiner ses valeurs .. la méthode Remove définit la valeur de la balise sur null ...
Speckpgh
Intelligent! Merci!
Taslim Oseni
32

Ajoutez le marqueur à la carte comme ceci

Marker markerName = map.addMarker(new MarkerOptions().position(latLng).title("Title"));

Ensuite, vous pourrez utiliser la méthode remove, elle supprimera uniquement ce marqueur

markerName.remove();
Eclipse22
la source
25

pour effacer tous les gribouillis de la carte, utilisez

map.clear()
Federico Verchez
la source
14
Cela efface toutes les superpositions sur la carte, pas seulement un marqueur comme le suggère la question.
Emzor
4

si un marqueur existe, supprimez le dernier marqueur. si le marqueur n'existe pas, créer le marqueur courant

Marker currentMarker = null;
if (currentMarker!=null) {
    currentMarker.remove();
    currentMarker=null;
}

if (currentMarker==null) {
    currentMarker = mMap.addMarker(new MarkerOptions().position(arg0).
    icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
}
Dor Sharoni
la source
3

Si vous utilisez le langage Kotlin, ajoutez simplement ce code:

Créez des variables globales de GoogleMapet Markertypes.

J'utilise un marqueur variable pour que la valeur du marqueur variable puisse changer directement

private lateinit var map: GoogleMap
private lateinit var marker: Marker

Et j'utilise cette fonction / méthode pour ajouter le marqueur sur ma carte:

private fun placeMarkerOnMap(location: LatLng) {
    val markerOptions = MarkerOptions().position(location)
    val titleStr = getAddress(location)
    markerOptions.title(titleStr)
    marker = map.addMarker(markerOptions)
}

Après avoir créé la fonction, je place ce code sur le onMapReady()pour supprimer le marqueur et en créer un nouveau:

map.setOnMapClickListener { location ->
        map.clear()
        marker.remove()
        placeMarkerOnMap(location)
    }

C'est un bonus si vous souhaitez afficher l'emplacement de l'adresse lorsque vous cliquez sur le marqueur, ajoutez ce code pour masquer et afficher l'adresse du marqueur, mais vous avez besoin d'une méthode pour obtenir l'emplacement de l'adresse. J'ai reçu le code de ce post: Comment obtenir l'adresse complète de la latitude et de la longitude?

map.setOnMarkerClickListener {marker ->
        if (marker.isInfoWindowShown){
            marker.hideInfoWindow()
        }else{
            marker.showInfoWindow()
        }
        true
    }
Faiz Azhar Ristya Nugraha
la source
2

utilisez le code suivant:

 mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
       @Override
       public boolean onMarkerClick(Marker marker) {

           marker.remove();
           return true;
       }
   });

une fois que vous cliquez sur «un marqueur» , vous pouvez le supprimer.

kuo chang
la source
2

Juste une NOTE, quelque chose que j'ai perdu des heures à retrouver ce soir ...

Si vous décidez de conserver un marqueur pour une raison quelconque, après l'avoir SUPPRIMÉ d'une carte ... getTag retournera NULL, même si les valeurs get restantes reviendront avec les valeurs que vous leur avez définies lors de la création du marqueur. .

La valeur TAG est définie sur NULL si jamais vous supprimez un marqueur, puis essayez de le référencer.

Ça ressemble à un bug pour moi...

Speckpgh
la source
1

1. Si vous souhaitez supprimer un marqueur, vous pouvez le faire car marker.remove(); vous pouvez également masquer le marqueur au lieu de le supprimer comme

 marker.setVisible(false);

et rendez-le visible plus tard en cas de besoin.
2. Toutefois, si vous souhaitez supprimer tous les marqueurs de la carte, utilisez map.clear();
Remarque: map.clear(); supprimera également Polylines, Circlesetc.
3. Si vous ne voulez pas supprimer, Polylines, Circlesetc., utilisez une boucle de la longueur du marqueur (si vous avez plusieurs marqueurs) pour les supprimer Consultez l'exemple ici OU définissez-les sur Visible false Et ne l'utilisez pas map.clear();dans ce cas.

Inzimam Tariq IT
la source
1

Créer une variable globale pour suivre le marqueur

private Marker currentLocationMarker;

// Supprimer l'ancien marqueur

            if (null != currentLocationMarker) {
                currentLocationMarker.remove();
            }

// Ajouter un marqueur mis à jour et déplacer la caméra

            currentLocationMarker = mMap.addMarker(new MarkerOptions().position(
                    new LatLng(getLatitude(), getLongitude()))
                    .title("You are now Here").visible(true)
                    .icon(Utils.getMarkerBitmapFromView(getActivity(), R.drawable.auto_front))
                    .snippet("Updated Location"));

            currentLocationMarker.showInfoWindow();
Hitesh Sahu
la source
0

Créez un tableau avec tous les marqueurs sur la carte d'ajout.

Plus tard, utilisez:

Marker temp = markers.get(markers.size() - 1);
temp.remove();
Elton da Costa
la source
0

Pour ceux qui suivent l'exemple sur ce projet GoogleMaps - MapWithMarker , vous pouvez supprimer le marqueur en le faisant

override fun onMapReady(googleMap: GoogleMap?) {
    googleMap?.apply {

        // Remove marker
        clear()

        val sydney = LatLng(-33.852, 151.211)
        addMarker(
            MarkerOptions()
                .position(sydney)
                .title("Marker in Sydney")
        )
        moveCamera(CameraUpdateFactory.newLatLng(sydney))
    }
}
Naim Jamalludin
la source