我有一个meso级别的{shape 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
我可以将它们绘制在彼此之上,这表明每个城市都是中东地区的一部分,如下所示:
我想创建一个表,其中一列中的市政ID
和另一列中的相应MesoRegion
。在R中有没有办法做到这一点,假设有一些方法可以使用单独的mesoregion剪切市政当局并将中间区域的名称分配给剪切区域。
编辑:我尝试使用函数over
library(sp)
over(sul.mun, sul.ms,returnList = T)
这是有效的。但是,我认为有一个问题是一个市政当局是两个中间区域的一部分。不知道为什么会这样。
答案 0 :(得分:2)
这是一个基于“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”。