r - 固定 map 库数据以太平洋中心(经度0°-360°)显示

标签 r maps

我正在使用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/

相关文章:

r - 更新了 R "maps"包的世界地图?

r - 如何在R中简洁地表达这个和?

r - 多项式混合 logit 模型 mlogit r-package

Java如何根据值将 TreeMap 分成两个相等的图

java - Android "onRequestPermissionsResult"未被调用

maps - 如何在此处 map 中拖动 map 后获取边界

从字符串中删除相邻的重复项

c++ - 将 R 代码转换为 C++ 以进行 Rcpp 实现

r - 使用 ggrepel 标记单个点

javascript - 如何创建在 React-Native 中检测自动位置的 map