【发布时间】:2016-11-06 07:39:10
【问题描述】:
我有一个定义多边形的坐标列表(纬度、经度)。它的边缘是通过用弧连接两点来创建的,弧是这些点之间的最短路径。
我的问题是确定另一个点(我们称之为U)是否位于多边形之内或之外。我已经在网上搜索了几个小时,寻找一种完整且没有任何缺陷的算法。以下是我希望我的算法支持和接受的内容(就可能的弱点而言):
- 地球可以被视为一个完美的球体(据我所知,它会导致 0.3% 的精度损失,我可以接受)。
- 它必须正确处理跨越国际日期变更线的多边形。
- 它必须正确处理跨越北极和南极的多边形。
我决定实施以下方法(作为适用于 2D 场景的光线投射算法的修改)。
- 我想选择多边形外的点 S(纬度、经度)。
- 对于定义单个边的每一对顶点,我想计算大圆(我们称之为 G)。
- 我想计算点对 S 和 U 的大圆。
- 对于第 2 点中定义的每个大圆,我想计算这个大圆是否与 G 相交。如果是,我会检查交点是否位于多边形的边缘。
- 我会计算有多少个交叉点,然后根据这个(偶数/奇数)确定点 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