Usuń znacznik z GoogleMap

124

W nowym Google Maps API na Androida możemy dodać znacznik , ale nie ma sposobu, aby (łatwo) go usunąć.

Moim rozwiązaniem jest zachowanie znaczników na mapie i przerysowanie mapy, gdy chcę usunąć znacznik, ale nie jest to zbyt wydajne.

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

Czy ktoś ma lepszy pomysł?

Jonas
źródło
Dlaczego używasz Runnable () do dodawania znaczników?
user3927312
Aby to zrobić w wątku UI
Jonas
użyj mMap.clear (), aby usunąć wszystkie znaczniki
Bahaa Salaheldin

Odpowiedzi:

260

Podpis metody addMarkerto:

public final Marker addMarker (MarkerOptions options)

Więc kiedy dodajesz znacznik do a GoogleMappoprzez określenie opcji dla znacznika, powinieneś zapisać Markerzwrócony obiekt (zamiast MarkerOptionsobiektu, którego użyłeś do jego utworzenia). Ten obiekt umożliwia późniejszą zmianę stanu znacznika. Kiedy skończysz ze znacznikiem, możesz zadzwonić, Marker.remove()aby usunąć go z mapy.

Na marginesie, jeśli chcesz go tylko tymczasowo ukryć, możesz przełączyć widoczność znacznika, dzwoniąc Marker.setVisible(boolean).

Anthony
źródło
1
To nie działa dla mnie. marker.setVisible (false), marker.remove (), a nawet markerManager.remove (marker) nie wpływa na mapę. Markery nadal pozostają. jakieś wskazówki?
Totalys
1
Zobacz mój komentarz poniżej na temat trzymania znacznika, który nie jest przydatny po usunięciu go z mapy, jeśli zdecydujesz się sprawdzić jego wartości .. Metoda Remove ustawia wartość tagu na null ...
Speckpgh
Sprytny! Dzięki!
Taslim Oseni
32

Dodaj znacznik do mapy w ten sposób

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

Wtedy będziesz mógł użyć metody remove, usunie ona tylko ten marker

markerName.remove();
Eclipse22
źródło
25

aby usunąć wszystkie bazgroły z mapy użyj

map.clear()
federico verchez
źródło
14
Spowoduje to wyczyszczenie wszystkich nakładek na mapie, a nie tylko znacznika, jak sugeruje pytanie.
Emzor
4

jeśli znacznik istnieje, usuń ostatni znacznik. jeśli znacznik nie istnieje, utwórz aktualny znacznik

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
źródło
3

Jeśli używasz języka Kotlin, po prostu dodaj ten kod:

Utwórz zmienne globalne GoogleMap i Marker.

Używam znacznika zmiennej, aby wartość znacznika zmiennej mogła się zmieniać bezpośrednio

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

I używam tej funkcji / metody, aby dodać znacznik na mojej mapie:

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

Po utworzeniu funkcji umieszczam ten kod w onMapReady()celu usunięcia znacznika i utworzenia nowego:

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

To bonus, jeśli chcesz wyświetlić lokalizację adresu po kliknięciu znacznika, dodaj ten kod, aby ukryć i pokazać adres znacznika, ale potrzebujesz metody, aby uzyskać lokalizację adresu. Dostałem kod z tego postu: Jak uzyskać pełny adres z szerokości i długości geograficznej?

map.setOnMarkerClickListener {marker ->
        if (marker.isInfoWindowShown){
            marker.hideInfoWindow()
        }else{
            marker.showInfoWindow()
        }
        true
    }
Faiz Azhar Ristya Nugraha
źródło
2

użyj poniższego kodu:

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

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

po kliknięciu „znacznika” można go usunąć.

kuo chang
źródło
2

Tylko WSKAZÓWKA, coś, na co straciłem godziny szukając tej nocy ...

Jeśli z jakiegoś powodu zdecydujesz się zatrzymać znacznik, po USUNIĘCIU go z mapy ... getTag zwróci NULL, nawet jeśli pozostałe wartości get powrócą z wartościami, które ustawiłeś podczas tworzenia znacznika. .

Wartość TAG jest ustawiana na NULL, jeśli kiedykolwiek usuniesz znacznik, a następnie spróbujesz się do niego odwołać.

Wydaje mi się, że to błąd ...

Speckpgh
źródło
1

1. Jeśli chcesz usunąć znacznik, możesz to zrobić, ponieważ marker.remove(); możesz również ukryć znacznik zamiast usuwać go jako

 marker.setVisible(false);

i pokazuj je później, gdy zajdzie taka potrzeba.
2. Jeśli jednak chcesz usunąć wszystkie znaczniki z mapy Użyj map.clear();
Uwaga: map.clear(); usunie również Polylines, Circlesitd.
3. Jeśli nie chcesz usuwać Polylines, Circlesitp., Użyj pętli do długości znacznika (jeśli masz wiele znaczników), aby je usunąć Sprawdź przykład tutaj LUB ustaw je jako Widoczne jako fałszywe I nie używaj map.clear();w takim przypadku.

Inzimam Tariq IT
źródło
1

Utwórz zmienną globalną, aby śledzić znacznik

private Marker currentLocationMarker;

// Usuń stary znacznik

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

// Dodaj zaktualizowany marker i przesuń kamerę

            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
źródło
0

Utwórz tablicę ze wszystkimi znacznikami na mapie dodania.

Później użyj:

Marker temp = markers.get(markers.size() - 1);
temp.remove();
Elton da Costa
źródło
0

Dla tych, którzy podążają za przykładem w tym projekcie GoogleMaps - MapWithMarker , możesz usunąć znacznik, robiąc to

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
źródło