WFS/WMS-Datensatz anlegen per API¶
Nicht jeder Datensatz besteht aus einer hochgeladenen Datei: Geodienste wie WFS und WMS werden als Verweise auf den jeweiligen Dienst veröffentlicht. Dieser Guide zeigt, wie ein solcher Datensatz über die ODI-API angelegt wird – konform zu DCAT-AP.de, dem Metadatenprofil für offene Verwaltungsdaten in Deutschland.
Der Ablauf: Token abrufen, Datensatz anlegen, anschließend die Dienste als Distributionen anhängen.
Was ist eine Distribution? Laut dem DCAT-AP ist eine Distribution „eine physische Verkörperung bzw. Repräsentation des Datensatzes in einem bestimmten Format" – sie beschreibt also, wie und wo die Daten abgerufen werden können. Eine Distribution kann z. B. eine herunterladbare Datei (CSV, JSON, …) oder ein Verweis/Link auf einen externen Dienst (wie in diesem Beispiel) sein. Ein Datensatz kann mehrere Distributionen enthalten.
Umgebungen
Über die Tabs bei den Beispiel-Requests kann zwischen Produktion und Test gewechselt werden.
API-Dokumentation
Swagger-UI: https://ckan-service.odi.schleswig-holstein.de/docs
API-Dokumentation
Swagger-UI: https://ckan-service.odi-stage.schleswig-holstein.de/docs
Voraussetzungen¶
- Client-ID und Client-Secret eines Keycloak Service Accounts liegen vor
- WFS- und/oder WMS-URL ist bekannt und erreichbar
- Metadaten sind bekannt (siehe Metadaten-IDs abrufen):
- Katalog-Name (
catalogue), z. B.opendata-sh - Lizenz-ID (
licenseId), z. B.http://dcat-ap.de/def/licenses/cc-zero - Publisher-ID (
publisherId), z. B.lfu - Kategorie-IDs (
categoryIds), z. B.["ener", "envi"] - Raumbezug-ID (
spatialReferenceId), z. B.http://dcat-ap.de/def/politicalGeocoding/stateKey/01
- Katalog-Name (
Vorgehen¶
1. Token abrufen¶
Alle folgenden Requests erwarten ein JWT-Token im Authorization-Header – siehe Token abrufen.
2. Metadaten-IDs abrufen¶
Lizenz, Herausgeber, Kategorien und Raumbezug werden über IDs aus dem Metadaten-Service angegeben; die vollständige Übersicht steht unter Metadaten-IDs abrufen.
Häufig verwendete Werte:
| Feld | Wert | Kommentar |
|---|---|---|
catalogue |
opendata-sh |
|
licenseId |
http://dcat-ap.de/def/licenses/cc-zero |
Creative Commons CC Zero |
spatialReferenceId |
http://dcat-ap.de/def/politicalGeocoding/stateKey/01 |
Bundesland Schleswig-Holstein |
categoryIds |
["envi", "tran", "ener", "gove"] |
Umwelt, Verkehr, Energie, Regierung und öffentlicher Sektor |
3. Datensatz anlegen¶
Ein neuer Datensatz wird ohne Dateiinhalt angelegt. Er enthält ausschließlich Metadaten und erhält die WFS- und WMS-URLs im nächsten Schritt als Distributionen.
Endpunkt¶
POST https://ckan-service.odi.schleswig-holstein.de/dataset/{catalogue}
POST https://ckan-service.odi-stage.schleswig-holstein.de/dataset/{catalogue}
Felder¶
| Feld | Pflicht | Typ | Beschreibung | Quelle |
|---|---|---|---|---|
datasetId |
Pflicht | string | Frei wählbare ID des Datensatzes | frei wählbar |
title |
Pflicht | JSON-Objekt | Titel des Datensatzes (mehrsprachig) | frei wählbar |
description |
Pflicht | JSON-Objekt | Beschreibung des Datensatzes (mehrsprachig) | frei wählbar |
publisherId |
Pflicht | string | ID des Herausgebers | Metadaten-Service /publisher |
categoryIds |
Pflicht | string[] | Array der Kategorie-IDs | Metadaten-Service /categories |
licenseId |
Pflicht | string | ID der Lizenz | Metadaten-Service /licenses |
spatialReferenceId |
Pflicht | string | ID des Raumbezugs | Metadaten-Service /places |
startDate |
Pflicht | string | Startdatum des Datensatz-Zeitraums im ISO-8601-Format (z. B. 2025-01-01T00:00:00) |
bekannt |
endDate |
Optional | string | Enddatum des Datensatz-Zeitraums im ISO-8601-Format (z. B. 2026-01-01T00:00:00) |
– |
issuedBy |
Optional | string | Dienst oder Nutzer, der den Datensatz angelegt hat | frei wählbar |
publish |
Optional | string | "true" = sofort veröffentlichen; fehlt = Draft |
– |
Info
title und description sind mehrsprachige JSON-Objekte, z. B.:
{"de": "Windkraftanlagen", "en": "Wind turbines"}
Mindestens ein Sprachwert (de oder en) ist erforderlich.
Beispiel-Request¶
Der access_token wird im Abschnitt Token abrufen ermittelt.
curl --request POST \
--url https://ckan-service.odi.schleswig-holstein.de/dataset/opendata-sh \
--header 'authorization: Bearer <access_token>' \
--header 'content-type: application/json' \
--data '{
"datasetId": "windkraftanlagen-2026-05-01",
"title": {
"de": "Windkraftanlagen"
},
"description": {
"de": "Dieser Datensatz enthält Daten und Standorte von genehmigungspflichtigen Windkraftanlagen in Schleswig-Holstein. Im Landesportal sind weitere Informationen zum Thema Windenergie zu finden."
},
"publisherId": "lfu",
"categoryIds": ["ener", "envi"],
"licenseId": "http://dcat-ap.de/def/licenses/cc-zero",
"spatialReferenceId": "http://dcat-ap.de/def/politicalGeocoding/stateKey/01",
"startDate": "2025-01-01T00:00:00",
"endDate": "2026-01-01T00:00:00",
"issuedBy": "ODI-Api-Examples",
"publish": "true"
}'
curl --request POST \
--url https://ckan-service.odi-stage.schleswig-holstein.de/dataset/opendata-sh \
--header 'authorization: Bearer <access_token>' \
--header 'content-type: application/json' \
--data '{
"datasetId": "windkraftanlagen-2026-05-01",
"title": {
"de": "Windkraftanlagen"
},
"description": {
"de": "Dieser Datensatz enthält Daten und Standorte von genehmigungspflichtigen Windkraftanlagen in Schleswig-Holstein. Im Landesportal sind weitere Informationen zum Thema Windenergie zu finden."
},
"publisherId": "lfu",
"categoryIds": ["ener", "envi"],
"licenseId": "http://dcat-ap.de/def/licenses/cc-zero",
"spatialReferenceId": "http://dcat-ap.de/def/politicalGeocoding/stateKey/01",
"startDate": "2025-01-01T00:00:00",
"endDate": "2026-01-01T00:00:00",
"issuedBy": "ODI-Api-Examples",
"publish": "true"
}'
Beispiel-Response (Erfolg)¶
{
"datasetId": "windkraftanlagen-2026-05-01",
"catalogue": "opendata-sh",
"distributionIds": [],
"modifiedDate": "2026-05-27T08:11:31.378281",
"issuedDate": "2026-05-27T08:11:30.146000+00:00",
"datasetUrl": "https://opendata.schleswig-holstein.de/dataset/windkraftanlagen-2026-05-01"
}
Fehlercodes¶
| HTTP-Status | Bedeutung | Mögliche Ursache / Lösung |
|---|---|---|
| 400 | Ungültige Anfrage | Pflichtfeld fehlt oder falsches Format |
| 401 | Nicht authentifiziert | Token fehlt oder abgelaufen → neuen Token abrufen |
| 403 | Keine Berechtigung | Service Account hat nicht die erforderliche Rolle |
| 500 | Interner Serverfehler | Kontakt zum ODI-Support aufnehmen |
4. WFS-Distribution hinzufügen¶
Nach dem Anlegen des Datensatzes wird die WFS-URL als Distribution angehängt.
Endpunkt¶
POST https://ckan-service.odi.schleswig-holstein.de/distribution/{catalogue}/{datasetId}/link-to
POST https://ckan-service.odi-stage.schleswig-holstein.de/distribution/{catalogue}/{datasetId}/link-to
Felder¶
| Feld | Pflicht | Typ | Beschreibung |
|---|---|---|---|
format |
Pflicht | string | Format-Kenner der Distribution; für WFS: WFS_SRVC |
licenseId |
Pflicht | string | ID der Lizenz |
title |
Pflicht | JSON-Objekt | Titel der Distribution (mehrsprachig) |
description |
Pflicht | JSON-Objekt | Beschreibung der Distribution (mehrsprachig) |
url |
Pflicht | string | URL zum WFS GetCapabilities-Request |
Beispiel-Request¶
curl --request POST \
--url https://ckan-service.odi.schleswig-holstein.de/distribution/opendata-sh/windkraftanlagen-2026-05-01/link-to \
--header 'authorization: Bearer <access_token>' \
--header 'content-type: application/json' \
--data '{
"format": "WFS_SRVC",
"licenseId": "http://dcat-ap.de/def/licenses/cc-zero",
"title": {
"de": "WFS"
},
"description": {
"de": "Web Feature Service zum Abrufen von Geodaten."
},
"url": "https://geoserver.odi.schleswig-holstein.de/geoserver/windkraftanlagen_2026_02_12/ows?service=WFS&version=2.0.0&request=GetCapabilities"
}'
curl --request POST \
--url https://ckan-service.odi-stage.schleswig-holstein.de/distribution/opendata-sh/windkraftanlagen-2026-05-01/link-to \
--header 'authorization: Bearer <access_token>' \
--header 'content-type: application/json' \
--data '{
"format": "WFS_SRVC",
"licenseId": "http://dcat-ap.de/def/licenses/cc-zero",
"title": {
"de": "WFS"
},
"description": {
"de": "Web Feature Service zum Abrufen von Geodaten."
},
"url": "https://geoserver.odi.schleswig-holstein.de/geoserver/windkraftanlagen_2026_02_12/ows?service=WFS&version=2.0.0&request=GetCapabilities"
}'
Fehlercodes¶
| HTTP-Status | Bedeutung | Mögliche Ursache / Lösung |
|---|---|---|
| 400 | Ungültige Anfrage | Pflichtfeld fehlt oder ungültige URL |
| 401 | Nicht authentifiziert | Token fehlt oder abgelaufen → neuen Token abrufen |
| 403 | Keine Berechtigung | Service Account hat nicht die erforderliche Rolle |
| 404 | Datensatz nicht gefunden | datasetId oder catalogue prüfen |
| 500 | Interner Serverfehler | Kontakt zum ODI-Support aufnehmen |
5. WMS-Distribution hinzufügen¶
Analog zur WFS-Distribution wird die WMS-URL als weitere Distribution angehängt.
Endpunkt¶
POST https://ckan-service.odi.schleswig-holstein.de/distribution/{catalogue}/{datasetId}/link-to
POST https://ckan-service.odi-stage.schleswig-holstein.de/distribution/{catalogue}/{datasetId}/link-to
Felder¶
| Feld | Pflicht | Typ | Beschreibung |
|---|---|---|---|
format |
Pflicht | string | Format-Kenner der Distribution; für WMS: WMS_SRVC |
licenseId |
Pflicht | string | ID der Lizenz |
title |
Pflicht | JSON-Objekt | Titel der Distribution (mehrsprachig) |
description |
Pflicht | JSON-Objekt | Beschreibung der Distribution (mehrsprachig) |
url |
Pflicht | string | URL zum WMS GetCapabilities-Request |
Beispiel-Request¶
curl --request POST \
--url https://ckan-service.odi.schleswig-holstein.de/distribution/opendata-sh/windkraftanlagen-2026-05-01/link-to \
--header 'authorization: Bearer <access_token>' \
--header 'content-type: application/json' \
--data '{
"format": "WMS_SRVC",
"licenseId": "http://dcat-ap.de/def/licenses/cc-zero",
"title": {
"de": "WMS"
},
"description": {
"de": "Web Map Service zum Abrufen von Geodaten."
},
"url": "https://geoserver.odi.schleswig-holstein.de/geoserver/windkraftanlagen_2026_02_12/ows?service=WMS&version=2.0.0&request=GetCapabilities"
}'
curl --request POST \
--url https://ckan-service.odi-stage.schleswig-holstein.de/distribution/opendata-sh/windkraftanlagen-2026-05-01/link-to \
--header 'authorization: Bearer <access_token>' \
--header 'content-type: application/json' \
--data '{
"format": "WMS_SRVC",
"licenseId": "http://dcat-ap.de/def/licenses/cc-zero",
"title": {
"de": "WMS"
},
"description": {
"de": "Web Map Service zum Abrufen von Geodaten."
},
"url": "https://geoserver.odi.schleswig-holstein.de/geoserver/windkraftanlagen_2026_02_12/ows?service=WMS&version=2.0.0&request=GetCapabilities"
}'
Fehlercodes¶
| HTTP-Status | Bedeutung | Mögliche Ursache / Lösung |
|---|---|---|
| 400 | Ungültige Anfrage | Pflichtfeld fehlt oder ungültige URL |
| 401 | Nicht authentifiziert | Token fehlt oder abgelaufen → neuen Token abrufen |
| 403 | Keine Berechtigung | Service Account hat nicht die erforderliche Rolle |
| 404 | Datensatz nicht gefunden | datasetId oder catalogue prüfen |
| 500 | Interner Serverfehler | Kontakt zum ODI-Support aufnehmen |
6. Datensatz löschen (optional)¶
Ein Datensatz kann per API gelöscht werden. Ohne den Parameter purge wird der Datensatz nur als gelöscht markiert (Soft Delete) und kann wiederhergestellt werden. Mit purge=true wird der Datensatz dauerhaft gelöscht und die datasetId wird für eine Wiederverwendung freigegeben.
Endpunkt¶
DELETE https://ckan-service.odi.schleswig-holstein.de/dataset/{datasetId}
DELETE https://ckan-service.odi-stage.schleswig-holstein.de/dataset/{datasetId}
Query-Parameter¶
| Parameter | Pflicht | Typ | Beschreibung |
|---|---|---|---|
purge |
Optional | boolean | true = dauerhaft löschen (Hard Delete); fehlt oder false = Soft Delete |
Beispiel-Request¶
Fehlercodes¶
| HTTP-Status | Bedeutung | Mögliche Ursache / Lösung |
|---|---|---|
| 204 | Erfolgreich gelöscht | – |
| 401 | Nicht authentifiziert | Token fehlt oder abgelaufen → neuen Token abrufen |
| 403 | Keine Berechtigung | Service Account hat nicht die erforderliche Rolle |
| 404 | Datensatz nicht gefunden | datasetId prüfen |
Nächste Schritte¶
Für weiterführende Operationen – z. B. das Aktualisieren von Datensatz-Metadaten oder das Ersetzen einer Distribution – steht die vollständige API-Referenz des CKAN-Service zur Verfügung: