c# - 检测地理位置是否在复杂的多边形中

标签 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;

    }

有没有人有更好的算法?

最佳答案

球坐标系有它的怪癖

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

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

    所以 (long,lat,alt) -> (x,y,z)here你会找到怎么做的。您不需要仅将第一个球面应用局部变换到 3D 笛卡尔变换(项目符号 #1。)

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

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

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

    is point inside polygon?

[注释]

不要忘记将所有内容都视为 3D 矢量而不是 2D !!!

关于c# - 检测地理位置是否在复杂的多边形中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19423472/

相关文章:

c# - 如何使 C# Web 服务接受自定义对象,包括 XSD 中定义的未绑定(bind)元素

javascript - 有没有一种算法既能保证集合顺序又能保持O(1)的插入/删除?

c++ - 二进制搜索树键/值对 - 我知道值但不知道键 C++

arrays - 给定数组 A 和数字 K 创建数组 B,其中 B[i] = min(A[i], A[i+1].. A[i + K - 1])

android - Place Picker 在启动后关闭

c# - RavenDB查询时间过长

c# - 哪些资源解释了 C# 中的反射和元编程?

c# - 将毫秒转换为人类可读的时间流逝

javascript - navigator.geolocation.getCurrentPosition 不起作用

ios - WKWebView 两次询问位置权限