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