计算给定 (x,y) 坐标的多边形面积

新手上路,请多包涵

我有一组点,想知道是否有一个函数(为了方便和速度)可以计算一组点所包围的面积。

例如:

 x = np.arange(0,1,0.001)
y = np.sqrt(1-x**2)

points = zip(x,y)

给定 points 面积应约等于 (pi-2)/4 。也许有来自 scipy、matplotlib、numpy、shapely 等的东西可以做到这一点?我不会遇到 x 或 y 坐标的任何负值……它们将是没有任何定义函数的多边形。

编辑:

点很可能不会按任何指定顺序(顺时针或逆时针)并且可能非常复杂,因为它们是一组边界下的 shapefile 中的一组 utm 坐标

原文由 pbreach 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

鞋带公式 的实现可以在 Numpy 中完成。假设这些顶点:

 import numpy as np
x = np.arange(0,1,0.001)
y = np.sqrt(1-x**2)

我们可以重新定义numpy中的函数求面积:

 def PolyArea(x,y):
    return 0.5*np.abs(np.dot(x,np.roll(y,1))-np.dot(y,np.roll(x,1)))

并获得结果:

 print PolyArea(x,y)
# 0.26353377782163534

避免 for 循环使这个函数比 PolygonArea 快 ~50 倍:

 %timeit PolyArea(x,y)
# 10000 loops, best of 3: 42 µs per loop
%timeit PolygonArea(zip(x,y))
# 100 loops, best of 3: 2.09 ms per loop.

计时在 Jupyter notebook 中完成。

原文由 Mahdi 发布,翻译遵循 CC BY-SA 3.0 许可协议

涵盖所有可能情况的最优化解决方案是使用几何包,如 shapelyscikit-geometrypygeos 。它们都在底层使用 C++ 几何包。第一个很容易通过 pip 安装:

 pip install shapely

并且使用简单:

 from shapely.geometry import Polygon
pgon = Polygon(zip(x, y)) # Assuming the OP's x,y coordinates

print(pgon.area)


要从头开始构建它或了解底层算法的工作原理,请查看 鞋带公式

 # e.g. corners = [(2.0, 1.0), (4.0, 5.0), (7.0, 8.0)]
def Area(corners):
    n = len(corners) # of corners
    area = 0.0
    for i in range(n):
        j = (i + 1) % n
        area += corners[i][0] * corners[j][1]
        area -= corners[j][0] * corners[i][1]
    area = abs(area) / 2.0
    return area

因为这适用于简单的多边形:

  • 如果您有一个 带孔的多边形:计算外环的面积并减去内环的面积

  • 如果你有 自相交环:你必须将它们分解成简单的扇区

原文由 Nikos Athanasiou 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题