在 R 中合并两个 shapefile

Merging two shapefiles in R

我有一个中观级别的 shapefile (sul.ms),它有一个名为 MesoRegion

的独特属性
library(brazilmaps)
sul.ms <- get_brmap(geo="MesoRegion",geo.filter = list(State = 43),class="SpatialPolygonsDataFrame")
plot(sul.ms)
sul.ms@data$MesoRegion

 [1] 4301 4302 4303 4304 4305 4306 4307

我有另一个 shapefile(从 here 下载)

在市一级(来自另一个来源)。该文件还有一个名为 ID 的独特属性。

library(rgdal)
sul.mun <- readOGR("~","Rio_Grande_do_Sul_municipalities")
plot(sul.mun)
sul.mun@data$ID # should give 497 ID

我可以将它们绘制在彼此之上,这表明每个城市都是中间区域的一部分,如下所示:

我想创建一个 table,其中一列是自治市 ID,另一列是相应的 MesoRegion。 R 中是否有任何方法可以做到这一点,假设有某种方法可以使用单个中区域来裁剪自治市并将中区域的名称分配给裁剪区域。

编辑:我尝试使用函数 over

library(sp)
over(sul.mun, sul.ms,returnList = T)

这样就可以了。但是,我认为存在一个问题,即一个自治市属于两个中间区域。不知道为什么会这样。

以下是基于使用 "sf" 函数的可能解决方案:

library(sf)
#convert to "sf"
sul.ms_sf  <- sf::st_as_sf(sul.ms)
sul.mun_sf <- sf::st_as_sf(sul.mun)

# find centroids of the different municipalities
centroids  <- sf::st_centroid(sul.mun_sf)

# find out to which region they belong
inters <- sf::st_intersection(sul.ms_sf, centroids) %>% 
  sf::st_set_geometry(NULL)

# re-join with the municipalities to get the additional
# "nome" column
out <- dplyr::left_join(sul.mun_sf, inters) %>% 
  sf::st_sf(sf_column_name = "geometry")
head(out)  

Simple feature collection with 6 features and 7 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -56.66047 ymin: -31.95874 xmax: -51.95982 ymax: -27.53024
epsg (SRID):    NA
proj4string:    +proj=longlat +ellps=GRS80 +no_defs
    ID CD_GEOCODM  NM_MUNICIP                           nome MesoRegion State Region
1 4609    4300034     ACEGUÃ         SUDOESTE RIO-GRANDENSE       4306    43      4
2 4610    4300059 ÃGUA SANTA         NOROESTE RIO-GRANDENSE       4301    43      4
3 4611    4300109       AGUDO CENTRO OCIDENTAL RIO-GRANDENSE       4303    43      4
4 4612    4300208   AJURICABA         NOROESTE RIO-GRANDENSE       4301    43      4
5 4613    4300307     ALECRIM         NOROESTE RIO-GRANDENSE       4301    43      4
6 4614    4300406    ALEGRETE         SUDOESTE RIO-GRANDENSE       4306    43      4

plot(out["nome"])

似乎可行,除了东部的一个地区保持 "NA"。