首页 文章

重新投影cshapes世界 Map 时的扭曲

提问于
浏览
2

我正在尝试使用来自 cshapes 包和 sp::spTransform 的数据绘制重新投影的世界 Map ,但投影导致扭曲的图 . How can I correctly reproject and plot a cshapes map?

这是一个示例,显示 Map 自身绘制良好(代码改编自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

一些额外的信息:

  • 我知道有国家边界的其他数据来源,但我需要反映国家边界变化的 Map ,这些 Map 是 cshapes .

  • 我的猜测是问题与底层 Map 多边形的问题有关,但我不知道从哪里开始寻找,最好问我到底想要得到什么,而不是如何解决预感 .

  • 问题不在于 ggplot2 ,用基本图形绘制 Map 会显示相同的扭曲( plot(wmap_robin) ) .

2 回答

  • 0

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

    使用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

相关问题