重新投影 cshapes 世界地图时出现失真
Distortions when reprojecting cshapes world map
我正在尝试使用 cshapes
包和 sp::spTransform
中的数据绘制重新投影的世界地图,但投影会导致绘图失真。 如何正确地重新投影和绘制 cshapes
地图?
这是一个示例,显示地图本身绘制得很好(代码改编自 this blog post):
library("cshapes")
library("ggplot2")
library("rgdal")
wmap <- cshp(date=as.Date("2012-06-30"))
wmap_df <- fortify(wmap)
ggplot(wmap_df, aes(long,lat, group=group)) +
geom_polygon() +
labs(title="World map (longlat)") +
coord_equal()
ggsave("~/Desktop/map1.png", height=4, width=7)
这是我重新投影到罗宾逊时的变形版本:
wmap_robin <- spTransform(wmap, CRS("+proj=robin"))
wmap_df_robin <- fortify(wmap_robin)
ggplot(wmap_df_robin, aes(long,lat, group=group)) +
geom_polygon() +
labs(title="World map (robinson)") +
coord_equal()
ggsave("~/Desktop/map2.png", height=4, width=7)
一些附加信息:
- 我知道还有其他国家边界数据源,但我需要反映国家边界变化的地图,
cshapes
需要。
- 我猜这个问题与底层地图多边形的问题有关,但我不知道从哪里开始寻找,最好问问我最终想要得到什么,而不是如何解决直觉。
- 问题不在于
ggplot2
,使用基础图形绘制地图显示了相同的扭曲 (plot(wmap_robin)
)。
您可以使用 raster::crop
删除刚好小于 -180 或大于 180 的节点
library(cshapes)
library(raster)
wmap <- cshp(date=as.Date("2012-06-30"))
w <- crop(wmap, extent(-180, 180,-90,90))
w_robin <- spTransform(w, CRS("+proj=robin"))
plot(w_robin)
2018 年更新,使用 sf
的解决方案:
library("cshapes")
library("sf")
cshp(as.Date("2015-01-01")) %>%
st_as_sf() %>%
st_crop(ymin = -90, ymax = 90, xmin=-180, xmax=180) %>%
st_transform(crs = "+proj=robin") %>%
`[`(1) %>% plot()
输出为:
我正在尝试使用 cshapes
包和 sp::spTransform
中的数据绘制重新投影的世界地图,但投影会导致绘图失真。 如何正确地重新投影和绘制 cshapes
地图?
这是一个示例,显示地图本身绘制得很好(代码改编自 this blog post):
library("cshapes")
library("ggplot2")
library("rgdal")
wmap <- cshp(date=as.Date("2012-06-30"))
wmap_df <- fortify(wmap)
ggplot(wmap_df, aes(long,lat, group=group)) +
geom_polygon() +
labs(title="World map (longlat)") +
coord_equal()
ggsave("~/Desktop/map1.png", height=4, width=7)
这是我重新投影到罗宾逊时的变形版本:
wmap_robin <- spTransform(wmap, CRS("+proj=robin"))
wmap_df_robin <- fortify(wmap_robin)
ggplot(wmap_df_robin, aes(long,lat, group=group)) +
geom_polygon() +
labs(title="World map (robinson)") +
coord_equal()
ggsave("~/Desktop/map2.png", height=4, width=7)
一些附加信息:
- 我知道还有其他国家边界数据源,但我需要反映国家边界变化的地图,
cshapes
需要。 - 我猜这个问题与底层地图多边形的问题有关,但我不知道从哪里开始寻找,最好问问我最终想要得到什么,而不是如何解决直觉。
- 问题不在于
ggplot2
,使用基础图形绘制地图显示了相同的扭曲 (plot(wmap_robin)
)。
您可以使用 raster::crop
删除刚好小于 -180 或大于 180 的节点
library(cshapes)
library(raster)
wmap <- cshp(date=as.Date("2012-06-30"))
w <- crop(wmap, extent(-180, 180,-90,90))
w_robin <- spTransform(w, CRS("+proj=robin"))
plot(w_robin)
2018 年更新,使用 sf
的解决方案:
library("cshapes")
library("sf")
cshp(as.Date("2015-01-01")) %>%
st_as_sf() %>%
st_crop(ymin = -90, ymax = 90, xmin=-180, xmax=180) %>%
st_transform(crs = "+proj=robin") %>%
`[`(1) %>% plot()
输出为: