如何在Python中通过空间连接替换多边形Shapefile目标区域的值
空间连接保留全部多边形并更新指定区域Value值的解决方法
问题场景
你手里有个多边形相交生成的Shapefile,对应的GeoDataFrame(intersected_polygons)有4行数据,对应4块不同颜色的相交多边形区域,每行都带Value字段——其中淡紫色那块的Value是23。另外还有个只含单个红点的Shapefile,这个点带数值19,刚好落在淡紫色区域里。
你想用Geopandas做空间连接,把淡紫色区域的Value改成19,其他多边形的Value保持不变,但现在用这段代码:
point_in_poly = gpd.sjoin(intersected_polygons, point, how='inner', op='contains')
只能拿到包含红点的那单个多边形行,没法保留全部4个多边形,得改代码实现需求。
解决方案
核心是用**左连接(how='left')**保住所有原始多边形,再针对性更新Value字段:
- 第一步:执行左空间连接,保留所有多边形数据
# 用左连接,确保intersected_polygons的所有行都被保留 joined = gpd.sjoin(intersected_polygons, point, how='left', op='contains')
这里how='left'会把左表(也就是你的多边形GeoDataFrame)的所有行都留下来,只有包含红点的那行会匹配到点的属性,其他行的点相关字段会显示NaN。
- 第二步:更新
Value字段
假设红点的数值字段叫point_value,用这个值替换匹配到的多边形的Value,没匹配到的就保持原来的Value:
import pandas as pd # 遍历每行,有匹配点值的就替换,没有的留原值 joined['Value'] = joined.apply( lambda row: row['point_value'] if not pd.isna(row['point_value']) else row['Value'], axis=1 )
要是你的红点数值字段不是point_value,换成实际的字段名就行。
- 第三步:清理冗余字段(可选)
空间连接后会多出index_right这类没用的字段,按需删掉就行:
# 删除不需要的冗余列,比如index_right和点的数值字段 cleaned = joined.drop(columns=['index_right', 'point_value'])
这么操作完,你就能得到包含全部4个多边形的GeoDataFrame了——淡紫色区域的Value已经改成19,其他区域的数值还是原来的样子。
内容的提问来源于stack exchange,提问作者LostinSpatialAnalysis
相关产品推荐
相关产品推荐

