我使用以下代码来查找代码中是否存在坐标点:
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
那么它工作正常。
有谁知道出了什么问题?
答案 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)