从Google地图中删除标记

时间:2012-12-03 21:51:39

标签: android google-maps

在适用于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);
      }
    }
  });
}

有没有人有更好的主意?

12 个答案:

答案 0 :(得分:217)

addMarker的方法签名是:

public final Marker addMarker (MarkerOptions options)

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

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

答案 1 :(得分:23)

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

map.clear()

答案 2 :(得分:22)

将标记添加到地图中

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

然后您将能够使用删除方法,它将只删除该标记

markerName.remove();

答案 3 :(得分: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)));
}

答案 4 :(得分: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)
    }

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

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

答案 5 :(得分:1)

1。如果要删除标记,可以marker.remove();执行此操作     或者您也可以隐藏标记而不是将其删除为

 marker.setVisible(false);

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

答案 6 :(得分:1)

使用以下代码:

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

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

点击&#34;标记&#34; 后,您可以将其删除。

答案 7 :(得分:0)

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

稍后,使用:

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

只是一个注意事项,我今晚浪费时间追踪......

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

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

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

答案 10 :(得分: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))
    }
}

答案 11 :(得分: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));
        
        }