米国本土48州の地表付近の風の場を格子で可視化します。マップは新しいモデルサイクルごとに更新されるため、発達中の強風イベントをほぼリアルタイムで追えます。
WINDパラメータは、地表から10 mの風速を返します。これは地上観測や再生可能エネルギー計画でよく使われる標準的な参照高度です。
WDIRは風が吹いてくる方向を、北から時計回りの度数で返します。値が90なら東からの風です。下のクエリでは角度を180°回転しています。これはGrafanaダッシュボード側が、矢印の向きとして「風が向かう方向」を期待しているためです。
offset_hoursフィールドを計算し、時刻スライダーを予報のリードタイム(モデル実行時刻から有効時刻までの予報時間)に合わせています。これにより、マップを他の気象グラフと同期しやすくなります。
ダッシュボードは次のリクエストでGribStream APIを呼びます。JSON内のboundsやstepを変えると、自分の対象地域に絞れます。API自体はより細かい格子にも対応できますが、この画面はGrafanaが描画する要素数で遅くならないよう控えめにしています。
curl -X POST 'https://gribstream.com/api/v2/nbm/timeseries' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer [API_TOKEN]' \
-d '{
"fromTime": "2025-05-06T02:01:36.287Z",
"untilTime": "2025-05-07T12:01:36.287Z",
"minHorizon": 0,
"maxHorizon": 36,
"grid": {
"minLatitude": 24.52,
"maxLatitude": 49.38,
"minLongitude": -124.77,
"maxLongitude": -66.93,
"step": 1.25
},
"variables": [
{ "name": "WIND", "level": "10 m above ground", "info": "", "alias": "wind_speed" },
{ "name": "WDIR", "level": "10 m above ground", "info": "", "alias": "wind_dir" }
],
"expressions": [
{ "expression": "int(wind_dir + 180) % 360", "alias": "wind_dir"},
{ "expression": "floor((date(forecasted_time) - date('\''2025-05-06T02:01:36.287Z'\'')).Hours())", "alias": "offset_hours"}
],
"filter": { "expression": "wind_speed != nil"}
}'
stepを0.5度まで細かくすると、峠や谷付近の局地的な風速最大域を拾いやすくなります。