Japan
JMA High-Resolution Precipitation Nowcast
How Japan's High-Resolution Precipitation Nowcast is read from public map tiles rather than a data file, why a fixed zoom goes silent in dry weather, and why a transparent pixel is not a zero.
At a glance
- Product
- High-Resolution Precipitation Nowcast (高解像度降水ナウキャスト, HRPN)
- Format
- 256x256 8-bit RGBA PNG map tiles, Web Mercator XYZ
- Cadence
- New tile set every 5 minutes
- Coverage
- Distance to the nearest JMA radar, not a bounding box
- Access
- www.jma.go.jp/bosai/jmatile, the same public tile endpoint the official viewer uses, no API key
- Units
- mm/h bucket midpoints from the 9-colour legend, not exact readings
- Licence
- 政府標準利用規約 2.0 (Government of Japan Standard Terms of Use, roughly CC BY 4.0 International)
- Required attribution
- 出典: 気象庁 ("Source: Japan Meteorological Agency") wherever the data is surfaced.
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 |
|---|---|---|---|
nearest JMA radar out of range | Outside the radar-reach coverage gate | out-of-coverage | Checked before any HTTP request. A judgement call made deliberately generous, since a too-wide gate only costs a less precise status label. |
no usable pixel at any walked zoom: unpainted (0,0,0,0), or a colour matching no known palette entry | Tile unrendered at every zoom tried, or an unrecognised colour | unavailable | Cannot distinguish a dry, covered point from one no radar reaches. An unrecognised colour may mean JMA changed its legend. Either way the router falls through, in practice to the Open-Meteo model nowcast. |
(255,255,255,0) | In-domain no-echo paint | measurement | Occurs only on a tile that also carries rendered precipitation elsewhere. Verified live for Sapporo and Naha. The only transparent variant that may be shown as 0 mm/h. |
upstream fetch or decode failure (timeout, non-200, malformed PNG) | The tile request itself failed | unavailable | A radar may well cover the point; this particular request just did not complete. |
What the product is
The Japan Meteorological Agency's High-Resolution Precipitation Nowcast, 高解像度降水ナウキャスト or HRPN, is not read from a data file at all. We sample the public map tiles the official viewer itself draws from: 256-by-256 8-bit RGBA PNGs in standard Web Mercator XYZ, refreshed every 5 minutes, at jmatile/data/nowc/{basetime}/none/{validtime}/surf/hrpns/{z}/{x}/{y}.png. Each pixel is one of nine intensity buckets from JMA's own published legend, so getting a rate means matching the pixel colour against that palette rather than parsing a value out of a grid.
Coverage is not a bounding box either. Japan is a 3000 km arc, and a single rectangle wide enough to hold the outlying Pacific islands also swallows large volumes of open ocean no radar reaches. A distance-to-nearest-radar gate is the better shape, and it should err generous: a gate that is too wide only costs a less precise status label, while one that is too narrow silently discards a real reading.
A fixed zoom goes silent in dry weather
JMA renders a tile only where it has something to draw. A tile with no echo anywhere inside it is not served as blank white paint; it is served as a fully transparent, 334-byte stub, with HTTP 200. This adapter originally requested a single zoom finer than HRPN's native grid, which sounded like the more precise choice. It was not: a zoom nobody renders returns nothing to sample, so in dry weather the adapter reported unavailable for the whole of Japan, every time, from the day it shipped. Nothing in the response says so. You get HTTP 200 and no pixels.
The fix is to walk several zooms, finest first, and take the first that yields a pixel. Which zooms are worth trying, and how much coverage each one buys, is a question for measurement against the live tiles rather than for the published grid resolution. The trade is resolution for coverage, and it is only paid where the finer tile had nothing to give: falling back to a coarse pixel only happens when no echo exists for tens of kilometres in any direction, where the smearing costs nothing because there was nothing there to smear.
Two transparent pixels that are not the same
A tile that does get rendered can still answer transparent for a given pixel, and here the fully unpainted stub reappears in a more dangerous form. Sampled live on 2026-07-30 against six points at one basetime: Tokyo, the Pacific 600 km southeast of it, the Sea of Japan and Minami-Tori-shima on the edge of the coverage box all came back (0,0,0,0), byte-identical, 334-byte tiles. Sapporo, raining at the time, and Naha both carried (255,255,255,0) pixels alongside their rendered precipitation.
(255,255,255,0)occurs only on a tile that also carries rendered precipitation somewhere: it is the in-domain paint for "a radar looked here and found no echo", a real measurement that resolves to 0 mm/h. (0,0,0,0) is a tile with nothing drawn on it at all, and metropolitan Tokyo and open ocean hundreds of kilometres outside radar range produce the same bytes. An adapter that reads either transparent variant as zero cannot tell a dry city from a point no radar has ever reached; this one used to, and the bounding-box gate alone did not catch it, since Minami-Tori-shima and the mid-Pacific points above sit inside that gate and are plainly outside radar range. Only the painted no-echo variant is a measured zero; the unpainted one, and any colour matching no known palette entry at every zoom tried, resolves to no reading at all.
A bucket that straddles the no-fly line
HRPN's nine intensity values are bucket midpoints, not exact readings, and the lowest non-zero bucket spans 0.1-1 mm/h. That range straddles the 0.3 mm/h precipitation threshold the flight score uses to call a no-fly condition: a true 0.15 mm/h drizzle and a true 0.8 mm/h shower land in the same bucket and both report as 0.5 mm/h. Any echo in that bucket is therefore classified conservatively as no-fly, a deliberate false positive in the safe direction rather than a rounding error, and it stays that way until the snapshot type can carry a range instead of a single number.
Reading one point yourself
# Time index: the latest (basetime, validtime) pair.
curl -s "https://www.jma.go.jp/bosai/jmatile/data/nowc/targetTimes_N1.json" \
| jq '.[0]'
# One tile at zoom 8 covering Tokyo. z/x/y and the intra-tile pixel
# come from standard Web Mercator projection, same math as OSM tiles.
curl -s -o tile.png \
"https://www.jma.go.jp/bosai/jmatile/data/nowc/<basetime>/none/<validtime>/surf/hrpns/8/<x>/<y>.png"
# Decode the PNG and match its RGBA pixel against JMA's published
# nine-bucket legend; see colormap.ts for the exact palette and the
# transparent-pixel handling above.- A fully transparent pixel is not automatically a zero. Only (255,255,255,0), the in-domain no-echo paint, is a measurement; (0,0,0,0) means the tile was never rendered and could be a dry city or open ocean far outside radar range.
- If the finest zoom tried comes back with nothing to sample, that is not evidence the point is uncovered. It means try a coarser zoom before concluding there is no reading.
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=35.6762&lon=139.6503"