【问题标题】:Distortions when reprojecting cshapes world map重新投影 cshapes 世界地图时的失真
【发布时间】:2016-02-10 00:17:39
【问题描述】:

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

这是我重新投影到 Robinson 时的失真版本:

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)

一些附加信息:

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

【问题讨论】:

    标签: r gis rgdal


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

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

      输出是:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-14
        • 2014-03-01
        相关资源
        最近更新 更多