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

TWT*_*TWT 5 c# algorithm geometry geolocation

我们目前正在使用以下算法来检测地理点是否位于复杂多边形内。这工作正常,除非多边形穿过 180\xc2\xb0 经线。

\n\n

例如,在多边形中未检测到点 (-170, 60) 160,65,0 160,15,0 -160,15,0 -160,65,0 160,65,0

\n\n

看下图:\n[Img]http://tinypic.com/r/14x2xl1[/img]\n我想要红框中的所有内容。不是黄盒子!

\n\n
    public static bool IsCoordinateInPolygon(IList<KMLCoordinate> polygon, KMLCoordinate testPoint)\n    {\n\n        bool result = false;\n        int j = polygon.Count - 1;\n        for (int i = 0; i < polygon.Count; i++)\n        {\n            if (polygon[i].Latitude < testPoint.Latitude && polygon[j].Latitude >= testPoint.Latitude || polygon[j].Latitude < testPoint.Latitude && polygon[i].Latitude >= testPoint.Latitude)\n            {\n                if (polygon[i].Longitude + (testPoint.Latitude - polygon[i].Latitude) / (polygon[j].Latitude - polygon[i].Latitude) * (polygon[j].Longitude - polygon[i].Longitude) < testPoint.Longitude)\n                {\n                    result = !result;\n                }\n            }\n            j = i;\n        }\n        return result;\n\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

有人有更好的算法吗?

\n

Spe*_*tre 1

球坐标系有它的怪癖

为了避免它们,请改用3D正交/正交笛卡尔坐标系

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

    所以(long,lat,alt) -> (x,y,z)在这里您可以找到如何操作。您不需要仅应用第一个球面到 3D 笛卡尔变换的局部变换(第 1 点。)

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

    我通常会计算从您的地理位置到任何方向的线与多边形边界线之间的交点数量。

    • 如果是奇数则点在里面
    • 如果是偶数则该点在外面
    • 如果点位于多边形的任何线上,则它在内部
    • 如果您的投射线击中任何顶点,则请记住(不要计算在此顶点的多次击中)或稍微改变方向并重试

    点在多边形内部吗?

[笔记]

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