无缝拟合两个 sf 多边形
fit two sf polygons seamlessly
问题
假设我们有两个应该无缝接壤的 shapefile。只是,他们没有。有没有什么办法可以让他们无缝衔接?
具体案例
我有两个 shapefile:一个用于欧洲地区 -- REG
,另一个用于邻国 -- NEI
。两个 shapefile 都取自 Eurostat repository,应该可以很好地组合在一起;但也有小差距。另外,我需要简化多边形,这样缝隙就会变得非常明显。
我能想到的最好的
我尝试了几种方法但都没有成功。实现我所看到的预期结果的唯一方法需要执行以下步骤:
- 创建一条 sf 线,仅包含我的 shapefile 之间的边界;
- 从这一行创建一个刚好足以覆盖所有间隙的缓冲多边形;
- 将此缓冲区加入并分解到邻居的 shapefile --
NEI
;
- 用
REG
shapefile 剪掉展开的 NEI
。
显然,这是一个相当笨拙的解决方法。
还有更好的方法吗?
this gist
中的可重现示例
一个最小的例子
# install dev version of ggplot2
devtools::dev_mode()
devtools::install_github("tidyverse/ggplot2")
library(tidyverse)
library(sf)
library(rmapshaper)
library(ggthemes)
# load data
source(file = url("https://gist.githubusercontent.com/ikashnitsky/4b92f6b9f4bcbd8b2190fb0796fd1ec0/raw/1e281b7bb8ec74c9c9989fe50a87b6021ddbad03/minimal-data.R"))
# test how good they fit together
ggplot() +
geom_sf(data = REG, color = "black", size = .2, fill = NA) +
geom_sf(data = NEI, color = "red", size = .2, fill = NA)+
coord_sf(datum = NA)+
theme_map()
ggsave("test-1.pdf", width = 12, height = 10)
# simplify
REGs <- REG %>% ms_simplify(keep = .5, keep_shapes = TRUE)
NEIs <- NEI %>% ms_simplify(keep = .5, keep_shapes = TRUE)
ggplot() +
geom_sf(data = REGs, color = "black", size = .2, fill = NA) +
geom_sf(data = NEIs, color = "red", size = .2, fill = NA)+
coord_sf(datum = NA)+
theme_map()
ggsave("test-2.pdf", width = 12, height = 10)
ms_simplify
似乎适用于您的最小示例,但您首先需要将 2 "shapefiles" 分组为一个 "shapefile"。如果需要的话,在边界简化后就很容易拆分了。
(注意:当 ms_simplify
与 sf
对象一起使用时,我的 rmapshaper
returns 版本出错。这就是为什么我将 tmp
对象转换为sp
对象 as(tmp, "Spatial")
)
NEI <- st_transform(NEI, st_crs(REG)$epsg)
tmp <- rbind(REG , NEI)
tmp <- ms_simplify(as(tmp, "Spatial"), keep = .1, keep_shapes = T)
ggplot() + geom_sf(data = st_as_sf(tmp)) + theme_bw()
问题
假设我们有两个应该无缝接壤的 shapefile。只是,他们没有。有没有什么办法可以让他们无缝衔接?
具体案例
我有两个 shapefile:一个用于欧洲地区 -- REG
,另一个用于邻国 -- NEI
。两个 shapefile 都取自 Eurostat repository,应该可以很好地组合在一起;但也有小差距。另外,我需要简化多边形,这样缝隙就会变得非常明显。
我能想到的最好的
我尝试了几种方法但都没有成功。实现我所看到的预期结果的唯一方法需要执行以下步骤:
- 创建一条 sf 线,仅包含我的 shapefile 之间的边界;
- 从这一行创建一个刚好足以覆盖所有间隙的缓冲多边形;
- 将此缓冲区加入并分解到邻居的 shapefile --
NEI
; - 用
REG
shapefile 剪掉展开的NEI
。
显然,这是一个相当笨拙的解决方法。
还有更好的方法吗?
this gist
中的可重现示例一个最小的例子
# install dev version of ggplot2
devtools::dev_mode()
devtools::install_github("tidyverse/ggplot2")
library(tidyverse)
library(sf)
library(rmapshaper)
library(ggthemes)
# load data
source(file = url("https://gist.githubusercontent.com/ikashnitsky/4b92f6b9f4bcbd8b2190fb0796fd1ec0/raw/1e281b7bb8ec74c9c9989fe50a87b6021ddbad03/minimal-data.R"))
# test how good they fit together
ggplot() +
geom_sf(data = REG, color = "black", size = .2, fill = NA) +
geom_sf(data = NEI, color = "red", size = .2, fill = NA)+
coord_sf(datum = NA)+
theme_map()
ggsave("test-1.pdf", width = 12, height = 10)
# simplify
REGs <- REG %>% ms_simplify(keep = .5, keep_shapes = TRUE)
NEIs <- NEI %>% ms_simplify(keep = .5, keep_shapes = TRUE)
ggplot() +
geom_sf(data = REGs, color = "black", size = .2, fill = NA) +
geom_sf(data = NEIs, color = "red", size = .2, fill = NA)+
coord_sf(datum = NA)+
theme_map()
ggsave("test-2.pdf", width = 12, height = 10)
ms_simplify
似乎适用于您的最小示例,但您首先需要将 2 "shapefiles" 分组为一个 "shapefile"。如果需要的话,在边界简化后就很容易拆分了。
(注意:当 ms_simplify
与 sf
对象一起使用时,我的 rmapshaper
returns 版本出错。这就是为什么我将 tmp
对象转换为sp
对象 as(tmp, "Spatial")
)
NEI <- st_transform(NEI, st_crs(REG)$epsg)
tmp <- rbind(REG , NEI)
tmp <- ms_simplify(as(tmp, "Spatial"), keep = .1, keep_shapes = T)
ggplot() + geom_sf(data = st_as_sf(tmp)) + theme_bw()