st_join()行为不一致:使用旧版sf包的结果是否可信?
问题解答
版本差异原因
sf 1.0.0版本开始默认启用S2球面几何库,对空间几何的有效性检查远严于旧版(0.9.x及之前)使用的GEOS平面几何库。你办公电脑的新版sf检测出GADM地图里有4个多边形存在边交叉的无效几何,而旧版sf会跳过这类严格检查,直接执行匹配操作。
旧版sf结果的可信度
旧版得到的结果存在不确定性,不能直接认为完全可信:
- 如果你的点没有落在那4个有无效几何的多边形范围内,结果是可靠的;
- 若有点落在这些无效多边形里,旧版GEOS处理交叉边时的行为是未定义的,可能出现点匹配错误(比如匹配到错误区域,或无法匹配),这类结果的准确性无法保证。
解决建议
要在新版sf中得到可靠结果,同时兼容旧版逻辑,可参考以下方法:
- 修复无效几何(推荐):对地图数据执行几何修复后再做匹配
x <- st_read(my_map) x <- st_make_valid(x) # 修复无效多边形 y <- st_as_sf(my_points, coords = c('long', 'lat'), crs = 4326) y <- st_join(y, x) - 临时切换到平面几何模式:关闭S2检查,让新版sf沿用旧版GEOS的处理逻辑
sf_use_s2(FALSE) # 全局关闭S2 x <- st_read(my_map) y <- st_as_sf(my_points, coords = c('long', 'lat'), crs = 4326) y <- st_join(y, x) - 结果验证:无论用哪种方式,建议随机抽取部分点(尤其是靠近无效几何的点),手动核对匹配结果是否正确,确保数据准确性。
内容的提问来源于stack exchange,提问作者ladyp
相关产品推荐
相关产品推荐

