如何使用Geopandas同时基于公共键与空间位置执行sjoin连接
时空双条件空间连接实现方案
基础实现(兼容所有geopandas版本)
写法1:全量空间连接后过滤(适合小数据集)
- 思路:先执行标准空间匹配,再筛选出左右表hour值相等的结果,代码最简单
import geopandas as gpd # 执行标准空间连接,同名字段会自动加_left/_right后缀 full_sjoin = gpd.sjoin(gdf_A, gdf_B, how="inner", predicate="intersects") # 仅保留hour匹配的行 final_result = full_sjoin[full_sjoin["hour_left"] == full_sjoin["hour_right"]]
写法2:按hour分组连接(适合大数据集)
- 思路:仅对同一hour的子集做空间匹配,避免跨hour的无效计算,性能提升明显
import pandas as pd import geopandas as gpd result = [] for hour in gdf_A["hour"].unique(): a_sub = gdf_A[gdf_A["hour"] == hour] b_sub = gdf_B[gdf_B["hour"] == hour] if len(a_sub) == 0 or len(b_sub) == 0: continue # 单小时子集空间连接 sub_sjoin = gpd.sjoin(a_sub, b_sub, how="inner", predicate="intersects") result.append(sub_sjoin) # 合并所有小时的结果 final_result = gpd.GeoDataFrame(pd.concat(result, ignore_index=True))
简化实现(geopandas ≥ 0.14.0版本)
geopandas 0.14及以上版本的sjoin接口已经原生支持非空间关联键参数on,可以直接指定hour作为额外匹配条件,底层已做优化,性能和代码简洁度都最优:
final_result = gpd.sjoin( gdf_A, gdf_B, how="inner", predicate="intersects", on="hour" # 额外要求两表的hour字段值相等才匹配 )
内容的提问来源于stack exchange,提问作者John s
相关产品推荐
相关产品推荐

