Фиксирование картографических данных библиотеки для тихоокеанского центра (0 ° -360 ° долготы)

Я рисую некоторые точки на карте мира, используя пакет R- maps , что-то вроде:

Карта мира, от -180 ° до 180 ° долгота

Команда рисования базовой карты:

 map("world", fill=TRUE, col="white", bg="gray", ylim=c(-60, 90), mar=c(0,0,0,0)) 

Но мне нужно отобразить карту с центром в центре Тихого океана. Я использую map("world2", т. Д., Чтобы использовать map("world2", с центром в центре Тихого океана из пакета карт и преобразовывать координаты точек данных в моем фрейме данных ( df ) с помощью:

 df$longitude[df$longitude < 0] = df$longitude[df$longitude < 0] + 360 

Это работает, если я не использую параметр fill , но с fill полигонов, которые пересекают 0 °, вызывают проблемы.

Карта мира, от 0 ° до 360 ° по долготе

Думаю, мне нужно каким-то образом преобразовать данные полигона из библиотеки maps чтобы разобраться в этом, но я понятия не имею, как это сделать.

Моим идеальным решением было бы нарисовать карты с левой границей при -20 ° и правую границу при -30 ° (т. Е. 330 °). Следующее получает правильные точки и береговые линии на карте, но проблема с пересекающимся нулем одинакова

 df$longitude[df$longitude < -20] = df$longitude[d$longitude < -20] + 360 map("world", fill=TRUE, col="white", bg="gray", mar=c(0,0,0,0), ylim=c(-60, 90), xlim=c(-20, 330)) map("world2", add=TRUE, col="white", bg="gray", fill=TRUE, xlim=c(180, 330)) 

Любая помощь будет принята с благодарностью.

    Вы можете использовать тот факт, что внутренний объект, возвращаемый функцией map() может быть пересчитан и снова использован в функции map() . Я создал список с отдельными многоугольниками, проверял, какие из них имеют очень разные значения долготы, и перегруппируйте их. Я привел пример такого подхода в функции ниже *, которая позволяет что-то вроде:

     plot.map("world", center=180, col="white",bg="gray", fill=TRUE,ylim=c(-60,90),mar=c(0,0,0,0)) 

    получить

    Исправленный центр карты 180

    Если бы я был вами, я бы переместил все немного больше, например:

     plot.map("world", center=200, col="white",bg="gray", fill=TRUE,ylim=c(-60,90),mar=c(0,0,0,0)) 

    Исправленный центр карты 200

    Функция :

     plot.map<- function(database,center,...){ Obj <- map(database,...,plot=F) coord <- cbind(Obj[[1]],Obj[[2]]) # split up the coordinates id <- rle(!is.na(coord[,1])) id <- matrix(c(1,cumsum(id$lengths)),ncol=2,byrow=T) polygons <- apply(id,1,function(i){coord[i[1]:i[2],]}) # split up polygons that differ too much polygons <- lapply(polygons,function(x){ x[,1] <- x[,1] + center x[,1] <- ifelse(x[,1]>180,x[,1]-360,x[,1]) if(sum(diff(x[,1])>300,na.rm=T) >0){ id <- x[,1] < 0 x <- rbind(x[id,],c(NA,NA),x[!id,]) } x }) # reconstruct the object polygons <- do.call(rbind,polygons) Obj[[1]] <- polygons[,1] Obj[[2]] <- polygons[,2] map(Obj,...) } 

    * Обратите внимание, что эта функция принимает только положительные значения центра. Он легко адаптируется для учета значений центра в обоих направлениях, но я больше не беспокоился, поскольку это тривиально.

    Немного поздно, но вы также можете создать сдвинутую карту с помощью проекции (требуется пакет mapproj):

      map("world", projection="rectangular", parameter=0, orientation=c(90,0,180), wrap=TRUE, fill=T, resolution=0,col=0) 

    Это сдвинется на 180 gradleусов. Но разница с «миром2» заключается в том, что координата долготы будет отличаться ([-pi, pi]). Все проекции этого пакета положили 0 в центр. И в этом случае опция «wrap» обнаруживает скачок правильно.

    ‘resolution = 0’ помогает получить более чистые границы.

    Вы можете легко изменить долготу центра, изменив значение «180» в описании проекции.

    установите последнюю версию карт (3.2.0).

    сделай это:

     d$lon2 <- ifelse(d$lon < -25, d$lon + 360, d$lon) # where d is your df mapWorld <- map_data('world', wrap=c(-25,335), ylim=c(-55,75)) ggplot() + geom_polygon(data = mapWorld, aes(x=long, y = lat, group = group)) + geom_point(data = d, aes(x = lon2, y = lat)) 
    Давайте будем гением компьютера.