从GoogleMap删除标记


123

在适用于Android的新版Google Maps API中,我们可以添加标记,但是无法(轻松地)删除一个标记

我的解决方案是将标记保留在地图中,并在要删除标记时重新绘制地图,但这不是很有效。

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

Answers:


258

方法签名为addMarker

public final Marker addMarker (MarkerOptions options)

因此,当您GoogleMap通过指定标记的选项将标记添加到时,应保存Marker返回的MarkerOptions对象(而不是用于创建它的对象)。此对象允许您稍后更改标记状态。完成标记的创建后,您可以致电Marker.remove()将其从地图上删除。

顺便说一句,如果您只想暂时隐藏它,可以通过调用来切换标记的可见性Marker.setVisible(boolean)


1
这对我不起作用。marker.setVisible(false),marker.remove()甚至markerManager.remove(marker)都不会影响地图。标记仍然存在。有什么提示吗?
Totalys

1
请参阅下面有关保持标记的评论,尽管如果您决定检查标记的值,那么在将标记从地图上删除后几乎没有用
。.Remove

聪明!谢谢!
塔斯林·奥塞尼

32

像这样将标记添加到地图

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

然后,您将可以使用remove方法,它将仅删除该标记

markerName.remove();


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语言,则只需添加以下代码:

创建GoogleMapMarker类型的全局变量。

我使用可变标记使可变标记值可以直接更改

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

只是一个注意事项,我今晚浪费了数小时来追踪...

如果出于某种原因决定保留标记,则从地图上将其删除后,即使剩余的get值将返回创建标记时设置的值,getTag也会返回NULL。 。

如果曾经删除标记,然后尝试引用它,则TAG值将设置为NULL。

对我来说似乎是个虫子...


1

1.如果要删除标记,则可以这样做,marker.remove(); 也可以隐藏标记而不是将其删除为

 marker.setVisible(false);

并在以后需要时使其可见。
2.但是,如果您想从地图上删除所有标记,请使用 map.clear();
注释: map.clear();还将删除Polylines, Circles
。3.如果您不想删除Polylines, Circles等,则可以使用标记长度的循环(如果您有多个标记)来删除这些标记在此处查看示例 将其设置为可见false,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

使用添加标记中的所有标记创建数组。

以后,使用:

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

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))
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.