使用GeoDataFrame.sjoin筛选澳新州Uber数据点仍有外溢问题求解
问题
在Folium地图上可视化澳大利亚新南威尔士州的Uber行程数据集时,发现部分数据点落在海域而非陆地区域。尝试使用新南威尔士州的多边形数据集,通过GeoDataFrame.sjoin并指定"contains"谓词进行空间连接,但仍有部分点位于多边形外。
使用的代码如下:
geo_df = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.pick_up_lon, df.pick_up_lat), crs="EPSG:4326") poly_df = gpd.read_file("state.geojson") join_df = gpd.sjoin(poly_df, geo_df, predicate="contains")
- [应用多边形前的地图:可见大量海域内的Uber行程点]
- [应用多边形及sjoin后的地图:仍存在海域内的行程点]
解决方案
验证多边形数据的完整性与准确性
新南威尔士州的GeoJSON边界可能存在缺失(比如未覆盖沿海岛屿、半岛)或坐标误差,导致部分陆地行程点被判定为在多边形外。建议更换为官方数据源,比如澳大利亚统计局(ABS)发布的州边界数据,或从OpenStreetMap提取更精确的边界。调整空间筛选的逻辑与方式
当前代码是用多边形表左连接点表,容易保留不匹配的记录。建议直接筛选出被多边形包含的点,两种实现方式:# 方式1:调换sjoin的表顺序,保留在多边形内的点 join_df = gpd.sjoin(geo_df, poly_df, predicate="within") # 方式2:直接用within方法结合多边形合并后的几何对象 merged_poly = poly_df.unary_union valid_points = geo_df[geo_df.geometry.within(merged_poly)]修复拓扑与坐标精度问题
GPS行程点可能存在微小偏移,或多边形本身有拓扑错误(比如自相交),导致空间判断失效。可以先修复多边形拓扑,再做筛选:# 修复多边形拓扑错误 poly_df["geometry"] = poly_df.geometry.buffer(0) # 筛选有效点 valid_points = geo_df[geo_df.geometry.within(poly_df.iloc[0]["geometry"])]确认CRS完全一致
即使代码中指定了CRS,仍需验证点数据与多边形数据的坐标参考系是否完全匹配:print("点数据CRS:", geo_df.crs) print("多边形数据CRS:", poly_df.crs) # 若不一致,统一转换为相同CRS if geo_df.crs != poly_df.crs: poly_df = poly_df.to_crs(geo_df.crs)
内容的提问来源于stack exchange,提问作者Ali_Khaled
相关产品推荐
相关产品推荐

