You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在sf中使用st_union合并同ID多边形失败的问题求助

解决sf包合并同ID相切多边形的问题

你的代码核心问题有两个:

  1. 未保存聚合结果:你运行了group_by + summarise但没有将结果赋值给变量,导致copy还是原始的80行数据,完全没变化。
  2. 误用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:05:37