Attribution & Lizenz-Compliance
Open Data heißt nicht „ohne Pflichten”. Die Daten hinter Lodapi sind frei nutzbar — aber je nach Lizenz musst du die Quelle sichtbar nennen. Lodapi nimmt dir die 16 Behörden-Lizenzdialekte ab und normalisiert sie auf drei Familien. Die Anzeigepflicht im Frontend bleibt aber bei dir, dem Konsumenten.
Warum überhaupt
In Deutschland kommen die LoD2- und DGM1-Daten unter drei Lizenzfamilien:
| Lizenz | Attributionspflicht |
|---|---|
| DL-DE/Zero 2.0 | Keine — nutzbar ohne Quellenangabe (Nennung trotzdem empfohlen). |
| DL-DE BY 2.0 | Ja — Quellenangabe Pflicht. |
| CC BY 4.0 | Ja — Quellenangabe Pflicht. |
Welche Familie für ein Bundesland gilt, entscheidet die jeweilige Geobasis-Stelle, nicht Lodapi. Du musst das nicht pro Behörde nachschlagen — die API sagt es dir pro Antwort.
Der lodapi.attribution[]-Block
Jede attributionsrelevante Response trägt top-level ein lodapi-Objekt mit attribution[]. Betroffen sind u.a. /v1/buildings, /v1/tilesets und /v1/buildings/{gmlid}/roof. Jeder Array-Eintrag steht für ein Bundesland, das in der Antwort vorkommt:
{
"lodapi": {
"attribution": [
{
"source": "HLBG",
"license": "DL-DE/Zero 2.0",
"url": "https://www.govdata.de/dl-de/zero-2-0",
"tiles_count": 1
}
]
}
}
Felder:
| Feld | Bedeutung |
|---|---|
source | Behörden-/Geobasis-Stelle (z.B. "HLBG", "BezReg Köln"). Das ist der String, den du anzeigst. |
license | Klartext der Lizenz: DL-DE/Zero 2.0, DL-DE BY 2.0 oder CC BY 4.0. |
url | Lizenz-URL zum Verlinken im UI. |
tiles_count | Anzahl beteiligter Tiles (bei /v1/tilesets aussagekräftig; bei /v1/buildings immer 1). |
Die Pflicht-Regel
Ist
license != "DL-DE/Zero 2.0", MUSS dersource-String sichtbar im Frontend stehen — typischerweise im Map-Footer oder als Credit-Zeile.
Bei DL-DE/Zero 2.0 ist die Nennung optional, aber empfohlen. Die einfachste sichere Strategie: immer alle source-Strings anzeigen, dann liegst du bei jeder Lizenz richtig.
Code-Snippets
1. Generisch (Vanilla JS) — Footer rendern
const res = await fetch("https://api.lodapi.de/v1/buildings?bbox=8.66,50.108,8.665,50.111");
const data = await res.json();
const attrs = data.lodapi?.attribution ?? [];
// Pflicht: alles außer DL-DE/Zero anzeigen. Hier zeigen wir der Einfachheit halber alles.
const credits = attrs.map(a =>
`<a href="${a.url}" target="_blank" rel="noopener">© ${a.source} (${a.license})</a>`
);
document.getElementById("map-credit").innerHTML =
"Daten: " + credits.join(" · ");
2. CesiumJS — Credits in der Toolbar
const data = await (await fetch(
`https://api.lodapi.de/v1/tilesets?bbox=${bbox}`
)).json();
for (const a of data.lodapi.attribution) {
viewer.scene.creditDisplay.addStaticCredit(
new Cesium.Credit(`${a.source} (${a.license})`, true)
);
}
3. Statischer Footer-String-Builder
function buildAttributionLine(attribution) {
// Dedupe nach source (mehrere Tiles derselben Behörde).
const seen = new Set();
const parts = [];
for (const a of attribution) {
if (seen.has(a.source)) continue;
seen.add(a.source);
parts.push(`© ${a.source} (${a.license})`);
}
return "Daten: " + parts.join(" · ");
}
// → "Daten: © HLBG (DL-DE/Zero 2.0) · © BezReg Köln (DL-DE BY 2.0)"
Terrain: Attribution als String
Die Terrain-Endpoints /v1/terrain/elevation und /v1/terrain/profile liefern ein einzelnes Feld attribution als String (nicht als Array), weil eine Höhenkote bzw. ein Profil aus genau einer Quelle stammt:
{ "attribution": "© SenStadt Berlin (DL-DE/Zero 2.0)" }
Den String kannst du direkt anzeigen — er enthält Quelle und Lizenz bereits formatiert.
Bezug
- Quickstart — Erste Calls, inklusive Lizenz-Hinweis.
- Lodapi mit CesiumJS — Credit-Display in der Praxis.
- Endpoint-Details:
/v1/buildings,/v1/tilesetsund/v1/buildings/{gmlid}/roofin der API-Referenz.