Remover um marcador de um GoogleMap

123

Na nova API do Google Maps para Android, podemos adicionar um marcador , mas não há como (facilmente) remover um.

Minha solução é manter os marcadores em um mapa e redesenhar o mapa quando eu quiser remover um marcador, mas não é muito 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);
      }
    }
  });
}

Alguém tem uma idéia melhor?

Jonas
fonte
Por que você usa um Runnable () para adicionar os marcadores?
user3927312
Para fazê-lo no thread da interface do usuário
Jonas
use mMap.clear () para limpar todos os marcadores
Bahaa Salaheldin

Respostas:

258

A assinatura do método para addMarkeré:

public final Marker addMarker (MarkerOptions options)

Portanto, quando você adiciona um marcador a GoogleMapespecificando as opções para o marcador, salve o Markerobjeto retornado (em vez do MarkerOptionsobjeto usado para criá-lo). Este objeto permite alterar o estado do marcador posteriormente. Quando terminar o marcador, você pode ligar Marker.remove()para removê-lo do mapa.

Como um aparte, se você quiser apenas ocultá-lo temporariamente, poderá alternar a visibilidade do marcador chamando Marker.setVisible(boolean).

Anthony
fonte
1
Isso não está funcionando para mim. marker.setVisible (false), marker.remove (), e mesmo markerManager.remove (marker) não está afetando o mapa. Marcadores ainda permanecem. alguma dica?
Totalys 17/03/16
1
Veja meu comentário abaixo sobre como segurar um marcador, embora ele tenha pouca utilidade após ser removido do mapa, se você decidir examinar seus valores. O método Remove define o valor do tag como nulo ...
Speckpgh
Inteligente! Obrigado!
Taslim Oseni 04/07/19
32

Adicione o marcador ao mapa como este

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

Então você poderá usar o método remove, ele removerá apenas esse marcador

markerName.remove();
Eclipse22
fonte
25

para limpar todos os rabiscos no mapa, use

map.clear()
federico verchez
fonte
14
Isso limpa todas as sobreposições no mapa, não apenas um marcador, como sugere a pergunta.
Emzor
4

se o marcador existir, remova o último marcador. se o marcador não existir, crie o marcador atual

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

Se você usa a linguagem Kotlin, basta adicionar este código:

Crie variáveis ​​globais de GoogleMape Markertipos.

Eu uso marcador variável para fazer o valor do marcador variável pode mudar diretamente

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

E eu uso essa função / método para adicionar o marcador no meu mapa:

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

Depois de criar a função, coloco esse código no onMapReady()para remover o marcador e criar um novo:

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

É um bônus se você quiser exibir o local do endereço ao clicar no marcador, adicione este código para ocultar e mostrar o endereço do marcador, mas você precisa de um método para obter o local do endereço. Eu recebi o código deste post: Como obter o endereço completo da latitude e longitude?

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

use o seguinte código:

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

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

Depois de clicar em "um marcador" , você pode removê-lo.

kuo chang
fonte
2

Apenas uma NOTA, algo que eu perdi horas rastreando esta noite ...

Se você decidir manter um marcador por algum motivo, depois de removê-lo de um mapa ... getTag retornará NULL, mesmo que os demais valores get retornem com os valores que você definiu quando o marcador foi criado. .

O valor TAG é definido como NULL se você remover um marcador e tentar fazer referência a ele.

Parece um inseto para mim...

Speckpgh
fonte
1

1. Se você deseja remover um marcador, você pode fazê-lo como marker.remove(); alternativa, também pode ocultar o marcador em vez de removê-lo como

 marker.setVisible(false);

e torná-lo visível mais tarde, sempre que necessário.
2. No entanto, se você deseja remover todos os marcadores do mapa, use map.clear();
Nota: map.clear(); também removerá Polylines, Circlesetc.
3. Se você não deseja remover Polylines, Circlesetc., use um loop no comprimento do marcador (se você tiver vários marcadores) para removê-los. Confira o exemplo aqui OU defina-os como Visible false E não use map.clear();nesse caso.

Inzimam Tariq IT
fonte
1

Faça uma variável global para acompanhar o marcador

private Marker currentLocationMarker;

// Remover marcador antigo

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

// Adicione um marcador atualizado e mova a câmera

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

Crie uma matriz com todos os marcadores no mapa de adição.

Mais tarde, use:

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

Para aqueles que seguem o exemplo deste projeto GoogleMaps - MapWithMarker , você pode remover o marcador fazendo isso

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
fonte