Android:根据颜色检查google地图标记是否存在
Android: Check if google map marker exists based on color
我有一个名为创建标记的方法,它使用 LatLng 和颜色在特定坐标处创建标记。
public void createMarker(LatLng latLong, float thisNewColor){
MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
if(mMap != null) {
mMap.addMarker(options).showInfoWindow();
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17);
mMap.animateCamera(cameraUpdate);
mMap.setMyLocationEnabled(true);
}
}
基于用户发送的新位置将成为绿色标记,每次他发送新位置时地图都需要更新。如何检查绿色标记是否存在,如果存在则删除并创建一个新标记?
EDIT
此线程在后台执行,当找到新位置 LatLng 时,它会执行绿色的 createMarker 方法。所以我需要检查它是否存在,并在线程收到新的 LatLng 时替换它:
@SuppressWarnings("unused")
public void onEventMainThread(DisplayNewLocation displayNewLocation){
newLatLngToDisplay = displayNewLocation.getNewLatLng();
this.createMarker(newLatLngToDisplay, BitmapDescriptorFactory.HUE_GREEN);
}
EDIT 2
我尝试使用全局布尔标志检查添加的标记是否存在,然后将其设置为不可见并尝试覆盖它。在构建和测试时,它不会覆盖标记,它只是创建一个新标记。因此,为什么我认为通过标记颜色来执行此操作最简单。
@SuppressWarnings("unused")
public void onEventMainThread(DisplayNewLocation displayNewLocation){
if(isPeerLocation){
this.peerLocation.visible(false);
}
newLatLngToDisplay = displayNewLocation.getNewLatLng();
this.createMarker(newLatLngToDisplay, BitmapDescriptorFactory.HUE_GREEN);
Log.e("NEwLatLng Success!- ", newLatLngToDisplay.toString());
}
public void createMarker(LatLng latLong, float thisNewColor){
if(thisNewColor == BitmapDescriptorFactory.HUE_GREEN){
peerLocation = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
this.isPeerLocation = true;
}else{
options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
this.isPeerLocation = false;
}
//MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
if(mMap != null) {
if(isPeerLocation) {
mMap.addMarker(peerLocation).showInfoWindow();
}else{
mMap.addMarker(options).showInfoWindow();
}
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17);
mMap.animateCamera(cameraUpdate);
mMap.setMyLocationEnabled(true);
}
}
谢谢
按颜色是不可能的,所以在创建新标记之前清除所有标记
编辑
尝试
Marker marker;
if(marker!=null) {
marker.remove();
marker=mMap.addMarker(options);
}
您可以创建一个 HashMap(键是颜色,MarkerOptions 作为值),您将在其中存储所有标记,然后手动检查标记是否存在于 HashMap 中。
编辑
试试这个代码
Map<Integer, Marker> mMarkers = new HashMap<>();
public void createMarker(LatLng latLong, float thisNewColor){
MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
if(mMap != null) {
if (mMarkers.contains(thisNewColor)){
Marker old = mMarkers.get(thisNewColor);
old.remove();
}
Marker marker = mMap.addMarker(options);
marker.showInfoWindow();
mMarkers.put(thisNewColor, marker);
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17);
mMap.animateCamera(cameraUpdate);
mMap.setMyLocationEnabled(true);
}
}
所以我解决了我的问题。这不是一个理想的解决方案,但它确实解决了我的问题。
我只是添加了一个标志来检查是否将对等位置解析为 createMarker 方法。如果是,则清除地图,并使用对等方的新位置重新绘制客户端的原始位置。
public void createMarker(LatLng latLong, float thisNewColor, boolean isPeerLocation){
MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
if(mMap != null) {
if(isPeerLocation){
mMap.clear();
//This is the method that is called to place your current location on the map
handleNewLocation(location);
}
mMap.addMarker(options).showInfoWindow();
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17);
mMap.animateCamera(cameraUpdate);
mMap.setMyLocationEnabled(true);
}
}
为什么不使用 Marker 的 setPosition()?
如果你一直只有一个标记,你可以只保存它,然后改变位置。
private Marker mMarker;
public void createMarker(LatLng latLng, float thisNewColor, boolean isPeerLocation) {
if (mMap == null) return;
if (mMarker != null) {
//update existing
mMarker.setPosition(latLng);
} else {
// create new marker
MarkerOptions options = new MarkerOptions()
.position(latLng)
.draggable(false)
.icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
mMarker = mMap.addMarker(options);
}
mMarker.showInfoWindow();
...
}
如果你有很多标记,Alexandr 的答案是正确的。 HashMap 和 GoogleMaps 中的标记引用相同。
我有一个名为创建标记的方法,它使用 LatLng 和颜色在特定坐标处创建标记。
public void createMarker(LatLng latLong, float thisNewColor){
MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
if(mMap != null) {
mMap.addMarker(options).showInfoWindow();
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17);
mMap.animateCamera(cameraUpdate);
mMap.setMyLocationEnabled(true);
}
}
基于用户发送的新位置将成为绿色标记,每次他发送新位置时地图都需要更新。如何检查绿色标记是否存在,如果存在则删除并创建一个新标记?
EDIT
此线程在后台执行,当找到新位置 LatLng 时,它会执行绿色的 createMarker 方法。所以我需要检查它是否存在,并在线程收到新的 LatLng 时替换它:
@SuppressWarnings("unused")
public void onEventMainThread(DisplayNewLocation displayNewLocation){
newLatLngToDisplay = displayNewLocation.getNewLatLng();
this.createMarker(newLatLngToDisplay, BitmapDescriptorFactory.HUE_GREEN);
}
EDIT 2
我尝试使用全局布尔标志检查添加的标记是否存在,然后将其设置为不可见并尝试覆盖它。在构建和测试时,它不会覆盖标记,它只是创建一个新标记。因此,为什么我认为通过标记颜色来执行此操作最简单。
@SuppressWarnings("unused")
public void onEventMainThread(DisplayNewLocation displayNewLocation){
if(isPeerLocation){
this.peerLocation.visible(false);
}
newLatLngToDisplay = displayNewLocation.getNewLatLng();
this.createMarker(newLatLngToDisplay, BitmapDescriptorFactory.HUE_GREEN);
Log.e("NEwLatLng Success!- ", newLatLngToDisplay.toString());
}
public void createMarker(LatLng latLong, float thisNewColor){
if(thisNewColor == BitmapDescriptorFactory.HUE_GREEN){
peerLocation = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
this.isPeerLocation = true;
}else{
options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
this.isPeerLocation = false;
}
//MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
if(mMap != null) {
if(isPeerLocation) {
mMap.addMarker(peerLocation).showInfoWindow();
}else{
mMap.addMarker(options).showInfoWindow();
}
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17);
mMap.animateCamera(cameraUpdate);
mMap.setMyLocationEnabled(true);
}
}
谢谢
按颜色是不可能的,所以在创建新标记之前清除所有标记
编辑
尝试
Marker marker;
if(marker!=null) {
marker.remove();
marker=mMap.addMarker(options);
}
您可以创建一个 HashMap(键是颜色,MarkerOptions 作为值),您将在其中存储所有标记,然后手动检查标记是否存在于 HashMap 中。
编辑
试试这个代码
Map<Integer, Marker> mMarkers = new HashMap<>();
public void createMarker(LatLng latLong, float thisNewColor){
MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
if(mMap != null) {
if (mMarkers.contains(thisNewColor)){
Marker old = mMarkers.get(thisNewColor);
old.remove();
}
Marker marker = mMap.addMarker(options);
marker.showInfoWindow();
mMarkers.put(thisNewColor, marker);
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17);
mMap.animateCamera(cameraUpdate);
mMap.setMyLocationEnabled(true);
}
}
所以我解决了我的问题。这不是一个理想的解决方案,但它确实解决了我的问题。
我只是添加了一个标志来检查是否将对等位置解析为 createMarker 方法。如果是,则清除地图,并使用对等方的新位置重新绘制客户端的原始位置。
public void createMarker(LatLng latLong, float thisNewColor, boolean isPeerLocation){
MarkerOptions options = new MarkerOptions().position(latLong).draggable(false).icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
if(mMap != null) {
if(isPeerLocation){
mMap.clear();
//This is the method that is called to place your current location on the map
handleNewLocation(location);
}
mMap.addMarker(options).showInfoWindow();
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLong, 17);
mMap.animateCamera(cameraUpdate);
mMap.setMyLocationEnabled(true);
}
}
为什么不使用 Marker 的 setPosition()?
如果你一直只有一个标记,你可以只保存它,然后改变位置。
private Marker mMarker;
public void createMarker(LatLng latLng, float thisNewColor, boolean isPeerLocation) {
if (mMap == null) return;
if (mMarker != null) {
//update existing
mMarker.setPosition(latLng);
} else {
// create new marker
MarkerOptions options = new MarkerOptions()
.position(latLng)
.draggable(false)
.icon(BitmapDescriptorFactory.defaultMarker(thisNewColor));
mMarker = mMap.addMarker(options);
}
mMarker.showInfoWindow();
...
}
如果你有很多标记,Alexandr 的答案是正确的。 HashMap 和 GoogleMaps 中的标记引用相同。