ลบเครื่องหมายออกจาก GoogleMap


124

ใน Google Maps API ใหม่สำหรับ Android เราสามารถเพิ่มเครื่องหมายได้ แต่ไม่มีวิธีใดที่จะลบ (อย่างง่ายดาย) ได้

วิธีแก้ปัญหาของฉันคือเก็บเครื่องหมายไว้ในแผนที่และวาดแผนที่ใหม่เมื่อฉันต้องการลบเครื่องหมายออก แต่มันไม่ค่อยมีประสิทธิภาพ

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

ใครมีความคิดที่ดีกว่านี้?


เหตุใดคุณจึงใช้ Runnable () เพื่อเพิ่มเครื่องหมาย
user3927312

หากต้องการทำในเธรด UI
Jonas

ใช้ mMap.clear () เพื่อล้างเครื่องหมายทั้งหมด
Bahaa Salaheldin

คำตอบ:


260

ลายเซ็นวิธีสำหรับaddMarkerคือ:

public final Marker addMarker (MarkerOptions options)

ดังนั้นเมื่อคุณเพิ่มเครื่องหมายลงใน a GoogleMapโดยการระบุตัวเลือกสำหรับเครื่องหมายคุณควรบันทึกMarkerวัตถุที่ส่งคืน (แทนที่จะเป็นMarkerOptionsวัตถุที่คุณใช้สร้าง) วัตถุนี้ช่วยให้คุณสามารถเปลี่ยนสถานะเครื่องหมายในภายหลังได้ เมื่อคุณทำเครื่องหมายเสร็จแล้วคุณสามารถโทรMarker.remove()เพื่อลบออกจากแผนที่ได้

Marker.setVisible(boolean)เช่นกันถ้าคุณเพียงต้องการที่จะซ่อนมันชั่วคราวคุณสามารถสลับการแสดงผลของเครื่องหมายโดยการเรียก


1
นี่ใช้ไม่ได้สำหรับฉัน marker.setVisible (false), marker.remove (), แม้แต่ markerManager.remove (marker) ก็ไม่มีผลกับแผนที่ มาร์คเกอร์ยังคงอยู่ คำแนะนำใด ๆ
Totalys

1
ดูความคิดเห็นของฉันด้านล่างเกี่ยวกับการจับเครื่องหมายในขณะที่มีการใช้งานเพียงเล็กน้อยหลังจากที่ถูกลบออกจากแผนที่หากคุณควรตัดสินใจตรวจสอบค่าของมัน .. วิธีการลบจะตั้งค่าแท็กเป็น null ...
Speckpgh

ฉลาด! ขอบคุณ!
Taslim Oseni

32

เพิ่มเครื่องหมายลงในแผนที่เช่นนี้

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

จากนั้นคุณจะสามารถใช้วิธีลบมันจะลบเฉพาะเครื่องหมายนั้น

markerName.remove();

25

เพื่อล้างการขีดเขียนทั้งหมดในแผนที่ให้ใช้

map.clear()

14
วิธีนี้จะล้างภาพซ้อนทับทั้งหมดบนแผนที่ไม่ใช่แค่เครื่องหมายตามที่คำถามแนะนำ
Emzor

4

หากมีเครื่องหมายอยู่ให้ลบเครื่องหมายสุดท้าย หากไม่มีเครื่องหมายให้สร้างเครื่องหมายปัจจุบัน

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 คุณเพียงแค่เพิ่มรหัสนี้:

สร้างตัวแปรส่วนกลางของGoogleMapและMarkerประเภท

ฉันใช้เครื่องหมายตัวแปรเพื่อทำให้ค่าเครื่องหมายตัวแปรสามารถเปลี่ยนแปลงได้โดยตรง

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

และฉันใช้ฟังก์ชัน / วิธีการนี้เพื่อเพิ่มเครื่องหมายบนแผนที่ของฉัน:

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

หลังจากที่ฉันสร้างฟังก์ชันฉันวางรหัสนี้บนonMapReady()เพื่อลบเครื่องหมายและสร้างใหม่:

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

เป็นโบนัสหากคุณต้องการแสดงตำแหน่งที่อยู่เมื่อคุณคลิกที่เครื่องหมายเพิ่มรหัสนี้เพื่อซ่อนและแสดงที่อยู่ของเครื่องหมาย แต่คุณต้องมีวิธีการรับตำแหน่งที่อยู่ ฉันได้รับรหัสจากโพสต์นี้: จะรับที่อยู่ที่สมบูรณ์จากละติจูดและลองจิจูดได้อย่างไร

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

2

ใช้รหัสต่อไปนี้:

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

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

เมื่อคุณคลิกที่"เครื่องหมาย"คุณสามารถลบออกได้


2

แค่บันทึกสิ่งที่ฉันเสียเวลาไปหลายชั่วโมงในการติดตามคืนนี้ ...

หากคุณตัดสินใจที่จะยึดเครื่องหมายไว้ด้วยเหตุผลบางประการหลังจากที่คุณลบออกจากแผนที่แล้ว ... getTag จะส่งคืนค่า NULL แม้ว่าค่า get ที่เหลือจะกลับมาพร้อมกับค่าที่คุณตั้งไว้เมื่อสร้างเครื่องหมาย .. .

ค่า TAG ถูกตั้งค่าเป็น NULL หากคุณเคยลบเครื่องหมายออกจากนั้นพยายามอ้างอิง

ดูเหมือนเป็นข้อบกพร่องสำหรับฉัน ...


1

1.หากคุณต้องการลบเครื่องหมายออกคุณสามารถทำได้marker.remove(); หรือคุณสามารถซ่อนเครื่องหมายแทนการลบออกเป็น

 marker.setVisible(false);

และทำให้มองเห็นได้ในภายหลังเมื่อใดก็ตามที่ต้องการ
2.อย่างไรก็ตามหากคุณต้องการลบเครื่องหมายทั้งหมดออกจากแผนที่ให้ใช้ map.clear();
หมายเหตุ: map.clear();จะลบออกด้วยPolylines, Circlesเช่นกัน
3.หากคุณไม่ต้องการลบPolylines, Circlesฯลฯ นอกจากใช้การวนซ้ำตามความยาวของเครื่องหมาย (หากคุณมีหลายเครื่องหมาย) เพื่อลบเครื่องหมายเหล่านั้นลองดูตัวอย่างที่นี่ หรือตั้งค่าเป็นเท็จที่มองเห็นได้และอย่าใช้ map.clear();ในกรณีดังกล่าว


1

สร้างตัวแปรส่วนกลางเพื่อติดตามเครื่องหมาย

private Marker currentLocationMarker;

// ลบเครื่องหมายเก่า

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

// เพิ่มเครื่องหมายที่อัปเดตเข้าและย้ายกล้อง

            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

สำหรับผู้ที่กำลังทำตามตัวอย่างในโครงการGoogleMaps - MapWithMarkerนี้คุณสามารถลบเครื่องหมายได้โดยทำเช่นนั้น

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))
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.