在android中找到多边形中的一个点

时间:2012-12-27 02:11:05

标签: java android eclipse

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

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那么它工作正常。

有谁知道出了什么问题?

2 个答案:

答案 0 :(得分:1)

我看了source for the polygon boundary definition。它使用了#34;内部的常规约定,&#34;这要求顶点以CCW顺序在&#34;内部&#34;周围给出。空间。很可能你的边界是按CW顺序给出的,这使得内部&#34;内部&#34;大多数人会称之为外面的东西。

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

因此,颠倒边界顶点的顺序,事情应该按照你的意图开始工作。

<强> ADDITION

如果你不能颠倒顶点的顺序,那么有一个不同的多边形成员资格测试,它不依赖于点顺序。如果您正在测试点(x,y)的成员资格,则此算法假定点(无穷大,y)在多边形之外,然后决定(x,y)是否在对侧。 implementation here in C is due to WR Franklin。{{3}}。将它移植到Java很容易。我已多次使用它并取得了很好的效果。

答案 1 :(得分:1)

我一直在使用Google android-maps-utils library,你可以使用PolyUtil类,特别是在这种方法中:

public static boolean containsLocation(LatLng point, List<LatLng> polygon, boolean geodesic)