気象庁の数値予報モデルの計算結果は、気象庁サイト(数値予報天気図)様々な種類の天気図が公表されているものの、モノクロだったり欲しい時刻の天気図がなかったりします。
ということで、数値予報の生データ(GPV)を京都大学生存圏研究所のサイトにある数値予報GPVをダウンロードしてきて、GMTで自分好みの図を作図してみようと思います。
気象庁の数値予報データ(GPV:Grid Point Value)はGRIB2という形式のバイナリデータで、そのままテキストで読み取ることは出来ないため、何らかの方法でデコードする必要があります。NOAAがwgrib2というツールを公開してくれているのですが、色々と面倒くさそうだったので、私個人が慣れているGDAL1)GDALはGRIB2にも対応しているをC#から触ってデコードしてみようと思います。
早速、GRIB2形式のGPVをダウンロードしてきて、下記のコードを使ってGDALをC#から使ってどんな情報が入っているのかを覗いてみます。
//冒頭にはこれが書かれているものとします using System.IO; using GDAL = OSGeo.GDAL; /*中略*/ const string sGdalDir = @"C:\Program Files\GDAL"; //GDALのインストールディレクトリ const string sInGRIB2 = @"ダウンロードしたGPVファイルのフルパス"; static void Main(string[] args) { //GDAL有効化 InitGDAL(); //とりあえず開いてみる using (GDAL.Dataset ds = GDAL.Gdal.Open(sInGRIB2, GDAL.Access.GA_ReadOnly)) { //バンド数 Console.WriteLine("ds.RasterCount:{0}", ds.RasterCount); Console.WriteLine("ds.GetDescription:{0}", ds.GetDescription()); //バンドの内容 for (int i = 1; i <= ds.RasterCount; i++) { Console.WriteLine("Band{0}, GetDescription:{1}", i, ds.GetRasterBand(i).GetDescription()); } //止める Console.ReadLine(); } } //GDAL有効化【AnyCPUだとバグるので注意】 public static void InitGdal() { const string sGdalDir = @"C:\Program Files\GDAL"; string sVal; //PATH sVal = Environment.GetEnvironmentVariable("PATH") + ";" + sGdalDir + ";" + Path.Combine(sGdalDir, "csharp") + ";" + Path.Combine(sGdalDir, "gdal-data") + ";" + Path.Combine(sGdalDir, "gdalplugins") + ";" + Path.Combine(sGdalDir, "projlib"); Environment.SetEnvironmentVariable("PATH", sVal); //GDAL_DATA Environment.SetEnvironmentVariable("GDAL_DATA", Path.Combine(sGdalDir, "gdal-data")); GDAL.Gdal.SetConfigOption("GDAL_DATA", Path.Combine(sGdalDir, "gdal-data")); //GDAL_DRIVER(Plugins) Environment.SetEnvironmentVariable("GDAL_DRIVER_PATH", Path.Combine(sGdalDir, "gdalplugins")); GDAL.Gdal.SetConfigOption("GDAL_DRIVER_PATH", Path.Combine(sGdalDir, "gdalplugins")); //PROJ_LIB Environment.SetEnvironmentVariable("PROJ_LIB", Path.Combine(sGdalDir, "projlib")); GDAL.Gdal.SetConfigOption("PROJ_LIB", Path.Combine(sGdalDir, "projlib")); GDAL.Gdal.SetConfigOption("GDAL_CACHEMAX", "100000"); GDAL.Gdal.SetConfigOption("CPL_TMPDIR", @".\"); GDAL.Gdal.AllRegister(); }
上記のコードを実行した結果がこちら。
GRIB2に含まれる様々な要素(気圧・風向風速・気温etc)が多数のバンドに分かれて保存されているようです。
Dataset.GetDescriptionメソッドの結果を見ると、気圧面・高度の種類が記載されているようですが、予報時刻や何の要素が記録されたバンドなのかはわかりません。
色々と試行錯誤してみたところ、予報時刻や気象要素はGDAL.Band.GetMetadataメソッドで読み取ることが出来るようです。
そこで、前述のコードにメタデータを読み取る部分を追加してみます。追加した部分のコードと、追加したコードによる出力結果は下記の通りでした。
//バンドの内容 for (int i = 1; i <= ds.RasterCount; i++) { Console.WriteLine("Band{0}, GetDescription:{1}", i, ds.GetRasterBand(i).GetDescription()); string[] ss = ds.GetRasterBand(i).GetMetadata(""); for (int j = 0; j < ss.Length; j++) //追加した部分 { Console.WriteLine("Band{0}, Metadata[{1}]:{2}", i, j, ss[j]); } }
この内容を見ると、気象要素は「GRIB_COMMENT」に、初期値時刻と予報時刻は「GRIB_REF_TIME」と「GRIB_VALID_TIME」にそれぞれUNIXタイムで記録されていました。また、予報時間は「GRIB_FORECAST_SECONDS」に秒単位で記録されていました。
ひとまず、これでGRIB2からGPVの値を読み取る手順はなんとなくわかってきました。
次の記事で、GRIB2の情報をもう少しスッキリと読み取るクラスを使って、バンドの情報を読み取ってみたいと思います。
次の記事→ [C# GDAL 気象]数値予報モデルGPVを読み取る(その2)