# Bodemloket

Waar is de bodem onderzocht, waar is hij verontreinigd en wat gebeurt eraan? Het Bodemloket toont wat provincies, omgevingsdiensten en grote gemeenten over hun locaties aanleveren: de stand van het onderzoek, het oordeel over de verontreiniging en of er gesaneerd is. Op 15 oktober 2026 ging het om 241.945 locaties.

- Uitgever: Rijkswaterstaat
- Gebied: Nederland · Laagste detail: locatie (perceel of vlak)
- Periode: momentopname (geen datum per locatie) · Ververst: maandelijks
- Toegang: Open · Licentie: Niet vermeld (openbaar te raadplegen)
- Koppelsleutels: locatiecode bevoegd gezag, RD-coördinaten (EPSG:28992)
- Status: grijs · 241945 locaties met bodeminformatie
- URL: https://www.bodemloket.nl

## Wat kun je ermee?
- **Wat ligt er onder de nieuwbouwwijk?.** Vraag alle locaties binnen 250 meter van een adres op. Je ziet per locatie de stand van het onderzoek en het oordeel, bijvoorbeeld 'Potentieel Ernstig' of 'voldoende gesaneerd'.
- **Hoeveel werk ligt er nog?.** Tel per gemeente of omgevingsdienst de locaties waar nog onderzoek of sanering moet gebeuren (VERVOLG_WBB). Op 15 oktober 2026 stond bij 41.143 locaties 'Uitvoeren historisch onderzoek'.
- **Spoedlocaties in kaart.** Filter op oordelen met 'spoed' of 'urgent' en leg ze op de buurtgrenzen. Wonen er mensen boven of naast?
- **Welke gemeenten laten niets zien?.** De laag Bevoegd_gezag zegt per instantie of de gegevens in het Bodemloket staan of alleen op een eigen website. Op 15 oktober 2026 gold 'uitsluitend via eigen website' voor 31 van de 41 instanties, waaronder Utrecht, Groningen, Eindhoven en Nijmegen.

## Zo verwerk je het
1. **Bekijk de lagen en velden.** De gegevens staan in een ArcGIS-dienst van Rijkswaterstaat met drie lagen: WBB_locaties (de locaties), Beschikbaarheid_gegevens en Bevoegd_gezag. Maximaal 2.000 objecten per verzoek, uitvoer als JSON, GeoJSON of PBF.
   `https://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn/lks_blk_rd_v1/MapServer?f=json`
2. **Locaties rond een punt.** Geef een punt in RD-coördinaten en een straal. Rond dit punt in Helmond (buurt Brouwhuis-Oost) gaf een straal van 250 meter 29 locaties.
   `https://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn/lks_blk_rd_v1/MapServer/0/query?geometry=177060%2C386040&geometryType=esriGeometryPoint&inSR=28992&distance=250&units=esriSRUnit_Meter&spatialRel=esriSpatialRelIntersects&outFields=LOCATIECODE_BEVOEGD_GEZAG%2CVERVOLG_WBB%2CSTATUS_OORD&returnGeometry=false&f=json`
3. **Tellen op de server.** Met outStatistics en groupByFieldsForStatistics telt de dienst zelf, bijvoorbeeld per beheerder (ADMINISTRATOR_NM). Zo hoef je geen 241.945 locaties binnen te halen.
   `https://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn/lks_blk_rd_v1/MapServer/0/query?where=1%3D1&outStatistics=%5B%7B%22statisticType%22%3A%22count%22%2C%22onStatisticField%22%3A%22WBB_DOSSIER_DBK%22%2C%22outStatisticFieldName%22%3A%22n%22%7D%5D&groupByFieldsForStatistics=ADMINISTRATOR_NM&f=json`
4. **Ruim de oordelen op.** STATUS_OORD is vrije tekst uit verschillende systemen: 'Potentieel Ernstig', 'potentieel spoed', 'Urgent, start san voor 2015'. Maak zelf een korte indeling voor je gaat tellen.

## Interessante koppelingen
- Hoeveel woningen staan op een locatie met een ernstige verontreiniging? → [pdok-bag](https://www.opendataindex.nl/bron/pdok-bag.md) via locatievlak (RD). Snijd de verblijfsobjecten uit de BAG met de locatievlakken en tel per oordeel. Beide zijn in RD.
- Welke buurten hebben de meeste open dossiers? → [pdok-wijkenbuurten](https://www.opendataindex.nl/bron/pdok-wijkenbuurten.md) via locatievlak (RD). Tel per buurt de locaties waar VERVOLG_WBB nog een actie noemt. Let op dat grote steden ontbreken.

## Vergelijkbare bronnen
- [DINOloket (TNO)](https://www.dinoloket.nl): De diepere ondergrond (boringen, grondwater, geologie), geen verontreiniging per perceel.
- [Atlas Leefomgeving](https://www.atlasleefomgeving.nl): Laat bodemkwaliteit zien naast lucht, geluid en groen, voor bewoners. Minder geschikt om mee te rekenen.
- [data-overheid](https://www.opendataindex.nl/bron/data-overheid.md): Sommige gemeenten publiceren hun eigen bodembestand daar, zoals Den Haag (Historisch bodembestand).

## Waar je op moet letten
- **Grote steden ontbreken.** Amsterdam en Rotterdam hadden op 15 oktober 2026 nul locaties in de dienst, en 31 van de 41 instanties tonen hun gegevens alleen op een eigen website. Een lege kaart betekent dus niet dat de bodem schoon is.
- **Geen datum.** De locaties hebben geen datum van onderzoek of laatste wijziging. Hoe vaak een instantie levert, verschilt en staat nergens in de dienst.
- **Veel lege oordelen.** Bij 99.633 van de 241.945 locaties is STATUS_OORD leeg. Tel die apart en meld het erbij.
- **Licentie niet vermeld.** Site en dienst noemen geen open licentie, alleen een disclaimer. Vraag bij hergebruik op grote schaal na wat mag, en noem altijd de bron.
- **Storingen in de kaart.** Rond 20 en 21 augustus 2026 werkten de kaart en daarna de lagen met bodemkwaliteitskaarten een tijd niet (nieuwsberichten op de site). Bouw een herhaalpoging in.

## API (ArcGIS REST)

- Basis: https://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn
- Toegang: Geen sleutel of token: de directory en alle aanroepen hieronder werkten anoniem. (getest)
- Formaten: json, geojson, pbf, png (export, WMS)
- Omvang: 241945 locaties in laag 0 WBB_locaties (returnCountOnly, 16 okt 2026) (getest)
- Filteren: SQL-achtige where-voorwaarde op de velden van de laag, plus een optioneel ruimtelijk filter (geometry). Groeperen en tellen met outStatistics.; =, <>, >, >=, <, <=, LIKE, IN, IS NULL, BETWEEN, AND, OR, NOT

### Endpoints
- `GET ?f=json`: Map blk_gdn: één dienst, lks_blk_rd_v1 (MapServer, ArcGIS 11.5).
- `GET /lks_blk_rd_v1/MapServer?f=json`: De dienst: laag 0 WBB_locaties, 1 Beschikbaarheid_gegevens (31), 2 Bevoegd_gezag (41); maxRecordCount 2.000; extensie WMSServer.
- `GET /lks_blk_rd_v1/MapServer/{laag}?f=json`: Velden en mogelijkheden van één laag.
- `GET /lks_blk_rd_v1/MapServer/0/query`: Bodemlocaties opvragen: op een punt met straal, per bevoegd gezag, per status; tellen en groeperen.
- `GET /lks_blk_rd_v1/MapServer/export?bbox=120000,480000,125000,485000&bboxSR=28992&size=400,400&layers=show:0&format=png&f=json`: Kaartbeeld van een rechthoek (link naar een PNG; met f=image direct het beeld).
- `GET /lks_blk_rd_v1/MapServer/legend?f=json`: Legenda per laag.
- `GET https://gis.gdngeoservices.nl/standalone/services/blk_gdn/lks_blk_rd_v1/MapServer/WMSServer?request=GetCapabilities&service=WMS`: WMS 1.3.0 van dezelfde dienst (pad zonder /rest/).

### Parameters
- `where`: Voorwaarde in SQL-92-stijl: 1=1 voor alles, tekst tussen enkele aanhalingstekens (GEMEENTE='Zwolle'), LIKE met %, AND/OR, datums als DATE 'JJJJ-MM-DD'. Verplicht als er geen ander filter is. (getest)
- `outFields`: Velden in het antwoord, gescheiden door komma's, of * voor alle velden. (getest)
- `returnGeometry`: false = alleen attributen (veel kleiner antwoord). (getest)
- `outSR`: Projectie van de geometrie in het antwoord; 4326 = graden (WGS84). Standaard de projectie van de laag, hier RD (28992). (getest)
- `f`: Formaat: json (Esri-JSON), geojson, pbf (protobuf), pjson (ingesprongen) of html (bladeren in de browser). (getest)
- `resultOffset`: Paginering: aantal objecten overslaan (vanaf 0). Gebruik samen met orderByFields voor een vaste volgorde. (getest)
- `resultRecordCount`: Maximaal aantal objecten in dit antwoord (afgekapt op maxRecordCount van de laag). (getest)
- `orderByFields`: Sorteren, bv. 'OBJECTID' of 'n DESC' (ook op een statistiekveld). (getest)
- `returnCountOnly`: true = alleen het aantal objecten dat aan where voldoet: {"count": …}. (getest)
- `outStatistics`: Statistiek op de server: lijst van {statisticType, onStatisticField, outStatisticFieldName}; statisticType count, sum, min, max, avg, stddev of var. URL-coderen. (getest)
- `groupByFieldsForStatistics`: Velden om op te groeperen bij outStatistics (zoals GROUP BY). (getest)
- `returnDistinctValues`: true met outFields en returnGeometry=false: de unieke waarden van die velden. (getest)
- `geometry`: Ruimtelijk filter: een punt 'x,y' of rechthoek 'xmin,ymin,xmax,ymax', met geometryType (esriGeometryPoint, esriGeometryEnvelope), inSR (projectie van de invoer), spatialRel (esriSpatialRelIntersects) en eventueel distance + units (esriSRUnit_Meter) voor een straal. (getest)

### Velden van de voorbeeldlaag (9)
`WBB_DOSSIER_DBK` OID, `SIKB_ID` String, `LOCATIECODE_BEVOEGD_GEZAG` String, `BIS_LOCCODE` String, `TYPE_CD` String, `VERVOLG_WBB` String, `STATUS_OORD` String, `ADMINISTRATOR_NM` String, `NEN3610_ID_SOIL_LOCATION` String

### Limieten en valkuilen
- Hoogstens 2.000 objecten per antwoord (maxRecordCount van de laag; verschilt per laag, staat in /{laag}?f=json). Is er meer, dan staat exceededTransferLimit: true in het antwoord: haal de rest op met resultOffset en resultRecordCount. (getest)
- Geen sleutel en geen gedocumenteerde rate limit. Doe rustig aan (een paar verzoeken per seconde) en vraag liever statistieken of tellingen op dan alle objecten. (ervaring)
- Het telveld van outStatistics komt in hoofdletters terug: vraag je outStatisticFieldName 'n', dan heet het in het antwoord 'N'. Sorteren kan wel met orderByFields=n DESC. (getest)
- Het objectsleutelveld heet WBB_DOSSIER_DBK, niet OBJECTID: orderByFields=OBJECTID geeft 'Invalid or missing input parameters'. (getest)
- Fouten komen terug met HTTP 200 en een JSON-object {"error": {"code": 400, …}} ('Failed to execute query.' bij een onbekend veld in where). Controleer altijd op een veld error, niet alleen op de statuscode. (getest)
- 22.869 locaties hebben geen VERVOLG_WBB en geen TYPE_CD. Amsterdam en Rotterdam leveren niets; 31 van de 41 bevoegde gezagen (laag 1) tonen hun gegevens alleen op hun eigen website. (getest)
- Geen datumveld en geen editingInfo: de API zegt niet wanneer een locatie is bijgewerkt. Het totaal schommelt (15 okt 241.945, eerder op 16 okt 242.206, 's avonds weer 241.945). (getest)
- Laag 0 heeft vlakken in RD (EPSG:28992). Een zoekvraag op een punt met straal: geometry=x,y&geometryType=esriGeometryPoint&inSR=28992&distance=250&units=esriSRUnit_Meter. (getest)

### Voorbeeld
```
https://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn/lks_blk_rd_v1/MapServer/0/query?where=1%3D1&outStatistics=%5B%7B%22statisticType%22%3A%22count%22%2C%22onStatisticField%22%3A%22WBB_DOSSIER_DBK%22%2C%22outStatisticFieldName%22%3A%22n%22%7D%5D&groupByFieldsForStatistics=VERVOLG_WBB&orderByFields=n%20DESC&f=json
```

## Zo haal je het op

### curl
```bash
curl "https://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn/lks_blk_rd_v1/MapServer/0/query?geometry=177060%2C386040&geometryType=esriGeometryPoint&inSR=28992&distance=250&units=esriSRUnit_Meter&spatialRel=esriSpatialRelIntersects&outFields=LOCATIECODE_BEVOEGD_GEZAG%2CVERVOLG_WBB%2CSTATUS_OORD&returnGeometry=false&f=json"
```

### python
```python
import requests

# Locaties binnen 250 meter van een punt (RD-coördinaten)
r = requests.get(
    "https://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn/lks_blk_rd_v1/MapServer/0/query",
    params={"geometry": "177060,386040", "geometryType": "esriGeometryPoint", "inSR": 28992,
            "distance": 250, "units": "esriSRUnit_Meter", "spatialRel": "esriSpatialRelIntersects",
            "outFields": "LOCATIECODE_BEVOEGD_GEZAG,VERVOLG_WBB,STATUS_OORD",
            "returnGeometry": "false", "f": "json"})
for f in r.json()["features"]:
    a = f["attributes"]
    print(a["LOCATIECODE_BEVOEGD_GEZAG"], a["VERVOLG_WBB"], a["STATUS_OORD"], sep=" | ")
```


## Voorbeelden met echte cijfers (2)

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

- **Locaties in het Bodemloket per aanleverende instantie: het meest Omgevingsdienst Haaglanden (34.157 locaties), dan Omgevingsdienst West-Holland en Provincie Limburg** (oktober 2026). Tabel WBB_locaties. [Voorbeeld](https://www.opendataindex.nl/voorbeeld/bodemloket-beheerders)
  - `https://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn/lks_blk_rd_v1/MapServer/0/query?where=1%3D1&outStatistics=%5B%7B%22statisticType%22%3A%22count%22%2C%22onStatisticField%22%3A%22WBB_DOSSIER_DBK%22%2C%22outStatisticFieldName%22%3A%22n%22%7D%5D&groupByFieldsForStatistics=ADMINISTRATOR_NM&f=json`
  - `https://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn/lks_blk_rd_v1/MapServer/1/query?where=1%3D1&outFields=AUTHORITY_NM&returnGeometry=false&f=json`
- **Locaties in het Bodemloket naar volgende stap: het meest voldoende onderzocht (140.558 locaties), dan historisch onderzoek uitvoeren en oriënterend onderzoek uitvoeren** (oktober 2026). Tabel WBB_locaties. [Voorbeeld](https://www.opendataindex.nl/voorbeeld/bodemloket-vervolgstap)
  - `https://gis.gdngeoservices.nl/standalone/rest/services/blk_gdn/lks_blk_rd_v1/MapServer/0/query?where=1%3D1&outStatistics=%5B%7B%22statisticType%22%3A%22count%22%2C%22onStatisticField%22%3A%22WBB_DOSSIER_DBK%22%2C%22outStatisticFieldName%22%3A%22n%22%7D%5D&groupByFieldsForStatistics=VERVOLG_WBB&f=json`
