D3 · Weather

Which way the wind blows

Comparing January and August winds over Indonesia, with an animated map and wind roses for eight cities.

Indonesia’s monsoon winds change direction through the year. Across much of the country, northwesterly winds bring the wet season around December–March. Southeasterly winds from Australia bring drier conditions around June–September, when fires and haze are more common.

The map shows average winds 10 metres above the surface for two fortnights in 2025, using ECMWF’s ERA5 reanalysis. Switch between January and August, or hover to read the wind at a point.

Fig. 01 · Mean surface wind over the archipelago, two monsoons (ERA5 via Open-Meteo)
Season
02468+ m/s

January and August

In August, winds south of the equator mostly come from the east-southeast. They reach about 7 m/s south of Java and 9 m/s in the Arafura Sea. At Kupang, winds come from the east-southeast for 92% of the sampled hours.

These winds carry smoke north and west from fires in Sumatra and Kalimantan. Over land, the average wind is much weaker: around 1 m/s or less at Pekanbaru and Palangkaraya, where smoke can accumulate.

In January, northeasterly winds cross the South China Sea, reaching 15 m/s off Vietnam. Singapore receives winds from the north-northeast for about 80% of the sampled hours. South of the equator, the flow turns eastwards across the Java Sea. Jakarta’s winds come from the west or west-northwest 58% of the time.

Near the equator, around Borneo and Sulawesi, winds are slower and less consistent. The convergence zone between these flows shifts with the seasons.

Wind roses

The roses below show hourly winds at eight cities. Each spoke gives the share of hours when wind came from that direction, split by speed. They show variation that disappears in the map’s averages. Singapore’s prevailing direction changes sharply between seasons; Jayapura is less affected, with calm conditions for about a fifth of January’s sampled hours.

Fig. 02 · Where the wind comes from: hourly 10 m wind at eight cities, two fortnights
ERA5 hourly 10 m wind at each city, 8–21 January and 8–21 August 2025, 336 hours each.

Data limits

The samples cover 8–21 January and 8–21 August 2025. They illustrate the seasonal pattern, but two fortnights cannot capture its full variation. Averaging also hides sea breezes, squalls and calm periods.

The map uses 1,325 points on a 1° grid, roughly 110 km apart, interpolated between points. This is coarser than ERA5’s native 0.25° grid to keep the download within the API allowance. The build script supports finer sampling.

ERA5’s 10 m wind is a model estimate over its representation of terrain and vegetation. Wind at street level can be much weaker.

How it is drawn

Two canvases separate the static map from the moving particles. Each particle reads the wind by interpolating between four grid points, moves along it, and leaves a short segment coloured by speed. Fading the previous frame creates the trails.

Segments are grouped by colour to reduce draw calls. Particles respawn when they leave the grid, reach calm air or exceed their lifetime. Animation pauses offscreen and becomes a still image when reduced motion is enabled.

The wind roses use d3.arc with a square-root radius scale, so spoke area is proportional to the number of hours.

Data

FileSourceNotes
field.jsonERA5 (ECMWF) via the Open-Meteo archive APIMean u/v on a 1° grid, two seasons; 22 kB
roses.jsonSame16 sectors × 4 speed classes at eight cities
land.jsonNatural Earth 1:50mShared with the earthquake post

node scripts/wind/build.mjs rebuilds both. It caches every response, so a rerun after the quota resets only fetches what is missing.