在R中的图像图上叠加世界地图

时间:2016-11-10 18:43:34

标签: r

我正在尝试使用R中的纬度,经度和网格数据绘制全局地图。为此我使用image和image.plot函数。此外,我需要覆盖全球海岸线的土地面积。但是我不确定如何将地图完全放在我的网格数据图像上。地图在控制台中显示为向左移位,该部分也不可见。请参阅下面的示例代码,其中包含随机网格数据。

remove(list=ls())

library(fields)

library(maps)

grid_lon<-c(0.5:1:359.5)

grid_lat<-c(-89.5:89.5)

temp1<-matrix(data = rexp(200, rate = 10), nrow = 360, ncol = 180)#random matrix

zlim=c(0,0.25)

par(oma=c( 3,0,0,0))# c(bottom, left, top, right)#plot margins

image(grid_lon,grid_lat,temp1,axes=FALSE,xlab='',ylab='')

map("world", fill=TRUE, col="white", bg="white", ylim=c(-90, 90),add=TRUE)

title(main ='Main title')
image.plot(zlim=zlim,legend.only=TRUE,horizontal=TRUE,legend.mar=0.4,legend.shrink=0.4,legend.width=0.4,nlevel=64,axis.args = list(cex.axis =1,at=zlim, labels=zlim,mgp=c(1, 0, 0),tck=0),smallplot=c(.25,.72, 0,.030),
    legend.args=list( text=expression(textstyle(atop('anomaly',
    paste('(meters)')),cex.main=1.2)),cex=1.2, side=1, line=1.6)
    )#end image.plot

box()

2 个答案:

答案 0 :(得分:1)

通常,在使用地图时,最好使用空间对象,可以为其定义投影方法。然后更好地保证与地图的一致性。由于您正在使用填充网格,因此显而易见的选择是使用包raster中的raster。您的代码将变为:

require (raster)
require (maps)
temp1<-matrix(data = rexp(180*360, rate = 10), nrow = 360, ncol = 180)  #random matrix
r<-raster(temp1,xmn=-179.5,xmx=179.5,ymn=-89.5,ymx=89.5,crs="+proj=longlat +datum=WGS84")
plot(r)
map("world",add=T,fill=TRUE, col="white", bg="white")

修改

此代码未考虑数据是360 * 180矩阵,而需要绘制(映射)180 * 360矩阵。转置是有风险的,因为它可能导致颠倒的图像。为了确保正确的坐标与正确的值相关联,我们可以明确地将它们关联起来,然后转换为空间对象。执行此操作的for循环在下面的代码中很慢,也许它可以提高效率,但它可以完成这项工作。

require (raster)
require (maps)
# basic data, as in code given
grid_lon<-seq(0.5,359.5,1)
grid_lat<-seq(-89.5,89.5,1)
temp1<-matrix(data = rexp(200, rate = 10), nrow = 360, ncol = 180)#random matrix
# transform into data frame, where coords are associated to values
tt<-data.frame(lon=rep(NA,64800),lat=rep(NA,64800),z=rep(NA,64800))
ct<-0
for (i in 1:360){
  for (j in 1:180){
    ct<-ct+1
    tt$lon[ct]<-grid_lon[i]
    tt$lat[ct]<-grid_lat[j]
    tt$z[ct]<-temp1[i,j]
  }
}
# transform to spatial structure
coordinates(tt)<- ~lon+lat
# make spatial structure gridded
gridded(tt)<-TRUE
# transform to raster
r<-raster(tt)
projection(r)<-crs("+proj=longlat +datum=WGS84")
# plot
plot(r)
map("world2",add=T,fill=TRUE, col="white", bg="white")

答案 1 :(得分:0)

经过几次尝试和同事小费后,我找到了答案。需要做的是在声明grid_lon之后使用以下命令将经度网格从0:359转换到-179.5:179.5:

indexes_to_shift<-180

grid_lon[grid_lon>=180]<-grid_lon[grid_lon>=180]-360

grid_lon<-c(tail(grid_lon, indexes_to_shift), head(grid_lon, indexes_to_shift))