ingo@3661: \section{Geodatenimport} ingo@3661: ingo@3661: Der Geodaten Importer ist ein in Python geschriebenes Kommandozeilen Tool zum ingo@3661: Import von Shapefiles in eine Datenbank. Zum Lesen der Shapefiles und zum ingo@3676: Schreiben der Geodaten in die Datenbank wird GDAL verwendet. Der Import in eine ingo@3676: Oracle Datenbank erfordert, dass GDAL und GDAL Python Bindungs mit ingo@3661: Oracle Unterstützung installiert sind. Weitere Details hierzu befinden sich im ingo@3661: Kapitel \ref{Systemanforderungen} und \ref{Installationsanleitung}. ingo@3661: ingo@3676: Der Importer kann mit einem Shellscript von der Kommandozeile gestartet werden ingo@3661: (siehe Kapitel \ref{Starten des Geodaten Importers}). Nach dem Start wird anhand der ingo@3661: Konfiguration festgestellt, welche Klassen von Shapefiles aus dem Dateisystem ingo@3676: importiert werden sollen. Für jede Klasse gibt es einen speziellen ingo@3680: Parser, der die speziellen Attribute eines Shapefiles liest und in die entsprechende ingo@3680: Relation der Datenbank schreibt. Die Parser sind speziell auf das ingo@3661: Dateisystem der BfG ausgerichtet. So wird z.B. erwartet, dass die Shapefiles der ingo@3661: Gewässerachse im Ordner $Geodaesie/Flussachse+km$ liegen. Weitere Informationen zu ingo@3661: den einzelnen Parsern sind dem nächsten Kapitel \ref{Beschreibung der Parser} zu ingo@3661: entnehmen. Der Erfolg oder Misserfolg eines Shape-Imports wird je nach ingo@3661: Konfiguration im Logfile vermerkt. Folgende Einträge können dem Logfile ingo@3661: entnommen werden: ingo@3661: aheinecke@4971: %TODO etwas zum srs schreiben. aheinecke@4971: ingo@3661: \textbf{INFO: Inserted 4 features} ingo@3661: \\Gibt die Anzahl der erfolgreich importierten Features an.\\ ingo@3661: ingo@3661: \textbf{INFO: Failed to create 2 features} ingo@3661: \\Gibt die Anzahl der Features an, die nicht importiert werden konnten.\\ ingo@3661: ingo@3661: \textbf{INFO: Found 3 unsupported features} ingo@3661: \\Gibt die Anzahl der Features an, die aufgrund ihres Datentyps nicht importiert ingo@3661: werden konnten. Z.B: es werden Linien erwartet, im Shapefile sind jedoch ingo@3661: Polygone enthalten.\\ ingo@3661: ingo@3680: \textbf{ERROR: No source SRS given! No transformation possible!} ingo@3680: \\Das Shapefile enthält keine Information, in welcher Projektion die Geometrien ingo@3680: vorliegen. Es findet keine Transformation in die Zielprojektion statt. Bitte ingo@3680: beachten Sie, dass FLYS diese Geometrien später ggf nicht korrekt darstellen ingo@3680: kann. ingo@3680: ingo@3661: \textbf{ERROR: Unable to insert feature: DETAIL} ingo@3661: \\Beim Lesen der Attribute eines Features ist ein Fehler aufgetreten. ingo@3661: Das Feature konnte nicht in die Datenbank geschrieben werden.\\ ingo@3661: ingo@3661: \textbf{ERROR: Exception while committing transaction} ingo@3661: \\Beim Abschluss des Schreib-Vorgangs in die Datenbank ist ein unerwarteter ingo@3661: Fehler aufgetreten. Die Features des Shapes sind nicht importiert worden.\\ ingo@3661: ingo@3671: \textbf{ERROR 1: ORA-01017: invalid username/password; logon denied} ingo@3671: \\Es konnte keine Verbindung zur Oracle Datenbank hergestellt werden. Prüfen Sie ingo@3671: die Verbindungseinstellungen. ingo@3671: ingo@3661: Damit die Geodaten eines Shapes später eindeutig in der Datenbank identifiziert ingo@3661: werden können, wird für jede Geometrie der Pfad des Shapes im Dateisystem in ingo@3661: einer Spalte der Datenbank gespeichert. Anwendungen, die auf der Datenbank ingo@3661: aufbauen, können die Geodaten eines Shapefiles später anhand dieses Merkmals ingo@3661: gruppieren und anzeigen. ingo@3661: ingo@3661: ingo@3661: \subsection{Beschreibung der Parser} ingo@3661: \label{Beschreibung der Parser} ingo@3661: ingo@3661: Wie im letzten Kapitel beschrieben, sind die Parser speziell an das Dateisystem ingo@3676: der BfG ausgerichtet. Im Folgenden werden zu jedem Parser folgende Informationen ingo@3661: angegeben: ingo@3661: ingo@3661: \textbf{Pfad} ingo@3661: \\Der Pfad, in dem die Shapefiles im Dateisystem abgelegt sein müssen ausgehend ingo@3661: vom Gewässer Verzeichnis. ingo@3661: ingo@3661: \textbf{Geometrie} ingo@3661: \\Der Geometrie Typ, der für diese Klasse von Shapefiles erwartet wird. ingo@3661: ingo@3661: \textbf{Attribute} ingo@3661: \\Eine Liste der Attribute, die vom Parser aus dem Shape gelesen werden. ingo@3661: ingo@3661: ingo@3661: \subsubsection{Achsen} ingo@3661: \hspace{1cm} ingo@3661: \begin{tabular}[t]{ll} ingo@3661: Pfad & Geodaesie/Flussachse+km \\ ingo@3661: Geometrie & LINESTRING \\ ingo@3661: Attribute & name, kind \\ ingo@3661: \end{tabular} ingo@3661: ingo@3661: ingo@3661: \subsubsection{Hydrologische Grenzen} ingo@3661: \hspace{1cm} ingo@3661: \begin{tabular}[t]{ll} ingo@3661: Pfad & Hydrologie/Hydr.Grenzen/Linien \\ ingo@3661: Geometrie & LINESTRING, POLYGON \\ ingo@3661: Attribute & name, kind \\ ingo@3661: \end{tabular} ingo@3661: ingo@3661: \subsubsection{Bauwerke} ingo@3661: \hspace{1cm} ingo@3661: \begin{tabular}[t]{ll} ingo@3661: Pfad & Geodaesie/Bauwerke \\ ingo@3661: Geometrie & LINESTRING \\ ingo@3661: Attribute & name, Name, KWNAAM \\ ingo@3661: \end{tabular} ingo@3661: ingo@3661: ingo@3661: \subsubsection{Einzugsgebiete} ingo@3661: \hspace{1cm} ingo@3661: \begin{tabular}[t]{ll} ingo@3661: Pfad & Hydrologie/Einzugsgebiet \\ ingo@3661: Geometrie & POLYGON, MULTIPOLYGON \\ ingo@3661: Attribute & name, Name, AREA, area \\ ingo@3661: \end{tabular} ingo@3661: ingo@3661: ingo@3661: \subsubsection{Querprofilspuren} ingo@3661: \hspace{1cm} ingo@3661: \begin{tabular}[t]{ll} ingo@3661: Pfad & Geodaesie/Querprofile \\ ingo@3661: Geometrie & LINESTRING \\ ingo@3661: Attribute & KILOMETER, KM, STATION, ELEVATION \\ ingo@3661: \end{tabular} ingo@3661: ingo@3661: ingo@3661: \subsubsection{Festpunkte} ingo@3661: \hspace{1cm} ingo@3661: \begin{tabular}[t]{ll} ingo@3661: Pfad & Geodaesie/Festpunkte \\ ingo@3661: Geometrie & POINT \\ ingo@3661: Attribute & name, KM, ELBE\_KM, X, Y, HPGP \\ ingo@3661: \end{tabular} ingo@3661: ingo@3661: ingo@3661: \subsubsection{Talaue} ingo@3661: \hspace{1cm} ingo@3661: \begin{tabular}[t]{ll} ingo@3661: Pfad & Hydrologie/Hydr.Grenzen \\ ingo@3661: Geometrie & POLYGON, MULTIPOLYGON \\ ingo@3661: Attribute & name \\ ingo@3661: \end{tabular} ingo@3661: ingo@3661: ingo@3661: \subsubsection{Pegelstationen} ingo@3661: \hspace{1cm} ingo@3661: \begin{tabular}[t]{ll} ingo@3661: Pfad & Hydrologie/Streckendaten \\ ingo@3661: Geometrie & POINT \\ ingo@3661: Attribute & Name, name, MPNAAM \\ ingo@3661: \end{tabular} ingo@3661: ingo@3661: ingo@3661: \subsubsection{Hochwasserschutzanlagen} ingo@3661: \hspace{1cm} ingo@3661: \begin{tabular}[t]{ll} ingo@3661: Pfad & Hydrologie/HW-Schutzanlagen \\ ingo@3661: Geometrie & LINESTRING \\ ingo@3661: Attribute & TYP, Bauart, Name, name \\ ingo@3661: \end{tabular} ingo@3661: ingo@3661: ingo@3661: \subsubsection{Kilometrierung} ingo@3661: \hspace{1cm} ingo@3661: \begin{tabular}[t]{ll} ingo@3661: Pfad & Geodaesie/Flussachse+km \\ ingo@3661: Geometrie & POINT \\ ingo@3661: Attribute & name, km, KM \\ ingo@3661: \end{tabular} ingo@3661: ingo@3661: ingo@3661: \subsubsection{Linien} ingo@3661: \hspace{1cm} ingo@3661: \begin{tabular}[t]{ll} ingo@3661: Pfad & Geodaesie/Linien \\ ingo@3661: Geometrie & LINESTRING, MULTILINESTRING \\ ingo@3661: Attribute & name, TYP, Z \\ ingo@3661: ingo@3661: Anmerkung & Wenn kein Attribut 'TYP' definiert ist, wird standardmäßig der Wert \\ ingo@3676: & 'DAMM' angenommen. Fehlt ein Attribut 'Z' wird '9999' als Höhe \\ ingo@3661: & angenommen. \\ ingo@3661: \end{tabular} ingo@3661: ingo@3661: ingo@3661: \subsubsection{Überschwemmungsfläche} ingo@3661: \hspace{1cm} ingo@3661: \begin{tabular}[t]{ll} ingo@3661: Pfad & Hydrologie/UeSG/Berechnung \\ ingo@3661: Geometrie & POLYGON, MULTIPOLYGON \\ ingo@3661: Attribut & name, diff, count, area, perimeter \\ ingo@3661: \end{tabular} ingo@3661: ingo@3661: ingo@3661: \subsection{Systemanforderungen} ingo@3661: \label{Systemanforderungen} ingo@3661: \begin{itemize} ingo@3661: \item Oracle Datenbank inkl. Schema für FLYS ingo@3661: \item GDAL Binding für Python mit Oracle Support ingo@3661: \item ogr2ogr ingo@3661: \item Python $>=$ 2.6 ingo@3661: \end{itemize} ingo@3661: ingo@3661: ingo@3661: \subsection{Installationsanleitung} ingo@3661: \label{Installationsanleitung} ingo@3661: \begin{itemize} ingo@3670: ingo@3670: \item Python\\ ingo@3670: Zum Starten des Importers ist es notwendig Python zu installieren. Dies können ingo@3670: Sie mit folgendem Befehl auf der Kommandozeile erledigen: ingo@3670: ingo@3670: \begin{lstlisting} ingo@3670: zypper in python ingo@3670: \end{lstlisting} ingo@3670: ingo@3670: \item Oracle Instantclient\\ ingo@3670: Der Oracle Instantclient 11.2 wird benötigt, damit der Importer mittels Python ingo@3670: und GDAL in die bestehende Oracle Datenbank schreiben kann. Dazu ist es ingo@3676: erforderlich, folgende Archive von Oracle herunterzuladen. Zu finden sind die ingo@3676: folgenden Pakete unter\\ ingo@3676: \href{http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html}{http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html} ingo@3670: ingo@3670: \begin{itemize} ingo@3676: \item instantclient-basic-linux-x86-64-11.2.0.2.0.zip ingo@3676: \item instantclient-sdk-linux-x86-64-11.2.0.2.0.zip ingo@3676: \item instantclient-sqlplus-linux-x86-64-11.2.0.2.0.zip ingo@3670: \end{itemize} ingo@3670: ingo@3670: Anschließend führen Sie folgende Befehle auf der Kommandozeile aus: ingo@3670: ingo@3670: \begin{lstlisting} ingo@3670: ingo@3670: mkdir /opt ingo@3670: ingo@3670: unzip ~/instantclient-basic-linux-x86-64-11.2.0.2.0.zip -d /opt ingo@3670: unzip ~/instantclient-sdk-linux-x86-64-11.2.0.2.0.zip -d /opt ingo@3670: unzip ~/instantclient-sqlplus-linux-x86-64-11.2.0.2.0.zip -d /opt ingo@3670: ingo@3670: mkdir /opt/instantclient_11_2/lib ingo@3670: cd /opt/instantclient_11_2/lib ingo@3670: ln -s ../libclntsh.so.11.1 . ingo@3670: ln -s ../libclntsh.so.11.1 libclntsh.so ingo@3670: ln -s ../libnnz11.so . ingo@3670: ln -s ../libocci.so.11.1 . ingo@3670: ln -s ../libocci.so.11.1 libocci.so ingo@3670: ln -s ../libociei.so . ingo@3670: ln -s ../libocijdbc11.so . ingo@3670: ln -s ../libsqlplusic.so . ingo@3670: ln -s ../libsqlplus.so . ingo@3670: ingo@3670: rpm -i --nodeps ~/flys-importer/rpm/RPMS/x86_64/libgdal1180-1.8.0-intevation1.x86_64.rpm ingo@3670: rpm -i --nodeps ~/flys-importer/rpm/RPMS/x86_64/libgdal180-devel-1.8.0-intevation1.x86_64.rpm ingo@3670: rpm -i --nodeps ~/flys-importer/rpm/RPMS/x86_64/gdal180-1.8.0-intevation1.x86_64.rpm ingo@3670: ingo@3670: \end{lstlisting} ingo@3670: ingo@3670: Sollten keine Fehler aufgetreten sein, haben Sie den \textit{Oracle ingo@3670: Instantclient 11.2} erfolgreich entpackt und im Dateisystem unter ingo@3670: \textit{/opt/instantclient\_11\_2} abgelegt. Mit den Befehlen $rpm -i --nodeps$ ingo@3670: haben Sie anschließend die notwendigen Bindings installiert, damit der Importer ingo@3670: die Geodaten in die Oracle Datenbank schreiben kann. ingo@3670: ingo@3661: \end{itemize} ingo@3661: ingo@3661: ingo@3661: \subsection{Konfiguration} ingo@3661: \label{Konfiguration} ingo@3681: Der Geodaten Importer kann über die Datei \textit{contrib/run\_geo.sh} ingo@3661: konfiguriert werden. Öffnen Sie die Datei mit einem Texteditor Ihrer Wahl. ingo@3661: In den Zeilen 4-9 werden Optionen definiert, die zwangsläufig angepasst ingo@3661: werden müssen: ingo@3661: ingo@3661: \textbf{RIVER\_PATH} ingo@3661: \\Der Pfad zum Gewässer im Dateisystem. ingo@3661: aheinecke@4971: \textbf{RIVER\_NAME} aheinecke@4971: \\Der Datenbank Name des zu importierenden Gewässers. Wird dieser Parameter aheinecke@4971: nicht übergeben werden die Ordnernamen im mit dem Parameter RIVER\_PATH aheinecke@4971: angegebenen Verzeichnis als Flussnamen interpretiert und es wird versucht aheinecke@4971: diese zu Importieren. ingo@3661: ingo@3661: \textbf{HOST} ingo@3661: \\Der Host der Datenbank. ingo@3661: ingo@3661: \textbf{USER} ingo@3661: \\Der Nutzer, der zum Verbinden zur Datenbank verwendet wird. ingo@3661: ingo@3661: \textbf{PASS} ingo@3661: \\Das Passwort für USER zum Verbinden zur Datenbank. ingo@3661: ingo@3661: In den Zeilen 12-23 werden weitere Optionen definiert, die bei Bedarf angepasst ingo@3661: werden können. Falls nicht anders angegeben, können die Optionen mit den Werten ingo@3661: `0` und `1` belegt werden. ingo@3661: ingo@3661: \textbf{VERBOSE} ingo@3661: \\Dieser Wert gibt die Granularität der Log-Ausgaben während des ingo@3661: Imports an. Je höher der Wert, desto mehr Informationen werden ingo@3661: in das Logfile geschrieben. Aktuell sind die Werte `0`, `1` und ingo@3661: `2` definiert. Wird der Wert `0` gesetzt, werden nur Fehler und ingo@3661: Warnungen in das Logfile geschrieben. Bei `1` werden neben ingo@3661: Fehlern und Warnungen auch Infos in das Logfile geschrieben. Bei ingo@3661: `2` werden sämtliche Ausgaben des Programms geschrieben. Dieser ingo@3661: Modus ist hauptsächlich für die Entwicklung gedacht. ingo@3661: aheinecke@4871: \textbf{OGR\_CONNECTION} aheinecke@4871: \\Hiermit kann direkt ein beliebiger Verbindungs string angegegeben aheinecke@4871: werden, welcher die host, user und passwort werde überschreibt. aheinecke@4871: Dieser Option wird direkt an die OGR Bibliothek weitergegeben und ermöglicht aheinecke@4871: verbesserte Tests und Entwicklung mit verschiedenen Daten Backends. aheinecke@4871: ingo@3661: \textbf{SKIP\_AXIS} ingo@3661: \\Bei gesetztem Wert `1` werden keine Flussachsen importiert. ingo@3661: ingo@3661: \textbf{SKIP\_KMS} ingo@3661: \\Bei gesetztem Wert `1` werden keine Kilometrierungen importiert. ingo@3661: ingo@3661: \textbf{SKIP\_CROSSSECTIONS} ingo@3661: \\Bei gesetztem Wert `1` werden keine Querprofilespuren importiert. ingo@3661: ingo@3661: \textbf{SKIP\_LINES} ingo@3661: \\Bei gesetztem Wert `1` werden keine Linien importiert. ingo@3661: ingo@3661: \textbf{SKIP\_FIXPOINTS} ingo@3661: \\Bei gesetztem Wert `1` werden keine Festpunkte importiert. ingo@3661: ingo@3661: \textbf{SKIP\_BUILDINGS} ingo@3661: \\Bei gesetztem Wert `1` werden keine Bauwerke importiert. ingo@3661: ingo@3661: \textbf{SKIP\_FLOODPLAINS} ingo@3661: \\Bei gesetztem Wert `1` werden keine Talauen importiert. ingo@3661: ingo@3661: \textbf{SKIP\_HYDR\_BOUNDARIES} ingo@3661: \\Bei gesetztem Wert `1` werden keine hydrologischen Grenzen importiert. ingo@3661: aheinecke@4880: \textbf{SKIP\_HWS\_LINES} aheinecke@4880: \\Bei gesetztem Wert `1` werden kein Hochwasserschutz Liniendaten importiert. aheinecke@4880: aheinecke@4880: \textbf{SKIP\_HWS\_POINTS} aheinecke@4880: \\Bei gesetztem Wert `1` werden kein Hochwasserschutz Punktdaten importiert. ingo@3661: ingo@3661: \textbf{SKIP\_GAUGE\_LOCATION} ingo@3676: \\Bei gesetztem Wert `1` werden keine Pegelorte importiert. ingo@3661: ingo@3661: \textbf{SKIP\_CATCHMENTS} ingo@3676: \\Bei gesetztem Wert `1` werden keine Einzugsgebiete importiert. ingo@3661: ingo@3661: \textbf{SKIP\_UESG} ingo@3661: \\Bei gesetztem Wert `1` werden keine Überschwemmungsflächen importiert. ingo@3661: aheinecke@4971: \textbf{SKIP\_DGM} aheinecke@4971: \\Bei gesetztem Wert `1` werden keine Informationen über Digitale Geländemodelle importiert. aheinecke@4971: ingo@3661: ingo@3661: \subsection{Starten des Geodaten Importers} ingo@3661: \label{Starten des Geodaten Importers} ingo@3661: Der Geodaten Importer wird mittels eines Shellskripts von einer Konsole ingo@3676: gestartet. Dazu führen Sie folgenden Befehl aus:\\ ingo@3661: ingo@3661: \begin{lstlisting} ingo@3676: sh contrib/run_geo.sh > geo-import.log ingo@3661: \end{lstlisting} ingo@3676: ingo@3661: Der Importer wird nun gestartet. Sämtliche Log-Ausgaben werden in die Datei ingo@3676: $geo-import.log$ geschrieben. ingo@3676: ingo@3676: \textbf{Hinweis} ingo@3676: \\Bitte beachten Sie, dass der Geodaten Importer aufgrund der eingesetzten ingo@3676: Technologien derzeit nicht in der Lage ist, lesend auf die Oracle Datenbank ingo@3676: zuzugreifen. Entsprechend kann beim Import nicht festgestellt werden, ob sich ingo@3676: Shapefiles bereits in der Datenbank befinden, oder nicht. Ein erneuter Import ingo@3676: Vorgang der Geodaten würde also dazu führen, dass Geometrien doppelt in der ingo@3676: Datenbank abgelegt werden. ingo@3676: