[ PROMPT_NODE_26640 ]
spatial-analysis
[ SKILL_DOCUMENTATION ]
# 空间分析
## 属性连接
使用标准的 pandas 合并功能基于公共变量组合数据集:
python
# 基于公共列合并
result = gdf.merge(df, on='common_column')
# 左连接
result = gdf.merge(df, on='common_column', how='left')
# 重要:在 GeoDataFrame 上调用 merge 以保留几何信息
# 正确: gdf.merge(df, ...)
# 错误: df.merge(gdf, ...) # 返回 DataFrame,而非 GeoDataFrame
## 空间连接
基于空间关系组合数据集。
### 二元谓词连接 (sjoin)
基于几何谓词进行连接:
python
# 相交 (默认)
joined = gpd.sjoin(gdf1, gdf2, how='inner', predicate='intersects')
# 可用谓词
joined = gpd.sjoin(gdf1, gdf2, predicate='contains')
joined = gpd.sjoin(gdf1, gdf2, predicate='within')
joined = gpd.sjoin(gdf1, gdf2, predicate='touches')
joined = gpd.sjoin(gdf1, gdf2, predicate='crosses')
joined = gpd.sjoin(gdf1, gdf2, predicate='overlaps')
# 连接类型
joined = gpd.sjoin(gdf1, gdf2, how='left') # 保留左侧所有
joined = gpd.sjoin(gdf1, gdf2, how='right') # 保留右侧所有
joined = gpd.sjoin(gdf1, gdf2, how='inner') # 仅交集
`how` 参数决定保留哪些几何图形:
- **left**: 保留左侧 GeoDataFrame 的索引和几何
- **right**: 保留右侧 GeoDataFrame 的索引和几何
- **inner**: 使用索引交集,保留左侧几何
### 最近邻连接 (sjoin_nearest)
连接到最近的要素:
python
# 查找最近邻
nearest = gpd.sjoin_nearest(gdf1, gdf2)
# 添加距离列
nearest = gpd.sjoin_nearest(gdf1, gdf2, distance_col='distance')
# 限制搜索半径 (显著提高性能)
nearest = gpd.sjoin_nearest(gdf1, gdf2, max_distance=1000)
# 查找 k 个最近邻
nearest = gpd.sjoin_nearest(gdf1, gdf2, k=5)
## 叠加操作
结合两个 GeoDataFrame 几何图形的集合论操作:
python
# 交集 - 保留两者重叠的区域
intersection = gpd.overlay(gdf1, gdf2, how='intersection')
# 并集 - 合并所有区域
union = gpd.overlay(gdf1, gdf2, how='union')
# 差集 - 第一个中存在但第二个中不存在的区域
difference = gpd.overlay(gdf1, gdf2, how='difference')
# 对称差集 - 存在于其中一个但不同时存在于两个中的区域
sym_diff = gpd.overlay(gdf1, gdf2, how='symmetric_difference')
# 恒等 - 交集 + 差集
identity = gpd.overlay(gdf1, gdf2, how='identity')
结果包含来自两个输入 GeoDataFrame 的属性。