GeoPandas空间连接与叠加分析
GeoPandas 的空间连接用 GeoDataFrame.sjoin() 按几何关系把右侧图层属性挂到左侧,并保留左侧几何;叠加分析用 overlay() 做交集、并集等集合运算,生成切割后的新几何并合并两侧属性。两者都是平面操作(忽略 Z 维),要求两个图层 CRS 一致,否则结果常为空或报错。截至 2026 年 11 月,稳定版为 1.2.0(2026 年 9 月 28 日发布)。需要属性挂接选 sjoin,需要切割面/线选 overlay。

空间连接 sjoin 怎么写?
sjoin 解决“点落在哪个区、线穿过哪些面”这类属性附加问题,不改变左侧几何。推荐用方法调用:left_gdf.sjoin(right_gdf, how=…, predicate=…)。详细参数与示例可对照本站GeoPandas 空间连接 sjoin 函数用法。
| 参数 | 常用取值 | 说明 |
|---|---|---|
| how | inner(默认)/ left / right | 决定保留哪侧行与索引;inner 只保留有匹配的 |
| predicate | intersects(默认)、within、contains、overlaps、touches、covers、dwithin 等 | 空间关系;可用 .sindex.valid_query_predicates 查看当前后端支持项 |
| lsuffix / rsuffix | _left / _right | 列名冲突时的后缀 |
| distance | 数值 | 仅 predicate=’dwithin’ 时使用 |
| on_attribute | 列名列表 | 额外要求属性也匹配才连接 |
- 用 gpd.read_file 读入左右两个 GeoDataFrame,确认几何列有效。
- 检查 left.crs 与 right.crs;不一致则 right = right.to_crs(left.crs)(不要只用 set_crs,那只改元数据不变换坐标)。
- 执行结果 = left.sjoin(right, how=’inner’, predicate=’intersects’)。
- 验收:看结果行数、关键属性列是否齐全,抽查几条几何关系是否符合预期(可用 .explore() 或导出检查)。
地理 CRS(如 EPSG:4326)不适合做距离类 predicate;涉及 dwithin 或面积时先投影到合适投影坐标系。
最近邻连接什么时候用 sjoin_nearest?
当要素没有真正相交、只想找“最近的点/面”时用 sjoin_nearest。它按距离匹配,可一对多。关键参数:how(同 sjoin)、max_distance(强烈建议设上限,否则全量搜索很慢)、distance_col(输出距离列名)、exclusive。典型场景:给观测点挂最近站点属性、给建筑物找最近道路。
- 先统一 CRS 并尽量用投影坐标,距离才有实际意义。
- 设 max_distance 能显著缩小候选集;超出半径的记录按 how 规则处理。
- 结果里若加了 distance_col,可直接按距离排序或过滤。
大数据量下最近邻也会慢,可先看本站GeoPandas 空间连接太慢时的优化思路,再结合空间索引与分区。
叠加分析 overlay 怎么选 how?
overlay 解决“裁剪、擦除、求交后产生新图斑”的问题,结果是新 GeoDataFrame,几何被切割,两侧属性合并(冲突列加后缀)。调用:df1.overlay(df2, how=…)。仅支持均匀几何类型(同为 Polygon/MultiPolygon,或同为 Point,或 LineString+LinearRing 组合)。
| how | 含义 | 典型用途 |
|---|---|---|
| intersection(默认) | 只保留重叠部分 | 裁剪到研究区、求交集 |
| union | 所有可能几何(重叠+非重叠) | 合并覆盖范围 |
| identity | 保留 df1 范围,几何被 df2 切割 | 用边界切割但不丢 df1 外延 |
| symmetric_difference | 只保留非重叠部分 | 找互不覆盖区域 |
| difference | df1 减去 df2 | 擦除、挖洞 |
- 统一 CRS;无效几何可依赖 make_valid=True(默认)自动修复,否则会抛 ValueError。
- keep_geom_type=True 时只保留与 df1 相同类型的几何,避免混入点线。
- 执行后检查:新几何是否被正确切割、属性列是否完整、是否出现空几何(可再 .dropna(subset=[‘geometry’]) 或 make_valid)。

版本与依赖以官方发布为准:1.2.0 起要求 Python >=3.11、pandas>=2.2、shapely>=2.1、pyproj>=3.7 等。可在 GeoPandas GitHub Tags 核对标签与日期。
sjoin 和 overlay 怎么选?注意什么?
- 要挂属性、几何形状不变 → 用 sjoin / sjoin_nearest。
- 要裁剪、擦除、求交后得到新图斑 → 用 overlay。
- 两者都忽略第三维;输入几何类型要匹配 overlay 限制。
- CRS 必须一致且应用 to_crs 真正变换;地理坐标下距离/面积类结果不可靠。
- 列名冲突会自动加后缀,事后按需重命名。
若你还在搭建整体工作流,可先浏览本站GeoPandas 是什么与 GIS 空间分析实战指南,再回到本篇练 sjoin 与 overlay。
常见问题
CRS 不一致会导致什么?
常见现象是警告、空结果或错误匹配。务必先打印两侧 .crs,再用 to_crs 统一到同一投影或同一地理 CRS;仅 set_crs 不会改坐标数值。
overlay 提示几何类型不支持怎么办?
确认两侧都是同类几何(都是面,或都是点,或线+LinearRing)。混用点面会失败;可用 explode、buffer(0) 或先过滤类型后再叠加,并保持 keep_geom_type 合理设置。
sjoin 结果行数为 0 或属性全空?
先查 CRS,再查 predicate 是否过严(例如 within 对边界点更苛刻,可改 intersects),最后用小范围数据或 .sindex 抽查是否真有相交。边界接触可试 touches 或 covers。
数据量大时 sjoin / overlay 很慢怎么处理?
保证有空间索引、先裁剪到感兴趣范围、投影到合适 CRS,并限制 sjoin_nearest 的 max_distance。更系统的分块与加速做法见本站空间连接性能优化说明。
空间连接负责“按位置挂属性”,叠加分析负责“按集合运算出新几何”;先统一 CRS,再按需求选 sjoin 或 overlay,并用小样本验收几何与字段。建议固定使用方法调用(.sjoin / .overlay),并把投影与几何有效性检查写进每次分析的前置步骤。