GeoPandas相交多边形识别异常:判定相交但单独验证不相交
GeoPandas空间相交判定的矛盾问题
我参考相关方案用GeoPandas的sjoin方法识别单个GeoJSON文件中的相交多边形,结果显示zid为519和514的区域相交,但单独调用intersects和intersection方法验证时却返回不相交,可这两个区域实际存在共同边界。
区域边界情况:
相关代码:
admzones = admzones[['zid', 'geometry']] together = geopandas.sjoin(admzones, admzones.set_index('zid')) together.loc[together.zid != together.index_right] # 输出结果示例: # zid|geometry|index_right # 519|POLIGON()|514 #... # 单独验证部分 geo1 = admzones[admzones['zid']==519] geo2 = admzones[admzones['zid']==514] geo1['interssects'] = geo1.intersects(geo2) geo1['interssects'] # 返回False geo1['intersection'] = geo1.intersection(geo2) geo1['intersection'] # 返回None
问题原因
这是因为sjoin默认使用intersects作为空间谓词,但其底层依赖空间索引加速,会将共享边界的多边形判定为相交;而直接调用intersects方法时,若多边形边界存在浮点精度误差(比如顶点坐标因精度问题未完全重合),会被判定为不相交。
解决方案
- 修复多边形拓扑后验证
用buffer(0)修复多边形的拓扑问题(比如自相交、边界顶点精度误差),再调用intersects验证:
geo1_fixed = geo1.geometry.buffer(0) geo2_fixed = geo2.geometry.buffer(0) print(geo1_fixed.intersects(geo2_fixed.iloc[0]))
- 用
touches谓词筛选边界接触的多边形
如果目标是识别共享边界的区域,直接在sjoin中指定predicate='touches',专门检测仅边界接触的情况:
together = geopandas.sjoin(admzones, admzones.set_index('zid'), predicate='touches') result = together.loc[together.zid != together.index_right]
内容的提问来源于stack exchange,提问作者Diana Oryol
相关产品推荐
相关产品推荐

