从 GoogleMap 中删除标记

Posted

技术标签:

【中文标题】从 GoogleMap 中删除标记【英文标题】:Remove a marker from a GoogleMap 【发布时间】:2012-11-21 11:00:38 【问题描述】:

在新的 android 版 Google Maps API 中,我们可以add a marker,但没有办法(轻松)删除。

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

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() 来添加标记? 在 UI 线程上做 使用 mMap.clear() 清除所有标记 【参考方案1】:

addMarker 的方法签名是:

public final Marker addMarker (MarkerOptions options)

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

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

【讨论】:

这对我不起作用。 marker.setVisible(false)、marker.remove(),甚至 markerManager.remove(marker) 都不会影响地图。标记仍然存在。有什么提示吗? 请参阅下面关于持有标记的评论,虽然它在从地图中删除后几乎没有用处,如果您决定检查它的值.. Remove 方法将标记值设置为空...【参考方案2】:

像这样将标记添加到地图中

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

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

markerName.remove();

【讨论】:

【参考方案3】:

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

map.clear()

【讨论】:

这会清除地图上的所有叠加层,而不仅仅是问题所暗示的标记。【参考方案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)));

【讨论】:

【参考方案5】:

如果您使用 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)
    

如果您想在单击标记时显示地址位置,请添加此代码以隐藏和显示标记地址,但您需要一种获取地址位置的方法。我从这篇文章中得到了代码:How to get complete address from latitude and longitude?

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

【讨论】:

【参考方案6】:

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

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

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

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

使用以下代码:

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

           marker.remove();
           return true;
       
   );

点击“标记”后,即可将其移除。

【讨论】:

【参考方案9】:

1.如果您想删除标记,您可以使用marker.remove(); 或者,您也可以隐藏标记而不是将其删除为

 marker.setVisible(false);

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

【讨论】:

【参考方案10】:

对于那些遵循GoogleMaps - MapWithMarker 项目示例的人,您可以通过这样做来删除标记​​p>

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

【讨论】:

【参考方案11】:

在地图中添加所有标记创建数组。

稍后,使用:

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

【讨论】:

【参考方案12】:

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

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

【讨论】:

以上是关于从 GoogleMap 中删除标记的主要内容,如果未能解决你的问题,请参考以下文章

GoogleMap,如何在单击 Market en Flutter 时删除图标

无法在不单击标记的情况下在 GoogleMap 中显示信息窗口 - GoogleMap Cluster Android

如何在不清除 GoogleMap 的情况下更新多个位置

GoogleMap infowindow按下按钮即可点击

Swift 5:如何在点击/触摸坐标时在 GoogleMap 上添加标记?

关于googlemap的问题