使用st_intersection处理两个sf空间文件时报错求助
空间数据裁剪报错排查与解决
我有两个RDS空间文件,想用其中一个裁剪另一个,但执行代码时出现报错。文件体积不大。
执行代码
library(sf) mesoam <- readRDS("mesoam.rds") primate_polys <- readRDS("primate_polys.rds") primates_meso2 <- st_intersection(primate_polys, mesoam)
报错信息
Error in wk_handle.wk_wkb(wkb, s2_geography_writer(oriented = oriented, : Loop 0 is not valid: Edge 2778 crosses edge 2780
问题原因与解决方法
问题原因:空间数据存在拓扑错误,具体是
primate_polys中的某个多边形出现自相交(第2778条边与2780条边交叉),sf默认启用的S2地理空间引擎对拓扑有效性要求严格,因此执行裁剪时抛出错误。解决步骤:
- 修复数据拓扑有效性:
library(sf) # 读取数据 mesoam <- readRDS("mesoam.rds") primate_polys <- readRDS("primate_polys.rds") # 自动修复拓扑错误 primate_polys_fixed <- st_make_valid(primate_polys) # 若不需要地理坐标系的严格计算,也可临时关闭S2引擎 sf::sf_use_s2(FALSE) # 重新执行裁剪操作 primates_meso2 <- st_intersection(primate_polys_fixed, mesoam) - 验证修复效果:执行
st_is_valid(primate_polys_fixed)可检查每个要素的拓扑有效性,确保所有要素返回TRUE后再进行后续操作。
- 修复数据拓扑有效性:
内容的提问来源于stack exchange,提问作者Salvador
相关产品推荐
相关产品推荐

