Gebrauchsweisung für die Denkmallisten des Archäologischen Landesamts Schleswig-Holstein
Einmal »mit Umrissen« und einmal »mit Mittelpunkten«: Das Archäologisches Landesamt Schleswig-Holstein stellt im OpenData-Portal des Landes zwei verschieden aufgebaute Denkmallisten zur Verfügung. Sie enthalten allerdings nicht die gleichen Informationen. Wie im ersten Artikel zu den »neuzeitlichen Denkmalen« zeige ich hier die Unterschiede und Besonderheiten – aus der Perspektive eines OpenData-Nutzers und Webentwicklers.
Kurze Orientierung: Denkmallisten im OpenData-Portal
Beide Denkmallisten, »mit Umrissen« und »mit Mittelpunkten«, werden im OpenData-Portal als eigenständige »Datenserie« bereitgestellt. Eine Datenserie ist eine Reihe von älteren und neueren »Datensätzen«. Die Datensätze enthalten sogenannte »Distributionen«. Damit ist gemeint, dass die angebotenen offenen Daten in verschiedenen Dateiformaten heruntergeladen werden können.
Im Allgemeinen findet man als Distribuitionen CSV, JSON und GeoJSON – wobei hier das Archäologische Landesamt seine Geodaten nicht als GeoJSON publiziert.
Darstellung | Datenserie (offizieller Name) | Datensatz | Distribution |
---|---|---|---|
Umrisse | Denkmalliste unbeweglicher archäologischer Kulturdenkmale | Neuester | JSON CSV |
Mittelpunkte | Denkmalliste mit Mittelpunktkoordinaten unbeweglicher archäologischer Kulturdenkmale | Neuester | JSON |
Verfügbare Dateiformate
Die Denkmalliste »mit Umrissen« wird als CSV- und als JSON-Distribution angeboten, für die Landkreise sind auch PDF-Distributionen verfügbar. Weil PDF-Dateien nicht gut weiterverarbeitet werden können – und sie überdies auch keine Angaben zur geografischen Lage der Denkmale enthalten –, bleibt dieses Format im Folgenden außen vor. Die Denkmalliste »mit Mittelpunkten« wird hingegen nur als JSON angeboten.
Bei beiden JSON-Denkmallisten handelt es sich nicht um GeoJSON-Dateien, und beide sind technisch auch nicht ganz einfach zu verarbeiten. Auf die Besonderheiten gehe ich in den folgenden Abschnitten ein:
Verfügbare Datenfelder
Gemeinsame Objekteigenschaften haben in beiden Denkmallisten unterschiedliche Namen. Dazu gibt es in beiden Denkmallisten Objekteigenschaften, die es in der anderen nicht gibt. Die Denkmallisten »mit Umrissen« und »mit Mittelpunkten« sind also inhaltlich und technisch nicht ohne Weiteres austauschbar. Die folgende Tabelle zeigt die Feldnamen der beiden Denkmallisten:
Eigenschaft | CSV und JSON »mit Umrissen« | JSON »mit Mittelpunkten« |
---|---|---|
Denkmal-ID | objektnummer | Name |
Name | eigenname | Fachinfo2 |
Typ | objektbezeichnung | Fachinfo1 |
Beschreibung | objektbeschreibung | Fachinfo5 |
Schutzumfang | schutzumfang | Fachinfo7 |
Behörde | untere_denkmalschutzbehoerde | Fachninfo11 (sic!) |
Status | status | Fachinfo8 |
Gemeinde | gemeinde | Fachinfo4 |
Gemeindeziffer | gemeindeziffer | |
Kreis | kreis | Fachinfo3 |
Geometrie | geometrie | |
Latitude | lat | |
Longitude | lng | |
Eintragung | datum_eintragung | Fachinfo9 |
Letzte Änderung | datum_aenderung | Fachinfo10 |
Eigenschaft | CSV und JSON »mit Umrissen« | JSON »mit Mittelpunkten« |
JSON-Denkmallisten »mit Umrissen«
Das Landesamt stellt die Denkmalliste »mit Umrissen« sowohl für das ganze Bundesland Schleswig-Holstein als auch für die einzelnen Landkreise im OpenData-Portal zur Verfügung. Die Bundesland-JSON-Datei enthält alle Denkmale des Landes, die JSON-Dateien für die Landkreise nur die Denkmale des jeweiligen Kreises. Zuerst ein Blick auf die Landkreis-Denkmallisten:
Denkmalliste für einen Landkreis
Die JSON-Datei ist ein Objekt mit nur einer einzigen Eigenschaft:
Die Eigenschaft akd
ist ein Array mit den einzelnen Denkmal-Objekten.
Alle Denkmal-Eigenschaften bestehen aus Strings.
Hier ein Quellcode-Beispiel,
zu den Besonderheiten und Stolpersteinen dann weiter unten:
{
"akd": [
{
"objektbezeichnung": "Großsteingrab (Rundhügel) | Schalenstein",
"eigenname": "Papenbusch",
"objektnummer": "aKD-ALSH-000018",
"kreis": "Dithmarschen",
"gemeinde": "Albersdorf",
"objektbeschreibung": "Vorgeschichtliches Steingrab, Dolmen mit Gang ...",
"objektbegruendung": "Der Dolmen ?Papenbusch? zählt zu den wenigen ...",
"schutzumfang": "Substanzerhalt des kompletten Objektes ...",
"datum_eintragung": "2015-07-20T00:00:00Z",
"datum_aenderung": "2016-04-14T00:00:00Z",
"status": "in Denkmalliste eingetragen",
"untere_denkmalschutzbehoerde": "Die Landrätin/Der Landrat ...",
"gemeindeziffer": "01051001",
"geometrie": "SRID=25832;MULTIPOLYGON(((...)))"
},
...
]
}
Denkmalliste für das Bundesland
Die JSON-Denkmalliste für das ganze Land ist anders aufgebaut als die Landkreis-Listen.
Das JSON-Array reiht nicht die Denkmale, sondern die Denkmallisten-Objekte der Landkreise aneinander.
Jedes Objekt in diesem Array entspricht also einem Landkreis bzw. einer kreisfreien Stadt.
Allerdings kannst du am Landkreis-Objekt nicht erkennen, um welchen Kreis es sich handelt.
Dazu musst du die Denkmalobjekte in der Eigenschaft akd
betrachten, im Feld kreis
steht dann der Name des Landkreises bzw. der kreisfreien Stadt.
Die Landkreis-Denkmallisten sind im Übrigen so aufgebaut wie im vorigen Abschnitt beschrieben. Das folgende Quellcode-Beispiel verdeutlicht den Aufbau, zu den Besonderheiten und Stolpersteinen dann weiter unten:
[
{
"akd": [ ... ]
},
{
"akd": [
{
"objektbezeichnung": "Großsteingrab (Rundhügel) | Schalenstein",
"eigenname": "Papenbusch",
"objektnummer": "aKD-ALSH-000018",
"kreis": "Dithmarschen",
"gemeinde": "Albersdorf",
"objektbeschreibung": "Vorgeschichtliches Steingrab, Dolmen mit Gang ...",
"objektbegruendung": "Der Dolmen ?Papenbusch? zählt zu den wenigen ...",
"schutzumfang": "Substanzerhalt des kompletten Objektes ...",
"datum_eintragung": "2015-07-20T00:00:00Z",
"datum_aenderung": "2016-04-14T00:00:00Z",
"status": "in Denkmalliste eingetragen",
"untere_denkmalschutzbehoerde": "Die Landrätin/Der Landrat ...",
"gemeindeziffer": "01051001",
"geometrie": "SRID=25832;MULTIPOLYGON(((...)))"
},
...
]
},
{
"akd": [ ... ]
},
...
]
Das musst du beachten
Dei Denkmallisten haben einen ungewöhnlichen Aufbau.
Sie enthalten nicht die einzelnen Denkmal-Objekte als JSON-Objekte, wie man es in einer Kollektion von einzelnen Resourcen erwarten würde und wie es auch in der Denkmalliste bei den Denkmalpflegern der Fall ist.
Bei den Denkmallisten für die Landkreise sind die Denkmal-Objekte in einem Array mit der Eigenschaft akd
zusammengefasst.
Die Denkmallisten für das ganze Land fassen dagegen die Landkreis-Objekte in einem Array zusammen, deren Eigenschaft akd
dann die Denkmale enthält.
Die Abwesenheit von Daten wird nicht durch einen null
-Wert gekennzeichnet.
Das Feld eigenname
enthält stattdessen einen Bindestrich: -
.
Die Denkmalumrisse sind als
WKT-String codiert.
Als Koordinaten-Referenzsystem im Feld geometrie
ist EPSG:25832 angegeben.
Dahinter verbirgt sich das Referenzsystem ETRS 89 (UTM 32N), ein Standard im Vermessungswesen.
Für dich heißt das, dass du die JSON-Datei nicht einfach in ein GeoJSON umwandeln kannst, weil du die Koordinaten erst »umrechnen« musst.
CSV-Denkmalliste »mit Umrissen«
Das Landesamt stellt die Denkmalliste »mit Umrissen« sowohl für das ganze Bundesland Schleswig-Holstein als auch für die einzelnen Landkreise im OpenData-Portal zur Verfügung. Die Bundesland-CSV-Datei enthält alle Denkmale des Landes, die CSV-Dateien für die Landkreise nur die Denkmale des jeweiligen Kreises. Aus Sicht des Autors sind die CSV-Dateien nicht gut für die Verarbeitung in Desktop-Rechnern geeignet:
Die CSV-Listen lassen sich nicht zuverlässig im Tabellenprogramm öffnen.
In vielen Zeilen rutschen die Daten beim Öffnen in die falschen Spalten oder werden auseinandergeschnitten,
auch wenn das Trennzeichen ;
und das Text-Trennzeichen "
beim Import korrekt angegeben werden.
Beim Betrachten der kaputten Zellinhalte fällt auf, dass die Auftrennung immer dort vorzukommen scheint,
wo in an sich mit "
umschlossenen Zellwerten ein Semikolon innerhalb der Zelle auftaucht oder wo bei Textzitaten
doppelte Anführungszeichen "
im Spiel sind — auch wenn sie augenscheinlich korrekt mit \
maskiert sind.
Jedenfalls stolpern am Mac LibreOffice 24.8 und OnlyOffice 8.2 beim Import und schneiden Zellinhalte auseinander.
Dadurch verschieben sich in vielen Zeilen die Spalten.
Betroffen sind, zumindest am Mac, OnlyOffice, LibreOffice, Microsoft 365 Excel und Google Sheets. LibreOffice 24.8 und 25.2 am Mac zeigen zusätzlich die Fehlermeldung Die Daten konnten nicht vollständig geladen werden, da die maximale Anzahl von Zeichen pro Zelle überschritten wurde.
Dass die Zeilen sehr lang werden können, erklärt sich aus den langen Erklärungstexten und den als WKT-String angegebenen Multipolygon-Geometrien. Es ist nicht ganz sicher, wie hoch das Limit ist; viele Jahre galten demnach offenbar 65.535 Zeichen als Maximum pro Zelle. Letzten Endes wird die CSV-Datei doch noch im Programmfenster angezeigt, aber hinsichtlich der Vollständigkeit der angezeigten Inhalte ist Vorsicht angebracht.
Die Abwesenheit von Daten wird nicht durch einen null
-Wert gekennzeichnet.
Das Feld eigenname
enthält stattdessen einen -
Bindestrich.
Die Denkmalumrisse sind als
WKT-String codiert.
Damit wird erreicht, dass die Geometrie der Denkmale als Zellwert in der CSV-Datei gespeichert werden kann.
Als Koordinaten-Referenzsystem im Feld geometrie
ist EPSG:25832 angegeben, ein Standard im Vermessungswesen.
JSON-Denkmalliste »mit Mittelpunkten«
Die JSON-Datei ist keine FeatureCollection
nach dem GeoJSON-Standard
und auch kein Array von Objekten, sondern ein JSON-Objekt mit den Eigenschaften zeitstempel
und features
.
Der Zeitstempel ist ein String aus Datum und Uhrzeit ohne Angabe der Zeitzone.
Das Element features
ist ein Array mit Denkmal-Objekten.
Die Feldnamen der Denkmaleigenschaften beginnen mit Fachinfo
, gefolgt von einer Nummer.
Die geografische Lage der Denkmal-Mittelpunkte werden mit den beiden Feldern lat
und lng
angegeben.
Folgend ein Quellcode-Beispiel, zu den Besonderheiten und Stolpersteinen geht es hier.
{
"zeitstempel": "06.01.2025 11:07:39",
"features": [
{
"FID": 18,
"lat": "5999985",
"lng": "518803",
"Name": "aKD-ALSH-000018",
"Fachinfo1": "Megalithgrab (Rundhügel | Schalenstein",
"Fachinfo2": "Papenbusch",
"Fachinfo3": "Dithmarschen",
"Fachinfo4": "Albersdorf",
"Fachinfo5": "Vorgeschichtliches Steingrab, Dolmen mit Gang ...",
"Fachinfo7": "Substanzerhalt des kompletten Objektes sowie Umgebungsschutz (Einzelfallprüfung)",
"Fachinfo8": "in Denkmalliste eingetragen",
"Fachinfo9": "2015-07-20T00:00:00Z",
"Fachinfo10": "2016-04-14T00:00:00Z",
"Fachninfo11": "Die Landrätin/Der Landrat des Kreises Dithmarschen, Untere Denkmalschutzbehörde"
},
...
]
}
Das musst du beachten
Die Mittelpunkt-Angaben beziehen sich auf das Koordinaten-Referenzsystem EPSG:25832.
Das ist ein Standard im Vermessungswesen, der in Deutschland weit verbreitet ist. Die Koordinaten sind in den Eigenschaften lat
und lng
in Metern angegeben.
Das bedeutet, dass du die Koordinaten nicht einfach in ein GeoJSON umwandeln kannst, weil du die Koordinaten erst »umrechnen« musst.
Es fehlt die Gemeindeziffer.
In der Denkmalliste »mit Umrissen« ist die Gemeindeziffer angegeben, in dieser Denkmalliste jedoch fehlt sie.
Die Gemeindeziffer (eigentlich: Amtlicher Gemeindeschlüssel, AGS) ist eine achtstellige Zahl, die in Deutschland jeder Gemeinde zugeordnet ist.
Die Feldnamen zeigen nicht mehr ihre Bedeutung an.
Bis auf den Mittelpunkt und die Objektnummer heißen alle Felder Fachinfo1
, Fachinfo2
, Fachinfo3
usw.
Die JSON-Daten sind also ohne Interpretationsanleitung nicht selbsterklärend.
Achtung beim Feld Name
!
In dieser Denkmalliste enthält es die Denkmal-Objektnummer, nicht den Eigennamen. Der steht im Feld Fachinfo2
.
Das Feld Fachninfo11
heißt wirklich so.
Der Zeitstempel der Denkmalliste hat ein deutsches Datumsformat ohne Angabe der Zeitzone.
Es kann naheliegend vermutet werden, dass sich der Zeitstempel auf die Zeitzone Europe/Berlin
bezieht, anders also in der »mit Umrissen«-Liste.
Das ist aber nicht sicher, weil die Zeitangabe nicht mit einem Z
endet.
Hingegen, die Zeitstempel der einzelnen Denkmale in den Felder Fachinfo9
und Fachinfo10
sind korrekt in UTC angegeben.
Falls also der Datenstand der ganzen Denkmalliste verwendet werden soll, wäre ein Beispiel für die korrekte Verarbeitung mit PHP:
<?php
$dateString = "06.01.2025 11:07:39";
$timezone = new DateTimeZone("Europe/Berlin");
$date = DateTime::createFromFormat("d.m.Y H:i:s", $dateString, $timezone);
if ($date === false) {
echo "Error parsing the date.";
} else {
echo $date->format("Y-m-d H:i:s T");
}