如何计算每个多边形具有不同坐标的多个多边形的面积

时间:2019-08-15 10:20:49

标签: numpy polygon area point-in-polygon

假设我知道700个不同的x值以及另外700个不同的y坐标值。我的坐标每隔7个点就可以构造一个多边形。我可以轻松地选择任何公式(这里使用了鞋带公式)来计算任何多边形的面积。但是以这种方式计算每个多边形的面积确实很困难,是否有什么好的方法可以一次计算所有多边形的面积(对于这种情况,多边形的总数为100),例如通过使用任何迭代。

一个简单的代码如下所示:

import numpy as np

x = np.arange(0.5, 700)  #create random coordinates
y = np.arange(0.3, 700)  #create random coordinates

#first 7 coordinates that could form a polygon
x_1 = x[0:7]  
y_1 = y[0:7]

#Area of the first polygon
Area = 0.5 * np.array(np.dot(x_1, np.roll(x_1, 1)) - np.dot(y_1, np.roll(y_1, 1)))

1 个答案:

答案 0 :(得分:1)

这是一种矢量化的方法,可以获取所有多边形的面积-

X = x.reshape(-1,7)
Y = y.reshape(-1,7)

Xr = np.roll(X,1,axis=1)
Yr = np.roll(Y,1,axis=1)
p1 = np.einsum('ij,ij->i',X,Xr)
p2 = np.einsum('ij,ij->i',Y,Yr)
Area_out = (p1-p2)/2

或者,使用np.matmul来获取总和-

p1 = np.matmul(X[:,None,:],Xr[:,:,None])[:,0,0]

具有等效的@ operator(在Python3.x上)-

p1 = (X[:,None,:]@Xr[:,:,None])[:,0,0]

类似地,将其用于p2


避免滚动切片

我们可以使用slicing来跳过滚动,从而获得进一步的性能。像这样增强-

p1 = np.einsum('ij,ij->i',X[:,:-1],X[:,1:]) + X[:,0]*X[:,-1]
p2 = np.einsum('ij,ij->i',Y[:,:-1],Y[:,1:]) + Y[:,0]*Y[:,-1]

如前所述,我们可以将np.matmul/@ operator放在同一行,即-

p1 = np.matmul(X[:,None,:-1],X[:,1:,None])[:,0,0] + X[:,0]*X[:,-1]

以此类推。