Installs into .claude/skills of the current project.
Are you the author of Geo Api?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/developer-overheid-nl-geo-api)
---
name: geo-api
description: "OGC API services en kaartdiensten: WMS, WFS, WCS, WMTS, OGC API Features. PDOK-services, GetCapabilities/GetMap/GetFeature, ogc-checker validatie."
allowed-tools:
- Bash(gh api *)
- Bash(curl -s *)
- Bash(ogr2ogr *)
- Bash(ogrinfo *)
- WebFetch(*)
metadata:
created-with-ai: "true"
created-with-model: claude-opus-4-20250514
created-date: "2025-02-22"
status: concept
---
> **CONCEPT — Let op:** Deze skill is geen officieel product van Geonovum. De beschrijvingen zijn informatieve samenvattingen — niet de officiële standaarden zelf. De definities op [forumstandaardisatie.nl](https://www.forumstandaardisatie.nl/open-standaarden) en [Geonovum](https://www.geonovum.nl) zijn altijd leidend. Overheidsorganisaties die generatieve AI inzetten dienen te voldoen aan het [Overheidsbreed standpunt voor de inzet van generatieve AI](https://open.overheid.nl/documenten/bc03ce31-0cf1-4946-9c94-e934a62ebe73/file). Zie [DISCLAIMER.md](../../DISCLAIMER.md) en onze [verantwoording](https://github.com/developer-overheid-nl/skills-marketplace/blob/main/docs/verantwoording.md).
# OGC API Services & Kaartdiensten
**Agent-instructie:** Deze skill helpt bij het implementeren en gebruiken van OGC geo-webservices. Gebruik curl-voorbeelden voor PDOK-services en de ogc-checker voor validatie. OGC API Features en OGC API Tiles zijn verplicht onder ['pas-toe-of-leg-uit'](https://www.forumstandaardisatie.nl/open-standaarden/geo-standaarden); WMS en WFS zijn aanbevolen (sinds september 2024).
OGC-services zijn de standaard manier om geodata beschikbaar te stellen via het web. Nederland gebruikt deze standaarden intensief via [PDOK](https://www.pdok.nl/) — het nationale portaal voor geo-webservices. Geonovum beheert de Nederlandse profielen en de [ogc-checker](https://github.com/Geonovum/ogc-checker) validatietool.
## Standaarden Overzicht
| Standaard | Type | Doel | Forum status |
|-----------|------|------|-------------|
| OGC API Features | REST API | REST-gebaseerde opvolger van WFS (JSON/GeoJSON) | Verplicht |
| OGC API Tiles | Tiles | Opvolger van WMTS (voorgerenderde kaarttegels) | Verplicht |
| WMS 1.3.0 | View | Kaartafbeeldingen (PNG/JPEG) opvragen | Aanbevolen |
| WFS 2.0 | Download | Vector features (GML/GeoJSON) opvragen | Aanbevolen |
| WCS 2.0 | Coverage | Rasterdata (gridded data) ophalen | Geen Forum status |
| GeoPackage 1.3.1 | Bestandsformaat | Lokale opslag van vector- en rasterdata (SQLite) | Verplicht |
## Repositories
| Repository | Beschrijving | Licentie |
|-----------|-------------|--------|
| [Geonovum/ogc-checker](https://github.com/Geonovum/ogc-checker) | Validatietool voor OGC services (v1.3.2) | [EUPL-1.2](https://eupl.eu/1.2/en) |
| [Geonovum/ogc-checker Tags](https://github.com/Geonovum/ogc-checker/tags) | Versies van ogc-checker | [EUPL-1.2](https://eupl.eu/1.2/en) |
## WMS (Web Map Service)
WMS levert kaartafbeeldingen (rasterformaat). Drie operaties:
- **GetCapabilities** — beschrijft de service en beschikbare lagen
- **GetMap** — haalt een kaartafbeelding op (PNG, JPEG)
- **GetFeatureInfo** — haalt attribuutinfo op voor een punt op de kaart
```bash
# WMS GetCapabilities — Luchtfoto RGB
curl -s "https://service.pdok.nl/hwh/luchtfotorgb/wms/v1_0?service=WMS&request=GetCapabilities" \
| head -50
# WMS GetMap — kaartafbeelding ophalen (PNG)
curl -s "https://service.pdok.nl/hwh/luchtfotorgb/wms/v1_0?\
service=WMS&version=1.3.0&request=GetMap&\
layers=Actueel_orthoHR&crs=EPSG:28992&\
bbox=120000,480000,130000,490000&\
width=800&height=800&format=image/png" -o /tmp/kaart.png
# WMS GetFeatureInfo — attribuutinfo op een punt
curl -s "https://service.pdok.nl/hwh/luchtfotorgb/wms/v1_0?\
service=WMS&version=1.3.0&request=GetFeatureInfo&\
layers=Actueel_orthoHR&query_layers=Actueel_orthoHR&\
crs=EPSG:28992&bbox=120000,480000,130000,490000&\
width=800&height=800&i=400&j=400&\
info_format=application/json"
```
## WFS (Web Feature Service)
WFS levert vectordata als features (GML of GeoJSON). Belangrijke operaties:
- **GetCapabilities** — beschrijft de service
- **DescribeFeatureType** — beschrijft het schema van een featuretype
- **GetFeature** — haalt features op, met filters
```bash
# WFS GetCapabilities — BAG (Basisregistratie Adressen en Gebouwen)
curl -s "https://service.pdok.nl/lv/bag/wfs/v2_0?\
service=WFS&request=GetCapabilities" | head -80
# WFS GetFeature — eerste 10 panden als GeoJSON
curl -s "https://service.pdok.nl/lv/bag/wfs/v2_0?\
service=WFS&version=2.0.0&request=GetFeature&\
typeName=bag:pand&count=10&\
outputFormat=application/json"
# WFS met ruimtelijk filter (BBOX)
curl -s "https://service.pdok.nl/lv/bag/wfs/v2_0?\
service=WFS&version=2.0.0&request=GetFeature&\
typeName=bag:pand&count=10&\
outputFormat=application/json&\
bbox=52.37,4.89,52.38,4.91,urn:ogc:def:crs:EPSG::4326"
# WFS DescribeFeatureType
curl -s "https://service.pdok.nl/lv/bag/wfs/v2_0?\
service=WFS&version=2.0.0&request=DescribeFeatureType&\
typeName=bag:pand"
```
## WMTS (Web Map Tile Service)
WMTS levert voorgerenderde kaarttegels. Veel sneller dan WMS voor basemaps.
```bash
# WMTS GetCapabilities — BRT Achtergrondkaart
curl -s "https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0?\
service=WMTS&request=GetCapabilities" | head -80
# WMTS GetTile — enkele tegel ophalen
curl -s "https://service.pdok.nl/brt/achtergrondkaart/wmts/v2_0?\
service=WMTS&version=1.0.0&request=GetTile&\
layer=standaard&style=default&\
tilematrixset=EPSG:28992&tilematrix=10&\
tilerow=300&tilecol=350&format=image/png" -o /tmp/tile.png
```
## WCS (Web Coverage Service)
WCS levert rasterdata (gridded coverages) zoals hoogtemodellen.
```bash
# WCS GetCapabilities — AHN (Actueel Hoogtebestand Nederland)
curl -s "https://service.pdok.nl/rws/ahn/wcs/v1_0?\
service=WCS&request=GetCapabilities" | head -50
```
## OGC API Features
REST-gebaseerde opvolger van WFS. Gebruikt JSON/GeoJSON, OpenAPI-specificatie, en standaard HTTP-methoden.
```bash
# Beschikbare collecties ophalen (Bestuurlijke Gebieden)
curl -s "https://api.pdok.nl/kadaster/brk-bestuurlijke-gebieden/ogc/v1/collections?f=json" \
| python3 -m json.tool
# Specifieke collectie bekijken
curl -s "https://api.pdok.nl/kadaster/brk-bestuurlijke-gebieden/ogc/v1/collections/gemeentegebied?f=json" \
| python3 -m json.tool
# Features ophalen (eerste 10 gemeenten)
curl -s "https://api.pdok.nl/kadaster/brk-bestuurlijke-gebieden/ogc/v1/collections/gemeentegebied/items?limit=10&f=json" \
| python3 -m json.tool
# Feature op basis van ID
curl -s "https://api.pdok.nl/kadaster/brk-bestuurlijke-gebieden/ogc/v1/collections/gemeentegebied/items/{id}?f=json" \
| python3 -m json.tool
# Ruimtelijke filter met bbox
curl -s "https://api.pdok.nl/kadaster/brk-bestuurlijke-gebieden/ogc/v1/collections/gemeentegebied/items?\
bbox=4.89,52.37,4.91,52.38&limit=10&f=json" | python3 -m json.tool
# OpenAPI spec van de service
curl -s "https://api.pdok.nl/kadaster/brk-bestuurlijke-gebieden/ogc/v1/api?f=json" \
| python3 -m json.tool | head -50
```
## Python Implementatie
### Met requests (OGC API Features)
```python
import requests
# OGC API Features — bestuurlijke gebieden ophalen
base_url = "https://api.pdok.nl/kadaster/brk-bestuurlijke-gebieden/ogc/v1"
# Collecties ophalen
collecties = requests.get(f"{base_url}/collections", params={"f": "json"}).json()
for c in collecties["collections"]:
print(f" {c['id']}: {c.get('title', '')}")
# Features met bbox-filter
params = {
"bbox": "4.89,52.37,4.91,52.38",
"limit": 50,
"f": "json",
}
response = requests.get(f"{base_url}/collections/gemeentegebied/items", params=params)
features = response.json()
print(f"Gevonden: {features.get('numberMatched', len(features.get('features', [])))} gemeenten")
for feature in features["features"]:
print(f" ID: {feature['id']}, Naam: {feature['properties'].get('naam')}")
```
### Met OWSLib (WMS/WFS)
```python
from owslib.wms import WebMapService
from owslib.wfs import WebFeatureService
# WMS — kaartafbeelding ophalen
wms = WebMapService("https://service.pdok.nl/hwh/luchtfotorgb/wms/v1_0")
print("Lagen:", list(wms.contents))
img = wms.getmap(
layers=["Actueel_orthoHR"],
srs="EPSG:28992",
bbox=(120000, 480000, 130000, 490000),
size=(800, 800),
format="image/png",
)
with open("/tmp/kaart.png", "wb") as f:
f.write(img.read())
# WFS — features ophalen
wfs = WebFeatureService(
"https://service.pdok.nl/lv/bag/wfs/v2_0", version="2.0.0"
)
print("Feature types:", list(wfs.contents))
response = wfs.getfeature(
typename=["bag:pand"],
maxfeatures=10,
outputFormat="application/json",
)
import json
data = json.loads(response.read())
print(f"Gevonden: {len(data['features'])} panden")
```
## ogc-checker Validatie
De [ogc-checker](https://github.com/Geonovum/ogc-checker) (v1.3.2) is een validatietool van Geonovum om OGC-services te controleren op conformiteit.
De CLI kiest een standaard met `--standard <slug>` en optioneel `--version <id>`; zonder `--version` wordt de laatste **final** versie gebruikt. De oude vlag `--ruleset` werkt nog als deprecated alias en waarschuwt op stderr.
| Standaard | Slug | Versies |
|-----------|------|---------|
| JSON-FG | `json-fg` | `1.0` |
| OGC API Features | `ogc-api-features` | `1.0` |
| OGC API Processes | `ogc-api-processes` | `1.0.0` (default, goedgekeurd 18-062r2), `2.0.0` (draft) |
| OGC API Records | `ogc-api-records` | draft |
```bash
# Valideer tegen de laatste vastgestelde versie van een standaard
npx @geonovum/ogc-checker --standard ogc-api-features https://service.example.nl/collections
# Expliciet de OGC API Processes 2.0 draft kiezen
npx @geonovum/ogc-checker --standard ogc-api-processes --version 2.0.0 ./openapi.json
```
> **Let op:** sinds v1.2.0 selecteert `--standard ogc-api-processes` de goedgekeurde 1.0-versie in plaats van de 2.0-draft. Vanaf v1.3.0 vereist de CLI Node 22 of hoger (Node 20 is end-of-life).
### Via Docker
De repo bevat een `Dockerfile` met **twee build targets** uit dezelfde bron. Handig als Node 22+ lokaal niet beschikbaar is.
- `cli` (default): de CLI op een distroless, non-root Node-image
- `web`: de web-UI als statische bestanden, geserveerd door Caddy als non-root gebruiker
```bash
# CLI
docker build --target cli -t ogc-checker .
# lokaal bestand valideren (mount het in de container)
docker run --rm -v "$PWD/openapi.json:/data/openapi.json:ro" \
ogc-checker validate --standard ogc-api-processes --input /data/openapi.json
# vanaf een URL
docker run --rm ogc-checker \
validate --standard json-fg --input https://service.example.nl/spec.json
# vanaf stdin
cat spec.json | docker run --rm -i ogc-checker validate --standard json-fg
# Web-UI op http://localhost:8080/
docker build --target web -t ogc-checker-web .
docker run --rm -p 8080:8080 ogc-checker-web
```
De poort in de container is `8080`; aanpasbaar met `-e PORT=<poort>` plus een bijpassende `-p` mapping (bijv. `-e PORT=9090 -p 9090:9090`). Exit codes van de CLI: `0` = geslaagd, `1` = gefaald volgens het `--fail-on` beleid, `>1` = onverwachte fout.
> **Let op:** tot v1.3.1 was er één image met een entrypoint dat op het eerste argument dispatchte (`serve` startte de webserver). Dat entrypoint is in v1.3.2 vervangen door de twee targets hierboven; `docker run ... serve` werkt dus niet meer.
```bash
# Repo-informatie ophalen
gh api repos/Geonovum/ogc-checker --jq '{name, description, language, updated_at}'
# Laatste releases bekijken
gh api repos/Geonovum/ogc-checker/tags --jq '.[].name'
# Issues bekijken
gh issue list --repo Geonovum/ogc-checker
# Broncode verkennen
gh api repos/Geonovum/ogc-checker/contents --jq '.[].name'
```
## GDAL/OGR Diagnostiek
```bash
# WFS-service testen met ogrinfo
ogrinfo "WFS:https://service.pdok.nl/lv/bag/wfs/v2_0" -summary
# Features downloaden naar GeoJSON
ogr2ogr -f "GeoJSON" /tmp/panden.geojson \
"WFS:https://service.pdok.nl/lv/bag/wfs/v2_0" bag:pand \
-where "1=1" -limit 10
# CRS-transformatie bij download
ogr2ogr -f "GeoJSON" /tmp/panden_wgs84.geojson \
"WFS:https://service.pdok.nl/lv/bag/wfs/v2_0" bag:pand \
-t_srs EPSG:4326 -limit 10
```
## Veelvoorkomende Problemen
| Probleem | Oorzaak | Oplossing |
|----------|---------|-----------|
| `InvalidParameterValue` bij WMS/WFS | Verkeerde CRS of lagen-naam | Controleer GetCapabilities voor juiste waarden |
| Lege response bij bbox-filter | Verkeerde coördinaatvolgorde | WMS 1.3.0 respecteert CRS-asvolgorde: voor EPSG:4326 is dat lat/lon; voor EPSG:28992 is het x/y |
| Timeout bij grote WFS-requests | Te veel features opgevraagd | Gebruik `count`/`maxFeatures` parameter of bbox-filter |
| `text/xml` in plaats van GeoJSON | outputFormat niet ondersteund | Controleer GetCapabilities voor beschikbare formaten |
| 403 bij PDOK-service | Te zware of geblokkeerde request | PDOK-services zijn open zonder API-key; beperk de request (bbox, lagere frequentie) of neem contact op met PDOK bij structurele blokkade |
| OGC API Features geeft HTML | Geen Accept-header meegegeven | Voeg `Accept: application/geo+json` header toe |
## Cross-referenties
- Gebruik `/ls-api` (uit skills-standaarden) voor de **ADR geo-module** — richtlijnen voor GeoJSON, CRS-negotiatie en bbox in REST APIs.
- Gebruik `/geo-meta` voor metadata van services (ISO 19115, CSW).
- Gebruik `/geo-inspire` voor INSPIRE-conforme view en download services.
## Achtergrondinfo
Zie [reference.md](reference.md) voor uitgebreide OGC-protocoldetails, CRS-handling (EPSG:28992/RD New), en de volledige PDOK-servicecatalogus.