気象系技術メモ

気象データ解析のための技術まわりのメモ。

GRIBデータの扱い①

GRIBファイルをGrADsで描画できるようにしたり、プログラムで解析したりできるようにするための操作について、忘れないうちにメモ。

手順ごとの詳細な説明というよりは、それぞれの部分で詳しいサイトに飛べるようなまとめみたいな感じかも。MacUnixLinux向け。

そもそもGRIBってなによ

まあwikiを見てもらえばいいんですが、簡単に言えばWMO(世界気象機関)が導入した気象データの格納形式で、格子点上での値をバイナリで記録する規格です。現状ではGRIB1とその後継であるGRIB2の2バージョンが使われています。

よく見るところとしては、JRA-55やERA-Interimといった再解析データがGRIBファイル(.grb、.grib)で提供されています。

前提となる環境構築

こちらのページにて、気象データの解析に必要な環境構築の手順についてまとめてくださっています(Mac向け)。
qiita.com
以下、こちらで紹介されている環境(gccとか)で使うことを前提にまとめます。

GRIBファイルの変換

GRIBはそのままでは描画・解析ができない/難しい場合が多いので(対応しているソフトウェアももちろんある)、何らかの手順で別のファイル形式に変換する必要があります。

① netCDFへ

netCDFは、アメリカの研究機関(UCAR Unidata)により導入された汎用配列データ形式です(拡張子.nc)。

netCDFに変換することで、GrADsでかなり簡単に描画できるようになります。落としてきたデータを解析前にサクッと確認したいときや、とりあえず何か描いてみたいときにおすすめ。

変換にはCDOと呼ばれるソフトウェアを用います。CDOコマンドラインで動作し、netCDF/GRIBの変換のほか格子系の変換や統計解析などかなり色々なことができるツールです。詳しくはこちらのページなどでまとめてくださっています。

www.hysk.sakura.ne.jp

インストール手順はこちら(上記ページ中のリンクから飛べます)で紹介されています。Macの方は公式ページに掲載されているMacPortsやHomebrewを使ったインストール方法も簡単かと思います。


CDOを使ったGRIBの変換は以下のコマンドで行います。

$ cdo -f nc copy [入力(GRIB)ファイル名] [出力(netCDF)ファイル名]


そして、GrADsでの描画コマンドは以下のようになります。

ga-> sdfopen hoge.nc   #netCDFファイルをオープン
ga-> d 変数名           #描画

②バイナリファイルへ

単純なバイナリファイルにする方法。プログラムに読み込んで解析する際に扱いやすい形式です。

ここではwgribというツールを使います。wgribには無印のwgribとwgrib2があり、それぞれGRIB、GRIB2のファイルに対応しています(wgrib2はGRIBにも対応しているとのことですが、あまりうまくいかないことが多いようです)。ここではwgribを使ったGRIBファイルの操作について書きます。

wgribはNOAAのサイトから落としてくることができます。インストール手順についてはこちらのページがわかりやすいと思います。

tarファイル解凍→ソースコード生成→make という簡単な手続きです。wgribという実行ファイルが作られるはずなので、あとはそれを/usr/local/binなど適当な(PATHが通っている)ところにコピーすれば完了です。

wgribも先ほどのCDO同様コマンドラインで動作するソフトウェアです。wgribのコマンドはこちらのサイトが非常に参考になります。
www.hysk.sakura.ne.jp
例えば、あるGRIBファイルから可降水量のデータを切り出して、バイナリファイルに書き出したいとします。GrADsやプログラムでも読めるようにヘッダなしのバイナリファイルに出力する(ヘッダがあると、頭に余分な数値が読み込まれてしまう)には、以下のようなコマンドを入力します。

wgrib [入力ファイル名] | grep ":PWAT:" |  wgrib  -bin -nh -i [入力ファイル名]  -o [出力ファイル名]

ここで"PWAT"というのが可降水量を表す変数名で、

wgrib [入力ファイル名]

とすると、

wgrib anl_column125.2020070100 

Undefined parameter table (center 34-241 table 200), using NCEP-opn
1:0:d=20070100:PWAT:kpds5=54:kpds6=200:kpds7=0:TR=0:P1=0:P2=0:TimeU=1:atmos col:anl:NAve=0
2:62748:d=20070100:COVTM:kpds5=152:kpds6=200:kpds7=0:TR=0:P1=0:P2=0:TimeU=1:atmos col:anl:NAve=0
3:125496:d=20070100:CAPE:kpds5=157:kpds6=200:kpds7=0:TR=0:P1=0:P2=0:TimeU=1:atmos col:anl:NAve=0
4:188244:d=20070100:HLCY:kpds5=190:kpds6=200:kpds7=0:TR=0:P1=0:P2=0:TimeU=1:atmos col:anl:NAve=0
5:250992:d=20070100:PROB:kpds5=191:kpds6=200:kpds7=0:TR=0:P1=0:P2=0:TimeU=1:atmos col:anl:NAve=0

こんな感じでそのGRIBファイルに含まれる変数リストを表示してくれます。

どれがなんの変数かわからない場合は、

wgrib -V [入力ファイル名]

とすれば、

wgrib -V anl_column125.2020070100 

Undefined parameter table (center 34-241 table 200), using NCEP-opn
rec 1:0:date 2020070100 PWAT kpds5=54 kpds6=200 kpds7=0 levels=(0,0) grid=255 atmos col anl:
  PWAT=Precipitable water [kg/m^2]
  timerange 0 P1 0 P2 0 TimeU 1  nx 288 ny 145 GDS grid 0 num_in_ave 0 missing 0
  center 34 subcenter 241 process 201 Table 200 scan: WE:NS winds(N/S) 
  latlon: lat  90.000000 to -90.000000 by 1.250000  nxny 41760
          long 0.000000 to -1.250000 by 1.250000, (288 x 145) scan 0 mode 128 bdsgrid 1
  min/max data 0.0899731 69.4337  num bits 12  BDS_Ref 0.0899731  DecScale 0 BinScale -5

rec 2:62748:date 2020070100 COVTM kpds5=152 kpds6=200 kpds7=0 levels=(0,0) grid=255 atmos col anl:
  COVTM=Covariance between v and T [K*m/s]
・
・
・

のように詳細な説明と一緒に表示してくれます。

ヘッダをつけない場合、出力されたバイナリファイルのサイズが数値のバイト数*東西グリッド数*南北グリッド数*鉛直グリッド数になっていれば問題ありません(たとえば、数値が4バイト実数で格納されていれば「4*東西*南北*鉛直」のファイルサイズになる)。ヘッダありの場合、ここに先頭のヘッダ分のバイトが加わります。

注意点として、wgribはデフォルトでは北→南の方向にデータを出力するので、南→北の順になっているデータと合わせて解析する場合などは適宜(解析前にひっくり返すとかして)対応が必要です。
厄介なのが、GRIB2を扱うwgrib2ではデフォルトで南→北になっていて、北→南で出力するためには別途オプションで「-order we:ns」とつけなければならない点。
不安があれば解析前に単体で描画してしまうとミスに気付きやすいのですが、例えばGrADsのctlファイル(別の記事でまとめてます)にもグリッドの南北、上下を反転させて読み込むオプションがあったりするので、案外面倒です。wgrib用のスクリプトやctlファイルを流用する際には注意しましょう。



以上、まずはGRIBファイルを扱いやすい形に変換する手順についてまとめました。これらを使った解析については、長くなるので次の記事でまとめます。