OTENKI Data Science

TechBlog

K.Sakurai

wgrib2を用いたGRIB2形式データの領域抽出

最近、「GRIB2形式データを、ある地域に限定してデータ抽出したい」というご要望を頂くことが多くなりました。ある地域とは、格子点1つではなく、広がりのある領域です。例えば、都道府県や、ある地点の周囲〇km等です。その主な目的は、CSV形式等テキストで出力した場合にデータ量を小さくできることです。全国領域のデータを利用するとデータ量が大きすぎて、専用の解析ソフトウェアに入力したり、処理したりするのが難しいケースもあるかと思います。
今回もwgrib2を使います。wgrib2のインストール方法は、過去の記事(Linux版Windows版)をご参照ください。(当記事執筆時点で、Windows版ソースのダウンロードサイトがリンク切れになっているようです。本家サイトの「Source Code and Compling Hints」下にある「FTP directory/by http」から、「Windows10/」ディレクトリをたどれば同様のファイルを入手できます。)
wgrib2を用いた領域抽出方法は、-ijboxオプション-small_gribオプションを使う2つの方法を紹介します。どちらも簡単に領域抽出できますが、領域の指定方法や出力が異なります。

※wgrib2のバージョンは2.0.7(Linux版)で動作確認しました。領域抽出のオプションはWindows版でも同様です。
※当記事の情報は執筆時点のものです。また、ソフトウェアのダウンロードや実行はご自身の責任でお願いします。

抽出領域の設定と注意点

今回のコマンド例には、解析雨量のサンプルファイルを用います。
抽出領域は、北緯30.0度~35.0度、東経130.0度~135.0度とします。南北約600km、東西約400kmの矩形領域になります。
抽出する領域を決めるときに気を付けなければならないのは、あまりに小さな領域にすると、気象現象の特性(空間スケール)を捉えられなくなる可能性があることです。人が決めた境界(例:市町村や都道府県の境界)の外側にも領域を取る必要があるかどうか(例:流域が隣接する地域にまたがっている)、確認しましょう。
例として設定した抽出領域は、気象現象の特性を考慮しておらず、あくまでもデータ処理上の容量を削減することを目的とした切り出し領域とご理解ください。

-ijbox:格子点番号を指定して抽出する方法

-ijboxオプションでは、格子点番号を指定して領域抽出します。
解析雨量データの始まりの緯度経度は、北緯20度、東経118度で、メッシュ間隔は、緯度方向に0.008333度、経度方向に0.0125度なので、抽出したい格子点番号は、南北1201~1800、東西961~1360とします。
以下のように実行すると、CSV形式で抽出することができます。
    $ wgrib2 Z__C_RJTD_20201005000000_SRF_GPV_Ggis1km_Prr60lv_ANAL_grib2.bin -ijbox 961:1360 1201:1800 output.csv spread
ここで、spreadは出力ファイルのフォーマット指定で、spread sheet formatの略のようです。
出力ファイルoutput.csvは、以下のフォーマットになります。
東西格子点番号,南北格子点番号,解析雨量
(ヘッダ含め240001行)
他にもtext(縦並びのフォーマット)やbin(バイナリ)が指定できます。

-small_grib:緯度経度を指定してGRIB2形式データを出力する方法

-small_gribオプションでは、指定した東西南北4端の緯度経度で切り出した領域のGRIB2形式データを出力します。
例えば、
    $ wgrib2 Z__C_RJTD_20201005000000_SRF_GPV_Ggis1km_Prr60lv_ANAL_grib2.bin -small_grib 130:135 30:35 small.grib
のように、-small_gribの後に(西端経度:東端経度)(南端緯度:北端緯度)、出力ファイル(small_grib)を指定して実行します。
-gridオプションを使うと、実際に抽出できたか確認することができます。
    $ wgrib2 -grid small.grib
    1:0:grid_template=0:winds(N/S):
      lat-lon grid:(400 x 600) units 1e-06 input WE:SN output WE:SN res 48
      lat 30.004166 to 34.995833 by 0.008333
      lon 130.006250 to 134.993750 by 0.012500 #points=240000
あとは、-csvオプション等でCSV形式に変換することが可能です。
    $ wgrib2 small.grib -csv small.csv
この場合のCSV形式のフォーマットは-ijboxオプションのspread出力と異なります。特に、欠測値のデータが出力されないようです。
    $ head small.csv
    "2020-10-05 00:00:00","2020-10-05 00:00:00","var0_1_200","surface",130.006,30.0042,0
    "2020-10-05 00:00:00","2020-10-05 00:00:00","var0_1_200","surface",130.019,30.0042,0
    "2020-10-05 00:00:00","2020-10-05 00:00:00","var0_1_200","surface",130.031,30.0042,0
    "2020-10-05 00:00:00","2020-10-05 00:00:00","var0_1_200","surface",130.044,30.0042,0
    "2020-10-05 00:00:00","2020-10-05 00:00:00","var0_1_200","surface",130.056,30.0042,0
    "2020-10-05 00:00:00","2020-10-05 00:00:00","var0_1_200","surface",130.069,30.0042,0
    "2020-10-05 00:00:00","2020-10-05 00:00:00","var0_1_200","surface",130.081,30.0042,0
    "2020-10-05 00:00:00","2020-10-05 00:00:00","var0_1_200","surface",130.094,30.0042,0
    "2020-10-05 00:00:00","2020-10-05 00:00:00","var0_1_200","surface",130.106,30.0042,0
    "2020-10-05 00:00:00","2020-10-05 00:00:00","var0_1_200","surface",130.119,30.0042,0
    $ wc -l small.csv
    205006 small.csv

まとめ

今回はGRIB2形式データの領域抽出方法について、-ijboxオプションを用いた格子点番号を指定して抽出する方法と-small_gribオプションを用いた緯度経度を指定してGRIB2形式データを出力する方法を紹介しました。
使用した解析雨量データは、1つのファイルに1つの要素、1つの時刻が格納されていました。他のデータで複数の要素や時刻がある場合は-matchオプション等で絞るのを同時に行うことも可能です。wgrib2でできそうにないのは、CSV形式出力で時間(例えば、予報時間)を横並びで出力することかと思いますが、そのようなフォーマットにする処理を別途入れるか、テキスト変換済みデータをご利用ください。
皆さんのデータ利用の参考になれば幸いです。

この記事を書いた人

K.Sakurai

気象予報士/技術士(応用理学)/防災士 
総合気象数値計算システムSACRA、データ提供システムCOSMOS及びお天気データサイエンスの開発に一から携わる。
WRF-5kmモデル、虹予報、虹ナウキャスト、1㎞メッシュ雨雪判別予測データ、2kmメッシュ推計日射量を開発。
趣味はバドミントンと登山。

前の記事へ 2kmメッシュ推計日射量の特性~MSM-GPV予報値との比較~
記事一覧へ
  1. お天気データサイエンスHOME
  2. 技術情報
  3. 技術ブログ
  4. wgrib2を用いたGRIB2形式データの領域抽出