ingo@3661: \section{Geodatenimport} ingo@3661: aheinecke@5007: Der Geodaten Importer ist ein in der Programmiersprache Python aheinecke@5007: geschriebenes Kommandozeilen Werkzeug zum Import von Shapefiles in aheinecke@5007: eine Datenbank. aheinecke@5007: Zum Lesen der Shapefiles und zum schreiben der Geodaten aheinecke@5007: in die Datenbank wird die GDAL Bibliothek verwendet. aheinecke@5007: Um Daten in eine Oracle Datenbank zu importieren ist es nötig, dass aheinecke@5007: GDAL und GDAL Python Bindungs mit Oracle Unterstützung installiert aheinecke@5007: sind. Bei der Verwendung von PostgreSQL entfällt dieser Schritt. aheinecke@5007: 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 aheinecke@5007: Dateisystem der BfG ausgerichtet. So wird beispielsweise 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: aheinecke@5007: \textbf{INFO: Found 3 unsupported features of type: wbkMultiLineString} ingo@3661: \\Gibt die Anzahl der Features an, die aufgrund ihres Datentyps nicht importiert aheinecke@5007: werden konnten. Wenn etwa Punkte erwartet wurden aber sich im Shapefile aheinecke@5007: Polygone befanden.\\ aheinecke@5007: aheinecke@5007: \textbf{INFO: Did not import values from fields: TYP ID GRUENDUNG BHW} aheinecke@5007: \\Manche Importer versuchen neben der Geographischen Information weitere aheinecke@5007: Felder in die Datenbank einzulesen. Um festzustellen ob ein Feld aufgrund aheinecke@5007: von Tippfehlern oder unterschiedlicher Schreibweise nicht importiert wurde, aheinecke@5007: gibt diese Information Auskunft darüber welche Felder aus der Shape Datei aheinecke@5007: nicht verwendet wurden.\\ 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 \\ aheinecke@5007: Attribute & name, kind, sectie, sobek \\ 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 \\ aheinecke@5007: Geometrie & LINESTRING, POINT \\ aheinecke@5007: Attribute & name, source, description, status\_date, agency, aheinecke@5007: dike\_km, range, z\_target, rated\_level, z \\ 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{Ü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 aheinecke@5007: \item GDAL ab Version 1.9 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@3670: aheinecke@5007: \subsubsection Oracle Instantclient\\ aheinecke@5007: % TODO: oracle_cx aheinecke@5007: Der Oracle Instantclient 11.2.0.2.0 wird benötigt, damit der Importer mittels Python aheinecke@5007: und GDAL in die bestehende Oracle Datenbank schreiben kann. Wenn Sie aheinecke@5007: eine PosgreSQL Datenbank verwenden, können Sie diesen Schritt überspringen. ingo@3670: aheinecke@5007: Zur Anbindung von Oracle ist es erforderlich, folgende Archive von aheinecke@5007: Oracle herunterzuladen (Sie benötigen dafür ein Oracle Benutzerkonto): aheinecke@5007: aheinecke@5007: Der Oracle Instantclient 11.2 wird benötigt, damit der Importer mittels Python aheinecke@5007: und GDAL in die bestehende Oracle Datenbank schreiben kann. Dazu ist es aheinecke@5007: erforderlich, folgende Archive von Oracle herunterzuladen. 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: aheinecke@5007: Zu finden sind die aheinecke@5007: Pakete unter:\\ aheinecke@5007: \href{http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html} aheinecke@5007: {http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html} aheinecke@5007: aheinecke@5007: aheinecke@5007: Um diese Pakete zu installieren, öffnen Sie eine Konsole und wechseln aheinecke@5007: in das Verzeichnis in welches Sie die heruntergeladenen Pakete aheinecke@5007: gespeichert haben. (z.B.: cd /home/benutzername/Downloads ) ingo@3670: Anschließend führen Sie folgende Befehle auf der Kommandozeile aus: ingo@3670: ingo@3670: \begin{lstlisting} aheinecke@5007: mkdir /opt ingo@3670: aheinecke@5007: unzip instantclient-basic-linux-x86-64-11.2.0.2.0.zip -d /opt aheinecke@5007: unzip instantclient-sdk-linux-x86-64-11.2.0.2.0.zip -d /opt aheinecke@5007: unzip instantclient-sqlplus-linux-x86-64-11.2.0.2.0.zip -d /opt ingo@3670: aheinecke@5007: mkdir /opt/instantclient_11_2/lib aheinecke@5007: cd /opt/instantclient_11_2/lib aheinecke@5007: ln -s ../libclntsh.so.11.1 . aheinecke@5007: ln -s ../libclntsh.so.11.1 libclntsh.so aheinecke@5007: ln -s ../libnnz11.so . aheinecke@5007: ln -s ../libocci.so.11.1 . aheinecke@5007: ln -s ../libocci.so.11.1 libocci.so aheinecke@5007: ln -s ../libociei.so . aheinecke@5007: ln -s ../libocijdbc11.so . aheinecke@5007: ln -s ../libsqlplusic.so . aheinecke@5007: ln -s ../libsqlplus.so . ingo@3670: aheinecke@5007: echo "/opt/instantclient_11_2/lib/" > /etc/ld.so.conf.d/oci.conf aheinecke@5007: ldconfig ingo@3670: \end{lstlisting} ingo@3670: aheinecke@5007: Sollten keine Fehler aufgetreten sein, haben Sie den \textit{Oracle ingo@3670: Instantclient 11.2} erfolgreich entpackt und im Dateisystem unter aheinecke@5007: \textit{/opt/instantclient\_11\_2} abgelegt. ingo@3670: aheinecke@5007: \subsubsection Python, Mapserver und GDAL\\ aheinecke@5007: Installieren Sie nun die restlichen benötigten Pakete. aheinecke@5007: Dazu installieren Sie zuerst einige Abhängigkeiten und anschließend die aheinecke@5007: von der Intevation GmbH bereitgestellten speziellen Versionen von gdal aheinecke@5007: und Mapserver. aheinecke@5007: % ^ Das sollte sich in zukunft ändern und alles in einem repo sein. aheinecke@5007: aheinecke@5007: Um die Abhängigkeiten zu installieren führen Sie bitte folgende Befehle aus: aheinecke@5007: aheinecke@5007: \begin{lstlisting} aheinecke@5007: zypper ar http://download.opensuse.org/repositories/home:/intevation:/bfg/SLE_11/ "intevation:bfg" aheinecke@5007: rpm --import http://download.opensuse.org/repositories/home:/intevation:/bfg/SLE_11/repodata/repomd.xml.key aheinecke@5007: zypper ref # Paketlist neu laden aheinecke@5007: zypper in python libgeos0 libproj0 proj netcdf libnetcdf4 xerces-c libxerces-c-3_0 FastCGI aheinecke@5007: zypper mr -d "intevation:bfg" aheinecke@5007: zypper ref # Paketliste neu laden aheinecke@5007: ln -s /usr/lib64/libproj.so.0.6.6 /usr/lib64/libproj.so aheinecke@5007: \end{lstlisting} aheinecke@5007: aheinecke@5007: Nun können Sie die unter \url{http://ftp.intevation.de/local/flys/2012-09-11/RPMS/x86\_64} aheinecke@5007: bereitgestellten Pakete: aheinecke@5007: \begin{itemize} aheinecke@5007: \item libgdal1-1.9.0-intevation1.x86\_64.rpm aheinecke@5007: \item gdal-1.9.0-intevation1.x86\_64.rpm aheinecke@5007: \item python-gdal-1.9.0-intevation1.x86\_64.rpm aheinecke@5007: \item mapserver-6.0.2-1.x86\_64.rpm ingo@3661: \end{itemize} ingo@3661: aheinecke@5007: Installieren. Laden Sie diese dazu Herunter und wechseln Sie in das Verzeichnis in welches Sie aheinecke@5007: die Pakete heruntergeladen haben und führen Sie dann folgende Befehle aus: aheinecke@5007: aheinecke@5007: \begin{lstlisting} aheinecke@5007: rpm -i --nodeps libgdal1-1.9.0-intevation1.x86_64.rpm gdal-1.9.0-intevation1.x86_64.rpm python-gdal-1.9.0-intevation1.x86_64.rpm aheinecke@5007: rpm -i --nodeps mapserver-6.0.2-1.x86_64.rpm aheinecke@5007: \end{lstlisting} aheinecke@5007: 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\_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: