NOAA Global Forecast Systemから天気予報データを抽出する

NOAA Global Forecast Systemから天気予報データを抽出する

hata6502 hata6502(秦 友幸)
木更津高専専攻科 制御・情報システム工学専攻
2021年3月 ~ 株式会社Helpfeel
Uber配達始めました
共用部分だけ撮影してる

Rain Viewer
雨雲レーダーを無料で配信されていたサービス
2026年1月1日以降は、個人または教育目的でのみ利用可能になる

© OpenStreetMap contributors https://www.openstreetmap.org/copyright

NOAA Global Forecast Systemの天気予報データ
米国政府による製作物のため、規約を守ればパブリックドメインとして自由に利用できる
ありがたいhata6502

GRIB2というファイルから天気予報データを取れる
GDALというコマンドラインツールを使うと中身を見れる

GeminiやChatGPTに頼りながらデータを抽出してみた
hata6502はGFSもGRIB2もGDALも初見
自分が知らない分野にはAIが頼もしい

gdalinfoでGRIB2ファイルの中身を見る
$ gdalinfo gfs.t00z.pgrb2.0p25.f000 > info.txt
ヘッダー
band 1から696までの一覧が並んでいる
band 1
1万行近くある

読み解くのが難しいので、Geminiに読んでもらう
たとえばband1には「海面更正気圧」データが入っているらしい
うーん説明を読んでも分からない

夕日がよく見える場所
いろいろ教えてくれたけど、情報の取捨選択が必要そう
たぶん大気の成分に関するデータを使えそう
Ozone Mixing Ratio(オゾン混合比, O₃MR)?
オゾンは紫外線を吸収し、短波長の光が減衰することで夕日の赤みが強調されるらしい
ここから先hata6502は試行錯誤していないので、なんともわからない

雨雲を表示するデータとして、降水確率を使ってみた
※ 後から気づいたけど、レーダー反射強度を使うのが一般的らしい
Rain Viewerの雨雲レーダーは反射強度を使っていた
でもhata6502の用途は正確な情報というより雰囲気の演出なので、気にしない

降水確率のband番号を取得する
$ gdalinfo -json gfs.t00z.pgrb2.0p25.f000 | jq '[.bands[] | select(.metadata"".GRIB_COMMENT | contains("Precipitation rate"))] | max_by(.metadata"".GRIB_FORECAST_SECONDS | tonumber) | .band'
gdalinfoの結果をjqに読み込ませる
今回使ってGRIB2ファイルでは、 589 番に降水確率データが入っている

geoTIFF
$ gdal_translate -b 589 -ot Byte -scale -srcwin 1 1 1438 719 gfs.t00z.pgrb2.0p25.f000 precipitation.tif
降水確率を最小値0~最大値1に正規化
0~255のバイトデータに量子化

ラスタータイル化
$ gdal2tiles.py --s_srs EPSG:4326 --xyz --zoom=0-2 precipitation.tif tiles
open tiles/leaflet.html でタイルを見れる

3時間ごとにスクリプト実行してレーダーを更新する
Helpfeelという会社のインフラに個人開発を合わせると、仕事に知見を持ち込めるhata6502
Google Cloud Run Jobs
MongoDB Atlas Vector Search
Terraform

感想まとめhata6502
米国政府の天気予報データがパブリックドメインなのありがたい
会社のインフラに個人開発を合わせると、仕事に知見を持ち込めて役立つ
自分が知らない分野にはAIが頼もしいなと思った
GFSとかGRIB2とかGDALとかgeoTIFFとか
情報が正しいか検証できないぶん、対策は必要
雰囲気を演出する目的程度の雨雲に留める
Powered by Helpfeel