Искажения при перепроектировании карты мира cshapes

Я пытаюсь построить перепроецированную карту мира, используя данные из пакета cshapes и sp::spTransform, но проекция приводит к искаженным графикам. Как правильно перепроектировать и построить cshapes карту?

Вот пример, который показывает, что карта сама по себе отображает график (код адаптирован из это сообщение в блоге):

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)

Искаженная карта

Дополнительная информация:

  1. Я знаю, что есть и другие источники данных о границах страны, но мне нужны карты, отражающие изменения границ страны, что cshapes делает.
  2. Я предполагаю, что проблема связана с проблемами с лежащими в основе полигонами карты, но я понятия не имею, с чего начать поиск, и, вероятно, лучше спросить, что я хочу получить в итоге, а не как исправить догадку.
  3. Проблема не в ggplot2, построение карты с базовой графикой показывает те же искажения (plot(wmap_robin)).

person andybega    schedule 09.11.2015    source источник


Ответы (2)


Вы можете использовать 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)
person Robert Hijmans    schedule 11.11.2015

Обновление на 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()

Результат:

введите здесь описание изображения

person andybega    schedule 21.05.2018