如何计算地球上自相交多边形的面积

时间:2014-01-13 14:09:42

标签: algorithm polygon area geodesic-sphere

我试图在地球上找到自相交(复杂)多边形的区域。是否有任何库可以为这些几何实现正确的区域计算?

到目前为止,我已尝试geographiclibPolygon2(基于gpc),但它们会给复杂多边形带来错误的结果。

另一方面,是否有一种简单的方法可以将自相交多边形转换为一组简单的多边形,这样我就可以将算法用于简单的几何,然后对所有多边形求和?我知道解决方案是实现Bentley-Ottman algorithm来找到交叉点,然后将多边形划分为一组简单的多边形,但是如果有一个库我可以使用我很乐意避免重新发明轮子(可能介绍错误)。

更新:我正在使用的坐标不明确包括交叉点。因此剪辑库似乎无法正确处理它们。例如,在以下代码coords_1coords_2中定义相同的多边形。使用Polygon2剪辑库。

>>> coords_1 = [(0,0), (1,1), (1,0), (0,1)]
>>> coords_2 = [(0,0), (0.5, 0.5), (1,0), (1,1), (0.5,0.5), (0,1)]
>>> Polygon(coords_1).area()
0
>>> Polygon(coords_2).area()
0.5

我想通过使用coords_1获得第二个结果。我还尝试了其他剪辑库但到目前为止没有运气。

2 个答案:

答案 0 :(得分:3)

近似解决方案是将多边形映射到平面,并使用平面几何库来执行计算几何。对于相对于整个球体较小的多边形,这种近似应该非常有效;但即使对于大型多边形,也可以通过充分细化多边形来任意精确。

不幸的是,我认为本质球形操作没有太多的库功能。

编辑:这是一个形状上的解决方案,我认为你想要的是:

from shapely.geometry.polygon import  LinearRing, Polygon

coords_1 = [(0,0), (1,1), (1,0), (0,1)]
##coords_1 = [(0,0), (0,1), (1,1), (1,0)]

lr = LinearRing(coords_1)

if lr.is_valid:
    print Polygon(lr).area
else:
    print Polygon(coords_1).buffer(0).area + Polygon(coords_1[::-1]).buffer(0).area

答案 1 :(得分:1)

将您的纬度/经度多边形转换为在欧几里得平面上玩得很好。然后使用类似:http://sourceforge.net/projects/polyclipping/

的内容