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

时间:2013-10-17 09:54:55

标签: c# algorithm geolocation geometry

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

    }

有人有更好的算法吗?

1 个答案:

答案 0 :(得分:0)

球面坐标系有怪癖

要避免使用 3D正交/标准正交笛卡尔坐标系

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

    所以(long,lat,alt) -> (x,y,z)here你会发现如何做到这一点。您不需要将局部变换仅应用于第一个球体到3D笛卡尔变换(项目符号#1)。

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

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

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

    is point inside polygon?

  3. <强> [注释]

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