从 GoogleMap 中删除标记

在新的 Android 版谷歌地图 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);
}
}
});
}

有人有更好的主意吗?

132064 次浏览

addMarker的方法签名是:

public final Marker addMarker (MarkerOptions options)

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

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

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

map.clear()

创建带有所有添加到地图上的标记的数组。

以后,使用:

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

1. 如果你想删除一个标记,你可以用 marker.remove();来做 或者,您也可以隐藏标记,而不是删除它作为

 marker.setVisible(false);

然后在需要的时候显示出来。
2. 然而,如果你想从地图 使用 map.clear();中移除所有的标记
注: map.clear();也会去除 Polylines, Circles等。
3.如果你不想去除 Polylines, Circles等等,那么使用一个循环到标记的长度(如果你有多个标记)来去除那些 点击这里查看示例 或者设置它们为可见假。在这种情况下不要使用 map.clear();

像这样把标记添加到地图上

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

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

markerName.remove();

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

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

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

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

使用以下代码:

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


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

一旦你点击 “标记”,你可以删除它。

只是一个提示,一些我今晚浪费了几个小时去追寻的东西..。

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

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

对我来说就像一只虫子。

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

对于那些遵循此 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))
}
}

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

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

}

如果你想在点击时删除标记,试试这个:

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

在 Kotlin

全局变量

private var marker: Marker? = null

在函数中

private fun placeMarkerOnMap(location: LatLng) {
val markerOptions = MarkerOptions()
.position(location)
.title("My Location")
marker = mMap.addMarker(markerOptions)
}

按下按钮

mMap.setOnMapClickListener { location ->
mMaps.clear()
marker?.remove()
placeMarkerOnMap(location)
}