DroneInfo

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.

SignalUpstream meaningWe reportWhy
nearest JMA radar out of rangeOutside the radar-reach coverage gateout-of-coverageChecked 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 entryTile unrendered at every zoom tried, or an unrecognised colourunavailableCannot 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 paintmeasurementOccurs 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 failedunavailableA 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

GET one HRPN tilebash
# 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.

curlbash
curl "https://api.droneinfo.app/v1/demo/weather/point?lat=35.6762&lon=139.6503"

Run it for Tokyo in the browser