WTHR.technology

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:

FromToConversion
Kelvin°CT − 273.15
PahPa÷ 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/skm/h, mph, knots× 3.6; × 3.6 ÷ 1.609344; × 1.943844
Geopotential height, mdecametres÷ 10
°C°FT × 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:

V=u2+v2θ=atan2(−u,−v)×180π(mod 360)

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:

f=(1−t)(1−s)f00+s(1−t)f10+(1−s)tf01+stf11 s, t: the point's fractional position between grid columns and rows (0–1).

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:

φj=arctan(sinh(yN−j+0.5h(yN−yS))),y=arsinh(tanφ) yN, yS: Mercator y of the view's north and south edges.

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:

R=(10dBZ/10200)1/1.6mm/h Below 5 dBZ counts as dry (0 mm/h). Reflectivity is capped at 53 dBZ (about 100 mm/h), as stronger echoes are usually hail, which the relation overstates. Values below −90 dBZ mean outside radar cover and are left empty.

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:

MixRedGreenBlue
Airmass6.2 − 7.3 µm, −26.2 to 0.6 K9.6 − 10.3 µm, −43.2 to 6.7 K6.2 µm, 243.9 to 208.5 K
Night fog12.3 − 10.3 µm, −6.7 to 2.6 K10.3 − 3.9 µm, −3.1 to 5.2 K10.3 µm, 243.55 to 292.65 K
True colour0.64 µm0.45 R + 0.1 × 0.87 µm + 0.45 B0.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:

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:

P=∑krk×3600×nkmm rk: mean rate over period k; nk: its length in hours.

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:

P(t0,t1]=A(t1)−A(t0)

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:

HI=0.5[T+61+1.2(T−68)+0.094RH]

Step 2. If the average of that and T is 80 °F or more, the Rothfusz regression is used instead:

HI=−42.379+2.04901523T+10.14333127R−0.22475541TR −0.00683783T2−0.05481717R2+0.00122874T2R +0.00085282TR2−0.00000199T2R2 T in °F, R = relative humidity in %.

Step 3, adjustments:

R<13,80≤T≤112:HI−=13−R417−|T−95|17 R>85,80≤T≤87:HI+=R−8510×87−T5

The result is converted back to °C. The map shows it only from 80 °F (27 °C). The categories use the NWS thresholds:

Heat indexNWS 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 overExtreme 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:

WC=13.12+0.6215T−11.37V0.16+0.3965TV0.16 Only calculated where T ≤ 10 °C (50 °F) and V ≥ 4.8 km/h (3 mph), the formula's valid range. Elsewhere the map is left clear, and the chart follows the air temperature.

Frostbite risk for exposed skin follows Environment Canada's guidance:

Wind chillRisk
above −10 °CLow
−10 to −28 °CModerate
−28 to −40 °CFrostbite possible in 10 to 30 minutes
−40 to −48 °CFrostbite possible in 5 to 10 minutes
−48 °C and colderFrostbite 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:

Hswell=h12+h22+h32 Wave heights add by energy (the square of height), not directly. A train the model doesn't have at a point counts as 0. Where the total wave height is empty, the point is land.

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:

  1. It is the lowest (for L) or highest (for H) of its 3 × 3 neighbours.
  2. 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.
  3. 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.
  4. 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.

Average: x¯=1n∑ixi Spread: σ=1n∑ixi2−x¯2 Chance: P=100×#{i:xi≥c}n(or xi<c for "below") Spread is the population standard deviation (divided by n, not n − 1).

Directions (wind and wave direction) are averaged as unit vectors, so 350° and 10° average to 0°, not 180°:

θ¯=atan2(∑sinθi,∑cosθi)

Percentiles are interpolated linearly between the sorted member values x(0) ≤ … ≤ x(n−1):

h=(n−1)p100,Qp=x(⌊h⌋)+(h−⌊h⌋)(x(⌊h⌋+1)−x(⌊h⌋)) This is the common "linear" (Hyndman–Fan type 7) definition, also used by spreadsheets' PERCENTILE.INC. With 18 members the 5th and 95th percentiles sit close to the lowest and highest members.

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

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:

  1. 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.
  2. 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.
  3. Similarity. The members' anomaly maps ai are compared through the Gram matrix, summed over the times:
    Gij=∑t∑kwkaiktwkajkt,dij=Gii+Gjj−2Gij dij is the weighted distance between members i and j over the whole area and window.
  4. 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.
  5. 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.
  6. Number of groups (Auto). k = 2 to 5 are tried, and the mean silhouette is calculated for each:
    si=bi−aimax(ai,bi) 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.
  7. 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.
  8. 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.
  9. 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

Potential temperature: θ=T(1000p)κ,κ=0.2857 Saturation vapour pressure (Bolton): es(T)=6.112exp17.67TT+243.5hPa Mixing ratio: w=εep−e,ε=0.622 Dew point from humidity (Magnus): γ=lnRH100+17.625T243.04+T,Td=243.04γ17.625−γ T in °C (K inside θ). Humidity below 0.5% is treated as 0.5% so the logarithm stays finite.

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:

dTdp=RdT+Lvrsp(cp+Lv2rsεRdT2) Rd = 287.04 J kg⁻¹ K⁻¹, cp = 1005.7 J kg⁻¹ K⁻¹, Lv = 2.501 × 10⁶ J kg⁻¹, rs = saturation mixing ratio, T in K.

Normand's point

  1. 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.
  2. 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).
  3. The saturated adiabat from Normand's point back down to the surface pressure gives the surface wet-bulb temperature.
  4. 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.
  5. 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

16. Marine routing

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:

  1. 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↓σTa4,clear=clip(0.97−ε0.2),calm=clip(1−V8) Tr=Ts+(0.5+0.3·clear·calm)(Ta−Ts) 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.
  2. Sunshine. Dark asphalt runs warmer than grass in sunshine. With downward short-wave radiation S (W/m²):
    Tr+=min(15,0.01S1+0.15V) About 1 °C per 100 W/m², less in wind (3 m/s assumed when there is no wind value).
  3. 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)):
    Tw=Tarctan(0.151977RH+8.313659)+arctan(T+RH)−arctan(RH−1.676331) +0.00391838RH3/2arctan(0.023101RH)−4.686035

Ice risk (road estimate or model surface temperature Tr):

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:

StateVisibility ≥Cloud base ≥
BLU8,000 m2,500 ft
WHT5,000 m1,500 ft
GRN3,700 m700 ft
YLO12,500 m500 ft
YLO21,600 m300 ft
AMB800 m200 ft
REDbelow 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):

  1. Daily values. Values that ECA&D flags as suspect or missing are dropped. Sunshine is converted to hours.
  2. 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.
  3. 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.
  4. Records are the highest daily maximum and lowest daily minimum in the period, with their dates.
  5. 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.
  6. 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

20. Known limitations

Spotted something that doesn't match? Tell us.

Back to the top