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 中的标记引用相同。