球体表面上(经度,纬度)点的凸包

问题描述 投票:21回答:5

标准凸包算法不适用于(经度,纬度)点,因为标准算法假定您需要一组笛卡尔点的壳。纬度-经度点是not直角坐标,因为经度在反子午线(+/- 180度)处“环绕”。也就是说,经度179以东两度为-179。

因此,如果您的点集恰好跨越了反子午线,您将计算出错误地在整个世界范围内延伸的伪造船体。

关于技巧的任何建议,我都可以使用标准凸包算法来纠正,或者指向正确的“地球球形”包算法的指针?

现在,我想一想,有很多有趣的案例要比跨跨子午线要考虑。考虑环绕地球的点“带”-它的凸包将没有东西边界。甚至更进一步,{(0,0),(0、90),(0,-90),(90、0),(-90、0),(180、0)}的凸包是什么? -它似乎包含地球的整个表面,那么在其周长上有哪些点?

geometry geospatial latitude-longitude computational-geometry convex-hull
5个回答
7
投票

标准凸包算法不会因为坐标在地球表面的环绕而失败,而是受到了更根本的问题的困扰。球体的表面(不要忘了地球的非球形性)不是欧几里得空间,因此欧几里得几何学不起作用,而凸包例程则假定基础空间是欧几里得(请向我展示一个不包含欧几里得的空间)。 t,请)无效。

球体的表面符合elliptic geometry的概念,其中线为大圆,对映点被视为同一点。您已经开始体验由于尝试将欧几里得凸性概念应用于椭圆空间而引起的问题。

向您开放的一种方法是采用geodesic convexity的定义并实现测地线凸包例程。看起来很毛。而且它可能不会产生符合您(通常是欧几里得)期望的结果。在许多情况下,对于3个任意点,凸包都变成了球体的整个表面。

[另一种方法,是导航员和制图师千古以来采用的一种方法,就是将球体表面的一部分(包含所有点的一部分)投影到欧几里得空间(这是地图投影的主题,我不会。请参考其中的大量文献来打扰您,并找出投影点的凸包。将您感兴趣的区域投影到平面上并调整坐标,以使其不会环绕;例如,如果您对法国感兴趣,可以通过加30度来调整所有经度,以使整个国家都由+ ve数进行协调。

虽然我在写,但@ Li-aung Yip的答案中提出的使用3D凸包算法的想法让我误以为是。一组表面点的3D凸包将包括位于球体内的点,边和面。这些从字面上看并不存在于球的2D曲面上,只会将您的困难从从2D中不太正确的概念进行角力变为3D完全错误。此外,我从Wikipedia文章中了解到,我提到了一个封闭的半球(即包括其“赤道”的半球)在球表面的几何形状上不是凸的。


2
投票

不是将您的数据视为经纬度数据,而是可以在3D空间中考虑它并应用3D convex hull algorithm吗?然后,您可以通过分析3D凸包来找到所需的2D凸包。

这将使您返回到遍历笛卡尔凸壳(虽然是三维的)的算法,并且坐标的折回没有问题。

或者,有本文:Computing the Convex Hull of a Simple Polygon on the Sphere (1996)似乎处理了您正在处理的一些相同问题(坐标环绕等)


1
投票

如果所有点都在半球内(也就是说,如果您可以找到一个穿过地球中心的切面,将它们全部放在一侧),那么您可以从中心进行中央aka经济学的人称工程投影到平行于切割平面的平面。然后所有大圆在投影中成为直线,因此投影中的凸包将映射回地球上正确的凸包。通过查看“地标投影”部分here中的纬度线,可以看到纬度/经度点有多么错误(请注意,经度线保持笔直)。

(将地球视为球体仍然不太正确,但这是一个很好的第二近似值。我不认为跨越更现实的地球(例如WGS84)的真实最小距离路径上的点通常位于一架穿过中心的飞机。也许假装它们能比球体给您更好的逼近感。)


1
投票

FutureNerd:

您绝对正确。对于我的应用程序,我必须解决与Maxy-B完全相同的问题。作为第一次迭代,我只是将(lng,lat)视为(x,y)并运行了标准的2D算法。只要没有人看起来太近,此方法就可以很好地工作,因为我的所有数据都位于连续的美国。不过,作为第二次迭代,我使用了您的方法并证明了这一概念。

这些点必须位于同一半球。事实证明,选择此半球并非易事(正如我最初猜测的那样,不仅仅是点的中心。)为说明起见,请考虑以下四个点:(0,0),(-60,0), (+60,0)沿赤道,(0,90)沿北极。但是,您选择定义“中心”,它们的中心对称地位于北极上,所有四个点都位于北半球。但是,考虑用(-19,64)冰岛代替第四点。现在它们的中心不在北极,而是不对称地朝向冰岛。但是,所有这四个点仍然在北半球。此外,由北极唯一定义的北半球是它们共享的唯一半球。因此,计算此“极”成为算法,而不是代数。

请参阅我的存储库以获取Python代码:https://github.com/VictorDavis/GeoConvexHull


0
投票

这个问题已经回答了一段时间,但是我想总结一下我的研究结果。

球形凸包基本上仅针对非对映点定义。假设所有点都在同一半球上,则可以通过两种主要方法来计算它们的凸包:

  1. 使用侏儒/中央投影将点投影到平面上,并应用平面凸包算法。参见Lin-Lin Chen,T。C. Woo,"Computational Geometry on the Sphere With Application to Automated Machining"(1992)。如果这些点在已知的半球上,则可以对将这些点投影到哪个平面上进行硬编码。
  2. 将平面凸包算法应用于球体。参见C. Grima和A. Marquez,"Computational Geometry on Surfaces: Performing Computational Geometry on the Cylinder, the Sphere, the Torus, and the Cone",Springer(2002)。此引用似乎与上述Li-aung Yip引用的摘要提供了类似的方法。

作为参考,在Python中,我正在研究implementation of my own,目前仅适用于北半球上的点。

另请参见this question关于数学溢出。

© www.soinside.com 2019 - 2024. All rights reserved.