# Actueel Hoogtebestand Nederland (AHN)

De hoogtekaart van Nederland, gemeten met een laser vanuit een vliegtuig: minstens tien metingen per vierkante meter. Er zijn twee kaarten. Het maaiveldmodel (DTM) is de kale grond. Het oppervlaktemodel (DSM) is alles wat erop staat, met gebouwen en bomen. Via PDOK als kaartlaag (WMS), als API voor rasters (WCS) en als download.

- Uitgever: Het Waterschapshuis, Rijkswaterstaat, Publieke Dienstverlening Op de Kaart
- Gebied: Nederland · Laagste detail: 0,5 meter
- Periode: AHN4 (2020–2022) via PDOK; AHN6 deels (2025) via ahn.nl · Ververst: elke paar jaar
- Toegang: Open · Licentie: CC0 (AHN4 via PDOK); CC BY 4.0 (AHN6)
- Koppelsleutels: RD-coördinaten (EPSG:28992), kaartbladnummer
- Status: ok (2023-04-12) · PDOK-dienst met AHN4 (DTM en DSM 0,5 m)
- URL: https://www.ahn.nl

## Wat kun je ermee?
- **Hoe hoog ligt jouw straat?.** Vraag de hoogte op één punt op uit het maaiveldmodel. Je krijgt meters ten opzichte van NAP. Zet een rij adressen naast elkaar en je ziet welke buurt onder zeeniveau ligt.
- **Gebouwen meten zonder meetlint.** Trek het maaiveld af van het oppervlak (DSM min DTM). Wat overblijft is de hoogte van gebouwen, bomen en bruggen.
- **Hoeveel van de buurt ligt onder NAP?.** Knip het maaiveldmodel op de buurtgrenzen en tel per buurt het aandeel cellen onder 0 meter. Laat gebouwen en water weg, die hebben geen waarde in het DTM.
- **Zakt de grond?.** Vergelijk twee versies van het AHN op dezelfde plek, bijvoorbeeld in het veenweidegebied. Let op: sinds AHN5 wordt het model anders berekend, dus vergelijk het liefst de nieuwe kaartbladen van 1 bij 1 kilometer, die voor alle versies opnieuw zijn afgeleid.

## Zo verwerk je het
1. **Hoogte op één punt.** Een WMS-GetFeatureInfo op de laag dtm_05m geeft de hoogte in meters ten opzichte van NAP als JSON (value_list). Gebruik RD-coördinaten. Met een heel kleine bbox (2 bij 2 meter) kregen we een leeg antwoord; met 200 bij 200 meter en de klik in het midden werkt het.
   `https://service.pdok.nl/rws/ahn/wms/v1_0?service=WMS&version=1.3.0&request=GetFeatureInfo&layers=dtm_05m&query_layers=dtm_05m&styles=&crs=EPSG:28992&bbox=121300,487300,121500,487500&width=200&height=200&i=100&j=100&info_format=application/json`
2. **Een klein stuk raster.** Met WCS GetCoverage knip je een rechthoek uit. 20 bij 20 meter geeft een GeoTIFF van 40 bij 40 cellen (float32, ruim 3 KB). Kies dtm_05m of dsm_05m.
   `https://service.pdok.nl/rws/ahn/wcs/v1_0?service=WCS&version=2.0.1&request=GetCoverage&coverageId=dtm_05m&subset=x(121390,121410)&subset=y(487390,487410)&format=image/tiff`
3. **Grote gebieden als kaartblad.** Voor meer dan een paar honderd meter download je kaartbladen. De ATOM-feed van PDOK noemt 1.373 bladen van 5 bij 6,25 km als Cloud Optimized GeoTIFF; de grootste zijn ruim 500 MB. Zoek eerst het bladnummer op met de laag kaartbladindex.
   `https://service.pdok.nl/rws/actueel-hoogtebestand-nederland/atom/dtm_05m.xml`
4. **Gooi de lege cellen weg.** Cellen zonder meting hebben de waarde 3,4 × 10³⁸ (het grootste float32-getal). In ons proefstukje in de buurt Oude Kerk e.o. (Amsterdam) was dat 813 van de 1.600 cellen. Filter ze weg voor je gemiddelden berekent.

## Interessante koppelingen
- Hoe hoog is elk gebouw in de buurt? → [pdok-bag](https://www.opendataindex.nl/bron/pdok-bag.md) via pandgeometrie (RD). Neem per pand uit de BAG de hoogste of mediane DSM-waarde en trek het maaiveld eromheen af.
- Welke buurten liggen het laagst? → [pdok-wijkenbuurten](https://www.opendataindex.nl/bron/pdok-wijkenbuurten.md) via buurtgrens (RD). Bereken per buurt de mediane maaiveldhoogte. Gebruik dezelfde projectie (EPSG:28992) voor grenzen en raster.

## Vergelijkbare bronnen
- [3DBAG (TU Delft en 3DGI)](https://3dbag.nl): Alle gebouwen in 3D, afgeleid uit de BAG en het AHN. Handiger als je alleen gebouwhoogtes nodig hebt. CC BY 4.0.
- [Copernicus DEM](https://registry.opendata.aws/copernicus-dem/): Wereldwijd oppervlaktemodel van 30 of 90 meter. Grof, maar gelijk over de grens.
- [klimaateffectatlas](https://www.opendataindex.nl/bron/klimaateffectatlas.md): Gebruikt het AHN om overstromingsdiepte en wateroverlast te berekenen. Kant-en-klare kaarten in plaats van ruwe hoogte.

## Waar je op moet letten
- **PDOK heeft nog AHN4.** De PDOK-diensten bevatten AHN4, ingewonnen in 2020 tot en met 2022 (ATOM-feed bijgewerkt op 12 april 2023). Het eerste deel van AHN6 (noordoost-Nederland, 2025) staat sinds 13 oktober 2025 op ahn.nl, met eigen WMS-, WMTS- en WCS-diensten.
- **Gaten in het maaiveldmodel.** Onder gebouwen en op water heeft het DTM geen waarde. Wil je een doorlopend vlak, vul de gaten dan zelf op of gebruik het DSM.
- **Versies zijn niet één op één te vergelijken.** Tot en met AHN4 was het DTM een gewogen gemiddelde en het DSM ook. Sinds AHN5 is het DTM een ongewogen gemiddelde en het DSM het hoogste punt; sinds AHN6 zonder hoogspanningsleidingen en -masten. Verschillen tussen versies kunnen dus deels uit de methode komen.
- **Licentie verschilt per versie.** AHN4 via PDOK is CC0. Voor AHN5 en AHN6 vraagt de uitgever naamsvermelding (AHN6: CC BY 4.0).
- **Echt groot.** Heel Nederland op 0,5 meter is 540.000 bij 625.000 cellen. Werk met kleine uitsneden of kaartbladen, nooit met het hele land in één keer.

## API (OGC WMS 1.3.0 + WCS 2.0.1 (PDOK))

- Basis: https://service.pdok.nl/rws/ahn
- Toegang: Geen sleutel of account nodig (getest)
- Formaten: GeoTIFF (float32), png, jpeg, json (GetFeatureInfo), COG (download)
- Omvang: 1373 kaartbladen DTM 0,5 m (5 × 6,25 km, Cloud Optimized GeoTIFF) in de ATOM-feed; het raster is 540.000 × 625.000 cellen (getest)
- Filteren: Geen querytaal: je kiest een laag, een rechthoek (bbox of subset) en eventueel een pixel.; 

### Endpoints
- `GET /wms/v1_0?service=WMS&request=GetCapabilities`: Lagen dtm_05m (maaiveld), dsm_05m (oppervlak) en kaartbladindex; 9 projecties (o.a. EPSG:28992, 3857, 4326).
- `GET /wms/v1_0?service=WMS&version=1.3.0&request=GetMap&layers=dtm_05m&styles=&crs=EPSG:28992&bbox=…&width=…&height=…&format=image/png`: Kaartbeeld (ingekleurde hoogte) van een rechthoek.
- `GET /wms/v1_0?service=WMS&version=1.3.0&request=GetFeatureInfo&layers=dtm_05m&query_layers=dtm_05m&crs=EPSG:28992&bbox=…&width=200&height=200&i=100&j=100&info_format=application/json`: Hoogte op één punt in meters t.o.v. NAP (properties.value_list).
- `GET /wcs/v1_0?service=WCS&request=GetCapabilities&version=2.0.1`: Coverages dtm_05m en dsm_05m; formaten image/tiff, png, jpeg.
- `GET /wcs/v1_0?service=WCS&version=2.0.1&request=DescribeCoverage&coverageId=dtm_05m`: Omvang (RD 10000,306250 tot 280000,618750) en raster (540.000 × 625.000 cellen van 0,5 m).
- `GET /wcs/v1_0?service=WCS&version=2.0.1&request=GetCoverage&coverageId=dtm_05m&subset=x(…)&subset=y(…)&format=image/tiff`: Ruwe hoogtewaarden als GeoTIFF (float32) voor een rechthoek in RD.
- `GET https://service.pdok.nl/rws/actueel-hoogtebestand-nederland/atom/dtm_05m.xml`: ATOM-feed met 1.373 kaartbladen (COG) en kaartbladindex.json (1,1 MB); ook dsm_05m.xml.

### Parameters
- `layers / coverageId`: dtm_05m = maaiveld (kale grond), dsm_05m = oppervlak (met gebouwen en bomen); WMS heeft ook kaartbladindex. (getest)
- `crs / bbox`: WMS: crs=EPSG:28992 met bbox=xmin,ymin,xmax,ymax in meters (RD). Ook EPSG:3857, 4326, 4258, 25831, 25832, 3034, 3035, CRS:84. (getest)
- `i, j, width, height`: GetFeatureInfo: het pixel binnen het beeld waarvan je de waarde wilt. 200×200 px over 200×200 m met i=j=100 geeft het middelpunt. (getest)
- `info_format`: application/json (GeoJSON met value_list), application/vnd.ogc.gml, text/xml … (getest)
- `subset`: WCS: twee keer meegeven, subset=x(121390,121410)&subset=y(487390,487410), in RD-meters. (getest)
- `format`: WCS: image/tiff geeft float32-waarden in meters; png en jpeg zijn alleen beelden. (getest)

### Velden in het GetFeatureInfo-antwoord (3)
`value_list` String, `geometry.coordinates` Point, `bbox` array

### Limieten en valkuilen
- Geen sleutel en geen gedocumenteerde limiet. Houd WCS-uitsneden klein (20 × 20 m = 3,4 KB); voor grote gebieden de kaartbladen downloaden (tot ruim 500 MB per blad). (getest)
- PDOK heeft AHN4 (inwinning 2020–2022, ATOM bijgewerkt 12 april 2023). Nieuwere versies (AHN5, het eerste deel van AHN6) staan alleen op ahn.nl, via Ellipsis Drive (zie onderdelen). (getest)
- Met een heel kleine bbox (2 × 2 m, 4 × 4 px) gaf GetFeatureInfo een lege lijst; 200 × 200 m bij 200 px met i=j=100 werkt. (ervaring)
- Cellen zonder meting (gebouwen en water in het DTM) hebben in de GeoTIFF de waarde 3,4028235e38. In 20 × 20 m Amsterdam-centrum was dat 813 van 1.600 cellen. Filter die weg. (ervaring)
- Er is geen WFS en geen WMTS op service.pdok.nl/rws/ahn (404). De kaartbladindex is wel een WMS-laag en een JSON-bestand in de ATOM-feed. (getest)
- Hetzelfde adres werkt ook als service.pdok.nl/rws/actueel-hoogtebestand-nederland/…; de ATOM-feed staat alleen onder die lange naam. (ervaring)

### Voorbeeld
```
https://service.pdok.nl/rws/ahn/wms/v1_0?service=WMS&version=1.3.0&request=GetFeatureInfo&layers=dtm_05m&query_layers=dtm_05m&styles=&crs=EPSG:28992&bbox=121300,487300,121500,487500&width=200&height=200&i=100&j=100&info_format=application/json
```

## Zo haal je het op

### curl
```bash
curl "https://service.pdok.nl/rws/ahn/wms/v1_0?service=WMS&version=1.3.0&request=GetFeatureInfo&layers=dtm_05m&query_layers=dtm_05m&styles=&crs=EPSG:28992&bbox=121300,487300,121500,487500&width=200&height=200&i=100&j=100&info_format=application/json"
```

### python
```python
import requests

# Hoogte (m t.o.v. NAP) op een punt in RD-coördinaten, uit het maaiveldmodel van AHN4
x, y = 121400, 487400
r = requests.get("https://service.pdok.nl/rws/ahn/wms/v1_0", params={
    "service": "WMS", "version": "1.3.0", "request": "GetFeatureInfo",
    "layers": "dtm_05m", "query_layers": "dtm_05m", "styles": "", "crs": "EPSG:28992",
    "bbox": f"{x-100},{y-100},{x+100},{y+100}", "width": 200, "height": 200,
    "i": 100, "j": 100, "info_format": "application/json"})
f = r.json()["features"]
print(float(f[0]["properties"]["value_list"]) if f else "geen waarde")
```

## Wat je ermee kunt bouwen
- [Klimaatrisico-check voor een adres](https://www.opendataindex.nl/bouwen/klimaatrisico-adres.md): Typ een postcode en huisnummer en zie in één rapport hoe het pand ervoor staat bij hitte, wateroverlast, overstroming, droogte en funderingsproblemen, met de kaarten van de Klimaateffectatlas, het AHN, de BAG en echte grondwatermetingen uit de BRO.
- [Zonnepanelen-check voor je eigen dak](https://www.opendataindex.nl/bouwen/zonnepanelen-check.md): Typ een postcode en huisnummer en zie hoe groot je dakvlakken zijn, welke kant ze op kijken, hoeveel zon er valt en wat panelen ruwweg zouden opleveren, met open data van BAG, AHN, KNMI en RVO.


## Voorbeelden met echte cijfers (1)

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

- **Het reliëf van het Heuvelland rond Valkenburg, uit het Actueel Hoogtebestand Nederland** (AHN4). Tabel dtm_05m. [Voorbeeld](https://www.opendataindex.nl/voorbeeld/ahn-hoogte-zuid-limburg)
  - `https://service.pdok.nl/rws/ahn/wms/v1_0?service=WMS&version=1.3.0&request=GetMap&layers=dtm_05m&styles=&crs=EPSG:28992&bbox=180000,312000,196000,323000&width=960&height=660&format=image/png`
