ALKIS-Daten einlesen

Aus kvwmap
Wechseln zu: Navigation, Suche

ToDo: Auch den Start- und Endzeitpunkt aus der info.txt auswerten und ggf. das Einlesen verhindern!

Zum Einlesen der NAS-Daten kann das Shell-Skript import_nas.sh im Ordner plugins/alkis/tools verwendet werden. Mit dem Skript werden die NAS-Daten transaktional in die PostGIS-DB eingelesen.


Voraussetzungen

Skript-Konfiguration

Das Skript erwartet eine Konfigurationsdatei config.sh im Ordner plugins/alkis/config. Diese kann auf Basis der config-default.sh im selben Ordner erstellt werden. In der config.sh müssen insbesondere 4 Pfad-Variablen gesetzt werden:

DATA_PATH="/var/www/data/alkis/ff/eingang"                      # der Daten-Eingangsordner; hier werden die Zip-Dateien mit den NAS-Daten abgelegt
IMPORT_PATH="/var/www/data/alkis/ff/import"                     # der Import-Ordner; hier befinden sich die ausgepackten NAS-Dateien und die zu importierende SQL-Datei
LOG_PATH="/var/www/data/alkis/ff/logs"                          # der Logs-Ordner; hier findet das Error-Logging statt
POSTPROCESSING_PATH="/var/www/data/alkis/ff/postprocessing";    # in diesem Ordner können Postprocessing-SQL-Skripte abgelegt werden, die nach jedem Einlesevorgang ausgeführt werden sollen

GFS-Template

Die Variable GFS_TEMPLATE in der config.sh muss nicht angepasst werden. Hier wird die GFS-Datei "../config/alkis-schema.gfs" verwendet. Diese GFS-Datei wird beim Einlesevorgang mit ogr2ogr verwendet. Sie erfüllt 2 Aufgaben:

  • Durch die Abbildung des komplexen ALKIS-Datenmodells auf das flache PostNAS-Datenmodell kommt es bei einigen Attributen zu doppelten Bezeichnungen. Damit die NAS-Daten mit ogr2ogr korrekt in das vollständige PostNAS-Schema eingelesen werden können, wurden diese Attributnamen im PostNAS-Schema umbenannt. Die GFS-Datei beschreibt für alle Attribute die Abbildung des NAS-Element-Pfades auf den (möglicherweise umbenannten) Attributnamen.
  • Außerdem definiert die GFS-Datei für jedes Attribut den Datentyp mit dem ogr2ogr die Daten in die Datenbank einlesen soll. Würde das nicht erfolgen, würde OGR den Datentyp automatisch an Hand der NAS-Daten ermitteln. Dabei kann es vorkommen, dass z.B. führende Nullen abgeschnitten werden o.ä.

Die GFS-Datei wurde mit dem Tool xmi2db auf Basis des AAA-Implementierungsmodells erzeugt.

Prüfung von NAS-Dateien auf Validität mit xmllint

Vor dem Einlesen der Daten ist eine Prüfung der NAS-Dateien mit xmllint auf Validität gegen das Schema NAS 6.0.1 der ADV zu empfehlen.
Beispiel:

xmllint --nowarning --noout --schema pfad_zum_schema/NAS_6.0.1/schema/NAS-Operationen.xsd pfad_zu_nas/beispiel.xml

Das Tool xmllint wird über das Paket libxml2-utils unter linux zur Verfügung gestellt. Es ist eine aktuelle Version ab 2.9 erforderlich.
Das Ergebnis der Prüfung wird mit "validates" oder eine detailierte Fehlermeldung und "fails to validate" ausgegeben.
Das notwendige Schema kann auf den Seiten der ADV als ZIP heruntergeladen und dann lokal entpackt installiert werden.
Link zum Schema: NAS 6.0.1

Wichtig: Es sollten nur valide Daten eingespielt werden!


Skript-Ablauf

Im Ordner "eingang" werden die gezippten NAS-Fortführungsdaten, die eingelesen werden sollen, abgelegt (Katalog- und Objektdaten). Dies sollte am besten auch automatisiert ablaufen.

Wenn das Shell-Skript "import_nas.sh" ausgeführt wird, prüft es zunächst, ob der Ordner "import" leer ist. Wenn ja, guckt es im Ordner "eingang" nach, ob dort Zip-Dateien liegen. Alle vorhandenen Zip-Dateien werden in den Ordner "import" ausgepackt und danach gelöscht. Jede NAS-Datei im Ordner "import" wird mit ogr2ogr zunächst in eine temporäre SQL-Datei konvertiert. Wenn diese Konvertierung erfolgreich war, wird der Inhalt der SQL-Datei zu einer SQL-Datei "import_transaction.sql" im Ordner "import" hinzugefügt und die NAS-Datei sowie die entstandene SQL-Datei gelöscht. In der SQL-Datei "import_transaction.sql" werden die SQL-Befehle aller NAS-Dateien gesammelt, um sie am Ende transaktional ausführen zu können. Wenn alle NAS-Dateien erfolgreich konvertiert wurden, wird die SQL-Datei "import_transaction.sql" ausgeführt und die Daten in die PostGIS-DB eingelesen. Wenn dies erfolgreich war, wird der Ordner "import" geleert.

Logging der eingelesenen NAS-Dateien

Im Schema "alkis" gibt es eine Tabelle "import" mit folgender Struktur:

CREATE TABLE alkis.import
(
 id serial NOT NULL,
 datum timestamp without time zone DEFAULT now(),
 datei text,
 status text
)
WITH(
 OIDS=TRUE
);

Hier wird jede eingelesene NAS-Datei registriert. Diese Tabelle dient einerseits als Übersicht, was alles eingelesen wurde und andererseits wird durch das Einlese-Skript vor der Abarbeitung jeder NAS-Datei auch überprüft, ob eine Datei schon mal eingelesen wurde.

Fehlerbehebung

Wenn bei der Konvertierung einer NAS-Datei ein Fehler aufgetreten ist, bricht das Einlese-Skript ab. Die Fehlermeldung von ogr2ogr steht in der Datei logs/error.log. Der Fehler kann in der fehlerhaften NAS-Datei behoben werden. Danach kann das Einlese-Skript einfach nochmal gestartet werden. Es beginnt mit der Konvertierung der zuvor fehlerhaften NAS-Datei. Alternativ kann auch der Ordner "import" geleert werden und eine neue, korrigierte Zip-Datei in den Ordner "eingang" gelegt werden.

Wenn bei der Ausführung der SQL-Datei "import_transaction.sql" ein Fehler auftritt (Fehlermeldung auch in logs/error.log), kann dieser entweder in "import_transaction.sql" behoben werden oder evtl. auch durch Änderungen am Datenbestand in der Datenbank. Danach kann das Skript einfach nochmal aufgerufen werden. Alternativ kann auch hier der Ordner "import" geleert werden und eine neue, korrigierte Zip-Datei in den Ordner "eingang" gelegt werden.

Post-Processing

Wenn die SQL-Datei "import_transaction.sql" erfolgreich eingelesen wurde, wird die Funktion "alkis.postprocessing()" aufgerufen. Diese Funktion füllt die PP-Tabellen im Alkis-Schema. Eigene Post-Processing-Skripte können im Ordner postprocessing abgelegt werden. Diese werden am Ende nacheinander ausgeführt.


Das Skript "import_nas.sh" wird per Cron-Job einmal täglich automatisch ausgeführt, kann bei Bedarf aber auch händisch gestartet werden.