解决R中sf包空间连接时的球形几何无效错误
解决sf空间连接时的S2几何无效错误
问题原因
你遇到的错误是因为S2球面几何引擎(sf默认用于WGS84坐标系(EPSG:4326)的空间运算)检测到 shp 文件存在拓扑无效问题(重复顶点、环自相交等),导致无法执行st_contains连接。
解决方案
以下两种方法可解决该问题,按优先级尝试:
方法1:修复几何拓扑错误
先对两个空间数据的几何做有效性检查与修复,再执行连接:
library(sf) # 读取并转换坐标系 Bigger_Units <- sf::st_read("C:/Users/ME/OneDrive/Documents/hr_shape/HR_000a18a_e.shp", options = "ENCODING=WINDOWS-1252") %>% st_transform(crs = 4326) Smaller_Units <- sf::st_read("C:/Users/ME/OneDrive/Documents/shape7/lfsa000b16a_e.shp", options = "ENCODING=WINDOWS-1252") %>% st_transform(crs = 4326) # (可选)定位无效几何特征 which(!st_is_valid(Bigger_Units)) which(!st_is_valid(Smaller_Units)) # 修复几何有效性并确保坐标系不变 Bigger_Units_fixed <- st_make_valid(Bigger_Units) %>% st_set_crs(4326) Smaller_Units_fixed <- st_make_valid(Smaller_Units) %>% st_set_crs(4326) # 执行空间连接 Dat <- st_join(Bigger_Units_fixed, Smaller_Units_fixed, join = st_contains, left = TRUE)
方法2:临时禁用S2球面几何
如果修复后仍有问题,或不需要球面几何运算,可切换到平面几何引擎处理:
library(sf) # 禁用S2球面几何 sf::sf_use_s2(FALSE) # 读取并转换坐标系 Bigger_Units <- sf::st_read("C:/Users/ME/OneDrive/Documents/hr_shape/HR_000a18a_e.shp", options = "ENCODING=WINDOWS-1252") %>% st_transform(crs = 4326) Smaller_Units <- sf::st_read("C:/Users/ME/OneDrive/Documents/shape7/lfsa000b16a_e.shp", options = "ENCODING=WINDOWS-1252") %>% st_transform(crs = 4326) # 执行空间连接 Dat <- st_join(Bigger_Units, Smaller_Units, join = st_contains, left = TRUE) # (可选)用完后重新启用S2 # sf::sf_use_s2(TRUE)
补充说明
st_make_valid会自动修复重复顶点、自相交等常见拓扑错误,修复后几何可能从POLYGON转为MULTIPOLYGON,不影响后续分析。- 禁用S2后,sf会使用传统GEOS平面几何引擎,适合大多数区域级空间运算,规避球面几何的严格校验规则。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

