You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:01:01