重新投影cshapes世界地图时的扭曲

时间:2015-11-09 10:59:15

标签: r gis rgdal

我正在尝试使用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)

Map without distortion

当我重新投入罗宾逊时,这是扭曲的版本:

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)

Distorted map

其他一些信息:

  1. 我知道有国家边界的其他数据来源,但我需要反映国家/地区边界变化的地图,cshapes这样做。
  2. 我的猜测是问题与底层地图多边形的问题有关,但我不知道从哪里开始寻找,最好问一下我到底想要得到什么,而不是如何预感到预感。
  3. 问题不在于ggplot2,使用基本图形绘制地图会显示相同的扭曲(plot(wmap_robin))。

2 个答案:

答案 0 :(得分:1)

您可以使用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)

答案 1 :(得分:0)

使用sf的解决方案更新2018年:

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()

输出结果为:

enter image description here