Исправление данных библиотеки карт для отображения по центру Тихого океана (долгота 0 ° -360 °) - PullRequest
18 голосов
/ 18 марта 2011

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

Map of the world, -180° to 180° longitude

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

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

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

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

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

Map of the world, 0° to 360° longitude

Я думаю, мне нужно преобразовать данные многоугольника из 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))

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

Ответы [ 3 ]

17 голосов
/ 04 апреля 2011

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

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

, чтобы получить

Corrected map center 180

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

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

Corrected map center 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,...)
}

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

3 голосов
/ 17 августа 2017

установить последнюю версию карт (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))
2 голосов
/ 08 декабря 2015

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...