确定点是否在多边形中

Sup*_*iya 17 android google-maps geolocation polygons android-maps-v2

根据我的要求,我在谷歌地图上绘制多边形,如下图所示.(使用地图v2) 在此输入图像描述

现在,我需要在用户输入特定多边形时显示警报.

如何识别我的当前位置是否在多边形中.(需要优化的方式,不需要耗尽电池)

提前致谢.

Sup*_*iya 25

刚试过Ray Casting算法,它可以识别多边形中的点.这很完美.

有关Ray-Casting的论文,请参阅http://en.wikipedia.org/wiki/Point_in_polygon

private boolean isPointInPolygon(LatLng tap, ArrayList<LatLng> vertices) {
        int intersectCount = 0;
        for (int j = 0; j < vertices.size() - 1; j++) {
            if (rayCastIntersect(tap, vertices.get(j), vertices.get(j + 1))) {
                intersectCount++;
            }
        }

        return ((intersectCount % 2) == 1); // odd = inside, even = outside;
    }

    private boolean rayCastIntersect(LatLng tap, LatLng vertA, LatLng vertB) {

        double aY = vertA.latitude;
        double bY = vertB.latitude;
        double aX = vertA.longitude;
        double bX = vertB.longitude;
        double pY = tap.latitude;
        double pX = tap.longitude;

        if ((aY > pY && bY > pY) || (aY < pY && bY < pY)
                || (aX < pX && bX < pX)) {
            return false; // a and b can't both be above or below pt.y, and a or
                            // b must be east of pt.x
        }

        double m = (aY - bY) / (aX - bX); // Rise over run
        double bee = (-aX) * m + aY; // y = mx + b
        double x = (pY - bee) / m; // algebra is neat!

        return x > pX;
    }
Run Code Online (Sandbox Code Playgroud)


Dor*_*ean 20

我发现光线投射方法不可靠,但我最终使用了PolyUtil谷歌地图.

你需要依赖 compile 'com.google.maps.android:android-maps-utils:0.5'

然后方法看起来像这样

PolyUtil.containsLocation(userLocation, polyPointsList, false);
Run Code Online (Sandbox Code Playgroud)

编辑

这是源代码中找到的此方法的描述

计算给定点是否位于指定的多边形内.无论最后一个点是否等于第一个点,多边形始终被视为闭合.内部被定义为不包含南极 - 南极总是在外面.如果测地线为真,则多边形由大圆段形成,否则由多边形(loxodromic)段形成.