R语言合并多个SpatialPolygonsDataFrame对象报错问题求助
问题根因
你的代码核心错误来源于两方面:
- 反复在
sf和sp类对象之间强制转换时,没有手动为每个行政区的Polygons对象指定唯一ID,导致合并后几何与属性错位,因此出现单独绘制行政区正常、合并后形状错乱的问题 - 手动实现双层循环合并逻辑冗余,且未处理多部件多边形(带飞地的行政区)的适配,直接触发rbind/union的长度匹配报错
最优解决方案
全程使用sf包的原生语法完成关联、分组、合并操作,无需手动循环,也无需反复转换sp对象,代码更简洁且不会出现ID冲突问题:
library(tidyverse) library(sf) library(readxl) library(leaflet) # 读取城镇shape文件并直接转为WGS84坐标系 mapa_municip <- st_read("UDALERRIAK_MUNICIPIOS/UDALERRIAK_MUNICIPIOS.shp") %>% st_transform(crs = 4326) # 读取城镇-行政区映射表 muni2com <- read_excel("listado-comarcas-gipuzkoa.xls", sheet = 1, range = "A1:C91", col_names = TRUE) # 关联映射表+按行政区分组合并,一行完成聚合 comarcas_sf <- mapa_municip %>% # 注意调整关联字段名和你实际字段名匹配 left_join(muni2com, by = c("MUNICIPIO" = "Municipios")) %>% group_by(Comarca) %>% summarise(geometry = st_union(geometry), .groups = "drop") # 验证合并结果,每行对应一个独立行政区 head(comarcas_sf) plot(comarcas_sf["Comarca"]) # 直接用sf对象绘制leaflet地图,无需转sp格式 leaflet(options = leafletOptions(zoomControl = FALSE, zoomSnap = 0.1, zoomDelta = 1), data = comarcas_sf) %>% addProviderTiles(provider = "CartoDB.Positron") %>% htmlwidgets::onRender("function(el, x) { L.control.zoom({ position: 'topright' }).addTo(this) }") %>% addPolygons(fillColor = "gray", opacity = 0.8, weight = 0.3, color = "white", fillOpacity = 0.95, smoothFactor = 0.5, label = ~Comarca, highlight = highlightOptions( weight = 1.5, color = "#333333", bringToFront = TRUE), layerId = ~Comarca) # 如果确实需要SpatialPolygonsDataFrame格式,最后统一转换即可 comarcas_sp <- as(comarcas_sf, "Spatial")
原代码报错解释
raster::union和rbind报错:如果行政区包含飞地,合并后会生成多部件多边形,对应sp对象中Polygons槽的长度大于1,和属性表行数不匹配就会触发长度报错- 合并后形状错乱:你逐个生成的每个行政区
sp对象里Polygons的ID默认都是1,合并时系统自动给重复ID加后缀,你构建属性表时使用的原始ID和新ID不匹配,导致几何和行政区属性对应错位
内容的提问来源于stack exchange,提问作者Ainhoa
相关产品推荐
相关产品推荐

