在sf中使用st_union合并同ID多边形失败的问题求助
解决sf包合并同ID相切多边形的问题
你的代码核心问题有两个:
- 未保存聚合结果:你运行了
group_by + summarise但没有将结果赋值给变量,导致copy还是原始的80行数据,完全没变化。 - 误用
by_feature参数:st_union的by_feature=TRUE是用于跨图层按要素合并,而你需要的是对每个ID组内的要素合并,这个参数在这里完全不需要(默认by_feature=FALSE会合并组内所有要素)。
修改后的完整代码
library(sf) library(curl) library(dplyr) # 下载并解压数据 curl_download("http://biogeo.ucdavis.edu/data/gadm2.8/shp/ETH_adm_shp.zip", destfile="gadmETH.zip", quiet=FALSE) unzip("gadmETH.zip", exdir="gadmETH", overwrite=FALSE) # 读取shapefile(请根据你的实际路径调整dsn参数) sptemp <- sf::st_read(dsn = "/Users/bevis.16/Library/CloudStorage/OneDrive-TheOhioStateUniversity/BoxLeah/Projects/GR Inequality/Data/Geospatial/gadmETH", layer = "ETH_adm2") # 查看原始数据状态 cat("原始数据行数:", nrow(sptemp), "\n") cat("唯一ID_2数量:", length(unique(sptemp$ID_2)), "\n") # 按ID_2分组合并多边形 merged_sf <- sptemp %>% group_by(ID_2) %>% summarise( # 保留其他属性:如果同ID的属性值一致,用first()/unique()提取即可 NAME_2 = first(NAME_2), # 合并组内所有几何对象(包括相切多边形) geometry = sf::st_union(geometry) ) %>% ungroup() # 查看合并后结果 cat("合并后数据行数:", nrow(merged_sf), "\n") cat("合并后唯一ID_2数量:", length(unique(merged_sf$ID_2)), "\n") # 可选:将合并后的MULTIPOLYGON转换为单个POLYGON(如果合并结果是单多边形的话) merged_sf <- merged_sf %>% mutate(geometry = st_cast(geometry, "POLYGON"))
关键说明
- 必须保存聚合结果:
summarise会生成新的sf对象,一定要赋值给变量(比如merged_sf),否则操作等于白做。 st_union的作用:它会自动处理相切多边形的合并,哪怕两个多边形只有一个公共点,也能合并成单个多边形。- 属性处理:如果同ID的其他属性(如NAME_2)在组内是统一的,用
first()或unique()就能保留;如果属性不一致,需要根据你的业务逻辑选择合适的方式(比如拼接、取均值等)。 - 可选的
st_cast:如果合并后部分结果是MULTIPOLYGON类型但实际是单个多边形,用st_cast转换为POLYGON可以让数据结构更规范。
内容的提问来源于stack exchange,提问作者Leah Bevis
相关产品推荐
相关产品推荐

