0

我正在使用以下代码来查找代码中是否存在坐标点:

mMap.setOnMapClickListener(new OnMapClickListener() 
{
    public void onMapClick(LatLng point) 
    {
        boolean checkPoly = true;
        Point2D[] points = new Point2D[ myPoints.size()];
        for ( int i = 0; i < myPoints.size(); i ++)
        {
            LatLng pt = myPoints.get(i);
            points[i] = new Point2D(pt.latitude, pt.longitude);
        }
        Polygon2D polygon2d = new SimplePolygon2D(points);

        double a = point.latitude;
        double b = point.longitude;
        Point2D myPt = new Point2D(a,b);

        checkPoly = polygon2d.contains(myPt);
        Log.i("CHECK", String.valueOf(checkPoly));
        if (checkPoly)
        {
            setMarker(point);
        }
        else
            Toast.makeText(NewSearch.this,"The Location is outside of the Area", Toast.LENGTH_LONG).show();
    }

我正在使用 JavaGeom 0.11.1 库来查找多边形点。然而,这段代码工作得很好。请注意,myPoints数组是ArrayList<LatLng>地图上绘制的多边形的所有顶点中的一个。但是发生了一些事情,现在它正在为地图之外的对面工作;如果我改变!checkPoly,那么它工作正常。

有谁知道出了什么问题?

4

2 回答 2

1

我查看了多边形边界定义的来源。它使用“内部”的通常约定,这需要在“内部”空间周围以逆时针顺序给出顶点。您的边界很可能是按 CW 顺序给出的,这使得“内部”成为大多数人所说的外部。

换句话说,你认为的多边形实际上是覆盖整个 xy 宇宙的无限多边形中的一个洞。

所以颠倒边界顶点的顺序,事情应该开始按你的意愿工作。

添加

如果您不能反转顶点的顺序,则有一个不依赖于点顺序的不同多边形隶属度测试。如果您正在测试点 (x,y) 的成员资格,则此算法假定点 (infinity, y) 在多边形之外,然后确定 (x,y) 是否在对面。C 中的实现归功于 WR Franklin。将它移植到 Java 很容易。我已经多次使用它,效果非常好。

于 2012-12-27T02:58:05.937 回答
1

我一直在使用Google android-maps-utils 库,您可以使用 PolyUtil 类,尤其是在这种方法中:

public static boolean containsLocation(LatLng point, List<LatLng> polygon, boolean geodesic)
于 2014-06-24T15:18:24.150 回答