如何判断标记是否在多边形 googleMap v2 中

How to tell if a Marker is in a Polygon googleMap v2

我有一个带有 Polygons 的 Google 地图,除了最后一部分检测 Marker 是否已经在 Polygon。目前的情况是,当我触摸 Polygon 时,它会添加 Marker"which is correct",但如果我在不同的位置触摸 Polygon,它会删除 Marker 并添加一个新的。我想要发生的是,如果 Marker 已经在这些点内,则不要添加新点。我的代码在下面任何帮助将不胜感激。

public void onMapClick(LatLng point) {


    for (int j = 0; j < arrPolygons.size(); j++) {

        if (isPointInPolygon(point, arrPolygons.get(j).getPoints())) {

        if (marker != null) {
                marker.remove();
                marker = null;
                Log.v("Marker", "Removing Marker");
            }else{
                marker = googleMap.addMarker(new MarkerOptions()
                        .position(point)
                        .title("test")
                        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                Log.v("Marker", "ADDing Marker");
            }
        }
    }

如有任何帮助,我们将不胜感激。

最简单的方法是使用 Google Maps Android API Utility Library, which contains the PolyUtil class.

首先通过将当前版本添加到您的 build.gradle 导入库,目前 0.3.4 例如:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile 'com.google.android.gms:play-services-maps:7.3.0'
    compile 'com.google.maps.android:android-maps-utils:0.3.4'
}

对于这个简单的例子,我们假设 Map Activity class 定义和成员变量如下所示,并且在 polygonList:

中只定义了一个多边形
import com.google.maps.android.PolyUtil;
//other imports.....

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    private Marker marker;
    List<LatLng> polygonList = new ArrayList<LatLng>();
    //.............

然后您可以像这样设置您的 GoogleMap.OnMapClickListener 以便仅在多边形内添加一个标记。:

  mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {

        @Override
        public void onMapClick(LatLng point) {

            if (PolyUtil.containsLocation(point, polygonList, false)) {

                if (marker == null) {
                    //only add Marker if there is not one already inside the Polygon
                    marker = mMap.addMarker(new MarkerOptions()
                            .position(point)
                            .title("test")
                            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                    Log.v("Marker", "ADDing Marker");

                }

            }
        }
    });

多个多边形,多个标记解决方案:

为了使其与多个 Ploygons 一起工作,您可以使用 POJO 来存储 Polygon/Marker 对:

public class PolyMarkerObject{
    Polygon polygon;
    Marker marker;
}

然后定义一个新的成员变量polyMarkerList:

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    List<PolyMarkerObject> polyMarkerList = new ArrayList<>();
    //.............

绘制时将每个多边形添加到列表中:

    List<LatLng> newPolygon = new ArrayList<>();
    //set up the points in the Polygon.......

    Polygon p = mMap.addPolygon(new PolygonOptions()
            .addAll(newPolygon)
            .strokeColor(Color.RED)
            .fillColor(Color.BLUE));

    PolyMarkerObject newPolyMarkerObj = new PolyMarkerObject();
    newPolyMarkerObj.polygon = p;
    polyMarkerList.add(newPolyMarkerObj);

然后在每次点击Map的时候循环list,看看当前的Ploygon是否已经有Marker了。如果它还没有 Marker,则移除任何已放置在不同 Polygon 中的 Marker,并在当前 Polygon 中创建一个:

 mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {

        @Override
        public void onMapClick(LatLng point) {

            for (PolyMarkerObject pmObj : polyMarkerList) {
                //only add Marker if there is not one already inside the Polygon
                if (PolyUtil.containsLocation(point, pmObj.polygon.getPoints(), false)) {
                    if (pmObj.marker == null) {

                        //Add Marker to current Polygon
                        Marker newMarker = mMap.addMarker(new MarkerOptions()
                                .position(point)
                                .title("test")
                                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));

                        pmObj.marker = newMarker;
                        Log.v("Marker", "ADDing Marker");
                        break;
                    }

                }
            }
        }
    });

多个多边形,一个标记解决方案:

在这种情况下,您只需要一个标记参考和一个多边形列表:

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    Marker marker;
    List<Polygon> polyList = new ArrayList<>();
    //................

将多边形添加到地图时将其添加到列表中:

    List<LatLng> newPolygon = new ArrayList<>();
    //set up the points in the Polygon.......

    Polygon p = mMap.addPolygon(new PolygonOptions()
            .addAll(newPolygon)
            .strokeColor(Color.RED)
            .fillColor(Color.BLUE));

    polyList.add(p);

然后,在地图点击侦听器中,您有两种情况,一种是 Marker 引用为 null(尚未添加 Marker),另一种是 Marker 在不同的 Polygon 中。如果Marker已经在当前Polygon中,则不会移动。

 mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {

        @Override
        public void onMapClick(LatLng point) {

            for (Polygon pObj : polyList) {
                //find Polygon user tapped inside of
                if (PolyUtil.containsLocation(point, pObj.getPoints(), false)) {
                    //first case, no Marker
                    if (marker == null) {

                        //Add Marker to current Polygon
                        marker = mMap.addMarker(new MarkerOptions()
                                .position(point)
                                .title("test")
                                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));

                        Log.v("Marker", "ADDing first Marker");
                        break;
                    }
                    else if (!PolyUtil.containsLocation(marker.getPosition(), pObj.getPoints(), false)) {
                        //Marker exists already in a different Polygon
                        //remove Marker from previous Polygon
                        marker.remove();
                        //Add Marker to current Polygon
                        marker = mMap.addMarker(new MarkerOptions()
                                .position(point)
                                .title("test")
                                .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));

                        Log.v("Marker", "Moving Marker to new Polygon");
                        break;
                    }

                }
            }
        }
    });