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?

Jonas
quelle
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).

Anthony
quelle
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();
Eclipse22
quelle
25

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

map.clear()
federico verchez
quelle
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)));
}
dor sharoni
quelle
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
    }
Faiz Azhar Ristya Nugraha
quelle
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.

kuo chang
quelle
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 ...

Speckpgh
quelle
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.

Inzimam Tariq IT
quelle
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();
Hitesh Sahu
quelle
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();
Elton da Costa
quelle
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))
    }
}
Naim Jamalludin
quelle