Visualize the gridded surface wind field across the lower forty eight states. The map updates with every new model cycle so you can follow developing wind events in near real time.
The WIND parameter reports the scalar speed of the air at ten meters above the surface, a standard reference height for surface observations and renewable energy planning.
WDIR gives the direction from which the wind is blowing, expressed in degrees clockwise from north. A value of ninety means wind is coming from the east. The query below rotates the angle 180° because the grafana dashboard expects the angle to be the direction the arrow is pointing to.
We calculate an offset_hours
field so the time slider lines up with forecast lead time, making it simple to synchronise the map with other weather charts.
The dashboard calls the GribStream API with the following query. Replace the domain bounds or adjust the grid step to focus on your own region of interest. The API can make much higher resolution requests but the dashboard is limited as grafana slows to a fault with too many artifacts being drawn.
curl -X POST 'https://gribstream.com/api/v2/nbm/history' \
-H 'Content-Type: application/json' \
-H 'Authorization: $(curl https://gribstream.com/auth/demo)' \
-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"}
}'