Hapus penanda dari GoogleMap

124

Di Google Maps API baru untuk Android, kita dapat menambahkan penanda , tetapi tidak ada cara untuk (dengan mudah) menghapusnya.

Solusi saya adalah menyimpan penanda di peta dan menggambar ulang peta ketika saya ingin menghapus penanda, tetapi itu tidak terlalu efisien.

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

Apakah ada yang punya ide yang lebih baik?

Jonas
sumber
Mengapa Anda menggunakan Runnable () untuk menambahkan penanda?
pengguna3927312
Untuk melakukannya di thread UI
Jonas
gunakan mMap.clear () untuk menghapus semua penanda
Bahaa Salaheldin

Jawaban:

260

Tanda tangan metode untuk addMarkeradalah:

public final Marker addMarker (MarkerOptions options)

Jadi, saat Anda menambahkan marker ke a GoogleMapdengan menentukan opsi untuk marker tersebut, Anda harus menyimpan Markerobjek yang dikembalikan (bukan MarkerOptionsobjek yang Anda gunakan untuk membuatnya). Objek ini memungkinkan Anda untuk mengubah status penanda nanti. Saat Anda selesai dengan penanda, Anda dapat memanggil Marker.remove()untuk menghapusnya dari peta.

Selain itu, jika Anda hanya ingin menyembunyikannya sementara, Anda dapat mengubah visibilitas penanda dengan memanggil Marker.setVisible(boolean).

Anthony
sumber
1
Ini tidak berhasil untuk saya. marker.setVisible (false), marker.remove (), bahkan markerManager.remove (marker) tidak memengaruhi peta. Penanda masih ada. ada petunjuk?
Totalys
1
Lihat komentar saya di bawah ini tentang memegang penanda, sementara itu tidak banyak berguna setelah dihapus dari peta, jika Anda harus memutuskan untuk memeriksa nilainya .. metode Hapus menetapkan nilai tag ke null ...
Speckpgh
Pintar! Terima kasih!
Taslim Oseni
32

Tambahkan penanda ke peta seperti ini

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

Kemudian Anda akan dapat menggunakan metode hapus, itu hanya akan menghapus penanda itu

markerName.remove();
Eclipse22
sumber
25

untuk menghapus semua coretan dalam penggunaan peta

map.clear()
federico verchez
sumber
14
Ini menghapus semua overlay di peta, bukan hanya penanda seperti yang disarankan pertanyaan.
Emzor
4

jika penanda ada hapus penanda terakhir. jika penanda tidak ada buat penanda saat ini

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

Jika Anda menggunakan bahasa Kotlin Anda cukup menambahkan kode ini:

Buat variabel GoogleMapdan Markertipe global .

Saya menggunakan penanda variabel agar nilai penanda variabel dapat berubah secara langsung

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

Dan saya menggunakan fungsi / metode ini untuk menambahkan penanda di peta saya:

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

Setelah saya membuat fungsi, saya menempatkan kode ini di onMapReady()untuk menghapus penanda dan membuat yang baru:

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

Ini bonus jika Anda ingin menampilkan lokasi alamat ketika Anda mengklik penanda tambahkan kode ini untuk menyembunyikan dan menampilkan alamat penanda tetapi Anda memerlukan metode untuk mendapatkan lokasi alamat. Saya mendapat kode dari posting ini: Bagaimana cara mendapatkan alamat lengkap dari lintang dan bujur?

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

gunakan kode berikut:

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

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

setelah Anda mengklik "penanda" , Anda dapat menghapusnya.

kuo chang
sumber
2

Hanya CATATAN, sesuatu yang saya buang berjam-jam melacak malam ini ...

Jika Anda memutuskan untuk mempertahankan marker karena suatu alasan, setelah Anda MENGHAPUSnya dari peta ... getTag akan mengembalikan NULL, meskipun nilai get yang tersisa akan dikembalikan dengan nilai yang Anda setel saat marker dibuat .. .

Nilai TAG disetel ke NULL jika Anda pernah menghapus penanda, lalu mencoba mereferensikannya.

Sepertinya bug bagiku ...

Speckpgh
sumber
1

1. Jika Anda ingin menghapus penanda, Anda dapat melakukannya sebagai marker.remove(); alternatif, Anda juga dapat menyembunyikan penanda daripada menghapusnya sebagai

 marker.setVisible(false);

dan membuatnya terlihat nanti kapan pun dibutuhkan.
2. Namun jika Anda ingin menghapus semua penanda dari peta Gunakan map.clear();
Catatan: map.clear(); juga akan menghapus Polylines, Circlesdll.
3. Jika Anda tidak ingin menghapus, Polylines, Circlesdll. Daripada menggunakan lingkaran untuk panjang penanda (jika Anda memiliki beberapa penanda) untuk menghapus penanda tersebut. Lihat Contoh di sini ATAU atur terlihat salah Dan jangan gunakan map.clear();dalam kasus seperti itu.

Inzimam Tariq IT
sumber
1

Buat variabel global untuk melacak penanda

private Marker currentLocationMarker;

// Hapus penanda lama

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

// Tambahkan penanda yang diperbarui dan gerakkan kamera

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

Buat array dengan semua penanda di add in map.

Nanti, gunakan:

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

Bagi mereka yang mengikuti contoh pada proyek GoogleMaps - MapWithMarker ini, Anda dapat menghapus penanda dengan melakukannya

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
sumber