在 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"。
我有一个中观级别的 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"。