防止 spData::world 国家环绕地图/裁剪地图区域

时间:2021-07-02 11:01:38

标签: r ggplot2 sf

我正在使用 sf::world 制作地图,我只想在其中绘制欧洲、非洲、亚洲和大洋洲:

library(sf)
map = spData::world %>%
    dplyr::filter(!continent %in% c("South America", "North America", "Antarctica"))

ggplot() + 
    geom_sf(data=map, aes(geometry=geom))

enter image description here

就目前的情况而言,俄罗斯和大洋洲的部分正在环绕并在图上留出大量空白。

我尝试了 this answer 中的 st_crop 的各种组合,以裁剪出空白:

st_crop(map, xmin=-30, xmax=180, ymin=-180, ymax=180)

但它似乎返回一张没有几何图形的空白地图。感觉解决方法就是简单的使用这个函数,但是我做不到。

2 个答案:

答案 0 :(得分:1)

您可以使用此答案中提出的方法 https://stackoverflow.com/a/67977330/7756889

library(sf)
library(ggplot2)

map = spData::world %>%
  dplyr::filter(!continent %in% c("South America", "North America", "Antarctica"))

# Russia only will not do; Fiji also crosses the antimeridean...
rossiya <- subset(map,  iso_a2 %in% c("RU", "FJ"))

pacified_rossiya <- st_shift_longitude(rossiya)

rest_of_world <- subset(map, !iso_a2 %in% c("RU", "FJ"))

map2 <- rbind(pacified_rossiya,
                rest_of_world) 

plot(st_geometry(map2))

enter image description here

虽然它似乎在基本绘图中效果最好,但在应用于 ggplot2 时会崩溃。

答案 1 :(得分:1)

使用 tmap 的解决方案:

# packages
library(sf)
#> Linking to GEOS 3.9.0, GDAL 3.2.1, PROJ 7.2.1
library(tmap)

# data
map = spData::world %>%
  dplyr::filter(!continent %in% c("South America", "North America", "Antarctica"))

# plot
tm_shape(map, bbox = c(-30, -60, 180, 90)) + 
  tm_polygons()

reprex package (v2.0.0) 于 2021 年 7 月 2 日创建

查看 ?tm_shape 的帮助页面了解更多详情。

编辑

正如@Jindra Lacko 所指出的,这里介绍的方法只是将矩形过滤器应用于地图,而没有解决反子午线附近的问题。