Methods
How every number on the map is worked out: where it comes from, each step between the raw data and what you see, and the equations used.
This page describes what the app's code actually does, not a textbook version. Where the app shows a value exactly as the data provider sent it, we say so. Where we calculate something ourselves, the formula, its constants and its limits are given here. For an overview of the site and the full data credits, see About. Last checked against the app on 27 October 2026.
1. Principles and unit conversions
Nearly everything is calculated in your own browser from the values the data services return. Nothing is smoothed, bias-corrected or blended with other models unless this page says so. Three things are handled on this site's server, and only because a browser can't fetch them directly: the climate averages, the UK lightning strikes and the European warnings (see Observations).
These unit conversions are used throughout:
| From | To | Conversion |
|---|---|---|
| Kelvin | °C | T − 273.15 |
| Pa | hPa | ÷ 100 (skipped if the service already gives hPa) |
| kg m⁻² s⁻¹ (precipitation rate) | mm/h | × 3600 (1 kg of water per m² is a 1 mm layer) |
| m/s | km/h, mph, knots | × 3.6; × 3.6 ÷ 1.609344; × 1.943844 |
| Geopotential height, m | decametres | ÷ 10 |
| °C | °F | T × 9/5 + 32 |
Wind from its components
Some models (GFS, the 3D data) give the wind as an eastward component u and a northward component v. Speed and the direction the wind blows from (degrees clockwise from north) are:
Going the other way, u = −V sin θ and v = −V cos θ. Wind barbs round the speed to the nearest 5 knots.
2. Grids, interpolation and map projection
Reading the data. Forecasts arrive as CoverageJSON grids from the OpenWeather EDR service. Each response's own axis order and strides are read, so the grid is placed correctly whichever way round it is sent. Empty values (null) stay empty. They are never filled in as zero.
Resolution. On a wide view the app asks for a thinned grid (every nth point, about 160,000 points at most per request), so a whole-continent view loads quickly. Zoom in and it asks for the model's full grid. Ensembles use a coarser grid than the single models, because every member has to be downloaded.
Values at a point. Tapping the map, drawing contours and sampling a route all use bilinear interpolation between the four surrounding grid points:
If any of the four points is empty (at a coastline for waves, or at the edge of a model), the nearest grid point is used instead, so edges don't fray. Directions such as wind direction are taken from the nearest point and are not interpolated as numbers.
Projections. The Met Office UKV model and radar use their own projected grids (in metres). Every grid is converted to and from latitude and longitude with proj4, using the projection definition that comes with the file. The map itself is Web Mercator, where rows of pixels are not evenly spaced in latitude. Each screen row j of the h rows is therefore sampled at its true latitude:
Without this, rain on a UK-wide view would sit visibly too far north or south. The image is redrawn at about screen resolution (at most 1,400 pixels a side), so zooming in shows the data's full detail.
3. Radar
Met Office UK composite
The Met Office's 1 km rain rate composite (ODIM HDF5, every 5 minutes) is read in the browser with h5wasm. Stored values are scaled by the file's own gain and offset, so rate = offset + gain × stored value, and nodata becomes empty (outside radar cover). The result is already rain rate in mm/h. The peak marker shows the highest value inside the visible area.
EUMETNET OPERA (Europe)
OPERA's 2 km surface rain rate composite (ODIM HDF5, Lambert equal-area) is read the same way and is already in mm/h. Pixels marked undetect (covered by radar, no echo) are set to 0 mm/h, and nodata pixels are left empty.
NOAA MRMS (US)
MRMS gives merged reflectivity Z in dBZ, not rain rate. It is turned into rain rate with the Marshall–Palmer relation Z = 200 R1.6:
Colours
Smooth blends between colour stops on a logarithmic scale, so 1 to 2 mm/h gets as much colour change as 8 to 16 mm/h. Classic uses 12 hard bands from 0.1 to 24+ mm/h. Below 0.1 mm/h is transparent. The same colours are used for forecast rain.
4. Satellite
Meteosat images (UK and Europe) come from EUMETSAT as finished pictures and are shown as supplied.
GOES-19 (US area) comes as raw band values: infrared as brightness temperature (K) and visible as reflectance (albedo, 0–1). The app colours them itself:
- Infrared and water vapour: brightness temperature in °C through a colour table, in steps of 0.25 °C. In the enhanced infrared table, cloud tops colder than −31 °C are coloured.
- Visible: brightness = √albedo, so dim cloud and thin cloud still show.
- RGB mixes follow the CIRA/EUMETSAT recipes. Each channel is scaled linearly between two limits and clipped to 0–1, clip((x − a)/(b − a)):
| Mix | Red | Green | Blue |
|---|---|---|---|
| Airmass | 6.2 − 7.3 µm, −26.2 to 0.6 K | 9.6 − 10.3 µm, −43.2 to 6.7 K | 6.2 µm, 243.9 to 208.5 K |
| Night fog | 12.3 − 10.3 µm, −6.7 to 2.6 K | 10.3 − 3.9 µm, −3.1 to 5.2 K | 10.3 µm, 243.55 to 292.65 K |
| True colour | 0.64 µm | 0.45 R + 0.1 × 0.87 µm + 0.45 B | 0.47 µm |
True colour has no green band on GOES, so green is made from red, blue and near-infrared as shown. All three channels are then raised to the power 1/2.2 (gamma).
5. Forecast fields
Unless listed in the later sections, forecast layers are the model's own values after the unit conversions in section 1:
- Rain rate: the model's precipitation rate (rain and snow as water), kg m⁻² s⁻¹ × 3600 = mm/h. On the ensembles, the rain rate and snowfall rate members are added together.
- Temperature: 1.5 m above ground (Met Office) or 2 m (GFS), K → °C.
- MSLP: mean sea level pressure, Pa → hPa.
- Wind: 10 m mean wind. Gusts are the model's gust field.
- Cloud: the models' low, medium and high cloud cover, in %.
- Wet bulb potential temperature at 850 hPa: the Met Office's own field, K → °C. We don't calculate it.
- Upper winds and heights: pressure-level wind and geopotential height (contours every 3 dam).
Animated wind particles need a regular latitude and longitude grid. The model's speed and direction are resampled onto one (about as many points as the source grid, at most 200 a side) and turned back into u and v.
6. Precipitation total
The total for the chosen period (1, 3, 12, 24 hours or a custom number) ends at the map time. The two model families store their totals differently, so they are handled differently.
Met Office (UKV, Global)
Met Office totals are stored as mean rates (kg m⁻² s⁻¹) over a 1, 3 or 6 hour period ending at each time. Working back from the map time, the app takes the longest available period that doesn't go past the start of the total, then the next one before it, and so on. The total is:
GFS
GFS stores totals in mm, counted from the start of each 6-hour block of the run (1 to 6 hours in). The running total since the run began, A(t), is the sum of the full 6-hour blocks before t plus the part-block total at t. The period's total is then:
For both: a period that would start before the run began is cut to the run start, and the time box says how many hours it covers. Tiny negative values from rounding are set to 0. The tap chart shows the running total since the run started.
7. Heat index
The heat index is the US National Weather Service's measure of how hot it feels in the shade, from air temperature T (°F) and relative humidity RH (%). It uses the Met Office Global 1.5 m temperature and humidity, or GFS 2 m temperature and humidity. Humidity is clipped to 0–100%, because the Met Office field can read slightly over 100%. The NWS method has three steps.
Step 1, Steadman's simple formula:
Step 2. If the average of that and T is 80 °F or more, the Rothfusz regression is used instead:
Step 3, adjustments:
The result is converted back to °C. The map shows it only from 80 °F (27 °C). The categories use the NWS thresholds:
| Heat index | NWS category |
|---|---|
| 80–89 °F (27–32 °C) | Caution |
| 90–102 °F (32–39 °C) | Extreme caution |
| 103–124 °F (39–51 °C) | Danger |
| 125 °F (52 °C) and over | Extreme danger |
The values were checked against every cell of the NWS heat index chart. Like the NWS figure, it is for shade and light wind. Full sunshine can make it feel up to about 8 °C (15 °F) hotter.
8. Wind chill
Wind chill uses the 2001 NWS and Environment Canada formula, from air temperature T (°C) and the 10 m wind speed V (km/h). It is used on UKV, Met Office Global and GFS:
Frostbite risk for exposed skin follows Environment Canada's guidance:
| Wind chill | Risk |
|---|---|
| above −10 °C | Low |
| −10 to −28 °C | Moderate |
| −28 to −40 °C | Frostbite possible in 10 to 30 minutes |
| −40 to −48 °C | Frostbite possible in 5 to 10 minutes |
| −48 °C and colder | Frostbite possible in 2 to 5 minutes |
The model's wind is at 10 m, as the formula expects. Wind at face height is usually lighter, especially in towns and sheltered places.
9. Waves and swell
Waves come from NOAA's GEFS-Wave model. Significant wave height (the average of the highest third of waves, wind sea and swell together) is shown as supplied. The model splits swell into up to three trains from different directions. The Swell layer combines them into one height:
The swell arrow uses the direction of the biggest train. Directions are given as where the waves come from, like wind, and the arrows point the way the waves travel.
10. Isobars, isotherms and H/L centres
Contours
The field is resampled onto a lattice in screen space (one point every 3 pixels or more, about 260 points across the view) by bilinear interpolation. Each lattice square is contoured with marching squares: where a level falls between two corners, the crossing point is found by linear interpolation along that edge. The pieces are then joined into continuous lines for dashing and labelling. Intervals: isobars every 4 hPa, isotherms every 2 °C (0 °C bold and dashed), heights every 3 dam. Some layers use fixed levels, such as the wet bulb potential temperature bands and the heat index categories.
High and low centres
An H or L is marked at a lattice point that passes all of these tests:
- It is the lowest (for L) or highest (for H) of its 3 × 3 neighbours.
- Nothing lower (higher) lies within a disc of radius R, where R is 14% of the map's shorter side, at most 90 screen pixels. At least 40% of the disc must have data.
- Its prominence is at least 1 hPa. Prominence is the difference between the centre and the average of 48 points on a ring at radius 2R, with at least 30% of the ring having data. Broad, flat highs still count this way.
- It is at least 24 screen pixels from the edge of the map.
Candidates are taken in order of prominence, and any within R of one already kept is dropped. The central pressure shown is the lattice value at the centre.
11. Ensemble statistics
MOGREPS-UK (18 members) and MOGREPS-G (36 members: 18 from the latest run and 18 from the run six hours earlier) are downloaded member by member. All the statistics below are worked out per grid point in your browser. Members with no value at a point are left out of that point's statistics.
Directions (wind and wave direction) are averaged as unit vectors, so 350° and 10° average to 0°, not 180°:
Percentiles are interpolated linearly between the sorted member values x(0) ≤ … ≤ x(n−1):
Preset chance thresholds: rain or snow ≥ 0.2, 1 or 4 mm/h; temperature below 0 °C, or 20 or 25 °C and over; wind ≥ 10, 15 or 20 m/s. You can also type your own.
Point summaries and plumes
- PDF bars split the members' range into between 5 and 10 equal bins (about 1.6√n, rounded). The CDF line steps up by 1/n at each member's value.
- Plumes show every member, the 10–90% band and the median, using the percentile rule above. The share of wet members counts members at 0.2 mm/h or more.
- MSLP spaghetti draws one chosen isobar from each member, with the member average in white dashes.
12. Ensemble scenarios (clustering)
Scenarios sort the ensemble members into a few groups with a similar weather pattern, in the spirit of ECMWF's ensemble clusters. The steps:
- Data. For each time compared (the map time alone, or every 12 hours across a 24 or 48 hour window centred on it), every member's MSLP or 500 hPa height is fetched over the chosen area, at about 2,400 grid points.
- Anomalies. At each grid point k and time, the member average is subtracted. On the global grid each point is weighted by √cos(latitude), so the many closely spaced points near the poles don't count more than they should (area weighting of squared differences). Points where any member is missing are left out.
- Similarity. The members' anomaly maps ai are compared through the Gram matrix, summed over the times:
dij is the weighted distance between members i and j over the whole area and window.
- Principal components. G is diagonalised with the Jacobi eigenvalue method. Each member's coordinates are its eigenvector entries times √λ, for every component with non-negligible variance (λ > 10⁻⁹ × trace). All components are kept, so the distances between members are exact, not truncated.
- k-means. The members are grouped by k-means, which minimises the total squared distance to the group centres, J = Σ‖pi − cg(i)‖². Starting centres use k-means++ seeding, and the best of 30 seeded tries is kept. The random seed is fixed, so the same data always gives the same groups. A group that empties takes the member furthest from its centre.
- Number of groups (Auto). k = 2 to 5 are tried, and the mean silhouette is calculated for each:
ai: member i's mean distance to the rest of its group; bi: its mean distance to the nearest other group. A member alone in its group scores 0.The highest mean silhouette wins among groupings whose smallest group has at least 4 members (3 for an 18-member ensemble). If none qualify, the best silhouette is used.
- Results. Groups are numbered by size. Each group's most typical member is the one nearest its centre. "Explained" is 1 − J / trace(G), the share of the members' variance that the grouping accounts for. The note under the chips describes how clear the split is from the silhouette. Between times, group numbers and colours are kept by matching the new groups to the old ones with the most members in common.
- Lagged MOGREPS-G check. Members 0–17 are the latest run and 18–35 the run six hours earlier. If every group of 4 or more is at least 80% from one run, the note warns that the split is mainly about the run's age.
- Compare panel. Each scenario's average minus the all-member average, shaded on one shared scale: the 95th percentile of those differences across all panels.
Picking a scenario recalculates the average, percentiles, chance and spread (section 11) from its members only.
13. IMPROVER percentiles and chances
The IMPROVER spot and gridded forecasts are the Met Office's own post-processed blend of its models and ECMWF's. Their percentiles and chances are calculated by the Met Office, and the app shows them as supplied. The app does one thing to them: for a chance at a threshold between the ones the data lists, it interpolates the exceedance probability linearly between the neighbouring thresholds, clipped to 0–100%. Weather symbols are the Met Office's codes 0–30. Where the chart groups several hours into one icon, the icon shows the most common symbol in that block.
14. Tephigram, Normand's point and hodograph
Profiles come from the model's pressure levels (1000 to 100 hPa) at the grid point nearest the tap, or from a radiosonde ascent.
Thermodynamics
The tephigram's axes are temperature and ln θ, rotated 45° so isobars run roughly across the chart.
Saturated adiabats
Saturated (pseudo-)adiabats are found by stepping the lapse rate in pressure, 5 hPa at a time:
Normand's point
- Surface: the highest-pressure level with a temperature and dew point and a height not below sea level. Model levels "under" the ground when pressure is low are skipped. You can also drag the surface temperature and dew point.
- The dry adiabat from the surface temperature, T(p) = θ₀(p/1000)κ, and the saturation mixing ratio line from the surface dew point (constant w₀) meet at Normand's point, the lifting condensation level. The meeting point is found by bisection on their difference (50 halvings).
- The saturated adiabat from Normand's point back down to the surface pressure gives the surface wet-bulb temperature.
- The point's height above the surface is interpolated in ln p from the profile's heights. If the profile has no heights, the rule of thumb 125 m per °C of dew-point depression is used.
- The saturated adiabat is followed upward from Normand's point until it crosses the environment curve. Where the parcel starts colder than its surroundings, the crossing is the level of free convection (LFC). Where it starts warmer, the crossing is the top of free convection. The crossing is found by linear interpolation within the 5 hPa step. The environment temperature between levels is interpolated linearly in ln p.
Hodograph
Each level's wind is plotted as a (u, v) vector in knots. Bulk shear is the length of the vector difference between the wind at 850 hPa (or 500 hPa) and the lowest level, √((u₂ − u₁)² + (v₂ − v₁)²). The 850 hPa figure is only given when the lowest level is below about 860 hPa.
Radiosondes
Weather balloon ascents come from the WMO WIS2 global cache as BUFR files, decoded in the browser by our own decoder (WMO templates 3 01 128 and 3 09 052, checked against ECMWF's ecCodes on 30 real files). Wind-shear records are dropped, levels above 100 hPa are not shown, a dew point higher than the temperature is set equal to it, and the newest launch per station (the deepest file if there are duplicates) is kept.
15. Route weather
- Distance along the route uses the haversine formula, with Earth's radius taken as 6,371 km:
- Sample points: one for every 30 minutes of riding at your average speed (hourly on marine passages over 48 hours), plus the finish and one in the middle of each stop. The clock time at each point adds the length of every earlier stop. Each point is sent to the forecast service, which returns the model's values at that place and time.
- Model choice (Auto): UKV if every sample point lies inside the UKV area and within the chosen run's times. Otherwise Met Office Global is used for the whole route. The default run is the newest one that covers the whole trip with more than one time.
- Between samples, values are interpolated linearly by distance. Wind is interpolated as a vector (u, v), not as speed and direction separately.
- Head, cross and tail wind: with travel direction β (the bearing from 300 m behind to 300 m ahead) and the direction the wind blows towards, θto:
Below 2 m/s (about 7 km/h) the wind counts as light.
- Grade: the height change over 100 m (50 m either side), as a percentage of the distance, so GPS height noise doesn't make spikes.
- Sunrise and sunset along the way use NOAA's low-precision solar position. The solar elevation is calculated at the rider's position at each moment. Sunrise and sunset are where it crosses −0.833° (allowing for refraction and the sun's radius), and "dark" is below −6° (the end of civil twilight). Crossings are found by a 2-minute scan and then bisection. Checked against published times (Edinburgh, 9 October: sunset 18:30 BST).
δ: solar declination; H: hour angle from Greenwich sidereal time, longitude and the sun's right ascension.
16. Marine routing
- Wind from GFS (10 m), waves from GEFS-Wave. Legs between waypoints are great-circle lines.
- Beaufort force from the mean wind, using lower limits (m/s) for F1 to F12 of 0.3, 1.6, 3.4, 5.5, 8.0, 10.8, 13.9, 17.2, 20.8, 24.5, 28.5 and 32.7.
- Douglas sea state from significant wave height. Upper limits (m): calm 0.1, smooth 0.5, slight 1.25, moderate 2.5, rough 4, very rough 6, high 9, very high 14, then phenomenal.
- How the sea meets the vessel: the angle between the course and the direction the waves come from. Up to 30° is a head sea, up to 60° on the bow, up to 120° beam, up to 150° on the quarter, and more is a following sea. Waves under 0.5 m count as slight.
17. Road surface temperature
The RST map starts from the UKV model's ground surface temperature Ts, which is an average over each 2 km grid box (grass, fields, woods and towns). Model surface shows it unchanged. Road estimate adjusts it for tarmac in three steps:
- Night-time heat store. When the air (Ta, 1.5 m) is warmer than the ground, the road is moved part of the way towards the air temperature. It moves further under a clear sky in light wind, because the road gives back heat stored during the day:
L↓: the model's downward long-wave radiation (W/m²); σ = 5.670 × 10⁻⁸ W m⁻² K⁻⁴; Ta in K; V: 10 m wind in m/s; clip limits to 0–1. Without long-wave data ε = 0.9 is assumed; without wind, calm = 0.5.
- Sunshine. Dark asphalt runs warmer than grass in sunshine. With downward short-wave radiation S (W/m²):
About 1 °C per 100 W/m², less in wind (3 m/s assumed when there is no wind value).
- Rain. Above 0.2 mm in the hour (a third of the 3-hour total where only that is available), the road is pulled towards the wet-bulb temperature Tw by a fraction 0.7 × min(1, rain in mm). Tw uses Stull's (2011) formula from temperature and humidity, with RH from the dew point via es(T) = 6.112 exp(17.62T/(243.12 + T)):
Ice risk (road estimate or model surface temperature Tr):
- Likely: Tr ≤ 0 °C and any of: more than 0.2 mm of rain in the last 3 hours (wet road), more than 0.3 mm (as water) of snow in the last 3 hours or more than 5 mm (as water) of snow lying, or Tr below the dew point (frost).
- Possible: Tr ≤ +1 °C and one of those reasons, or within 1 °C of the dew point.
These adjustments are rules of thumb from published road weather studies and have not been checked against road sensors. They don't know about bridges, cuttings, frost hollows, town centres or gritting.
18. Observations
METAR colour state
The military aviation colour state comes from the prevailing visibility and the lowest cloud base of SCT, BKN or OVC (or vertical visibility VV). CAVOK counts as BLU. The station gets the best state whose limits both are met:
| State | Visibility ≥ | Cloud base ≥ |
|---|---|---|
| BLU | 8,000 m | 2,500 ft |
| WHT | 5,000 m | 1,500 ft |
| GRN | 3,700 m | 700 ft |
| YLO1 | 2,500 m | 500 ft |
| YLO2 | 1,600 m | 300 ft |
| AMB | 800 m | 200 ft |
| RED | below AMB |
The map uses each airfield's latest report from no more than 70 minutes before the map time. "A" marks automatic (AUTO) reports. TAFs are decoded from the raw text into plain words.
Lightning
UK strikes come from the Met Office's files on the WMO WIS2 global cache. This site's server (lightning.php) gathers them, because a browser can't list the cache directly, and passes on the last 3 hours of time, latitude and longitude unchanged. The map shows strikes in the hour before the radar time, coloured by age: 0–5, 5–15, 15–30 and 30–60 minutes.
Climate averages
Daily station records from ECA&D (through EUMETNET MeteoGate) are averaged on this site's server (climate.php):
- Daily values. Values that ECA&D flags as suspect or missing are dropped. Sunshine is converted to hours.
- Monthly values. Mean maximum, minimum and mean temperature count for a month when at least 80% of its days have a value. Rain and sunshine totals count when no more than 3 days are missing, and are then scaled up by days in month ÷ days with data. A rain day is a day with 1.0 mm or more, and the count is scaled the same way.
- Averages for a period. Each calendar month's average is the mean of its yearly monthly values. For 1991–2020 and 1961–1990 it needs at least 20 years. For the whole record it needs at least 5.
- Records are the highest daily maximum and lowest daily minimum in the period, with their dates.
- Last 12 months compares recent months with the chosen average. The newest month may be partial: its means so far and its rain so far, not scaled up.
- Warming stripes use each year's mean temperature, for years with all 12 months. The line is the 10-year average.
Stations are listed when they have at least 15 years in a standard period or 30 years overall. Values are as the national weather services supplied them. They are not homogenised (adjusted for station moves or new instruments).
Warnings
Warnings are shown as issued by the Met Office, Met Éireann, the MeteoAlarm members and the US NWS, with their own areas, levels and times. Nothing is re-graded. For routes, a warning counts when the route enters its area while the warning is in force.
19. 3D view
- Horizontal: the model's pressure-level data cube is resampled bilinearly onto the box's own grid (a turned box gets its own axes, and the wind components are rotated to match).
- Vertical: pressure levels are placed at their geopotential heights at each grid point and interpolated linearly in height onto evenly spaced heights, from the ground to the top level's average height (rounded up to 500 m). A level just below the lowest data (within 500 m) takes the lowest level's value.
- Warm core: each level's temperature minus that level's average across the box, ΔT = T − ⟨T⟩level.
- Cloud (GFS): cloud water plus ice mixing ratio, × 1000 for g/kg, on a log scale from 0.001 to 1 g/kg. Cloud (Met Office): cloud cover in % on heights above ground, placed on the model's terrain.
- Values are stored in 254 steps between each field's display limits. Heights are stretched (×25 to start) for viewing only.
20. Known limitations
- A model value is an average over its grid box (2 km for UKV, about 10 km for Met Office Global, 20 km for MOGREPS-G, 28 km for GFS). Hills, coasts, valleys and towns can differ a lot from it.
- Normand's point uses the lowest usable pressure level as the surface, not the true ground or the 1.5 m values, so over high ground or in low pressure it can differ from a full surface-based calculation.
- Two Magnus-type formulas are used for water vapour: Bolton's constants (17.67, 243.5) for saturation on the tephigram, and Alduchov–Eskridge-style constants (17.625, 243.04) for dew point from humidity. The difference is under about 0.1 °C at normal temperatures.
- Ensemble percentiles from 18 or 36 members are coarse at the tails. A 5th or 95th percentile is essentially the lowest or highest member or two.
- Scenarios can only find groups if the members really do fall into groups. A low silhouette means the ensemble is a continuous spread and the groups are a rough split.
- The road surface estimate and the ice risk rules are unvalidated rules of thumb (section 17).
- Marshall–Palmer is a single average relation. Real rain rates vary with drop size, and snow, hail and bright band can make radar estimates wrong.
- Climate averages are not homogenised.
Spotted something that doesn't match? Tell us.