# CAMS luchtkwaliteitsverwachting Europa

Elke dag een verwachting van de luchtkwaliteit in Europa voor de komende vier dagen, per uur en per vak van ongeveer 10 km. Met stikstofdioxide, fijnstof, ozon en ook stuifmeel van berk en gras. Het is de mediaan van elf rekenmodellen, waaronder het Nederlandse LOTOS-EUROS.

- Uitgever: Copernicus, European Centre for Medium-Range Weather Forecasts
- Gebied: Europa · Laagste detail: ca. 10 km (0,1 graad)
- Periode: 2023 – heden, plus vier dagen vooruit · Ververst: dagelijks
- Toegang: Account · Licentie: CC BY 4.0
- Koppelsleutels: coördinaten, tijdstip, hoogte
- Status: ok (2026-10-16) · ADS-status: warning
- URL: https://ads.atmosphere.copernicus.eu/datasets/cams-europe-air-quality-forecasts

## Wat kun je ermee?
- **Smogdag op komst?.** Haal de verwachting voor ozon of fijnstof op voor een vak boven je stad en zet de komende vier dagen per uur in een lijn.
- **Hooikoorts voorspellen.** De verwachting bevat stuifmeel van gras, berk en els. Maak een kaart van Nederland voor de komende dagen.
- **Verwachting tegen meting.** Leg de verwachting van gisteren naast de uurmetingen van Luchtmeetnet op dezelfde plek. Hoe goed zat het model ernaast?
- **Waar komt de vervuiling vandaan?.** Vergelijk de elf modellen onderling. Grote verschillen tussen modellen betekenen een onzekere verwachting.

## Zo verwerk je het
1. **Maak een gratis account.** Registreer bij de Atmosphere Data Store, accepteer de licentie van deze dataset en zet je persoonlijke sleutel in ~/.cdsapirc.
   `https://ads.atmosphere.copernicus.eu/how-to-api`
2. **Bekijk welke keuzes er zijn.** De procesbeschrijving is zonder account te lezen: stoffen, modellen, hoogtes, tijdstappen en formaten.
   `https://ads.atmosphere.copernicus.eu/api/retrieve/v1/processes/cams-europe-air-quality-forecasts`
3. **Vraag alleen Nederland op.** Gebruik area (noord, west, zuid, oost) om een uitsnede te krijgen. Kies hoogte 0 voor de lucht op leefniveau.
   `import cdsapi
cdsapi.Client().retrieve("cams-europe-air-quality-forecasts", {
    "variable": ["nitrogen_dioxide"], "model": ["ensemble"], "level": ["0"],
    "date": ["2026-10-15/2026-10-15"], "type": ["forecast"], "time": ["00:00"],
    "leadtime_hour": [str(h) for h in range(0, 97)],
    "data_format": "netcdf_zip", "area": [53.6, 3.2, 50.7, 7.3]}).download("no2_nl.zip")`
4. **Lees het NetCDF-bestand.** Pak de ZIP uit en open het bestand met xarray. Eén vak boven je stad is dan één tijdreeks.

## Interessante koppelingen
- Hoe goed is de verwachting? → [luchtmeetnet](https://www.opendataindex.nl/bron/luchtmeetnet.md) via coördinaten en uur. Zoek het vak waarin een meetstation ligt en vergelijk per uur verwachting en meting.
- Europa naast elkaar → [eea-lucht](https://www.opendataindex.nl/bron/eea-lucht.md) via coördinaten en uur. De analyse van CAMS gebruikt metingen van het Europees Milieuagentschap. Vergelijk ze over de grens heen.

## Vergelijkbare bronnen
- [luchtmeetnet](https://www.opendataindex.nl/bron/luchtmeetnet.md): Echte metingen per uur op meetstations in Nederland, geen verwachting.
- [rivm-gcn](https://www.opendataindex.nl/bron/rivm-gcn.md): Berekend jaargemiddelde per kilometer voor Nederland, veel fijner maar niet per uur.
- [CAMS-kaarten (verwachting als plaatje)](https://atmosphere.copernicus.eu/european-air-quality-forecast-plots): De Europese verwachting als kant-en-klare kaarten, zonder account.

## Waar je op moet letten
- **Account en licentie nodig.** Zonder account kun je de catalogus en de keuzes lezen, maar niets downloaden. Per dataset accepteer je ook de licentie (CC BY 4.0).
- **Een verwachting, geen meting.** Alleen stikstofmonoxide, stikstofdioxide, zwaveldioxide, ozon, fijnstof en stof worden standaard getoetst aan metingen. De andere stoffen noemt CAMS experimenteel.
- **Te grof voor één straat.** Een vak is ongeveer 10 bij 10 km. Drukke straten en snelwegen vallen weg in het gemiddelde.
- **Archief vanaf oktober 2023.** In de Atmosphere Data Store gaan de verwachtingen terug tot 10 oktober 2023 (stand 15 oktober 2026). Voor 2013 tot en met 2024 is er een aparte heranalyse (cams-europe-air-quality-reanalyses).
- **Aanvragen staan in een wachtrij.** Je krijgt niet direct antwoord. Een aanvraag gaat in een wachtrij en levert later een bestand op (GRIB of NetCDF in een ZIP).

## API (CADS (OGC API Processes + STAC-catalogus), via cdsapi)

- Basis: https://ads.atmosphere.copernicus.eu/api
- Toegang: Catalogus, procesbeschrijving en kostenberekening werken zonder account (getest). Data opvragen vraagt een gratis ECMWF-account, de licentie van de dataset accepteren op de website en je persoonlijke sleutel (kop PRIVATE-TOKEN, of ~/.cdsapirc met url https://ads.atmosphere.copernicus.eu/api). Zonder sleutel: /jobs geeft 401 'authentication required'. (getest)
- Formaten: netcdf, grib, json
- Omvang: 16 CAMS-datasets in de Atmosphere Data Store (16 okt 2026); deze: Europa 0,1° (~10 km), 11 modellen + ensemble, 28 stoffen, sinds 11 okt 2023 (getest)
- Filteren: Geen querytaal: je kiest per keuzeveld de waarden (lijsten) en eventueel een rechthoek (area). Het resultaat is altijd een bestand.; 

### Endpoints
- `GET /catalogue/v1/collections`: Alle 16 datasets (EAC4-heranalyse, wereldverwachtingen, broeikasgassen, zonnestraling, GFAS-branduitstoot …).
- `GET /catalogue/v1/collections/{dataset}`: Eén dataset als STAC-collectie: licentie, bereik, DOI, links naar formulier, constraints en costing.
- `GET /retrieve/v1/processes/{dataset}`: Welke keuzes het verzoek kent, met alle toegestane waarden.
- `POST /retrieve/v1/processes/{dataset}/costing`: Rekent uit hoe 'groot' een verzoek is tegen de limiet ({"cost":2.0,"limit":5000.0}); werkt zonder account.
- `POST /retrieve/v1/processes/{dataset}/execution`: Verzoek indienen (asynchroon, sleutel nodig); body {"inputs": {…}}. Antwoord: een job.
- `GET /retrieve/v1/jobs/{jobId}`: Status van je job (accepted, running, successful); daarna /results met de downloadlink.
- `GET /catalogue/v1/collections/{dataset}/messages`: Meldingen over storingen of wijzigingen van de dataset.

### Parameters
- `variable`: 28 stoffen: nitrogen_dioxide, ozone, particulate_matter_2.5um, particulate_matter_10um, ammonia, dust, pollen (berk, gras, els …) … (uit de beschrijving)
- `model`: ensemble (mediaan) of een van de 11 modellen: chimere, dehm, emep, euradim, gemaq, lotos, match, minni, mocage, monarch, silam. (uit de beschrijving)
- `level`: Hoogte in meter: 0 (leefniveau), 50, 100, 250, 500, 750, 1000, 2000, 3000, 5000. (uit de beschrijving)
- `date`: JJJJ-MM-DD/JJJJ-MM-DD, van 2023-10-11 tot vandaag (staat in het formulier, niet in de procesbeschrijving). (uit de beschrijving)
- `type`: analysis of forecast. (uit de beschrijving)
- `time`: Uur in UTC. forecast: alleen run 00:00 (met leadtime_hour 0–96); analysis: elk uur 00:00–23:00 met leadtime_hour 0 (volgens de constraints). (uit de beschrijving)
- `leadtime_hour`: Uren vooruit, 0 tot en met 96. (uit de beschrijving)
- `area`: Uitsnede in graden; Nederland ongeveer [53.6, 3.2, 50.7, 7.3]. Zonder: heel Europa. (uit de beschrijving)
- `data_format`: grib of netcdf_zip. (uit de beschrijving)

### Inhoud van het bestand (niet zelf gedownload; volgens de datasetbeschrijving) (4)
`NetCDF: variabele per stof` getal, `time / step` datetime, `latitude / longitude` getal, `level` getal

### Limieten en valkuilen
- Elk verzoek heeft een kostenlimiet van 5.000 (costing). Eén stof, één model, één hoogte, één run en twee tijdstappen voor Nederland kost 2. (getest)
- Verzoeken lopen asynchroon in een wachtrij; reken op minuten, soms langer bij drukte. (uit de beschrijving)
- Niet elke combinatie bestaat: de link rel=constraints in het catalogusrecord (60 regels) zegt per datum welke modellen, stoffen, hoogtes en uren er zijn. Volgens de beschrijving worden alleen NO, NO2, SO2, O3, PM2,5, PM10 en stof regelmatig tegen metingen gevalideerd. (uit de beschrijving)
- De STAC-catalogus is alleen beschrijvend: /items en /search geven 501 ('STAC items is not implemented'). Data gaan altijd via processes/execution. (getest)
- Zonder de licentie op de website te accepteren faalt een verzoek, ook met een geldige sleutel. (uit de beschrijving)
- ?limit= op /collections wordt genegeerd: je krijgt altijd alle 16. (getest)
- Het catalogusveld cads:sanity_check zegt of de dataset bij de laatste controle werkte (op 16 okt 2026: down). (getest)
- Open kaartbeelden: eccharts.ecmwf.int heeft een WMS met token=public, maar robots.txt daar is Disallow: / (niet gebruikt). (ervaring)

### Voorbeeld
```
https://ads.atmosphere.copernicus.eu/api/retrieve/v1/processes/cams-europe-air-quality-forecasts
```

## Zo haal je het op

### curl
```bash
curl "https://ads.atmosphere.copernicus.eu/api/catalogue/v1/collections/cams-europe-air-quality-forecasts"
```

### python
```python
import cdsapi  # pip install cdsapi; sleutel in ~/.cdsapirc

cdsapi.Client().retrieve("cams-europe-air-quality-forecasts", {
    "variable": ["particulate_matter_2.5um"], "model": ["ensemble"], "level": ["0"],
    "date": ["2026-10-15/2026-10-15"], "type": ["forecast"], "time": ["00:00"],
    "leadtime_hour": ["0", "24", "48", "72", "96"],
    "data_format": "netcdf_zip", "area": [53.6, 3.2, 50.7, 7.3]}).download("pm25_nl.zip")
```

## Wie gebruikt het
- [CAMS-kaarten](https://atmosphere.copernicus.eu/european-air-quality-forecast-plots): Dagelijkse kaarten van de luchtkwaliteitsverwachting voor Europa


## Voorbeelden met echte cijfers (1)

Per voorbeeld de bevinding, de peildatum en de aanroep die precies deze cijfers ophaalt.

- **Fijnstof (PM2,5) op stedelijke achtergrondstations in Nederland: lager dan in 14 van de 26 andere EU-landen** (2025). Tabel AirQualityStatistics. [Voorbeeld](https://www.opendataindex.nl/voorbeeld/eea-pm25-eu)
  - `https://discodata.eea.europa.eu/sql?query=SELECT%20RTRIM(CountryCode)%20land%2C%20YearOfStatistics%20jaar%2C%20COUNT(*)%20n%2C%20AVG(AirPollutionLevel)%20gem%20FROM%20%5BAirQualityDataFlows%5D.%5Blatest%5D.%5BAirQualityStatistics%5D%20WHERE%20AirPollutant%3D'PM2.5'%20AND%20DataAggregationProcessId%3D'P1Y'%20AND%20DataCovFilterYN%3D'Yes'%20AND%20SourceDataFlow%20LIKE%20'E1a%25'%20AND%20AirQualityStationType%3D'Background'%20AND%20AirQualityStationArea%3D'Urban'%20AND%20YearOfStatistics%20%3E%3D%202022%20GROUP%20BY%20CountryCode%2C%20YearOfStatistics`
