给定(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坐标


问题答案:

Shoelace公式的实现可以在Windows中完成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笔记本中完成。