━━━━━━━━━━━━━━━━━━━━━━━━
GRIB2フォーマットの解読方法
━━━━━━━━━━━━━━━━━━━━━━━━

気象業務支援センターから提供されている解析のデータは、grib2というフォーマットで書かれています。
このフォーマットを解読するための手順を備忘録がわりにメモしておきます。(2015/8現在)

0.私のサーバー環境

・Linux Redhut 64bit

1.grib2_decを入手

grib2_decは、気象業務支援センターから購入したCD等についているgrib2の解読コードです。
どうしても手に入らない人は、配信資料に関する技術情報(気象編)第129号から頑張ってコピーしましょう。

2.grib2_decをコンパイル

make grib2_dec
でコンパイルします。
WindowsおよびLinuxではリトルエンディアン形式なので、
ヘッダーファイル「sample_decode.h」の5行目のコメントをあらかじめ外す必要があります。

/* (←これを消す)
#define IS_LITTLE_ENDIAN
*/ (←これを消す)

3.grib2_decを実行

grib2_dec Z__C_RJTD_20xxxxxxxxxxxx_ANAL_grib2.bin(ファイル名)
ファイル名.binというファイルで4バイト整数の配列で出力されます。

grib2_dec Z__C_RJTD_20xxxxxxxxxxxx_ANAL_grib2.bin(ファイル名)-xpm
ファイル名.xpmというxpm形式の画像イメージファイルが作成されます。

4.データの変換

grib2_decが出力してくれる数値は、レベル値の数字が並んでいるだけです。
実際に使用するには、(A)レベル値を物理値(解析雨量の場合はmm)に変換し、(B)緯度経度を把握する必要があります。
フォーマットの詳細は、配信資料に関する技術情報(気象編)第193号に書いてあります。

(A)レベル値から物理値への変換
grib2_decを利用すると、第5節は以下のように出力されます。
ここで、17列目がデータ代表値の尺度因子(つまり、10のn乗のn)で、18列目以降がレベル値に対応する物理値になります。
18-19列目はレベル1の物理値で、20−21列目はレベル2の物理値になります。
例えば、20−21列目は4と書いてありますが、実は17列目に指定されている10の1乗(=10)で割り算する必要があるので、レベル2の物理値は0.4mmとなります。

========== SECTION 5 ===========
1 -- 4: 213
5 : 5
6 -- 9: 8601600
10 -- 11: 200
12 : 8
13 -- 14: 25
15 -- 16: 98
17 : 1
18 -- 19: 0
20 -- 21: 4
22 -- 23: 10
24 -- 25: 20
26 -- 27: 30

(B)緯度経度の把握
データは日本地図上で左上(48,118)から右下(20,150)へ横方向に並んでいます。緯度経度の詳細は第3節に説明があります。31-34列目がx方向のデータ数nx、35-38列目がy方向のデータ数ny、64-67列目がx方向の増分dx(x10**-6)、68-71列目がy方向の増分dy(x10**-6)です。
for( n=0; n < gn; n++ ) {
  ny=(int)(n/nx);
  x=118.+(double)(n-ny*nx)*dx+dx*0.5;
  y=48.-(double)(ny*dy)-dy*0.5;
}

(C)土壌雨量指数や土砂災害警戒判定メッシュ情報の場合
土壌雨量指数や土砂災害警戒判定メッシュ情報のファイルを読みたいときは、grib2_decのヘッダーファイルを変更する必要があります。そのためのヘッダー用テンプレートを作成しました。prr_template.h(解析雨量)、pmf_template.h(降水短時間予報)と同様に使用します。psw_template.hが土壌雨量指数用で、ggis_template.hが土砂災害警戒判定メッシュ情報用です。ヘッダーファイルをインクルードして、init_sect関数を変更して下さい。

Link