4

R 関数を使用して、ECMWF ERA-40 Web サイトから波高を含む GRIB ファイルwavedata.gribを読み込もうとしています。これまでの私のソースコードは次のとおりです。

mylat = 43.75
mylong = 331.25

# read the GRIB file
library(rgdal)
library(sp)
gribfile<-"wavedata.grib"
grib <- readGDAL(gribfile)

summary = GDALinfo(gribfile,silent=TRUE)
save(summary, file="summary.txt",ascii = TRUE)
# >names(summary): rows columns bands ll.x ll.y res.x res.y oblique.x oblique.y
rows = summary[["rows"]]
columns = summary[["columns"]]
bands = summary[["bands"]]

# z=geometry(grib)
# Grid topology:
# cellcentre.offset cellsize cells.dim
# x            326.25      2.5        13
# y             28.75      2.5         7
# SpatialPoints:
#           x     y
# [1,] 326.25 43.75
# [2,] 328.75 43.75
# [3,] 331.25 43.75

myframe<-t(data.frame(grib))

# myframe[bands+1,3]=331.25 myframe[bands+2,3]=43.75
# myframe[1,3]=2.162918 myframe[2,3]=2.427078 myframe[3,3]=2.211989
# These values should match the values read by Degrib (see below)

# degrib.exe wavedata.grib -P -pnt 43.75,331.25 -Interp 1 > wavedata.txt
# element, unit, refTime, validTime, (43.750000,331.250000)
# SWH, [m], 195709010000, 195709010000, 2.147
# SWH, [m], 195709020000, 195709020000, 2.159
# SWH, [m], 195709030000, 195709030000, 1.931

lines = rows * columns
mycol = 0
for (i in 1:lines) {
if (mylat==myframe[bands+2,i] & mylong==myframe[bands+1,i]) {mycol = i+1}
}
# notice mycol = i+1 in order to get values in column to the right

myvector <- as.numeric(myframe[,mycol])

sink("output.txt")
cat("lat:",myframe[bands+2,mycol],"long:",myframe[bands+1,mycol],"\n")
for (i in 1:bands) { cat(myvector[i],"\n") }
sink()

wavedata.gribファイルには、1957 年 9 月 1 日から 2002 年 8 月 31 日までの期間の SWH 値がグリッド化されています。各バンドは緯度/経度のペアを参照し、各日の 00 時に一連の 16346 SWH 値を持ちます (1 バンド = 特定の緯度/経度での 16346 値)。

myframe のサイズは 16438 x 91 です。91 = 7 行 x 13 列であることに注意してください。そして、16438という数字はバンド数とほぼ同じです。追加の 2 つの行/バンドは経度と緯度の値で、他のすべての列は 16436 バンドに対応する波高でなければなりません。

問題は、緯度/経度 = 43.75,331.25 で SWH (波の高さ) を抽出したいのですが、同じ緯度/経度で Degrib ユーティリティを使用してファイルを読み取った値と一致しません。

また、必要な正しい値 (2.147、2.159、1.931、...) は myframe の列 3 ではなく列 4 にあります。 331.25 (長い)。どうしてこれなの?myframe[i,j] の値が実際にどの緯度/経度に対応しているか、またはプロセス中にデータ インポート エラーがあるかどうかを知りたいです。Degrib にはエラーがないと仮定しています。

グリッドポイント間の値を抽出したい場合、マトリックス内の値を簡単に補間する R ルーチンはありますか? より一般的には、次のような波の高さを抽出する効果的な R 関数を作成する際に助けが必要です。

SWH <- function (latitude, longitude, date/time)

助けてください。

4

0 に答える 0