Eliminar un marcador de un mapa de Google

123

En la nueva API de Google Maps para Android, podemos agregar un marcador , pero no hay forma de eliminarlo (fácilmente).

Mi solución es mantener los marcadores en un mapa y volver a dibujar el mapa cuando quiero eliminar un marcador, pero no es muy eficiente.

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

¿Alguien tiene una idea mejor?

Jonas
fuente
¿Por qué usa Runnable () para agregar los marcadores?
user3927312
Para hacerlo en el hilo de la interfaz de usuario
Jonas
use mMap.clear () para borrar todos los marcadores
Bahaa Salaheldin

Respuestas:

258

La firma del método para addMarkeres:

public final Marker addMarker (MarkerOptions options)

Entonces, cuando agrega un marcador a un GoogleMapal especificar las opciones para el marcador, debe guardar el Markerobjeto que se devuelve (en lugar del MarkerOptionsobjeto que utilizó para crearlo). Este objeto le permite cambiar el estado del marcador más adelante. Cuando haya terminado con el marcador, puede llamar Marker.remove()para eliminarlo del mapa.

Por otro lado, si solo desea ocultarlo temporalmente, puede alternar la visibilidad del marcador llamando Marker.setVisible(boolean).

Antonio
fuente
1
Esto no está funcionando para mí. marker.setVisible (false), marker.remove (), incluso markerManager.remove (marcador) no afecta el mapa. Los marcadores aún permanecen. alguna pista?
Totalys
1
Vea mi comentario a continuación sobre mantener un marcador, aunque tiene poco uso después de que se haya eliminado del mapa, si decide examinar sus valores ... el método Eliminar establece el valor de etiqueta en nulo ...
Speckpgh
¡Inteligente! ¡Gracias!
Taslim Oseni
32

Agregue el marcador al mapa como este

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

Entonces podrás usar el método remove, eliminará solo ese marcador

markerName.remove();
Eclipse22
fuente
25

para borrar todos los garabatos en el mapa usa

map.clear()
federico verchez
fuente
14
Esto borra todas las superposiciones en el mapa, no solo un marcador como sugiere la pregunta.
Emzor
4

Si existe un marcador, elimine el último marcador. si el marcador no existe crea el marcador actual

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
fuente
3

Si usa el lenguaje Kotlin, simplemente agregue este código:

Crear variables globales de GoogleMapy Markertipos.

Utilizo marcador variable para hacer que el valor del marcador variable pueda cambiar directamente

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

Y uso esta función / método para agregar el marcador en mi mapa:

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

Después de crear la función, coloco este código en onMapReady()para eliminar el marcador y crear uno nuevo:

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

Es adicional si desea mostrar la ubicación de la dirección cuando hace clic en el marcador, agregue este código para ocultar y mostrar la dirección del marcador, pero necesita un método para obtener la ubicación de la dirección. Obtuve el código de esta publicación: ¿Cómo obtener la dirección completa de latitud y longitud?

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

usa el siguiente código:

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

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

una vez que haga clic en "un marcador" , puede eliminarlo.

kuo chang
fuente
2

Solo una NOTA, algo que perdí horas rastreando esta noche ...

Si decide retener un marcador por alguna razón, después de haberlo ELIMINADO de un mapa ... getTag devolverá NULL, aunque los valores de get restantes regresarán con los valores que estableció cuando se creó el marcador. .

El valor TAG se establece en NULL si alguna vez elimina un marcador y luego intenta hacer referencia a él.

Me parece como un insecto...

Speckpgh
fuente
1

1. Si desea eliminar un marcador, puede hacerlo ya marker.remove(); que también puede ocultar el marcador en lugar de eliminarlo como

 marker.setVisible(false);

y hacerlo visible más tarde cuando sea necesario.
2. Sin embargo, si desea eliminar todos los marcadores del mapa, use la map.clear();
Nota: map.clear(); también eliminará, Polylines, Circlesetc.
3. Si no desea eliminar, Polylines, Circlesetc., utilice un bucle a la longitud del marcador (si tiene varios marcadores) para eliminarlos. Vea el ejemplo aquí O configúrelos Visible falso Y no lo use map.clear();en tal caso.

Inzimam Tariq IT
fuente
1

Hacer una variable global para realizar un seguimiento del marcador

private Marker currentLocationMarker;

// Eliminar marcador antiguo

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

// Agrega un marcador actualizado y mueve la cámara

            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
fuente
0

Cree una matriz con todos los marcadores en agregar en el mapa.

Más tarde, use:

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

Para aquellos que siguen el ejemplo en este proyecto GoogleMaps - MapWithMarker , puede eliminar el marcador al hacerlo

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
fuente