在适用于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);
}
}
});
}
有没有人有更好的主意?
答案 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语言,则只需添加以下代码:
创建GoogleMap
和Marker
类型的全局变量。
我使用可变标记使可变标记值可以直接更改
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项目示例的用户,您可以这样做删除标记 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 :(得分: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));
}