使用geom_sf跨越日期变更线时的封闭边界

问题描述 投票:0回答:1

我正在尝试制作一个罗宾逊投影图,它不是以经度 0 为中心,并且穿过 180° 线的两侧。

我的代码如下:

library("rnaturalearthdata")
world <- ne_countries(scale = "medium", returnclass = "sf")
robinson = "+proj=robin +lon_0=-90 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs"
transformed = st_transform(world, robinson)
ggplot(data=transformed) + geom_sf(fill = "gray", colour = "black")+theme_bw()

生成此地图,该地图的方向正确,但所有分割边界都是“由内而外”并环绕整个地图。

9年前就有这个相关问题,但我希望通过最近的软件包更新,有一个不太复杂的解决方案,这将允许我们使用

geom_point()
绘制纬度/经度数据点,而无需额外的转换.

编辑:我确实尝试使用 gisco 轮廓,但得到了相同的人工制品。

world <- giscoR::gisco_get_countries()

r ggplot2 maps coordinate-systems geom-sf
1个回答
0
投票

在投影之前,您需要“破坏”任何交叉 180 度的多边形。

st_break_antimeridian()
包中的
sf
函数是实现此目的的最简单方法:

library(rnaturalearth)
library(sf)
library(dplyr)
library(ggplot2)

world <- ne_countries(scale = "medium", returnclass = "sf") %>%
  st_set_crs(4326)

robinson <- "+proj=robin +lon_0=-90 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs"

world_robinson_90w <- world %>%
  st_break_antimeridian(lon_0 = -90) %>%
  st_transform(crs = robinson)

© www.soinside.com 2019 - 2024. All rights reserved.