Skip to main content

The weather you ride into

· 4 min read
Massimo Di Stefano
FastGIS author

Two days ago the rain overlay was a still picture from someone else's tile server. Today the Map tab carries a weather timeline of our own — radar, nowcast and forecast; rain, wind gusts, temperature and visibility; snow, thunder and wind direction on top — pan-European, with 1 km detail in the Nordics, and the same numbers printed under every stop of a planned route. This post is the whole of it in one place.

One bar, four layers​

The bar sits at the bottom of the map, beside the lean and acceleration HUD, and on the Navigate tab. Pick a layer — 🌧 rain, 💨 gusts, 🌡 temperature, 🌫 visibility — then play, pause or drag through time. The track is tinted by what kind of frame you are on: blue for what the radar saw, amber for our two-hour nowcast, violet for the model forecast to the day ahead. Tap the card and it folds into one round button while you ride; tap the button to get it back. A small line under the card tells you when the server will next look for new data, and a ⟳ asks it to look now — the server is honest about the cap, so a tap never hammers anyone's servers.

Every layer is served by our own service. Nothing on the phone talks to a weather provider; the worker ingests open data on a schedule into immutable frames and the app draws tiles from those.

What each layer knows​

Rain is the last hours of the pan-European radar composite (EUMETNET OPERA), our own extrapolation of it for the next two hours, and the ICON-EU model forecast after that. In the Nordics, MET Norway's own radar nowcast and 1 km forecast are pasted in. Since today the rain frames also carry their phase — a pale hatch where it will fall as snow, a lighter one for sleet, a red one for freezing rain — and thunderstorm cells as small ⚡ marks (orange when hail is forecast). Load the layer and the bar asks the server what your own position sees at each forecast hour: the hours with thunder get a yellow tick, and a ⚡ before the time while you are on one.

Gusts are the hourly maximum gust from ICON-EU, 1 km in the Nordics from MET, coloured from 30 km/h (below that a gust is weather, not a hazard) through 50, 70 and 90 to 120. Arrows on a lattice show where the wind blows, growing with the gust; calm areas keep a short grey barb so the direction is never missing.

Temperature is the 2 m forecast with a hard edge at 0 °C — frost is a threshold, not a gradient — and the 1 km Nordic detail that shows the cold valleys between the warmer slopes.

Visibility draws fog and haze only where they limit the view, grey from 200 m and gone at 5 km, so an empty map means you can see. Nordic detail comes from MET's MEPS model, which also knows where its cells are foggy.

The same numbers under every stop​

Plan a route and each stop's line in the plan sheet reads the weather expected at that stop's arrival time, from the very frames the map shows:

❄ 2.1 mm/h ⚡ · 💨 31 km/h ↗ · 🌡 −1 °C · 🌫 0.8 km

— snow, with thunder, a 31 km/h gust blowing north-east, a degree below zero, and 800 m of visibility. Visibility is only mentioned under 5 km; a clear morning does not need a number. Because the caption and the tile are sampled from one dataset, they can never disagree.

Where the 1 km comes from​

Across Europe the forecast layers sit on ICON-EU's 7 km grid. In the Nordics, MET Norway's 1 km post-processed forecast is read for every hour — its values pasted into the European frames, and, since today, drawn as frames of its own on top, so the valley-by-valley structure is visible rather than averaged into 8 km blocks. The paste is retried whenever MET's servers come back after an outage; an outage never costs the run its European picture.

What it costs, and what it does not​

All of this comes from open data under open licences — EUMETNET OPERA via MeteoGate, DWD's open data, MET Norway's thredds — credited on every tile's X-Attribution header and in the app's credits. No commercial weather service is involved, and the phone's traffic is only to our own API.

The frames are immutable and the tile URLs never change meaning, so an older build of the app keeps working through every one of these releases; it simply does not see the newer bands and layers. Everything above is on the current build.