
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: 
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: 
ingo@3661: \textbf{RIVER\_ID}
ingo@3661: \\Die Datenbank ID des zu importierenden Gewässers.
ingo@3661: 
ingo@3661: \textbf{TARGET\_SRS}
ingo@3661: \\Das EPSG Referenzsystem in das die Geodaten beim Import projeziert werden
ingo@3661: sollen.
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: 
ingo@3661: \textbf{SKIP\_HWS}
ingo@3661: \\Bei gesetztem Wert `1` werden kein Hochwasserschutzanlagen 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: 
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: 




