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:

LizenzAttributionspflicht
DL-DE/Zero 2.0Keine — nutzbar ohne Quellenangabe (Nennung trotzdem empfohlen).
DL-DE BY 2.0Ja — Quellenangabe Pflicht.
CC BY 4.0Ja — 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:

FeldBedeutung
sourceBehörden-/Geobasis-Stelle (z.B. "HLBG", "BezReg Köln"). Das ist der String, den du anzeigst.
licenseKlartext der Lizenz: DL-DE/Zero 2.0, DL-DE BY 2.0 oder CC BY 4.0.
urlLizenz-URL zum Verlinken im UI.
tiles_countAnzahl beteiligter Tiles (bei /v1/tilesets aussagekräftig; bei /v1/buildings immer 1).

Die Pflicht-Regel

Ist license != "DL-DE/Zero 2.0", MUSS der source-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

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)
  );
}
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

Bereit?

Der erste Call geht sofort.

LoD2-Gebäude für alle 16 Bundesländer, kostenlos und ohne Konto. Pro auf Anfrage 30 Tage testen.