创建一个列,其值为相邻多边形的值之和

问题描述

我有一些西班牙市政区域的 shapefile,除了每个区域的标识符外,还包含灌溉公顷数。 我的目标是创建一个列,其值是每个市政区域相邻多边形的灌溉公顷数的总和。 例如,在下图中,中间多边形的值与黄色(选定的)灌溉公顷的总和有关。

enter image description here

shp 文件属性表如下所示:

身份代码 区域名称 灌溉的_ha
01234 马德里 234.56
023453 曼雷萨 120.45

结果数据应如下所示:

身份代码 区域名称 灌溉的_ha neighbor_ha
01234 马德里 234.56 435.34
023453 曼雷萨 120.45 234.98

欢迎任何帮助/解决方案,尤其是 QGIS 或 R。

向大家致以最诚挚的问候,并提前致谢。

解决方法

使用 Python 和 geopandas:

import geopandas as gpd 

df = gpd.read_file('shapefile.shp')

for index,row in df.iterrows():
    neighbors = df[df.geometry.touches(row['geometry'])].Identitycode.tolist()
    #neighbors = neighbors.remove(row.Identitycode)
    # You can use list comprehension to exclude the current row in area sum
    neighbors = [id for id in neighbors if row.Identitycode != id]

    area = df[df.Identitycode.isin(neighbors)]['irrigated_ha'].sum()
    df.at[index,"neighbour_ha"] = area
,

您可以尝试在 QGIS 3.16 中使用字段计算器。 您必须创建一个新字段 neighbor_ha,然后使用此公式

aggregate( 
    layer:='name layer with polygon',aggregate:='sum',expression:= "irrigated_ha",filter:=   touches($geometry,geometry(@parent))
    )

该公式添加字段 irrigate_ha 值,仅适用于接触当前特征的那些特征。

如果某些特征不能在考虑中标记,您可以使用 intersects() 函数代替 touches()