4

我们目前正在使用以下算法来检测一个地理点是否在一个复杂的多边形内。这可以正常工作,除非多边形穿过 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;

    }

有人有更好的算法吗?

4

1 回答 1

0

球坐标系有它的怪癖

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

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

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

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

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

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

    点在多边形内吗?

[笔记]

不要忘记把所有的都当作 3D 向量而不是 2D 来处理!!!

于 2014-06-28T08:34:28.577 回答