我们目前正在使用以下算法来检测地理点是否在复杂多边形内。这种方法很好,除非多边形穿过180°经度线。
例如,在多边形160,65,0 160,15,0 -160,15,0 -160,65,0 160,65,0中未检测到点(-170,60)
请看下面的图片: [IMG] http://tinypic.com/r/14x2xl1 [/ IMG] 我想要红色框中的所有内容。不是黄色的盒子!
public static bool IsCoordinateInPolygon(IList<KMLCoordinate> polygon, KMLCoordinate testPoint)
{
bool result = false;
int j = polygon.Count - 1;
for (int i = 0; i < polygon.Count; i++)
{
if (polygon[i].Latitude < testPoint.Latitude && polygon[j].Latitude >= testPoint.Latitude || polygon[j].Latitude < testPoint.Latitude && polygon[i].Latitude >= testPoint.Latitude)
{
if (polygon[i].Longitude + (testPoint.Latitude - polygon[i].Latitude) / (polygon[j].Latitude - polygon[i].Latitude) * (polygon[j].Longitude - polygon[i].Longitude) < testPoint.Longitude)
{
result = !result;
}
}
j = i;
}
return result;
}
有人有更好的算法吗?
答案 0 :(得分:0)
球面坐标系有怪癖
要避免使用 3D正交/标准正交笛卡尔坐标系
转换多边形顶点和地理位置
所以(long,lat,alt) -> (x,y,z)
。 here你会发现如何做到这一点。您不需要将局部变换仅应用于第一个球体到3D笛卡尔变换(项目符号#1)。
使用任何内部多边形测试...
我通常会计算从地理定位到任意方向和多边形边界线的线条之间的交点数。
<强> [注释] 强>
不要忘记处理所有3D矢量而不是2D !!!