Более

Линии на перепроецированных объектах sp с проекцией Mollweide


У меня возникла странная проблема: когда я перепроецирую карты в проекцию Mollweide в R с помощью sp, я получаю дополнительные линии, тянущиеся по всему земному шару. Что здесь происходит, и есть ли у вас предложения по исправлению. Вот воспроизводимый пример:

библиотека (sp) библиотека (карты) библиотека (maptools) карта мира <- map ("world", plot = F) plot (worldmap, type = "l)

Все идет нормально. я получил

Итак, теперь я перепроектирую. Это CRS, который я использую для совместимости с некоторыми другими проектами. Обратите внимание, как затем возникают линии, охватывающие весь мир.

worldmapLines <- map2SpatialLines (worldmap, proj4string = CRS ("+ proj = longlat + datum = WGS84")) worldM <- spTransform (worldmapLines, CRS ("+ proj = moll + lon_0 = 0 + x_0 = 0 + y_0 = 0 + ellps = WGS84 + units = m + no_defs ")) plot (worldM)


Ваши данные превышают предел 180 ° в.д. в восточной части России и на каком-то тихоокеанском острове. Если вы хотите получить красивую карту в градусах, вы должны обрезать исходные данные на 179,9 ° в.д. / з.д.

См. Мой ответ здесь (хотя он касается тихоокеанского взгляда)

QGIS отображает файлы форм стран мира с центром в Тихом океане с помощью цилиндрической проекции Робинсона, Миллера или другой проекции.


Итак, основываясь на ответе AndreJ выше, я придумал это.

cleanSpLinesForProjection <- function (w) {# Нам придется пройти через это, строка за строкой… slot (w, "lines") <- lapply (slot (worldmapLines, "lines"), function (x) {coords <- slot (x, "Lines") [[1]] @ coords # получить строки со слишком большими значениями долготы rIDX <- which (coords> = 180, arr.ind = T) [, 1] # если есть некоторые, замените их if (length (rIDX> 0)) coords <--coords [-rIDX,] #replace the slot slot (x, "Lines") [[1]] @ coords <- coords x}) w}

Это работает.

worldM <- spTransform (cleanSpLinesForProjection (worldmapLines), CRS ("+ proj = moll + lon_0 = 0 + x_0 = 0 + y_0 = 0 + ellps = WGS84 + units = m + no_defs")) plot (worldM)

Я просто хотел бы, чтобы был аргумент для spTransform или универсальная функция для всех объектов sp. Ах хорошо. Я кое-что узнал о sp здесь и создал код, который почти наверняка буду использовать в будущем. А теперь нужно применить его к объекту SpatialPolygons ... Что может пойти не так?


Ваши данные недействительны:

> bbox (worldmapLines) min max x -179.95721 190.29080 y -85.44308 83.57391

и график правильный, учитывая, что вы предоставили ему неверные данные.

С помощью Роджера Биванда: исправленная версия этого набора данных доступна вmaptools, пытаться:

библиотека (maptools) data (wrld_simpl) plot (spTransform (wrld_simpl, CRS = ("+ proj = moll + lon_0 = 0 + x_0 = 0 + y_0 = 0")))

Роджер далее упомянул: Абсолютно непростого способа разбить геометрию на границах «другой стороны света». wrld_simpl частично был основан на Recenter (), но требовал ручного вмешательства (это было с GPCLib до rgeos).


Вы можете вырезать область больше 180 градусов и перейти к ее обычному представлению (нет ничего плохого в том, чтобы иметь градусы больше 180, но большинство программ не ожидают этого).

Что у тебя есть

библиотека (sp) библиотека (карты) библиотека (maptools) карта мира <- map ("world", plot = F) worldmapLines <- map2SpatialLines (worldmap, proj4string = CRS ("+ proj = longlat + datum = WGS84"))

Теперь вы можете:

библиотека (растр) w1 <- crop (worldmapLines, extension (-180, 180, -90,90)) w2 <- crop (worldmapLines, extension (180, 200, -90,90)) w2 <- shift (w2, -360) w <- bind (w1, w2) x <- spTransform (w, CRS ("+ proj = moll + lon_0 = 0 + x_0 = 0 + y_0 = 0 + ellps = WGS84 + units = m + no_defs") ) сюжет (х)


Смотреть видео: वछनन मलवड परकषप. Interrupted Mollweide Projection. (October 2021).