About Forecast Japan
The Japan Meteorological Agency publishes its whole operational GPV stream openly — the mesoscale model, the global model on two grids, and two wave models — and almost nowhere is any of it drawn on one frame where the forecasts can be read against each other. This site does that, and adds ECMWF's deterministic run alongside as the outside benchmark.
Free, no account, no key. Six products, one explorer, one time axis. The colour tables are JMA's own and are the default rather than an option; every other table in the network's collection of eleven hundred is one click away.
This is not a source of weather warnings. For those, JMA's own warnings and advisories are the authority, always. What is here is raw model output, drawn honestly — including where the models disagree with each other, which is often and is the point.
The models
| Model | Grid | Run by | Runs | Reach |
|---|---|---|---|---|
| MSM | 5 km lat/lon, 481 × 505 | JMA | 00, 03, 06, 09, 12, 15, 18, 21 UTC | T+78 on 00/12Z, T+39 otherwise — hourly |
| GSM Japan | 10 km lat/lon, 241 × 301 | JMA | 00, 06, 12, 18 UTC | T+264 on 00/12Z, T+132 otherwise — hourly to T+132, then 3-hourly |
| GSM Global | 0.5° global, 720 × 361 | JMA | 00, 06, 12, 18 UTC | T+264 on 00/12Z, T+132 otherwise — 6-hourly |
| Coastal Waves | 0.05° around Japan, 601 × 601 | JMA | 00, 06, 12, 18 UTC | T+72, 3-hourly |
| Global Waves | 0.25°, 1440 × 599 (to 74.75° N/S) | JMA | 00, 06, 12, 18 UTC | T+264 on 00/12Z, T+132 otherwise — 6-hourly |
| ECMWF HRES | 0.1° global, 3600 × 1801 | ECMWF | 00, 06, 12, 18 UTC | T+360 on 00/12Z, T+144 otherwise |
Every one of those grids and axes was read off a live file rather than
taken from documentation, and tools/validate_grids.py
re-checks them against a current one. The short cycles are not a
limitation of this site: JMA and ECMWF both integrate their intermediate
runs less far than their 00 and 12Z ones, and each cycle here publishes
exactly the axis it actually has.
The colours are JMA's — and where they are not, it says so
JMA uses one colour ladder across every intensity product it publishes — the radar mosaic, the rainfall nowcast, the analysed precipitation, the wind distribution. Pale blue, blue, deep blue, then yellow, orange, red and a dark red-violet. Only the numbers on the legend change between products. It is the most recognisable thing about a Japanese weather map, and a site about Japanese models drawn in someone else's colours would be a translation rather than the thing itself.
But there is an honest distinction to make, and it would be easy to blur. Forecast Italy's colour tables are fetched: the Italian agency serves the style document its own map server draws with, so those numbers are the agency's byte for byte. JMA publishes no equivalent endpoint. The tables here are therefore transcribed from JMA's published legends, and each one says which of two things it is:
| Table | Provenance | What that means |
|---|---|---|
|
Precipitation (1 h, 3 h, 24 h) Wind speed |
PUBLISHED | The breakpoints and the colours are JMA's, as they appear on the legend of the named product. Reproduced, not invented. These are drawn as hard bands because that is how JMA draws them — a gradient here would invent detail the agency does not claim. |
|
Temperature, waves, snow, pressure, humidity, cloud, period, sunlight |
IDIOM | JMA publishes no table for this quantity at this cadence. These apply the agency's ladder — or, where a ladder would say something false, a scale chosen not to — to breakpoints chosen here. Japanese in idiom; not official tables. |
Wave period is deliberately off the intensity ladder, and that is a judgement worth stating: a fourteen-second swell is not a severe fourteen seconds, and colouring period on the rainfall scale would imply it is. It gets a single-hue sequential ramp instead. Humidity and cloud are off the ladder for the same reason.
Two models, two senses of "precipitation"
This one is worth knowing about, because it is invisible if you do not. MSM and the GSM publish rainfall under the same GRIB2 parameter, as an accumulation, and the accumulation means different things:
| Model | Records read | What each one holds |
|---|---|---|
| MSM | 0–1, 1–2, 2–3, 3–4 … |
That hour's rain. The run total has to be summed. |
| GSM | 0–1, 0–2, 0–3, 0–4 … |
Everything since the run began. The hourly rate is its increment. |
Both are carried here as both, so the hourly rate and the run total are available on every model — one read straight from the file and the other derived, in opposite directions. Reading it the wrong way round does not fail: take the GSM's run total for an hourly rate and hour 240 of a ten-day run shows the whole period's rain as though it fell in one hour, a perfectly plausible band of violet exactly where the rain really was. The field name on the map always says which you are looking at.
There is a second trap in the same feed. At the 24-hour mark the GSM
encodes its total with a day unit rather than an hour unit, which
renders in wgrib2 as 0-1 day acc fcst. A parser
reading the integers out of that text gets (0, 1) and files a whole day's
rain as the hour-1 value. The reader here is eccodes, which normalises the
range to hours and reports 0-24, so the trap is in the text
rather than in the data.
How it is made
Every frame is an 8-bit palettised PNG whose palette is the colour ramp. That makes the image a reversible encoding of the forecast: point anywhere on the map and the value comes back out of the pixel, with no extra bytes published and no second request. It is also why swapping a colour table costs no re-render — it is a palette splice in the browser.
Native grids are warped onto axis-aligned Web Mercator rasters, which is what makes the placement exact rather than an approximate stretch. Ramps are pinned to absolute values, so a loop shows real intensity changes rather than a palette re-fitting itself frame by frame. City readouts are sampled from the native field rather than from the rendered image, so a quoted number is the model's, not one of 128 palette steps.
MSM's screen temperature and humidity are at 1.5 metres, not 2 — that is what the file says, and it is what the site says. Winds are metres per second and temperatures Celsius, as Japanese forecasts state them; a typhoon is described here by its metres per second, not by a category.
A note on the archive
The JMA GPV stream reaches this site through an archive run by the Research Institute for Sustainable Humanosphere at Kyoto University, which mirrors it and publishes it as plain files, for nothing, with no key and no obligation to anybody. That is a public good and this site is a guest on it. The ingest is built to behave like one: one directory listing per day per run, cached and shared between every process that asks; a pause between files; and — for the global model, the largest feed by far — a single range request that takes the first 13% of each file and closes it into a valid GRIB2 message, because the eleven fields this site draws are the first eleven of a hundred and four. That one trick is the difference between 5.8 GB a day and 0.75.
Credit
Model data from the Japan Meteorological Agency, via the Kyoto University RISH archive. ECMWF HRES from the European Centre for Medium-Range Weather Forecasts. Geography from Natural Earth; basemap © OpenStreetMap contributors. Not affiliated with any of them.