United Kingdom
Met Office UK Composite Rain Rate
How the Met Office UK composite rain-rate radar publishes a direct rate in British National Grid projection, and the two ways an earlier decoder confused a broken read with an uncovered point.
At a glance
- Product
- UK Composite Surface Rain Rate Estimate
- Format
- ODIM HDF5
- Grid
- 1 km cells
- Cadence
- New composite every 15 minutes
- Coverage
- UK and Ireland, gated with a generous sea fringe rather than the composite's exact boundary
- Access
- Public S3 bucket met-office-radar-obs-data in eu-west-2, no authentication
- File size
- About 1.4 MB per file
- Projection
- British National Grid (Transverse Mercator, Airy 1830)
- Units
- mm/h directly, no conversion; -1 is the ODIM nodata sentinel, not part of the scale
- Licence
- CC BY-SA 4.0 (British Crown copyright, Met Office)
- Required attribution
- Crown copyright, Met Office. CC BY-SA 4.0 requires credit, an indication of changes made, and the same licence carried forward on any distributed derivative work (ShareAlike). The ShareAlike condition attaches to distribution, not to internal use.
How it signals an absence
Three different facts, and only one of them is a zero.
On the wire these three collapse onto one field. A measurement is radarStatus: "available"; no coverage is radarStatus: "out-of-coverage"; and no measurement, a failed or empty attempt, is radarStatus: "temporarily-unavailable". That field describes the outcome of the whole routing pass, not the one network this page is about: NowcastRouter walks the registered national adapters in order and returns as soon as one reports a measurement, so a point this adapter reports as out-of-coverage can still come back available if a different adapter further down the order answers instead, and can come back temporarily-unavailable rather than out-of-coverage if any other adapter in the pass failed instead of declining. radarCoverage sits beside it: "ok" appears only together with available, and "model-fallback", meaning Open-Meteo's model nowcast answered instead, can appear with either out-of-coverage or temporarily-unavailable.
| Signal | Upstream meaning | We report | Why |
|---|---|---|---|
clean exit (0), empty stdout | Outside the British National Grid extent | out-of-coverage | Verified live: the Sahara and the mid-Pacific both answer this way. Permanent for the point. |
-1 | ODIM nodata (sensor masked or offline) | unavailable | Inside the grid, but this sensor has nothing valid right now. Clears when the sensor returns. |
0 | ODIM undetect (measured zero) | measurement | The radar looked and saw nothing falling. Verified live for London. The only one of the above that may be shown as 0 mm/h. |
non-zero exit code | Decoder or file error (missing binary, corrupt file, spawn failure) | unavailable | Kept apart from empty-stdout-on-a-clean-exit deliberately: a broken read is not the same fact as a confirmed-uncovered point. |
What the product is
The Met Office publishes its UK Composite Surface Rain Rate Estimate as ODIM HDF5 files, 1 km cells, refreshed every 15 minutes, on the AWS open data registry. Each file is about 1.4 MB, unauthenticated, over plain HTTPS from a bucket in eu-west-2.
Unlike Bright Sky's integer counts, this product publishes a rain rate directly, so there is no units conversion to get right. The projection is the harder problem: the file is in British National Grid, Transverse Mercator on the Airy 1830 ellipsoid, not latitude and longitude. GDAL reads that projection out of the HDF5 metadata and reprojects a WGS84 point internally, so nobody writing this adapter had to touch the projection math by hand. One detail is easy to get backwards: GDAL takes the point as lon lat, the opposite order from eccodes' lat lon.
A licence with a third condition
The licence is CC BY-SA 4.0, not the plain CC BY seen elsewhere in this reference. Credit and a note of what changed are required either way, but the ShareAlike term adds a third condition that plain CC BY does not carry: a derivative work built from this data and distributed to someone else must be licensed onward under that same CC BY-SA 4.0, not a licence of your choosing. That obligation attaches to distributing a derivative, not to using the data internally.
Three ways to have no rate
A point read against this file answers in three different ways, and only one of them is a rate. Outside the British National Grid extent, gdallocationinfo exits 0 with no output at all; that emptiness, on a clean exit, is itself the out-of-grid signal, and it is permanent for the point. Inside the grid, a cell can hold the ODIM nodata sentinel, -1, meaning the contributing sensor is masked or offline; that clears whenever the sensor comes back, so it is worth asking again. And a cell can hold undetect, 0, a real measurement that the radar looked and saw nothing falling. Only that last one may be shown as 0 mm/h.
The bug that hid on both sides of "empty"
Empty output turned out to mean two different things depending on the exit code, and an earlier version of this adapter got the distinction wrong in both directions before it was fixed. One version treated any invocation with no stdout, including a failed spawn or a missing binary, as out-of-grid: a broken decoder then looked identical to a permanently uncovered point, reporting "no radar here, ever" for what was really "ask again shortly".
A later version overcorrected the other way and assumed a clean exit with empty stdout "shouldn't happen", treating it as a missing measurement instead. That made every point outside the UK, which is most of the globe, look like a failing adapter, driven to temporarily-unavailable worldwide. Measured live against production on 2026-07-30: London inside the grid returns exit 0 with stdout "0", while the Sahara and the mid-Pacific both return exit 0 with no output at all. The fix keeps those apart by exit code first: a non-zero exit is always a decoder or file problem and reports unavailable; a clean exit with nothing printed is the actual out-of-grid signal.
Reading one point yourself
# GDAL takes the point as lon then lat, the opposite of eccodes' lat,lon.
gdallocationinfo -wgs84 -valonly \
202608011200_ODIM_ng_radar_rainrate_composite_1km_UK.h5 \
-0.1276 51.5072- A clean exit (0) with empty stdout is the out-of-grid signal itself, not a failure to be caught and reported as unavailable. Check the exit code before deciding what an empty result means.
- A non-zero exit code is a different fact from an empty result: a missing gdallocationinfo binary, a corrupt download, or a spawn failure. Reporting it the same as out-of-grid hides a broken adapter behind a plausible-looking permanent coverage gap.
Or call the API instead
The same reading, normalised, with the source that answered named in the response. No key and no signup for the demo endpoint.
curl "https://api.droneinfo.app/v1/demo/weather/point?lat=51.5072&lon=-0.1276"