检测地理位置是否在复杂多边形中

我们目前正在使用以下算法来检测地理点是否在复杂多边形内。 这种方法很好,除非多边形穿过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 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) { 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; } 

有没有人有更好的算法?

球坐标系有它怪癖

为了避免它们使用3D正交/正交笛卡尔坐标系代替

  1. 转换多边形顶点和地理位置

    so (long,lat,alt) -> (x,y,z) 。 在这里你会发现如何做到这一点。 您不需要将局部变换仅应用于第一个球体到3D笛卡尔变换(子弹#1)。

  2. 使用任何内部多边形测试…

    我通常会计算从地理位置到任意方向和多边形边界线的线投之间的交点数。

    • 如果它是奇数,则点在里面
    • 如果它是偶然那么重点是在外面
    • 如果点位于任何多边形线上,那么它就在里面
    • 如果您的铸造线击中任何顶点,则要记住(不要计算此顶点的多次撞击)或稍微改变方向并再试一次

    是多边形内的点?

[笔记]

不要忘记处理所有3D矢量而不是2D!