我有一个非常大的数据集,这些数据集的点已分配了值。我目前正在尝试将此数据叠加到一组多边形上,以便为这些多边形分配一个等于其相交的点值之和的值。
这是一个简化的示例:
import pandas as pd
import geopandas as gp
from shapely.geometry import Polygon
from shapely.geometry import Point
import matplotlib.pyplot as plt
## Create a dataset of polygons and points ##
df = gp.GeoDataFrame([['a',Polygon([(1, 0), (1, 1), (2,2), (1,2)])],
['b',Polygon([(1, 0.25), (2,1.25), (3,0.25)])]],
columns = ['name','geometry'])
df = gp.GeoDataFrame(df, geometry = 'geometry')
points = gp.GeoDataFrame( [['box', Point(1.5, 1.115), 4],
['triangle', Point(2.5,1.25), 8]],
columns=['name', 'geometry', 'value'],
geometry='geometry')
## Set a buffer around the points ##
buf = points.buffer(0.5)
points['buffer'] = buf
points = points.drop(['geometry'], axis = 1)
points = points.rename(columns = {'buffer': 'geometry'}) # rename buffer to geometry so that will be used in the calculations below #
绘制时,此数据如下所示: 左侧的圆圈值为4,右侧的圆圈值为8
接下来,我在空间上连接数据集:
shape_value = gp.sjoin(df, points, how = 'inner', op = 'intersects')
将产生以下数据集:
name_left geometry index_right name_right value
0 a POLYGON ((1 0, 1 1, 2 2, 1 2, 1 0)) 0 box 4
1 b POLYGON ((1 0.25, 2 1.25, 3 0.25, 1 0.25)) 0 box 4
1 b POLYGON ((1 0.25, 2 1.25, 3 0.25, 1 0.25)) 1 triangle 8
最后,我按多边形名称分组并求和:
shape_value_sum = shape_value.groupby('name_left')['value'].sum()
shape_value_sum.head()
如您所见,这将导致多边形a的值为4,b的值为12。
但是,我要弄清楚的是我需要更改的内容,因此,将点的值除以它们相交的多边形的数量,因此将左侧的点除以2(导致为多边形分配a和ba值2)和正确的点将被1除(结果多边形b仍被赋值为8)。
有人可以帮我吗?