NOAA Global Forecast Systemから天気予報データを抽出する
hata6502.icon hata6502(秦 友幸)
木更津高専専攻科 制御・情報システム工学専攻
2021年3月 ~ 株式会社Helpfeel
Uber配達始めました
共用部分だけ撮影してる
https://gyazo.com/04df336d6a0407885f50fee948152375https://gyazo.com/94eccdd81659c98108c6f98b220455d8https://gyazo.com/7495119d4bac12417557c62dfc81f349
Rain Viewer
https://www.rainviewer.com/api/weather-maps-api.html
雨雲レーダーを無料で配信されていたサービス
2026年1月1日以降は、個人または教育目的でのみ利用可能になる
https://gyazo.com/ea34a851fe8d8f31936a890bbd8ad44b
自前の雨雲レーダーのタイルサーバーに乗り換えた
https://almap.hata6502.com/
https://gyazo.com/01e3ebfce0b5d3dbd975395aef1e156c
© OpenStreetMap contributors https://www.openstreetmap.org/copyright
NOAA Global Forecast Systemの天気予報データ
https://console.cloud.google.com/marketplace/product/noaa-public/gfs
米国政府による製作物のため、規約を守ればパブリックドメインとして自由に利用できる
https://www.weather.gov/disclaimer
ありがたいhata6502.icon
GRIB2というファイルから天気予報データを取れる
https://console.cloud.google.com/storage/browser/_details/global-forecast-system/gfs.20250819/00/atmos/gfs.t00z.pgrb2.0p25.f000
GDALというコマンドラインツールを使うと中身を見れる
GeminiやChatGPTに頼りながらデータを抽出してみた
hata6502.iconはGFSもGRIB2もGDALも初見
自分が知らない分野にはAIが頼もしい
gdalinfoでGRIB2ファイルの中身を見る
$ gdalinfo gfs.t00z.pgrb2.0p25.f000 > info.txt
info.txt
ヘッダー
https://gyazo.com/7691726c7e0986fdad004dfee3a79e57
band 1から696までの一覧が並んでいる
band 1
https://gyazo.com/c80f632ac81a00efeb64c97490575042
1万行近くある
読み解くのが難しいので、Geminiに読んでもらう
たとえばband1には「海面更正気圧」データが入っているらしい
https://gyazo.com/5d976138d974b785f0b0d97061b151bf
https://gyazo.com/5e1df0d4dd84edbb20ac9ae9bf38c6c3
うーん説明を読んでも分からない
夕日がよく見える場所
https://gyazo.com/93fe6893d6d2587be539037d60011bef
いろいろ教えてくれたけど、情報の取捨選択が必要そう
https://gyazo.com/f90c950b581a1d3a7fb8a089e5f61d05
たぶん大気の成分に関するデータを使えそう
Ozone Mixing Ratio(オゾン混合比, O₃MR)?
オゾンは紫外線を吸収し、短波長の光が減衰することで夕日の赤みが強調されるらしい
ここから先hata6502.iconは試行錯誤していないので、なんともわからない
雨雲を表示するデータとして、降水確率を使ってみた
※ 後から気づいたけど、レーダー反射強度を使うのが一般的らしい
Rain Viewerの雨雲レーダーは反射強度を使っていた
でもhata6502.iconの用途は正確な情報というより雰囲気の演出なので、気にしない
https://gyazo.com/edef2c938a12f3318c6211e2527f66db
降水確率の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でタイルを見れる
https://gyazo.com/fa72424fcd1f6348b45a77dd4858bef9
3時間ごとにスクリプト実行してレーダーを更新する
コード 雨雲レーダーのタイルサーバー#68a00f4900000000008f792d
Helpfeelという会社のインフラに個人開発を合わせると、仕事に知見を持ち込めるhata6502.icon
Google Cloud Run Jobs
MongoDB Atlas Vector Search
Terraform
感想まとめhata6502.icon
米国政府の天気予報データがパブリックドメインなのありがたい
会社のインフラに個人開発を合わせると、仕事に知見を持ち込めて役立つ
自分が知らない分野にはAIが頼もしいなと思った
GFSとかGRIB2とかGDALとかgeoTIFFとか
情報が正しいか検証できないぶん、対策は必要
雰囲気を演出する目的程度の雨雲に留める
? NOAA Global Forecast Systemから天気予報データを抽出する