PHPでライブラリを使わず独力でGRIB2（気象バイナリデータ）を読む

気象の格子データの格納に使われるGRIB2（国際気象通報式 FM92 GRIB 二進形式格子点資料気象通報式（第2版））形式をgrib2用のライブラリを使わずPHPで読むことがある程度できたので書いてみる

GitHubに初めてそれっぽいコードを挙げたので、こちらにも記事を。
https://github.com/miyawa-tarou/convert_grib2
convertじゃなくてdecodeじゃね？って気はしてる。英語的にも気持ち悪さを感じる。
英語で書こうとしてくじけた痕跡や、とりあえずわからないからスキップと書いてあったり、対応できてないファイルが多々（？）あったりします。
少なくとも気圧面データは読めないと思います（地上のみのデータなどZが1変数のものは比較的読めると思っている）

# GRIB2データに関して

気象庁は予報をする際に予報の初期値を格子データにしてそれを予報モデルにぶっこんで予報している。その予報結果も格子データとして出される。
これらの初期値・予報結果を我々が使いやすいようにしている共通フォーマットがGRIB2形式である
（予報だけでなく解析値などの格子データも同じようにGRIB2である）

その計算結果を機械学習的な要素を通して計算した結果としてガイダンスというものがあるが、これもGRIB2形式
それを東京地方などに落とし込んだXML形式のものもあるが、今回は関係ない。

GRIB2ファイル自体は日本のデータだと基本は気象業務支援センターから手に入れるが、一部データは研究用に簡単に取れるように京大生存研がアーカイブしている
http://database.rish.kyoto-u.ac.jp/arch/jmadata/

GRIB2ファイルを扱うならwgrib2という定番ツールや
http://www.data.jma.go.jp/add/suishin/jyouhou/pdf/129.pdf
など参考になるソースはごまんとあるけど、今回のは何も見ずに作っていたので変なところは多々あると思われる。

CやFORTRANが読めない自分のような糞PHPerでも、中身が理解できるかもしれないというくらいのもの。
そもそも普通は中身理解する必要性を感じないけど。


エンジニアは手軽に入手できるからOpenWeatherMapのAPIをたたいてるのは見るけど、日本に関しては大した精度のない予報しか取れないわけで、こういうデータを使ってなんとかしようというのを是非やってほしいなとは思っているところ。
実際に天気予報をしてしまうと法律の問題でいろいろあるにせよ。
（別にGRIB2の仕様は理解しなくても中身がわかれば触れるはず。過去に研究で利用していた時には少なくとも以下のことは理解してなかった）

# GRIB2の各章の中身

おおもとの定義はNCEPが出しているが、細かい部分は気象庁などを見ないとわからないことも多々ある。
http://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc.shtml

途中で記載しているが気象庁が出しているPDFを見たほうがわかると思う
例：http://www.data.jma.go.jp/add/suishin/jyouhou/pdf/480.pdf
（PDF的にはP7、資料的にはP3）

## 0章 指示節

GRIB2ファイルである、という定義が書いてあるだけ

## 1章 識別節

ファイル時刻の定義。解析時刻や予報の初期時刻など。

## 2章 地域使用節

なぞ。JMAのファイルには存在しない？
コードでは必ずスキップします。

## 3章 格子系定義節

格子の定義です

たとえばMSMの地上ファイルならこのページの通り
http://www.jmbsc.or.jp/jp/online/file/f-online10200.html

 - 格子数は505×481
 - 緯度方向が47.6度から始まり-0.05度ごとに格子があり22.4度まである
 - 経度方向が120度から始まり-0.0625度ごとに格子があり150度まである

という情報

場所や予報時間によって格子間隔が異なるデータなどは3章が複数あることがあります。
降水ナウキャストとか？（忘れた

## 4章 プロダクト定義節

これから続く5～7章のデータが何の情報か。
一つのデータ内に、複数の情報が入りうる。例えばMSMなら
「海面更正気圧、地上気圧、風（２要素）、気温、相対湿度、時間降水量、雲量（４要素）、日射量」
これらのうちパラメータカテゴリとパラメータ番号から、どの情報になるかが示されている
予報時間（何時間後の予報か）もここに入る。
そういった形のため4～7章は基本的には何度もループする

じゃあそのパラメータカテゴリとパラメータ番号は何かという点では
以下の配信資料に関する技術情報を漁るとどこかにある。
http://www.data.jma.go.jp/add/suishin/cgi-bin/jyouhou/jyouhou.cgi

全球数値予報モデル GPVの場合
http://www.data.jma.go.jp/add/suishin/jyouhou/pdf/480.pdf
（PDF的にはP8、資料的にはP4）

## 5章 資料表現節

データは7章に入っているが、その値はそのまま整数や浮動小数で入っているわけではなく、なんらかの圧縮方法になっている
その圧縮方法とその際の係数を示している
コード上では単純圧縮とランレングス圧縮の二種類の方法はカバーしている。
ほかの圧縮方法は知らない

ランレングス圧縮は同じような値が続くような晴か雨か曇か雪かみたいな選択肢のようなものだと圧縮率が高いため選ばれる模様

## 6章 ビットマップ節

データによっては格子点全データを持たない場合がある。
その場合にどの点は情報を持ち、どの点はそもそもデータが存在しないのかが示される場合がある
その場合はどの点に適用するかのビットマップをここに持っている。
すべての点に情報がある場合は適用しないという情報だけ持っている

## 7章 資料節

4章で示された内容について5～6章・また3章の格子状態の順でここにデータが入っている


## 8章 終端節
「7777」で終わる

# プロダクト定義節のファイルリスト（わかってる分だけ）

- 全球数値予報モデル GPV（GSM）
    - http://www.data.jma.go.jp/add/suishin/jyouhou/pdf/480.pdf
- メソ数値予報モデルGPV（MSM)、週間アンサンブル数値予報モデルGPV
    - http://www.data.jma.go.jp/add/suishin/jyouhou/pdf/205.pdf
- 1km メッシュ全国合成レーダーGPV
    - http://www.data.jma.go.jp/add/suishin/jyouhou/pdf/162.pdf
- 竜巻発生確度ナウキャスト、雷ナウキャスト
    - http://www.data.jma.go.jp/add/suishin/jyouhou/pdf/312.pdf
- MSMガイダンス
    - http://www.data.jma.go.jp/add/suishin/jyouhou/pdf/389.pdf
- GSMガイダンス
    - http://www.data.jma.go.jp/add/suishin/jyouhou/pdf/316.pdf