如何在相交的多边形之间划分点的值?

时间:2019-01-10 09:41:41

标签: python-3.x spatial geopandas

我有一个非常大的数据集,这些数据集的点已分配了值。我目前正在尝试将此数据叠加到一组多边形上,以便为这些多边形分配一个等于其相交的点值之和的值。

这是一个简化的示例:

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 # 

绘制时,此数据如下所示: enter image description here 左侧的圆圈值为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)。

有人可以帮我吗?

0 个答案:

没有答案