我正在使用R maps包在世界 map 上绘制一些点,例如:

绘制 basemap 的命令是:

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

但是我需要显示太平洋中心 map 。我使用map("world2",等来使用来自 map 包的以太平洋为中心的 basemap ,并使用以下命令转换数据框(df)中数据点的坐标:
df$longitude[df$longitude < 0] = df$longitude[df$longitude < 0] + 360

如果我不使用fill选项,这将起作用,但是对于fill,跨0°的多边形会引起问题。

我想我需要以某种方式转换maps库中的多边形数据,但我不知道该如何实现。

我的理想解决方案是绘制一个 map ,其左边界为-20°,右边界为-30°(即330°)。以下内容将正确的点和海岸线输入到 map 上,但过零问题相同
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()对象,并在map()函数中再次使用该对象。我将创建一个包含各个多边形的列表,检查哪些多边形的经度值非常不同,然后重新排列这些多边形。我在下面的函数*中提供了这种方法的示例,该函数允许类似以下内容:

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

要得到

如果我是你,我会把所有事情都转移一点,例如:
plot.map("world", center=200, col="white",bg="gray",
   fill=TRUE,ylim=c(-60,90),mar=c(0,0,0,0))

功能 :
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,...)
}

*请注意,此功能仅采用正中心值。它很容易适应两个方向的中心值,但是我不再打扰,因为这很简单。

关于r - 固定 map 库数据以太平洋中心(经度0°-360°)显示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5353184/

10-12 17:53
查看更多