Rimuovi un indicatore da una GoogleMap


124

Nella nuova API di Google Maps per Android, possiamo aggiungere un marcatore , ma non c'è modo di rimuoverne (facilmente) uno.

La mia soluzione è mantenere gli indicatori in una mappa e ridisegnare la mappa quando voglio rimuovere un indicatore, ma non è molto efficiente.

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

Qualcuno ha un'idea migliore?


Perché usi Runnable () per aggiungere i marcatori?
user3927312

Per farlo sul thread dell'interfaccia utente
Jonas

usa mMap.clear () per cancellare tutti i marker
Bahaa Salaheldin

Risposte:


260

La firma del metodo per addMarkerè:

public final Marker addMarker (MarkerOptions options)

Quindi, quando aggiungi un marker a un GoogleMapspecificando le opzioni per il marker, dovresti salvare l' Markeroggetto restituito (invece MarkerOptionsdell'oggetto che hai usato per crearlo). Questo oggetto consente di modificare lo stato del marker in un secondo momento. Quando hai finito con il marker, puoi chiamare Marker.remove()per rimuoverlo dalla mappa.

Per inciso, se vuoi nasconderlo solo temporaneamente, puoi attivare o disattivare la visibilità del marker chiamando Marker.setVisible(boolean).


1
Questo non funziona per me. marker.setVisible (false), marker.remove (), anche markerManager.remove (marker) non influenzano la mappa. I marker rimangono ancora. qualche suggerimento?
Totalys

1
Vedi il mio commento qui sotto su come mantenere un marker, anche se è poco utile dopo che è stato rimosso dalla mappa, se dovessi decidere di esaminarne i valori .. il metodo Remove imposta il valore del tag su null ...
Speckpgh

Intelligente! Grazie!
Taslim Oseni

32

Aggiungi l'indicatore alla mappa in questo modo

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

Quindi sarai in grado di utilizzare il metodo di rimozione, rimuoverà solo quel marcatore

markerName.remove();

25

per cancellare tutti gli scarabocchi nella mappa usa

map.clear()

14
Questo cancella tutte le sovrapposizioni sulla mappa, non solo un indicatore come suggerisce la domanda.
Emzor

4

se il marker esiste, rimuovere l'ultimo marker. se il marker non esiste crea il marker corrente

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

Se usi il linguaggio Kotlin aggiungi semplicemente questo codice:

Crea variabili globali di GoogleMape Markertipi.

Uso il marker variabile per fare in modo che il valore del marker variabile possa cambiare direttamente

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

E uso questa funzione / metodo per aggiungere l'indicatore sulla mia mappa:

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

Dopo aver creato la funzione metto questo codice su onMapReady()per rimuovere il marker e crearne uno nuovo:

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

È un vantaggio se si desidera visualizzare la posizione dell'indirizzo quando si fa clic sul marker, aggiungere questo codice per nascondere e mostrare l'indirizzo del marker, ma è necessario un metodo per ottenere la posizione dell'indirizzo. Ho ricevuto il codice da questo post: come ottenere l'indirizzo completo da latitudine e longitudine?

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

2

usa il codice seguente:

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

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

una volta cliccato su "un marker" , puoi rimuoverlo.


2

Solo una NOTA, qualcosa che ho perso ore a rintracciare stasera ...

Se per qualche motivo decidi di trattenere un marker, dopo averlo RIMOSSO da una mappa ... getTag restituirà NULL, anche se i restanti valori get torneranno con i valori impostati quando il marker è stato creato .. .

Il valore TAG è impostato su NULL se si rimuove un indicatore e quindi si tenta di fare riferimento ad esso.

Mi sembra un insetto ...


1

1. Se vuoi rimuovere un marker puoi farlo in quanto in marker.remove(); alternativa puoi anche nascondere il marker invece di rimuoverlo come

 marker.setVisible(false);

e renderlo visibile in seguito quando necessario.
2. Tuttavia, se vuoi rimuovere tutti i marker dalla mappa Usa map.clear();
Nota: map.clear(); rimuoverà anche Polylines, Circlesecc.
3. Se non vuoi rimuovere Polylines, Circlesecc. Usa un ciclo alla lunghezza del marker (se hai più marker) per rimuoverli Controlla qui l'esempio OPPURE impostali su Visible false E non usarli map.clear();in questo caso.


1

Crea una variabile globale per tenere traccia del marker

private Marker currentLocationMarker;

// Rimuove il vecchio marcatore

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

// Aggiunge un marker aggiornato e sposta la telecamera

            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

Crea un array con tutti i marker su aggiungi nella mappa.

Successivamente, usa:

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

0

Per coloro che stanno seguendo l'esempio su questo progetto GoogleMaps - MapWithMarker , puoi rimuovere il marker in questo modo

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))
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.