2016-11-10 7 views
1

Rの緯度、経度、グリッドデータを使用してグローバルマップをプロットしようとしています。これはimage関数とimage.plot関数を使用しています。さらに、私は土地のために世界の海岸線を覆う必要があります。しかし、グリッドデータのイメージ上に正確にマップを配置する方法がわかりません。マップはコンソールの左側にビットシフトされて表示され、その部分も表示されません。以下のサンプルコードでランダムグリッドデータを参照してください。イメージプロット上にワールドマップをオーバーレイするR

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() 

答えて

0

私は、いくつかの試みと同僚からのヒントの答えを見つけました。 -179.5に359:どのように行われる必要があることは0から経度グリッドをシフトである179.5 grid_lonた後、以下のコマンドを使用しては宣言されています

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)) 
1

一般にマップを操作する場合、投影法を定義できる空間オブジェクトを使用することが望ましいです。マップとの一貫性が保証されます。塗りつぶしグリッドで作業しているので、明らかな選択はrasterrasterを使用することです。あなたのコードは、その後になる:

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") 

EDIT

データは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") 
+0

こんにちはピーター、私はこのケースでは、ラスタ機能を使用couldntの理由は、私が欲しいですgrid_latおよびgrid_lonからの座標情報を使用してグローバルデータをプロットするための行列temp1。 temp1は360 * 180(Long * Lat)のグローバルグリッドで、画像関数はパラメータを読み込み、Lat * Longのように180 * 360グリッドを表示します。さらに、転置を取るだけでは、この場合もプロットも正しい位置に座標を配置してプロットする必要がありません。 – Munish

+0

私がよく理解すれば、あるソースまたはルーチンからtemp1を360 * 180の行列として取得します。私はこの面を見落としていました。しかし、なぜ転置は機能しないのですか?たとえそれが逆さまの地図を生成しても(私はそれがなぜ起こるのかわかりません)、適切な方向を復元するのは簡単でしょう。ところで、マップパッケージには、画像にプロットできる「map2」という太平洋中心の(180E)マップがあります。 –

+0

助けてくれてありがとうPeter、私は私の目的を果たすソリューションを投稿しました。 – Munish

関連する問題