【问题标题】:Remove a marker from a GoogleMap从 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() 清除所有标记

标签: android google-maps


【解决方案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));
                            
                            }
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2015-05-03
                      • 1970-01-01
                      • 2018-03-29
                      • 2014-05-24
                      • 1970-01-01
                      • 2014-10-15
                      • 2013-08-05
                      • 2015-04-25
                      相关资源
                      最近更新 更多