137

在新的 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);
      }
    }
  });
}

有没有人有更好的主意?

4

13 回答 13

274

方法签名为addMarker

public final Marker addMarker (MarkerOptions options)

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

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

于 2012-12-03T22:23:08.490 回答
39

像这样将标记添加到地图

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

然后你就可以使用 remove 方法,它只会删除那个标记

markerName.remove();
于 2015-12-25T21:20:57.480 回答
29

清除地图使用中的所有涂鸦

map.clear()
于 2014-10-07T22:20:43.567 回答
6

如果标记存在,则删除最后一个标记。如果标记不存在,则创建当前标记

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)));
}
于 2016-07-07T07:08:07.933 回答
6

如果您使用 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
    }
于 2020-01-13T03:37:43.583 回答
3

只是一个注释,我今晚浪费了几个小时追踪的东西......

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

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

对我来说似乎是一个错误......

于 2018-01-25T05:32:49.880 回答
2

创建一个全局变量来跟踪标记

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();
于 2017-01-11T08:50:45.210 回答
2

使用以下代码:

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

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

单击“标记”后,您可以将其删除。

于 2017-09-01T13:53:00.687 回答
1

在添加地图上创建包含所有标记的数组。

稍后,使用:

Marker temp = markers.get(markers.size() - 1);
temp.remove();
于 2015-05-28T23:19:39.933 回答
1

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

 marker.setVisible(false);

并在以后需要时使其可见。
2.但是,如果您想从地图中删除所有标记,请使用 map.clear();
注意: map.clear();也会删除Polylines, Circles等。
3.如果您不想删除Polylines, Circles等,则使用循环到标记的长度(如果您有多个标记)来删除那些在此处查看示例 将它们设置为 Visible false 并且不要 map.clear();在这种情况下使用。

于 2015-12-09T04:54:13.470 回答
1

对于那些遵循此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))
    }
}
于 2020-07-03T02:54:35.050 回答
0

试试这个,它正在更新当前位置,它工作正常。

        public void onLocationChanged(@NonNull Location location) {               
        //here we update the location on the map
        
        LatLng myActualLocation = new LatLng(location.getLatitude(), location.getLongitude());
        
        if (markerName!=null){  // marker name is declared as a gloval variable.
            markerName.remove();
        }
        
        markerName = mMap.addMarker(new MarkerOptions().position(myActualLocation).title("Marker Miami").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)));
        
        // mMap.addMarker(new MarkerOptions().position(myActualLocation).title("Marker Miami").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE)));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myActualLocation,18));
        
        }
于 2021-02-21T02:23:01.557 回答
-1

如果您想在单击时删除标记,请尝试以下操作:

mMap.setOnMarkerClickListener(this); //mMap is googleMap
   @Override
    public boolean onMarkerClick(@NonNull Marker marker) {

        marker.remove();

        return false;
    }

https://developers.google.com/maps/documentation/android-sdk/marker

于 2022-02-05T15:05:13.753 回答