如何使用 sf 更改国家之间共享边界的颜色?

Kev*_*vin 5 maps r ggplot2 r-sf

我想将共享颜色更改为不同的颜色,比如说红色。到目前为止,我正在绘制德国联邦州巴伐利亚并触及奥地利各州。我从https://gadm.org/download_country.html获取数据-

\n

德国 2 级 - https://biogeo.ucdavis.edu/data/gadm3.6/Rsf/gadm36_DEU_2_sf.rds

\n

德国 1 级 - https://biogeo.ucdavis.edu/data/gadm3.6/Rsf/gadm36_DEU_1_sf.rds

\n

奥地利 2 级 - https://biogeo.ucdavis.edu/data/gadm3.6/Rsf/gadm36_AUT_2_sf.rds

\n

奥地利 1 级 -\n https://biogeo.ucdavis.edu/data/gadm3.6/Rsf/gadm36_AUT_1_sf.rds

\n
library("sf")\nlibrary("raster")\nlibrary("dplyr")\nlibrary("spData")\nlibrary("spDataLarge")\nlibrary("ggplot2")\nlibrary("patchwork")\nlibrary(tmap)    # for static and interactive maps\nlibrary(ggpattern)\n\ndata_aut <- readRDS("~/plot_at_ger/data/gadm36_AUT_2_sf.rds")\ndata_ger <- readRDS("~/plot_at_ger/data/gadm36_DEU_2_sf.rds")\ndata_aut_high <- readRDS("~/plot_at_ger/data/gadm36_AUT_1_sf.rds")\ndata_aut_high <- data_aut_high[which(data_aut_high$NAME_1==\'Salzburg\' | data_aut_high$NAME_1==\'Ober\xc3\xb6sterreich\' | data_aut_high$NAME_1==\'Tirol\' | data_aut_high$NAME_1==\'Vorarlberg\'), ]\ndata_ger_high <- readRDS("~/plot_at_ger/data/gadm36_DEU_1_sf.rds")\ndata_ger_high <- data_ger_high[which(data_ger_high$NAME_1==\'Bayern\'), ]\n\nggplot() +\n  geom_sf(data = ger_selected_data_bavaria, fill = NA) +\n  geom_sf(data = aut_selected_data_rel, fill = NA) +\n  geom_sf(data = data_aut_high, fill = NA, size = 1, color = "grey35") +\n  geom_sf(data = data_ger_high, fill = NA, size = 1, color = "black") \n
Run Code Online (Sandbox Code Playgroud)\n

这会产生下图:

\n

巴伐利亚-奥地利边境国家

\n

有没有办法改变共享边框的颜色?

\n

谢谢!

\n

Jin*_*cko 6

在 > 1.0 的环境中绘制共享边界有点棘手{sf},因为它使用 s2 依赖项进行球形操作,并且 s2 库引入了半封闭多边形的新概念(在 GEOS 年代还没有)。

请参阅https://r-spatial.github.io/s2/reference/s2_options.html#model了解更多信息。

无论如何,请考虑这段代码,它构建在{giscoR}包上以访问 EU NUTS 区域并sf::st_intersection()找到共享边界。请注意(即所有多边形都包含其整个边界)的使用model = "closed",这可能不是立即显而易见的,但对于代码按预期工作是必要的。

library(dplyr)
library(ggplot2)
library(giscoR)
library(sf)

bavaria <- gisco_get_nuts(country = "DE",
                          nuts_level = "1") %>% 
  filter(NUTS_NAME == "BAYERN")

austria <- gisco_get_nuts(country = "AT",
                          nuts_level = "2")

shared_border <- st_intersection(bavaria,
                                 austria,
                                 model = "closed") # this line is important!

ggplot() +
  geom_sf(data = bavaria, fill = NA, color = "gray40") +
  geom_sf(data = austria, fill = NA, color = "gray40") +
  geom_sf(data = shared_border, fill = NA, color = "red")
Run Code Online (Sandbox Code Playgroud)

共享边界 / 拜仁和奥地利