【问题标题】:Point in polygon on Earth globe地球上多边形中的点
【发布时间】:2016-11-06 07:39:10
【问题描述】:

我有一个定义多边形的坐标列表(纬度、经度)。它的边缘是通过用弧连接两点来创建的,弧是这些点之间的最短路径。

我的问题是确定另一个点(我们称之为U)是否位于多边形之内或之外。我已经在网上搜索了几个小时,寻找一种完整且没有任何缺陷的算法。以下是我希望我的算法支持和接受的内容(就可能的弱点而言):

  1. 地球可以被视为一个完美的球体(据我所知,它会导致 0.3% 的精度损失,我可以接受)。
  2. 它必须正确处理跨越国际日期变更线的多边形。
  3. 它必须正确处理跨越北极和南极的多边形。

我决定实施以下方法(作为适用于 2D 场景的光线投射算法的修改)。

  1. 我想选择多边形外的点 S(纬度、经度)。
  2. 对于定义单个边的每一对顶点,我想计算大圆(我们称之为 G)。
  3. 我想计算点对 SU 的大圆。
  4. 对于第 2 点中定义的每个大圆,我想计算这个大圆是否与 G 相交。如果是,我会检查交点是否位于多边形的边缘。
  5. 我会计算有多少个交叉点,然后根据这个(偶数/奇数)确定点 U 是否在多边形的内部/外部。

我知道如何实现从第 2 点到第 5 点的计算,但我不知道如何选择起点 S。它不像在 2D 平面上那么明显,因为我不能只选择最左边的点。

关于如何选择这一点 (S) 以及我的方法是否合理且最佳的任何想法?

感谢您的任何意见!

【问题讨论】:

  • 每个简单的多边形都将球体分成两部分。哪个是“内”,哪个是“外”……?在平面上这很简单——外面是未绑定的部分,但在球体上,两个部分都是有界的。他们甚至可以是平等的!考虑一个“四边形多边形”,其所有顶点都在赤道上,坐标以度为单位:(0, 0), (0, 90), (0,180), (0, -90)...
  • 令我惊讶的是,几年前我似乎回答了这个问题(几乎重复)stackoverflow.com/questions/3067095/…
  • 在我的情况下,我将拥有不应跨越世界一半的区域(它将或多或少是本地区域而不是全球区域),因此我们可以假设“内部”更小比“外面”。即使没有这个假设,我认为这并不重要,如果我们可以解决“内部”问题,我们也可以解决“外部”问题。
  • 查看“相对于任意形状的球面多边形在球面上定位一个点”。
  • @1valdis - 我是为我的员工在商业上做的,所以我没有发布它的权利 - 抱歉 :( 但我可以说它非常简单地映射它一对一一到Java代码

标签: algorithm math geospatial point-in-polygon


【解决方案1】:

如果你的多边形是局部的,你可以只取与地球球体在B点相切的平面,然后计算多边形顶点在该平面上的投影,这样问题就变成了简化为 2D。

当您在投影中用直线近似球面弧时,此方法会引入一个小错误。如果您的多边形很小,它可能是微不足道的,否则,您可以在进行投影时沿弧添加中间点。

您还应该考虑 B 对映面上的多边形,但考虑到多边形的方向或检查 B 和一些多边形顶点。

最后,如果您必须为此查询太多点,您可能希望选择一些固定的投影平面(例如,形成包裹球体的八面体的投影平面)并预先计算多边形的投影。您甚至可以为每个索引创建一些二维索引结构作为四叉树,以加快查找速度。

【讨论】:

    【解决方案2】:

    最大的问题是定义“多边形内部”的含义。

    在球体上,每个多边形(只要线不相交)都定义了球体的两个区域。这两个区域同样有资格被称为多边形的内部。

    考虑一个简单的、边长为 1 米、围绕南极的黄色正方形。

    你可以认为黄色区域是正方形的内部,或者你可以认为正方形包围了每条线以北的所有东西(地球的其余部分)。

    因此,从技术上讲,球体上的任何点都“有效”地位于多边形内。

    消除歧义的唯一方法是选择您想要的多边形的哪一侧。例如,将内部定义为始终为每条边右侧的区域。

    【讨论】:

      猜你喜欢
      • 2022-11-24
      • 2017-09-12
      • 2021-09-04
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      相关资源
      最近更新 更多