比较空间多边形并保留或删除 R 中的公共边界
Compare spatial polygons and keep or delete common boundaries in R
我曾经使用 R 在 GADM(select 比利时)上绘制比利时地图。
我使用以下方法导入并绘制比利时的外部边界:
belgium <-readRDS("gadm36_BEL_0_sp.rds")
plot(belgium)
这给了我:
我使用以下方法导入并绘制比利时各省的边界:
provinces <-readRDS("gadm36_BEL_2_sp.rds")
plot(provinces)
这给了我:
我想要的是 dataframe
省份边界不在比利时边界之外:
我尝试使用 over()
、intersect()
等,但还没有找到这样做的方法。我猜可以使用几种方法:
- 将比利时边界减去省数据集;
- 仅在省份数据集中工作并仅保留公共边界;
- 还有吗?
谢谢,如果你有解决办法。
格雷戈尔
我从该站点 (https://www.gadm.org/download_country_v3.html) 下载了 sf
格式的文件,因为 sf
包更容易处理。
library(dplyr)
library(sf)
provinces <- readRDS("gadm36_BEL_2_sf.rds")
interiors <- st_intersection(provinces) %>%
filter(n.overlaps > 1)
interiors
# Number of columns truncated for clarity:
# interiors %>% select(VARNAME_2, geometry, n.overlaps)
Simple feature collection with 30 features and 2 fields
geometry type: GEOMETRY
dimension: XY
bbox: xmin: 2.851679 ymin: 49.8004 xmax: 6.033082 ymax: 51.35568
epsg (SRID): 4326
proj4string: +proj=longlat +datum=WGS84 +no_defs
First 10 features:
VARNAME_2
1 Amberes|Antuérpia|Antwerp|Anvers|Anversa
2 Amberes|Antuérpia|Antwerp|Anvers|Anversa
3 Brussel Hoofstadt|Brusselse Hoofdstedelijke Gewest|Brüssel|Bruxelas|Région de Bruxelles-Capitale|Brussels|Bruselas
4 Limbourg|Limburgo
5 Flandres Oriental|Fiandra Orientale|Flandes Oriental|Flandre orientale|East Flanders|Ost Flandern
6 Amberes|Antuérpia|Antwerp|Anvers|Anversa
7 Amberes|Antuérpia|Antwerp|Anvers|Anversa
8 Amberes|Antuérpia|Antwerp|Anvers|Anversa
9 Flandres Oriental|Fiandra Orientale|Flandes Oriental|Flandre orientale|East Flanders|Ost Flandern
10 Brabant Flamand|Brabante Flamenco|Brabante Flamengo|Flemish Brabant
n.overlaps geometry
1 2 MULTILINESTRING ((5.239571 ...
2 2 MULTILINESTRING ((4.327078 ...
3 2 MULTILINESTRING ((4.403365 ...
4 2 MULTILINESTRING ((5.117446 ...
5 2 MULTILINESTRING ((4.243931 ...
6 3 POINT (4.994605 51.0414)
7 3 POINT (4.243931 51.04332)
8 2 MULTILINESTRING ((4.994605 ...
9 2 MULTILINESTRING ((3.466959 ...
10 2 MULTILINESTRING ((5.025736 ...
用图检查:
plot(interiors$geometry)
您在这里所做的是寻找各省与其他所有省的空间交集。然后你过滤掉它只是一个省份重叠的交叉点 (n.overlaps == 1
)。这样一来,您只能获得一个或多个省份与另一个省份 (n.overlaps > 1
) 接触的内部边界,而不是单独的任何省份(这将是外部边界)。
这是这个优秀答案的更新版本:
要去除地图和数据集中圈出的点(3个省份的交点),可以使用:
interiors %>% filter(!st_is(., "POINT"))
我曾经使用 R 在 GADM(select 比利时)上绘制比利时地图。
我使用以下方法导入并绘制比利时的外部边界:
belgium <-readRDS("gadm36_BEL_0_sp.rds")
plot(belgium)
这给了我:
我使用以下方法导入并绘制比利时各省的边界:
provinces <-readRDS("gadm36_BEL_2_sp.rds")
plot(provinces)
这给了我:
我想要的是 dataframe
省份边界不在比利时边界之外:
我尝试使用 over()
、intersect()
等,但还没有找到这样做的方法。我猜可以使用几种方法:
- 将比利时边界减去省数据集;
- 仅在省份数据集中工作并仅保留公共边界;
- 还有吗?
谢谢,如果你有解决办法。 格雷戈尔
我从该站点 (https://www.gadm.org/download_country_v3.html) 下载了 sf
格式的文件,因为 sf
包更容易处理。
library(dplyr)
library(sf)
provinces <- readRDS("gadm36_BEL_2_sf.rds")
interiors <- st_intersection(provinces) %>%
filter(n.overlaps > 1)
interiors
# Number of columns truncated for clarity:
# interiors %>% select(VARNAME_2, geometry, n.overlaps)
Simple feature collection with 30 features and 2 fields geometry type: GEOMETRY dimension: XY bbox: xmin: 2.851679 ymin: 49.8004 xmax: 6.033082 ymax: 51.35568 epsg (SRID): 4326 proj4string: +proj=longlat +datum=WGS84 +no_defs First 10 features: VARNAME_2 1 Amberes|Antuérpia|Antwerp|Anvers|Anversa 2 Amberes|Antuérpia|Antwerp|Anvers|Anversa 3 Brussel Hoofstadt|Brusselse Hoofdstedelijke Gewest|Brüssel|Bruxelas|Région de Bruxelles-Capitale|Brussels|Bruselas 4 Limbourg|Limburgo 5 Flandres Oriental|Fiandra Orientale|Flandes Oriental|Flandre orientale|East Flanders|Ost Flandern 6 Amberes|Antuérpia|Antwerp|Anvers|Anversa 7 Amberes|Antuérpia|Antwerp|Anvers|Anversa 8 Amberes|Antuérpia|Antwerp|Anvers|Anversa 9 Flandres Oriental|Fiandra Orientale|Flandes Oriental|Flandre orientale|East Flanders|Ost Flandern 10 Brabant Flamand|Brabante Flamenco|Brabante Flamengo|Flemish Brabant n.overlaps geometry 1 2 MULTILINESTRING ((5.239571 ... 2 2 MULTILINESTRING ((4.327078 ... 3 2 MULTILINESTRING ((4.403365 ... 4 2 MULTILINESTRING ((5.117446 ... 5 2 MULTILINESTRING ((4.243931 ... 6 3 POINT (4.994605 51.0414) 7 3 POINT (4.243931 51.04332) 8 2 MULTILINESTRING ((4.994605 ... 9 2 MULTILINESTRING ((3.466959 ... 10 2 MULTILINESTRING ((5.025736 ...
用图检查:
plot(interiors$geometry)
您在这里所做的是寻找各省与其他所有省的空间交集。然后你过滤掉它只是一个省份重叠的交叉点 (n.overlaps == 1
)。这样一来,您只能获得一个或多个省份与另一个省份 (n.overlaps > 1
) 接触的内部边界,而不是单独的任何省份(这将是外部边界)。
这是这个优秀答案的更新版本:
要去除地图和数据集中圈出的点(3个省份的交点),可以使用:
interiors %>% filter(!st_is(., "POINT"))