\section{Geodatenimport}

Der Geodaten Importer ist ein in der Programmiersprache Python
geschriebenes Kommandozeilen Werkzeug zum Import von Shapefiles in
eine Datenbank.
Zum Lesen der Shapefiles und zum schreiben der Geodaten
in die Datenbank wird die GDAL Bibliothek verwendet.
Um Daten in eine Oracle Datenbank zu importieren ist es nötig, dass
GDAL und GDAL Python Bindungs mit Oracle Unterstützung installiert
sind. Bei der Verwendung von PostgreSQL entfällt dieser Schritt.
Weitere Details hierzu befinden sich im
Kapitel \ref{Systemanforderungen} und \ref{Installationsanleitung}.

Der Importer kann mit einem Shellscript von der Kommandozeile gestartet werden
(siehe Kapitel \ref{Starten des Geodaten Importers}). Nach dem Start wird anhand der
Konfiguration festgestellt, welche Klassen von Shapefiles aus dem Dateisystem
importiert werden sollen. Für jede Klasse gibt es einen speziellen
Parser, der die speziellen Attribute eines Shapefiles liest und in die entsprechende
Relation der Datenbank schreibt. Die Parser sind speziell auf das
Dateisystem der BfG ausgerichtet. So wird beispielsweise erwartet, dass die Shapefiles der
Gewässerachse im Ordner $Geodaesie/Flussachse+km$ liegen. Weitere Informationen zu
den einzelnen Parsern sind dem nächsten Kapitel \ref{Beschreibung der Parser} zu
entnehmen. Der Erfolg oder Misserfolg eines Shape-Imports wird je nach
Konfiguration im Logfile vermerkt. Folgende Einträge können dem Logfile
entnommen werden:

%TODO etwas zum srs schreiben.

\textbf{INFO: Inserted 4 features}
\\Gibt die Anzahl der erfolgreich importierten Features an.\\

\textbf{INFO: Failed to create 2 features}
\\Gibt die Anzahl der Features an, die nicht importiert werden konnten.\\

\textbf{INFO: Found 3 unsupported features of type: wbkMultiLineString}
\\Gibt die Anzahl der Features an, die aufgrund ihres Datentyps nicht importiert
werden konnten. Wenn etwa Punkte erwartet wurden aber sich im Shapefile
Polygone befanden.\\

\textbf{INFO: Did not import values from fields: TYP ID GRUENDUNG BHW}
\\Manche Importer versuchen neben der Geographischen Information weitere
Felder in die Datenbank einzulesen. Um festzustellen ob ein Feld aufgrund
von Tippfehlern oder unterschiedlicher Schreibweise nicht importiert wurde,
gibt diese Information Auskunft darüber welche Felder aus der Shape Datei
nicht verwendet wurden.\\

\textbf{ERROR: No source SRS given! No transformation possible!}
\\Das Shapefile enthält keine Information, in welcher Projektion die Geometrien
vorliegen. Es findet keine Transformation in die Zielprojektion statt. Bitte
beachten Sie, dass FLYS diese Geometrien später ggf nicht korrekt darstellen
kann.

\textbf{ERROR: Unable to insert feature: DETAIL}
\\Beim Lesen der Attribute eines Features ist ein Fehler aufgetreten.
Das Feature konnte nicht in die Datenbank geschrieben werden.\\

\textbf{ERROR: Exception while committing transaction}
\\Beim Abschluss des Schreib-Vorgangs in die Datenbank ist ein unerwarteter
Fehler aufgetreten. Die Features des Shapes sind nicht importiert worden.\\

\textbf{ERROR 1: ORA-01017: invalid username/password; logon denied}
\\Es konnte keine Verbindung zur Oracle Datenbank hergestellt werden. Prüfen Sie
die Verbindungseinstellungen.

Damit die Geodaten eines Shapes später eindeutig in der Datenbank identifiziert
werden können, wird für jede Geometrie der Pfad des Shapes im Dateisystem in
einer Spalte der Datenbank gespeichert. Anwendungen, die auf der Datenbank
aufbauen, können die Geodaten eines Shapefiles später anhand dieses Merkmals
gruppieren und anzeigen.


\subsection{Beschreibung der Parser}
\label{Beschreibung der Parser}

Wie im letzten Kapitel beschrieben, sind die Parser speziell an das Dateisystem
der BfG ausgerichtet. Im Folgenden werden zu jedem Parser folgende Informationen
angegeben:

\textbf{Pfad}
\\Der Pfad, in dem die Shapefiles im Dateisystem abgelegt sein müssen ausgehend
vom Gewässer Verzeichnis.

\textbf{Geometrie}
\\Der Geometrie Typ, der für diese Klasse von Shapefiles erwartet wird.

\textbf{Attribute}
\\Eine Liste der Attribute, die vom Parser aus dem Shape gelesen werden.


\subsubsection{Achsen}
\hspace{1cm}
\begin{tabular}[t]{ll}
Pfad        &   Geodaesie/Flussachse+km \\
Geometrie   &   LINESTRING \\
Attribute   &   name, kind \\
\end{tabular}


\subsubsection{Hydrologische Grenzen}
\hspace{1cm}
\begin{tabular}[t]{ll}
Pfad        &   Hydrologie/Hydr.Grenzen/Linien \\
Geometrie   &   LINESTRING, POLYGON \\
Attribute   &   name, kind, sectie, sobek \\
\end{tabular}

\subsubsection{Bauwerke}
\hspace{1cm}
\begin{tabular}[t]{ll}
Pfad        &   Geodaesie/Bauwerke \\
Geometrie   &   LINESTRING \\
Attribute   &   name, Name, KWNAAM \\
\end{tabular}


\subsubsection{Einzugsgebiete}
\hspace{1cm}
\begin{tabular}[t]{ll}
Pfad        &   Hydrologie/Einzugsgebiet \\
Geometrie   &   POLYGON, MULTIPOLYGON \\
Attribute   &   name, Name, AREA, area \\
\end{tabular}


\subsubsection{Querprofilspuren}
\hspace{1cm}
\begin{tabular}[t]{ll}
Pfad        &   Geodaesie/Querprofile \\
Geometrie   &   LINESTRING \\
Attribute   &   KILOMETER, KM, STATION, ELEVATION \\
\end{tabular}


\subsubsection{Festpunkte}
\hspace{1cm}
\begin{tabular}[t]{ll}
Pfad        &   Geodaesie/Festpunkte \\
Geometrie   &   POINT \\
Attribute   &   name, KM, ELBE\_KM, X, Y, HPGP \\
\end{tabular}


\subsubsection{Talaue}
\hspace{1cm}
\begin{tabular}[t]{ll}
Pfad        &   Hydrologie/Hydr.Grenzen \\
Geometrie   &   POLYGON, MULTIPOLYGON \\
Attribute   &   name \\
\end{tabular}


\subsubsection{Pegelstationen}
\hspace{1cm}
\begin{tabular}[t]{ll}
Pfad        &   Hydrologie/Streckendaten \\
Geometrie   &   POINT \\
Attribute   &   Name, name, MPNAAM \\
\end{tabular}


\subsubsection{Hochwasserschutzanlagen}
\hspace{1cm}
\begin{tabular}[t]{ll}
Pfad        &   Hydrologie/HW-Schutzanlagen \\
Geometrie   &   LINESTRING, POINT \\
Attribute   &   name, source, description, status\_date, agency,
                dike\_km, range, z\_target, rated\_level, z \\
\end{tabular}


\subsubsection{Kilometrierung}
\hspace{1cm}
\begin{tabular}[t]{ll}
Pfad        &   Geodaesie/Flussachse+km \\
Geometrie   &   POINT \\
Attribute   &   name, km, KM \\
\end{tabular}


\subsubsection{Überschwemmungsfläche}
\hspace{1cm}
\begin{tabular}[t]{ll}
Pfad        &   Hydrologie/UeSG/Berechnung \\
Geometrie   &   POLYGON, MULTIPOLYGON \\
Attribut    &   name, diff, count, area, perimeter \\
\end{tabular}

\subsection{Konfiguration}
\label{Konfiguration}
Der Geodaten Importer kann über die Datei \textit{contrib/run\_geo.sh}
konfiguriert werden. Öffnen Sie die Datei mit einem Texteditor Ihrer Wahl.
In den Zeilen 4-9 werden Optionen definiert, die zwangsläufig angepasst
werden müssen:

\textbf{RIVER\_PATH}
\\Der Pfad zum Gewässer im Dateisystem.

\textbf{RIVER\_NAME}
\\Der Datenbank Name des zu importierenden Gewässers. Wird dieser Parameter
nicht übergeben werden die Ordnernamen im mit dem Parameter RIVER\_PATH
angegebenen Verzeichnis als Flussnamen interpretiert und es wird versucht
diese zu Importieren.

\textbf{HOST}
\\Der Host der Datenbank.

\textbf{USER}
\\Der Nutzer, der zum Verbinden zur Datenbank verwendet wird.

\textbf{PASS}
\\Das Passwort für USER zum Verbinden zur Datenbank.

In den Zeilen 12-23 werden weitere Optionen definiert, die bei Bedarf angepasst
werden können. Falls nicht anders angegeben, können die Optionen mit den Werten
`0` und `1` belegt werden.

\textbf{VERBOSE}
\\Dieser Wert gibt die Granularität der Log-Ausgaben während des
Imports an. Je höher der Wert, desto mehr Informationen werden
in das Logfile geschrieben. Aktuell sind die Werte `0`, `1` und
`2` definiert. Wird der Wert `0` gesetzt, werden nur Fehler und
Warnungen in das Logfile geschrieben. Bei `1` werden neben
Fehlern und Warnungen auch Infos in das Logfile geschrieben. Bei
`2` werden sämtliche Ausgaben des Programms geschrieben. Dieser
Modus ist hauptsächlich für die Entwicklung gedacht.

\textbf{OGR\_CONNECTION}
\\Hiermit kann direkt ein beliebiger Verbindungs string angegegeben
werden, welcher die host, user und passwort werde überschreibt.
Dieser Option wird direkt an die OGR Bibliothek weitergegeben und ermöglicht
verbesserte Tests und Entwicklung mit verschiedenen Daten Backends.

\textbf{SKIP\_AXIS}
\\Bei gesetztem Wert `1` werden keine Flussachsen importiert.

\textbf{SKIP\_KMS}
\\Bei gesetztem Wert `1` werden keine Kilometrierungen importiert.

\textbf{SKIP\_CROSSSECTIONS}
\\Bei gesetztem Wert `1` werden keine Querprofilespuren importiert.

\textbf{SKIP\_FIXPOINTS}
\\Bei gesetztem Wert `1` werden keine Festpunkte importiert.

\textbf{SKIP\_BUILDINGS}
\\Bei gesetztem Wert `1` werden keine Bauwerke importiert.

\textbf{SKIP\_FLOODPLAINS}
\\Bei gesetztem Wert `1` werden keine Talauen importiert.

\textbf{SKIP\_HYDR\_BOUNDARIES}
\\Bei gesetztem Wert `1` werden keine hydrologischen Grenzen importiert.

\textbf{SKIP\_HWS\_LINES}
\\Bei gesetztem Wert `1` werden kein Hochwasserschutz Liniendaten importiert.

\textbf{SKIP\_HWS\_POINTS}
\\Bei gesetztem Wert `1` werden kein Hochwasserschutz Punktdaten importiert.

\textbf{SKIP\_CATCHMENTS}
\\Bei gesetztem Wert `1` werden keine Einzugsgebiete importiert.

\textbf{SKIP\_UESG}
\\Bei gesetztem Wert `1` werden keine Überschwemmungsflächen importiert.

\textbf{SKIP\_DGM}
\\Bei gesetztem Wert `1` werden keine Informationen über Digitale Geländemodelle importiert.

\textbf{SKIP\_JETTIES}
\\Bei gesetztem Wert `1` werden keine Informationen über Buhnen importiert.

\subsection{Starten des Geodaten Importers}
\label{Starten des Geodaten Importers}
Der Geodaten Importer wird mittels eines Shellskripts von einer Konsole
gestartet. Dazu führen Sie folgenden Befehl aus:\\

\begin{lstlisting}
    sh contrib/run_geo.sh > geo-import.log
\end{lstlisting}

Der Importer wird nun gestartet. Sämtliche Log-Ausgaben werden in die Datei
$geo-import.log$ geschrieben.

\textbf{Hinweis}
\\Bitte beachten Sie, dass der Geodaten Importer aufgrund der eingesetzten
Technologien derzeit nicht in der Lage ist, lesend auf die Oracle Datenbank
zuzugreifen. Entsprechend kann beim Import nicht festgestellt werden, ob sich
Shapefiles bereits in der Datenbank befinden, oder nicht. Ein erneuter Import
Vorgang der Geodaten würde also dazu führen, dass Geometrien doppelt in der
Datenbank abgelegt werden.

