GoogleMap'ten bir işaretçi kaldırma


124

Android için yeni Google Haritalar API'sinde bir işaretçi ekleyebiliriz , ancak birini (kolayca) kaldırmanın bir yolu yoktur.

Benim çözümüm, işaretçileri bir haritada tutmak ve bir işaretleyiciyi kaldırmak istediğimde haritayı yeniden çizmek, ancak bu çok verimli değil.

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

Daha iyi bir fikri olan var mı?


İşaretçileri eklemek için neden Runnable () kullanıyorsunuz?
user3927312

UI iş parçacığında yapmak için
Jonas

tüm işaretleri temizlemek için mMap.clear () kullanın
Bahaa Salaheldin

Yanıtlar:


260

Yöntem imzası addMarkerşudur:

public final Marker addMarker (MarkerOptions options)

Bu nedenle, işaretçi için GoogleMapseçenekleri belirterek bir işaretçi eklediğinizde Marker, döndürülen nesneyi kaydetmelisiniz ( MarkerOptionsonu oluşturmak için kullandığınız nesnenin yerine ). Bu nesne, daha sonra işaretleyici durumunu değiştirmenize izin verir. İşaretçiyi bitirdiğinizde, Marker.remove()onu haritadan kaldırmak için arayabilirsiniz .

Bir kenara, yalnızca geçici olarak gizlemek istiyorsanız, arayarak işaretçinin görünürlüğünü değiştirebilirsiniz Marker.setVisible(boolean).


1
Bu benim için çalışmıyor. marker.setVisible (false), marker.remove (), hatta markerManager.remove (marker) haritayı etkilemiyor. İşaretler hala duruyor. herhangi bir ipucu?
Totalys

1
Değerlerini incelemeye karar verirseniz, haritadan kaldırıldıktan sonra çok az kullanım sağlarken, bir işaretçiyi tutma hakkındaki aşağıdaki
yorumuma bakın

Zeki! Teşekkürler!
Taslim Oseni

32

İşaretçiyi bu şekilde haritaya ekleyin

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

Ardından, kaldırma yöntemini kullanabileceksiniz, yalnızca bu işaretleyiciyi kaldıracak

markerName.remove();

25

haritadaki tüm karalamaları temizlemek için

map.clear()

14
Bu, yalnızca sorunun önerdiği gibi bir işaretleyiciyi değil, haritadaki tüm katmanları temizler.
Emzor

4

işaretçi varsa, son işaretleyiciyi kaldırın. işaretçi yoksa mevcut işaretleyiciyi oluştur

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

Kotlin dilini kullanıyorsanız, sadece şu kodu ekleyin:

Global değişkenler GoogleMapve Markertürler oluşturun.

Değişken işaretleyici değerinin doğrudan değişmesini sağlamak için değişken işaretleyici kullanıyorum

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

İşaretçiyi haritama eklemek için bu işlevi / yöntemi kullanıyorum:

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

İşlevi oluşturduktan sonra onMapReady(), işaretleyiciyi kaldırmak ve yeni bir tane oluşturmak için bu kodu üzerine yerleştiriyorum :

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

İşaretçiye tıkladığınızda adres konumunu görüntülemek istiyorsanız, işaretçi adresini gizlemek ve göstermek için bu kodu ekleyin, ancak adres konumunu almak için bir yönteme ihtiyacınız var. Kodu bu gönderiden aldım: Enlem ve boylamdan tam adres nasıl alınır?

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

2

aşağıdaki kodu kullanın:

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

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

Eğer tıkladığınızda "bir işaretleyici" , bunu kaldırabilirsiniz.


2

Sadece bir NOT, bu gece izleyerek saatler harcadığım bir şey ...

Herhangi bir nedenden dolayı bir işaretçiyi tutmaya karar verirseniz, onu bir haritadan KALDIRDIKTAN sonra ... getTag, işaretçi oluşturulduğunda belirlediğiniz değerlerle geri dönecek olsa bile, NULL döndürür. .

Bir işaretleyiciyi kaldırırsanız ve ardından ona başvurmaya çalışırsanız ETİKET değeri NULL olarak ayarlanır.

Bana bir böcek gibi görünüyor ...


1

1. Bir işaretleyiciyi kaldırmak istiyorsanız, bunu marker.remove(); alternatif olarak yapabilirsiniz.

 marker.setVisible(false);

ve gerektiğinde daha sonra görünür hale getirin.
2. Haritanın tüm işaretleri kaldırmak istiyorsanız Ancak kullanın map.clear();
Not: map.clear(); Ayrıca kaldıracaktır Polylines, Circlesvb
3. Kaldırmak istediğiniz Değilse Polylines, Circles(birden işaretleri varsa) bu kaldırmak için işaretleyici uzunluğuna kullanımı daha bir döngü vb Örneğe buradan göz atın VEYA onları Görünür yanlış olarak ayarlayın Ve map.clear();bu durumda kullanmayın .


1

İşaretçiyi takip etmek için global bir değişken yapın

private Marker currentLocationMarker;

// Eski işaretleyiciyi kaldır

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

// Güncellenmiş işaretçi ekleyin ve kamerayı hareket ettirin

            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

Haritaya eklenen tüm işaretçilerle dizi oluşturun.

Daha sonra şunu kullanın:

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

0

Bu GoogleMaps - MapWithMarker projesindeki örneği takip edenler için, bunu yaparak işaretçiyi kaldırabilirsiniz.

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))
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.