Entfernen Sie eine Markierung aus einer GoogleMap


123

In der neuen Google Maps-API für Android können wir einen Marker hinzufügen , aber es gibt keine Möglichkeit, einen (einfach) zu entfernen.

Meine Lösung besteht darin, die Markierungen in einer Karte zu belassen und die Karte neu zu zeichnen, wenn ich eine Markierung entfernen möchte, dies ist jedoch nicht sehr effizient.

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);
      }
    }
  });
}

Hat jemand eine bessere Idee?


Warum verwenden Sie Runnable (), um die Markierungen hinzuzufügen?
user3927312

Um es auf dem UI-Thread zu tun
Jonas

Verwenden Sie mMap.clear (), um alle Marker zu löschen
Bahaa Salaheldin

Antworten:


258

Die Methodensignatur für addMarkerlautet:

public final Marker addMarker (MarkerOptions options)

Wenn Sie also eine Markierung zu einer hinzufügen, GoogleMapindem Sie die Optionen für die Markierung angeben, sollten Sie das zurückgegebene MarkerObjekt speichern (anstelle des MarkerOptionsObjekts, mit dem Sie es erstellt haben). Mit diesem Objekt können Sie den Markierungsstatus später ändern. Wenn Sie mit der Markierung fertig sind, können Sie anrufen Marker.remove(), um sie von der Karte zu entfernen.

Wenn Sie es nur vorübergehend ausblenden möchten, können Sie die Sichtbarkeit des Markers durch Aufrufen umschalten Marker.setVisible(boolean).


1
Das funktioniert bei mir nicht. marker.setVisible (false), marker.remove () und sogar markerManager.remove (marker) wirken sich nicht auf die Karte aus. Marker bleiben noch. irgendwelche Hinweise?
Totalys

1
Siehe meinen Kommentar unten zum Festhalten an einem Marker, obwohl er nach dem Entfernen aus der Karte wenig Verwendung findet, wenn Sie sich entscheiden sollten, seine Werte zu untersuchen. Die Remove-Methode setzt den Tag-Wert auf null ...
Speckpgh

Klug! Vielen Dank!
Taslim Oseni

32

Fügen Sie den Marker wie folgt zur Karte hinzu

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

Dann können Sie die Methode remove verwenden, bei der nur dieser Marker entfernt wird

markerName.remove();

25

Um alle Kritzeleien in der Karte zu löschen, verwenden Sie

map.clear()

14
Dadurch werden alle Überlagerungen auf der Karte gelöscht, nicht nur eine Markierung, wie die Frage nahelegt.
Emzor

4

Wenn ein Marker vorhanden ist, entfernen Sie den letzten Marker. Wenn kein Marker vorhanden ist, erstellen Sie einen aktuellen Marker

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)));
}

3

Wenn Sie die Kotlin-Sprache verwenden, fügen Sie einfach diesen Code hinzu:

Erstellen Sie globale Variablen GoogleMapund MarkerTypen.

Ich verwende einen variablen Marker, damit sich der Wert des variablen Markers direkt ändert

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

Und ich benutze diese Funktion / Methode, um den Marker auf meiner Karte hinzuzufügen:

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

Nachdem ich die Funktion erstellt habe, platziere ich diesen Code auf onMapReady(), um den Marker zu entfernen und einen neuen zu erstellen:

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

Es ist ein Bonus, wenn Sie den Adressort anzeigen möchten, wenn Sie auf die Markierung klicken. Fügen Sie diesen Code hinzu, um die Markierungsadresse auszublenden und anzuzeigen. Sie benötigen jedoch eine Methode, um den Adressort abzurufen. Ich habe den Code aus diesem Beitrag erhalten: Wie erhalte ich die vollständige Adresse aus Längen- und Breitengrad?

map.setOnMarkerClickListener {marker ->
        if (marker.isInfoWindowShown){
            marker.hideInfoWindow()
        }else{
            marker.showInfoWindow()
        }
        true
    }

2

Verwenden Sie den folgenden Code:

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

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

Sobald Sie auf "einen Marker" klicken , können Sie ihn entfernen.


2

Nur ein Hinweis, etwas, das ich heute Abend stundenlang aufgespürt habe ...

Wenn Sie sich aus irgendeinem Grund dafür entscheiden, einen Marker festzuhalten, nachdem Sie ihn von einer Karte entfernt haben, gibt getTag NULL zurück, obwohl die verbleibenden get-Werte mit den Werten zurückgegeben werden, auf die Sie sie beim Erstellen des Markers festgelegt haben. .

Der TAG-Wert wird auf NULL gesetzt, wenn Sie jemals einen Marker entfernen und dann versuchen, ihn zu referenzieren.

Scheint mir ein Fehler zu sein ...


1

1. Wenn Sie einen Marker entfernen möchten, können Sie dies auch tun. marker.remove(); Alternativ können Sie den Marker auch ausblenden, anstatt ihn als zu entfernen

 marker.setVisible(false);

und machen Sie es später sichtbar, wann immer es nötig ist.
2. Wenn Sie jedoch alle Markierungen von der Karte entfernen möchten, verwenden Sie map.clear();
Hinweis: Entfernt map.clear();auch Polylines, Circlesusw.
3. Wenn Sie usw. nicht entfernen möchten, Polylines, Circlesverwenden Sie eine Schleife zur Länge der Markierung (wenn Sie mehrere Markierungen haben), um diese zu entfernen Schauen Sie sich das Beispiel hier an ODER setzen Sie sie auf Visible false und verwenden Sie sie map.clear();in diesem Fall nicht.


1

Erstellen Sie eine globale Variable, um die Markierung zu verfolgen

private Marker currentLocationMarker;

// Alte Markierung entfernen

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

// Aktualisierten Marker hinzufügen und Kamera bewegen

            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();

0

Erstellen Sie ein Array mit allen Markierungen beim Hinzufügen in der Karte.

Verwenden Sie später:

Marker temp = markers.get(markers.size() - 1);
temp.remove();

0

Für diejenigen, die dem Beispiel in diesem GoogleMaps - MapWithMarker- Projekt folgen , können Sie die Markierung auf diese Weise entfernen

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))
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.