303,525 datasets indexed1,419 publishers
Open Data IndexThe index of open data about the Netherlands
Open Data Index›Worked-out question
Worked out · 3 sources · 3 steps

How clean is the air on my street?

A monitoring station measures one spot, and Luchtmeetnet has 102 for the whole country. Amsterdam shows how big the difference is: in the week to 15 October 2026, nitrogen dioxide (NO2) averaged 10.7 micrograms per cubic metre in Vondelpark and 24.3 on Haarlemmerweg. For your own address there is RIVM's modelled map; at Dam Square it gives an annual mean of 20.1 for 2024. Hourly values are provisional, times are in UTC, and a weekly average cannot simply be compared with a standard for an annual mean.

Short answerAt Dam Square in Amsterdam: a modelled annual mean of 20.1 µg/m³ NO2 for 2024 (RIVM). That is half the EU limit of 40 and twice the WHO guideline of 10. The nearest station, Oude Schans, measured an average of 14.4 in the week to 15 October 2026.

Nitrogen dioxide in Amsterdam: highest along the main roads, lowest at the edges of the city

The modelled annual mean NO2 for 2024 from RIVM's map service, for an area of 16 by 12 kilometres around the centre. According to the service's legend, blue is below 14 micrograms per cubic metre and grey 14 to 16; cream and yellow 16 to 20, orange 20 to 30 and red 30 or more. The orange and red lines are the busy roads. It is a modelled map, not a measurement: for a value at your own address, query the map at that point (see the script).

Source: RIVM, NO2-kaart 2024 (WMS data.rivm.nl) · opgehaald 25 oktober 2026Open the table Single block

Step by step

  1. 1

    Find the nearest station in Luchtmeetnet.

  2. 2

    For an annual average at your own location: the RIVM GCN map.

  3. 3

    Compare with other European cities via the EEA.

Join on coördinaten

Start with AI

Paste this prompt into Claude or ChatGPT. It names the real endpoints, the join key and the pitfalls, so the assistant writes usable code straight away. Always check the result against the source itself.

Build a web page where I pick a point on the map and see how clean the air is there. All services below are open (no key, CORS is open).

1. Annual mean NO2 at that point, from the RIVM map (WMS GetFeatureInfo):
https://data.rivm.nl/geo/alo/wms?service=WMS&version=1.3.0&request=GetFeatureInfo&layers=rivm_nsl_20260401_gm_NO22024&query_layers=rivm_nsl_20260401_gm_NO22024&styles=&crs=EPSG:4326&bbox=52.3721,4.8915,52.3741,4.8935&width=3&height=3&i=1&j=1&info_format=application/json
The value is in features[0].properties.GRAY_INDEX, in µg/m³, for the year 2024. WMS 1.3.0 with EPSG:4326 expects the bbox as lat,lon (not lon,lat). It is a modelled map, not a measurement.

2. The three nearest Luchtmeetnet stations:
- list: https://api.luchtmeetnet.nl/open_api/stations?page=1 (5 pages, number and name only)
- details with coordinates, type (Traffic, Municipal …) and measured pollutants: https://api.luchtmeetnet.nl/open_api/stations/NL49017
- measurements: https://api.luchtmeetnet.nl/open_api/measurements?station_number=NL49017&formula=NO2&start=2026-10-08T00:00:00Z&end=2026-10-15T00:00:00Z
At most one week per request, paginated (pagination.last_page), times in UTC, hourly values provisional. Not every station measures every pollutant: check components (NO2, PM10, PM25, O3 …). Fetch station details once and store them; don't request all 102 stations on every visit.

Output: the RIVM value for the chosen point, and per station the distance, the type (traffic or background), the mean and maximum of the past week, and an hourly chart in Dutch local time. Add the WHO guideline (10 µg/m³ as an annual mean) and the EU limit (40), and say that a weekly average is not an annual mean.
The map itself can be the background: the same WMS with request=GetMap and crs=EPSG:28992.

Try it yourself

A small script that answers the core of the question. Needs: Python 3.10+ en requests. Tested on 2026-10-15; below is the real output of that run.

# Hoe schoon is de lucht in mijn straat? (1) Berekend jaargemiddelde NO2 op je plek (RIVM-kaart, WMS), (2) metingen
# van de afgelopen week op de Luchtmeetnet-stations in je stad, op afstand gesorteerd. Geen sleutel nodig.
import math, requests
from datetime import datetime, timedelta, timezone

API = "https://api.luchtmeetnet.nl/open_api"
UA = {"User-Agent": "opendataindex-voorbeeld/0.2 (+https://opendataindex.nl)"}
STAD, LON, LAT = "Amsterdam", 4.8925, 52.3731   # de Dam; zet hier je eigen coördinaten

def alle_paginas(pad, **params):
    uit, pagina = [], 1
    while True:
        j = requests.get(f"{API}/{pad}", params={**params, "page": pagina}, headers=UA, timeout=60).json()
        uit += j["data"]
        if pagina >= j["pagination"]["last_page"]:
            return uit
        pagina += 1

def km(lon1, lat1, lon2, lat2):   # benadering, goed genoeg binnen een stad
    return 6371 * math.hypot(math.radians(lon2 - lon1) * math.cos(math.radians(lat1)), math.radians(lat2 - lat1))

# 1. Jaargemiddelde op je plek uit de RIVM-kaart (GetFeatureInfo; WMS 1.3.0 met EPSG:4326 = lat,lon-volgorde).
LAAG = "rivm_nsl_20260401_gm_NO22024"   # NO2-kaart over 2024, gepubliceerd 1 april 2026
info = requests.get("https://data.rivm.nl/geo/alo/wms", headers=UA, timeout=60, params={
    "service": "WMS", "version": "1.3.0", "request": "GetFeatureInfo", "layers": LAAG, "query_layers": LAAG,
    "styles": "", "crs": "EPSG:4326", "bbox": f"{LAT - .001},{LON - .001},{LAT + .001},{LON + .001}",
    "width": 3, "height": 3, "i": 1, "j": 1, "info_format": "application/json"}).json()
print(f"Berekend jaargemiddelde NO2 in 2024 op {LAT}, {LON}: {info['features'][0]['properties']['GRAY_INDEX']:.1f} µg/m³\n")

# 2. Stations in je stad (de lijst heeft alleen nummer en naam; details per station apart).
stations = [s for s in alle_paginas("stations") if s["location"].replace(" ", "").startswith(STAD + "-")]
eind = datetime.now(timezone.utc).replace(minute=0, second=0, microsecond=0)
start = eind - timedelta(days=7)   # maximaal één week per verzoek; tijden in UTC

rijen = []
for s in stations:
    d = requests.get(f"{API}/stations/{s['number']}", headers=UA, timeout=60).json()["data"]
    if "NO2" not in d["components"]:
        continue   # niet elk station meet elke stof
    lon, lat = d["geometry"]["coordinates"]
    m = alle_paginas("measurements", station_number=s["number"], formula="NO2",
                     start=start.isoformat().replace("+00:00", "Z"), end=eind.isoformat().replace("+00:00", "Z"))
    w = [x["value"] for x in m if x["value"] is not None]
    if w:
        rijen.append((km(LON, LAT, lon, lat), s["location"], d["type"], sum(w) / len(w), max(w), len(w)))

print(f"NO2 in µg/m³, {start:%d-%m %H:%M} tot {eind:%d-%m %H:%M} UTC (voorlopige uurwaarden)\n")
print(f"{'afstand':>8}  {'station':32} {'soort':12} {'gem.':>5} {'max':>6} {'uren':>5}")
for afstand, naam, soort, gem, mx, n in sorted(rijen):
    print(f"{afstand:6.1f} km  {naam:32} {soort:12} {gem:5.1f} {mx:6.1f} {n:5}")
print("\nTer vergelijking: WHO-advies 10 µg/m³ als jaargemiddelde, EU-grenswaarde 40.")
Output
Berekend jaargemiddelde NO2 in 2024 op 52.3731, 4.8925: 20.1 µg/m³

NO2 in µg/m³, 08-10 22:00 tot 15-10 22:00 UTC (voorlopige uurwaarden)

 afstand  station                          soort         gem.    max  uren
   0.8 km  Amsterdam-Oude Schans            Municipal     14.4   52.0   168
   1.7 km  Amsterdam-Stadhouderskade        Traffic       18.6   55.8   168
   1.8 km  Amsterdam-Haarlemmerweg          Traffic       24.3   61.2   166
   1.9 km  Amsterdam-Van Diemenstraat       Traffic       19.7   55.7   168
   2.2 km  Amsterdam-Jan van Galenstraat    Traffic       21.3   59.3   168
   2.3 km  Amsterdam-Vondelpark             Municipal     10.7   39.5   168
   3.3 km  Amsterdam-Einsteinweg            Traffic       21.5   62.6   167
   3.9 km  Amsterdam-Nieuwendammerdijk      Municipal     14.4   44.4   162
   6.8 km  Amsterdam-Ookmeer                Municipal     12.6   57.3   167
   8.7 km  Amsterdam -Kantershof            Municipal     11.6   34.2   168

Ter vergelijking: WHO-advies 10 µg/m³ als jaargemiddelde, EU-grenswaarde 40.

The sources3

Luchtmeetnet air quality networkIn depth

RIVM, GGD's en provinciesNetherlands, monitoring station

Measurements of nitrogen dioxide, particulate matter and ozone, every hour, from about a hundred stations across the Netherlands.

OpenAPIReal timeClimate and environment
Up to date
updated less than an hour ago

Large-scale concentration maps (GCN)

RIVMNetherlands, 1 × 1 km

Modelled annual averages of nitrogen dioxide and particulate matter for the whole country, in one-kilometre cells. Where Luchtmeetnet measures, GCN fills in between stations.

OpenDownloadMap layerClimate and environment
Reachable
yearly

EEA air quality

Europees MilieuagentschapEurope, monitoring station

The same Dutch stations as Luchtmeetnet, but next to the rest of Europe. Useful for comparing Amsterdam with Antwerp or Cologne.

OpenDownloadAPIClimate and environment
Reachable
daily

More examples with this data

Also in the indexes

Datasets from data.overheid.nl, the National Georegister, CBS, Eurostat and city portals that fit this question.

Other worked-out questions