changeset 7352:c6825778de1f

Merged double-precision branch.
author Sascha L. Teichmann <teichmann@intevation.de>
date Wed, 16 Oct 2013 13:03:13 +0200
parents 760ea7f08455 (current diff) 2d912b2a4bdf (diff)
children 809e76b7fe38
files backend/contrib/shpimporter/gauges.py backend/contrib/shpimporter/run.sh backend/doc/README.txt
diffstat 45 files changed, 1085 insertions(+), 1287 deletions(-) [+]
line wrap: on
line diff
--- a/backend/contrib/import_river.sh	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/contrib/import_river.sh	Wed Oct 16 13:03:13 2013 +0200
@@ -32,12 +32,15 @@
 DEFAULT_BACKEND_NAME="XE"
 JAR="hydr_morph/importer.jar"
 IMPORTER_DRY_RUN=false
-IMPORTER_MAINVALUE_TYPES=QWTD
+IMPORTER_MAINVALUE_TYPES=QWTD-
 IMPORTER_ANNOTATION_TYPES="conf/annotation-types.xml"
 
 
 MIN_MEMORY="8024m"
 
+# Default encoding. Change here if necessary
+export LC_ALL=de_DE@euro
+
 if [ -z "$OPTIONAL_LIBS" ]; then
     OPTIONAL_LIBS="$(dirname $0)/opt"
 fi
@@ -72,13 +75,13 @@
    --skip-hydro                    Skip import of hydrological data
    --skip-morpho                   Skip import of morphological data
    --skip-geo                      Skip import of geographic data
-   --skip-wst                      Skip import of wst data
+   --skip-prf                      Skip import of cross section data
 EOF
 exit 0
 }
 
 OPTS=`getopt -o ?u:w:h:p:d: \
-     -l help,username:,password:,host:,port:,db-name:,skip-hydro,skip-morpho,skip-geo,skip-wst,postgres \
+     -l help,username:,password:,host:,port:,db-name:,skip-hydro,skip-morpho,skip-geo,skip-prf,postgres \
      -n $0 -- "$@"`
 if [ $? != 0 ] ; then usage; fi
 eval set -- "$OPTS"
@@ -113,8 +116,8 @@
     "--skip-morpho")
       SKIP_MORPHO="TRUE"
       shift;;
-    "--skip-wst")
-      SKIP_WST="TRUE"
+    "--skip-prf")
+      SKIP_PRF="TRUE"
       shift;;
     "--skip-geo")
       SKIP_GEO="TRUE"
@@ -202,19 +205,20 @@
     -Dflys.backend.importer.dry.run=$IMPORTER_DRY_RUN \
     -Dflys.backend.importer.skip.annotations=false \
     -Dflys.backend.importer.skip.bwastr=false \
-    -Dflys.backend.importer.skip.da50s=false \
-    -Dflys.backend.importer.skip.da66s=false \
     -Dflys.backend.importer.skip.extra.wsts=false \
     -Dflys.backend.importer.skip.fixations=false \
     -Dflys.backend.importer.skip.flood.water=false \
     -Dflys.backend.importer.skip.flood.protection=false \
     -Dflys.backend.importer.skip.gauges=false \
-    -Dflys.backend.importer.skip.historical.discharge.tables=false \
+    -Dflys.backend.importer.skip.historical.discharge.tables=true \
     -Dflys.backend.importer.skip.hyks=false \
     -Dflys.backend.importer.skip.official.lines=false \
-    -Dflys.backend.importer.skip.prfs=false \
-    -Dflys.backend.importer.skip.w80s=false \
-    -Dflys.backend.importer.skip.wst=true \
+    -Dflys.backend.importer.skip.prfs=true \
+    -Dflys.backend.importer.skip.w80s=true \
+    -Dflys.backend.importer.skip.w80.csvs=true \
+    -Dflys.backend.importer.skip.da50s=true \
+    -Dflys.backend.importer.skip.da66s=true \
+    -Dflys.backend.importer.skip.wst=false \
     -Dflys.backend.importer.skip.measurement.stations=true \
     -Dflys.backend.importer.skip.waterlevel.differences=true \
     -Dflys.backend.importer.skip.waterlevels=true \
@@ -248,8 +252,6 @@
     -Dflys.backend.importer.dry.run=$IMPORTER_DRY_RUN \
     -Dflys.backend.importer.skip.annotations=true \
     -Dflys.backend.importer.skip.bwastr=true \
-    -Dflys.backend.importer.skip.da50s=true \
-    -Dflys.backend.importer.skip.da66s=true \
     -Dflys.backend.importer.skip.extra.wsts=true \
     -Dflys.backend.importer.skip.fixations=true \
     -Dflys.backend.importer.skip.flood.water=true \
@@ -260,6 +262,9 @@
     -Dflys.backend.importer.skip.official.lines=true \
     -Dflys.backend.importer.skip.prfs=true \
     -Dflys.backend.importer.skip.w80s=true \
+    -Dflys.backend.importer.skip.w80.csvs=true \
+    -Dflys.backend.importer.skip.da50s=true \
+    -Dflys.backend.importer.skip.da66s=true \
     -Dflys.backend.importer.skip.wst=true \
     -Dflys.backend.importer.skip.measurement.stations=false \
     -Dflys.backend.importer.skip.waterlevel.differences=false \
@@ -274,9 +279,9 @@
     $JAR
 }
 
-import_wst(){
-    LOG_FILE=${LOG_DIR}/wst.log
-    echo Importing WST data.
+import_prf(){
+    LOG_FILE=${LOG_DIR}/prf.log
+    echo Importing cross section data.
     echo Logging into: $LOG_FILE
     sed 's!./import.log!'"$LOG_FILE"'!' conf/log4j.properties > $LOG_DIR/log4j.properties
     java -jar \
@@ -294,8 +299,6 @@
     -Dflys.backend.importer.dry.run=$IMPORTER_DRY_RUN \
     -Dflys.backend.importer.skip.annotations=true \
     -Dflys.backend.importer.skip.bwastr=true \
-    -Dflys.backend.importer.skip.da50s=true \
-    -Dflys.backend.importer.skip.da66s=true \
     -Dflys.backend.importer.skip.extra.wsts=true \
     -Dflys.backend.importer.skip.fixations=true \
     -Dflys.backend.importer.skip.flood.water=true \
@@ -304,9 +307,12 @@
     -Dflys.backend.importer.skip.historical.discharge.tables=true \
     -Dflys.backend.importer.skip.hyks=true \
     -Dflys.backend.importer.skip.official.lines=true \
-    -Dflys.backend.importer.skip.prfs=true \
-    -Dflys.backend.importer.skip.w80s=true \
-    -Dflys.backend.importer.skip.wst=false \
+    -Dflys.backend.importer.skip.prfs=false \
+    -Dflys.backend.importer.skip.w80s=false \
+    -Dflys.backend.importer.skip.w80.csvs=false \
+    -Dflys.backend.importer.skip.da50s=false \
+    -Dflys.backend.importer.skip.da66s=false \
+    -Dflys.backend.importer.skip.wst=true \
     -Dflys.backend.importer.skip.measurement.stations=true \
     -Dflys.backend.importer.skip.waterlevel.differences=true \
     -Dflys.backend.importer.skip.waterlevels=true \
@@ -333,7 +339,7 @@
     --directory $RIVER_PATH \
     --river_name "$RIVER_NAME" \
     --ogr_connection "$OGR_CONNECTION" \
-    --host $DBHOST \
+    --host $DBHOST/$BACKEND_NAME \
     --user $DBUSER \
     --password $DBPASS \
     --verbose 1 \
@@ -344,8 +350,8 @@
 if [ "$SKIP_HYDRO" != "TRUE" ]; then
 import_hydro
 fi
-if [ "$SKIP_WST" != "TRUE" ]; then
-import_wst
+if [ "$SKIP_PRF" != "TRUE" ]; then
+import_prf
 fi
 if [ "$SKIP_MORPHO" != "TRUE" ]; then
 import_morpho
--- a/backend/contrib/run_geo.sh	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/contrib/run_geo.sh	Wed Oct 16 13:03:13 2013 +0200
@@ -1,11 +1,8 @@
 #!/bin/sh
 
-# Required
-RIVER_PATH="/vol1/projects/Geospatial/flys-3.0/testdaten/Gewaesser/Saar"
-RIVER_NAME="Saar"
-
 # Set this to your target database for Oracle
 HOST=localhost
+BACKEND_NAME="XE"
 USER=flys28
 PASS=flys28
 # Alternatively you can provide a direct connection string:
@@ -22,14 +19,21 @@
 SKIP_HYDR_BOUNDARIES=0
 SKIP_HWS_LINES=0
 SKIP_HWS_POINTS=0
-SKIP_GAUGE_LOCATION=0
-SKIP_CATCHMENTS=0
 SKIP_UESG=0
 SKIP_DGM=0
 SKIP_JETTIES=0
 SKIP_FLOODMARKS=0
 
+# Default encoding. Change here if necessary
+export LC_ALL=de_DE@euro
+
 # There should be no need to change anything below this line
+GEW_FILE="$1"
+RIVER_NAME=$(grep "Gew.sser" "$1" | sed 's/Gew.sser: //')
+
+RIVER_PATH=$(grep "WSTDatei:" "$GEW_FILE" | awk '{print $2}')
+RIVER_PATH=$(dirname "$RIVER_PATH")/../..
+RIVER_PATH=$(readlink -f "$RIVER_PATH")
 
 DIR=`dirname $0`
 DIR=`readlink -f "$DIR"`
@@ -48,7 +52,7 @@
     --directory $RIVER_PATH \
     --river_name "$RIVER_NAME" \
     --ogr_connection "$OGR_CONNECTION" \
-    --host $HOST \
+    --host $HOST/$BACKEND_NAME \
     --user $USER \
     --password $PASS \
     --verbose $VERBOSE \
@@ -59,7 +63,6 @@
     --skip_buildings $SKIP_BUILDINGS \
     --skip_floodplains $SKIP_FLOODPLAINS \
     --skip_hydr_boundaries $SKIP_HYDR_BOUNDARIES \
-    --skip_gauge_locations $SKIP_GAUGE_LOCATION \
     --skip_uesgs $SKIP_UESG \
     --skip_hws_lines $SKIP_HWS_LINES \
     --skip_hws_points $SKIP_HWS_POINTS \
--- a/backend/contrib/run_hydr_morph.sh	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/contrib/run_hydr_morph.sh	Wed Oct 16 13:03:13 2013 +0200
@@ -1,7 +1,6 @@
 #!/bin/bash
 
 ######################### CONFIG OPTIONS ############################
-INFO_GEW="/vol1/projects/Geospatial/flys-3.0/testdaten/saar.gew"
 BACKEND_USER="flys28"
 BACKEND_PASS="flys28"
 BACKEND_HOST="czech-republic.atlas.intevation.de"
@@ -22,7 +21,7 @@
 
 ######################## Custom Importer Settings ###################
 IMPORTER_DRY_RUN=false
-IMPORTER_MAINVALUE_TYPES=QWTD
+IMPORTER_MAINVALUE_TYPES=QWTD-
 IMPORTER_ANNOTATION_TYPES="conf/annotation-types.xml"
 
 IMPORTER_SKIP_ANNOTATIONS=false
@@ -34,7 +33,7 @@
 IMPORTER_SKIP_FLOOD_WATER=false
 IMPORTER_SKIP_FLOOD_PROTECTION=false
 IMPORTER_SKIP_GAUGES=false
-IMPORTER_SKIP_HISTORICAL_DISCHARGE_GAUGES=false
+IMPORTER_SKIP_HISTORICAL_DISCHARGE_GAUGES=true
 IMPORTER_SKIP_HYKS=false
 IMPORTER_SKIP_OFFICIAL_LINES=false
 IMPORTER_SKIP_PRFS=false
@@ -54,11 +53,11 @@
 IMPORTER_SKIP_WATERLEVEL_DIFFERENCES=false
 #####################################################################
 
-#MIN_MEMORY="8192m"
-MIN_MEMORY="1024m"
-
+MIN_MEMORY="8192m"
 
 ######################### Run Importer ##############################
+INFO_GEW=$1
+
 OPTIONAL_LIBS="${DIR}"/../opt
 if [ -d "$OPTIONAL_LIBS" ]; then
     export PATH="$OPTIONAL_LIBS/bin:$PATH"
@@ -66,7 +65,8 @@
     export LD_LIBRARY_PATH="$OPTIONAL_LIBS/lib64:$LD_LIBRARY_PATH"
 fi
 
-export LC_ALL=de_DE@euro # Workaround encoding problem
+# Default encoding. Change here if necessary
+export LC_ALL=de_DE@euro
 
 exec java -jar \
     -Xmx$MIN_MEMORY \
--- a/backend/contrib/shpimporter/axis.py	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/contrib/shpimporter/axis.py	Wed Oct 16 13:03:13 2013 +0200
@@ -38,7 +38,7 @@
     def createNewFeature(self, featureDef, feat, **args):
         newFeat = ogr.Feature(featureDef)
         geometry = feat.GetGeometryRef()
-        geometry.SetCoordinateDimension(3)
+        geometry.SetCoordinateDimension(2)
         newFeat.SetGeometry(geometry)
         newFeat.SetField("name", args['name'])
 
--- a/backend/contrib/shpimporter/boundaries.py	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/contrib/shpimporter/boundaries.py	Wed Oct 16 13:03:13 2013 +0200
@@ -84,7 +84,7 @@
     def isShapeRelevant(self, name, path):
         shp = ogr.Open(path)
         if self.isGeometryValid(shp.GetLayerByName(name).GetGeomType()) and \
-                self.getKind(path) > 0:
+                self.getKind(path) > 0 and not "talaue" in path.lower():
             return True
         else:
             return False
--- a/backend/contrib/shpimporter/dgm.py	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/contrib/shpimporter/dgm.py	Wed Oct 16 13:03:13 2013 +0200
@@ -122,8 +122,10 @@
                     else:
                         values.append(unicode.encode(
                             fields[namedict[val]], "UTF-8"))
-                km_von = fields[namedict["km_von"]]
-                km_bis = fields[namedict["km_bis"]]
+                km_von = min(float(fields[namedict["km_von"]]), 
+                    float(fields[namedict["km_bis"]]))
+                km_bis = max(float(fields[namedict["km_von"]]), 
+                    float(fields[namedict["km_bis"]]))
                 year_from = None
                 year_to = None
                 try:
--- a/backend/contrib/shpimporter/floodmarks.py	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/contrib/shpimporter/floodmarks.py	Wed Oct 16 13:03:13 2013 +0200
@@ -15,13 +15,6 @@
 
 logger = logging.getLogger(NAME)
 
-BUILDING_KINDS= {
-        "sonstige" : 0,
-        "brücken"  : 1,
-        "wehre"    : 2,
-        "pegel"    : 3,
-        }
-
 class Floodmark(Importer):
     fieldmap = {
             "^station$"       : "km",
--- a/backend/contrib/shpimporter/gauges.py	Wed Oct 16 12:39:33 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-try:
-    from osgeo import ogr
-except ImportError:
-    import ogr
-
-from importer import Importer
-
-TABLE_NAME="gauge_location"
-PATH="Hydrologie/Streckendaten"
-NAME="Gauge locations"
-
-
-class GaugeLocation(Importer):
-
-    def getPath(self, base):
-        return "%s/%s" % (base, PATH)
-
-
-    def getTablename(self):
-        return TABLE_NAME
-
-
-    def getName(self):
-        return NAME
-
-
-    def isGeometryValid(self, geomType):
-        return geomType == 1
-
-
-    def isShapeRelevant(self, name, path):
-        return True
-
-
-    def createNewFeature(self, featureDef, feat, **args):
-        newFeat  = ogr.Feature(featureDef)
-        geometry = feat.GetGeometryRef()
-        geometry.SetCoordinateDimension(2)
-
-        newFeat.SetGeometry(geometry)
-
-        if self.IsFieldSet(feat, "river_id"):
-            newFeat.SetField("river_id", feat.GetField("river_id"))
-        else:
-            newFeat.SetField("river_id", self.river_id)
-
-        if self.IsFieldSet(feat, "Name"):
-            newFeat.SetField("name", feat.GetField("name"))
-        elif self.IsFieldSet(feat, "MPNAAM"):
-            newFeat.SetField("name", feat.GetField("MPNAAM"))
-        else:
-            newFeat.SetField("name", args['name'])
-
-        return newFeat
-
--- a/backend/contrib/shpimporter/km.py	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/contrib/shpimporter/km.py	Wed Oct 16 13:03:13 2013 +0200
@@ -25,7 +25,7 @@
 
 
     def isGeometryValid(self, geomType):
-        return geomType == 1
+        return geomType == ogr.wkbPoint or geomType == ogr.wkbPoint25D
 
 
     def isShapeRelevant(self, name, path):
--- a/backend/contrib/shpimporter/run.sh	Wed Oct 16 12:39:33 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-#!/bin/sh
-
-# Required
-RIVER_PATH="/path/to/rivers/river"
-RIVER_ID=1
-TARGET_SRS=31466
-HOST=localhost
-USER=the_user
-PASS=the_pass
-
-# Optional
-VERBOSE=1
-SKIP_AXIS=0
-SKIP_KMS=0
-SKIP_CROSSSECTIONS=0
-SKIP_LINES=0
-SKIP_FIXPOINTS=0
-SKIP_BUILDINGS=0
-SKIP_FLOODPLAINS=0
-SKIP_HYDR_BOUNDARIES=0
-SKIP_HWS=0
-SKIP_GAUGE_LOCATION=0
-SKIP_UESG=0
-
-exec python shpimporter.py \
-    --directory $RIVER_PATH \
-    --river_id $RIVER_ID \
-    --target_srs $TARGET_SRS \
-    --host $HOST \
-    --user $USER \
-    --password $PASS \
-    --verbose $VERBOSE \
-    --skip_axis $SKIP_AXIS \
-    --skip_kms $SKIP_KMS \
-    --skip_crosssections $SKIP_CROSSSECTIONS \
-    --skip_lines $SKIP_LINES \
-    --skip_fixpoints $SKIP_FIXPOINTS \
-    --skip_buildings $SKIP_BUILDINGS \
-    --skip_floodplains $SKIP_FLOODPLAINS \
-    --skip_hydr_boundaries $SKIP_HYDR_BOUNDARIES \
-    --skip_hws $SKIP_HWS \
-    --skip_gauge_locations $SKIP_GAUGE_LOCATION \
-    --skip_uesgs $SKIP_UESG
-
--- a/backend/contrib/shpimporter/shpimporter.py	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/contrib/shpimporter/shpimporter.py	Wed Oct 16 13:03:13 2013 +0200
@@ -17,7 +17,6 @@
 from floodplains import Floodplain
 from boundaries import HydrBoundary, HydrBoundaryPoly
 from hws import HWSLines, HWSPoints
-from gauges import GaugeLocation
 from jetties import Jetties
 from dgm import insertRiverDgm
 from floodmarks import Floodmark
@@ -47,7 +46,6 @@
         HydrBoundaryPoly(river_id, dbconn, dry_run),
         HWSLines(river_id, dbconn, dry_run),
         HWSPoints(river_id, dbconn, dry_run),
-        GaugeLocation(river_id, dbconn, dry_run),
         Jetties(river_id, dbconn, dry_run),
         Floodmark(river_id, dbconn, dry_run),
         UESG(river_id, dbconn, dry_run)
@@ -73,7 +71,6 @@
     parser.add_option("--skip_floodplains", type="int")
     parser.add_option("--skip_hws_lines", type="int")
     parser.add_option("--skip_hws_points", type="int")
-    parser.add_option("--skip_gauge_locations", type="int")
     parser.add_option("--skip_kms", type="int")
     parser.add_option("--skip_uesgs", type="int")
     parser.add_option("--skip_dgm", type="int")
@@ -125,8 +122,6 @@
     elif config.skip_hws_points == 1 and isinstance(importer, HWSPoints) and \
             not isinstance(importer, HWSLines):
         return True
-    elif config.skip_gauge_locations == 1 and isinstance(importer, GaugeLocation):
-        return True
     elif config.skip_jetties == 1 and isinstance(importer, Jetties):
         return True
     elif config.skip_kms == 1 and isinstance(importer, KM):
--- a/backend/doc/README.txt	Wed Oct 16 12:39:33 2013 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,528 +0,0 @@
-FLYS3-Importer
-
-Der FLYS3-Importer dient dazu, hydrologische und morphologische
-Gewässerdaten aus dem Dateisystem in die FLYS3-Datenbank zu importieren.
-Das Werkzeug orientiert sich hierbei an der Dateihierachie,
-so wie sie auch von Desktop-FLYS ausgelesen wird.
-
-Als Startargument bekommt der Importer den Pfad zu einer
-GEW-Datei übergeben. 
-
-Wichtig für den Importer sind in dieser Datei
-die Zeilen, die mit "WSTDatei:" beginnen. In ihnen wird der 
-Pfad zu der zentralen WST-Datei des jeweiligen Gewässers angegeben.
-Alle anderen importierten Dateien werden in ihrer Lage relativ zur 
-Lage dieser Datei betrachtet.
-
-Das Verhalten des Importes kann mit sogenannten
-System-Properties gesteuert werden. Diese werden im
-Allgemeinen in der Form -Dkey=value angegeben.
-
-Will man z.B. mit dem Importer nur einen simulierten Import
-durchführen (also nicht in die Datenbank geschrieben werden),
-dann kann dies über die Angabe von
-'-Dflys.backend.importer.dry.run=true' erfolgen.
-
-!!! Der Import geht wie Desktop-FLYS davon aus, dass die Dateien
-!!! Latin-1 encodiert vorliegen.
-
-Für den Importer stellt jeweils der Import eines Gewässers eine
-transaktionale Einheit dar. Wird der Import während eines Gewässers
-abgebrochen, werden alle Änderungen bzgl. dieses Gewässers zurück gerollt.
-
-Importierte Daten:
-
-Der Importer importiert folgende Datentypen:
-
-- Streckenfavoriten (*.km-Dateien)
-  Der Import kann mit '-Dflys.backend.importer.skip.annotations=true'
-  unterdrückt werden.
-
-  Zur Klassifikation von Streckenfavoriten kann mit
-  -Dflys.backend.importer.annotation.types=DATEI
-  der Pfad zu einer XML-Datei angegeben werden, in der über
-  Regeln festgelegt wird, wie diese geschehen soll.
-  Details hierzu im Anhang 'Klassifikation von Streckenfavoriten'.
-
-- Pegel, Stammdaten (*.glt, *.sta-Dateien):
-  Der Import kann mit '-Dflys.backend.importer.skip.gauges=true'
-  unterdrückt werden.
-  Die .glt-Datei, die neben der .wst-Datei liegt, wird zuerst
-  ausgelesen. Es werden nur *.sta-Datei von Pegeln geladen, die
-  in der .glt-Datei vermerkt sind.
-
-  Wenn "-Dflys.backend.sta.parse.gauge.numbers=true' wird versucht,
-  die offiziellen Pegelnummern aus den Stammdaten zu extrahieren.
-  !!! Dies ist mit Vorsicht zu behandeln, denn die meisten STA-Dateien
-  !!! Enthalten invalide Pegelnummern.
-
-  Die System-Property "flys.backend.main.value.types" kann einen
-  String mit gültigen Typen von Stammdaten enthalten. Vorbelegt
-  ist "QWTD". In der Praxis ist "QWD" eine sinnvolle Belegung.
-
-- Basis-Wasserstände (gewaesser.wst-Dateien):
-  Der Import kann mit '-Dflys.backend.importer.skip.wst=true'
-  unterdrückt werden.
-
-- Zusätzliche Längsschnitte (*.zus, *.wst-Dateien)
-  Der Import kann mit '-Dflys.backend.importer.skip.extra.wsts=true'
-  unterdrückt werden.
-  Es werden die *.zus- und *.wst-Dateien aus dem Verzeichnis
-  "../Zus.Längsschnitte" relativ zur gewaesser.wst-Datei betrachtet.
-
-- Fixierungen (*.wst-Dateien)
-  Der Import kann mit '-Dflys.backend.importer.skip.fixations=true'
-  unterdrückt werden.
-  Es werden die *.wst-Dateien aus dem Verzeichnis
-  "../Fixierungen" relativ zur gewaesser.wst-Datei betrachtet.
-
-- Amtliche Linien (*.wst-Dateien)
-  Der Import kann mit '-Dflys.backend.importer.skip.official.lines=true'
-  unterdrückt werden.
-  Es werden die "Amtl_Linien.wst"-Dateien aus dem Verzeichnis
-  "../Basisdaten" und "../Fixierungen" relativ zur gewaesser.wst-Datei betrachtet.
-
-- Profilspuren (*.prf-Dateien)
-  Der Import kann mit '-Dflys.backend.importer.skip.prfs=true'
-  unterdrückt werden.
-  Es werden rekursiv alle *.prf-Dateien aus "../../.." relativ
-  zur gewaesser.wst-Datei betrachtet. Vor dem Import werden
-  mithilfe eines Längen- und eines MD5-Summen-Vergleichs
-  inhaltliche Duplikate ausgeschlossen.
-
-- Hydraulische Kennzahlen (*.hyk)
-  Der Import kann mit '-Dflys.backend.importer.skip.hyks=true'
-  unterdrückt werden.
-  Es werden rekursiv alle *.hyk-Dateien aus "../../.." relativ
-  zur gewaesser.wst-Datei betrachtet. Vor dem Import werden
-  mithilfe eines Längen- und eines MD5-Summen-Vergleichs
-  inhaltliche Duplikate ausgeschlossen.
-
-- Hochwassermarken (*.zus, *.wst)
-  Der Import kann mit '-Dflys.backend.importer.skip.flood.water=true'
-  unterdrückt werden.
-  Es werden die *.zus- und *.wst-Dateien aus dem Verzeichnis
-  "../HW-Marken" relativ zur gewaesser.wst-Datei betrachtet.
-
-- Hochwasserschutzanlagen (*.zus)
-  Der Import kann mit '-Dflys.backend.importer.skip.flood.protection=true'
-  unterdrückt werden.
-  Es werden die *.zus- und *.wst-Dateien aus dem Verzeichnis
-  "../HW-Schutzanlagen" relativ zur gewaesser.wst-Datei betrachtet.
-
-  TODO INGO:
-
-  flys.backend.importer.skip.bed.height.single
-  flys.backend.importer.skip.bed.height.epoch
-  flys.backend.importer.skip.sediment.density
-  flys.backend.importer.skip.morphological.width
-  flys.backend.importer.skip.flow.velocity
-  flys.backend.importer.skip.sediment.yield
-  flys.backend.importer.skip.waterlevels
-  flys.backend.importer.skip.waterlevel.differences
-  flys.backend.importer.skip.sq.relation
-
-Für die Verbindung zur Datenbank ist es nötig, dem Import
-die Verbindungsdaten zu übergeben. Dies geschieht ebenfalls
-über System-Properties:
-
-  -Dflys.backend.user=NUTZER
-   Datenbanknutzer
-
-  -Dflys.backend.password=PASSWORT
-   Datenbankpasswort
-
-  -Dflys.backend.url=URL
-   URL zur Datenbank. Typische wäre im Fall einer Oracle-XE-Edition z.B.:
-   jdbc:oracle:thin:@//RECHNER:PORT/XE
-   mit RECHNER Name des Servers, auf dem die Datenbank läuft
-   und PORT der Port auf dem die Datenbank konkret zu erreichen ist.
-   Weitere Details unter http://www.orafaq.com/wiki/JDBC
-
- -Dflys.backend.driver=TREIBER
-  mit TREIBER dem Namen des JDBC-Treibers, der es erlaubt
-  das Protokoll der Datenbank zu sprechen. Im Falle
-  einer Oracle XE wäre dies z.B.:
-  oracle.jdbc.OracleDriver
-
- -Dflys.backend.dialect=DIALECT
-  mit DIALECT dem Hibernate-Dialekt, den die Datenbank versteht.
-  Im Falle eine Oracle-XE wäre dies z.B.:
-  org.hibernate.dialect.OracleDialect
-
-
-Hinweise zum Betrieb:
----------------------
-
-    Der Speicherverbrauch des Importers ist sehr hoch. Es ist empfehlenswert,
-    der JVM mindestens 8GiB Hauptspeicher zuzuordnen: '-Xmx8192m'
-    Besonders speicherintensiv ist der Import der HYKs und der PRFs.
-    Hier ist es unter Umständen empfehlenswert, diese in zwei oder drei
-    Schritten zu importieren. Zuerst die sonstigen hydrologischen Daten
-    (hierbei mit flys.backend.importer.skip.hyks=true und flys.backend.importer.skip.prfs
-    den Import der HYKs und PRFs verhindern). Dann die HYKs (mit flys.backend.importer.skip.*
-    der anderen Daten) und im finalen Schritt dann die PRFs.
-
-Anhang 'Klassifikation von Streckenfavoriten'
----------------------------------------------
-Streckenfavoriten werden aus KM-Dateien importiert. Um die einzelnen Einträge
-eine Kategorie (Brücken, Pegel, etc.) zuzuordnen, kann eine XML angegeben werden,
-in der Regeln für diese Klassifikation definiert werden. Schematisch gliedert
-sich diese Datei in die zwei Bereiche 'types' und 'patterns':
-
-<annotation>
-    <types> ...  </types>
-    <patterns> ...  </patterns>
-</annotation>
-
-In der Sektion 'types' werden die Kategorien vereinbart, in die
-klassifiziert werden sollen. Die geschieht mit einzelnen
-
-  <type name="Pegel"/>
-  <type name="Brücke"/>
-  ...
-  <type name="Sonstige" default="true"/>
-
-Das Attribut 'default' kann einmal vergeben werden und
-besagt, dass diese Kategorie gewählt werden soll, wenn
-keine andere Kategorie zugeordnet werden kann.
-
-In der Sektion 'patterns' werden dann die Regel
-definiert, die einzelne Einträge den definierten Kategorien
-zuordnet. Hierfür können zwei Arten von Definitionen
-angegeben werden:
-
-  <file pattern="^Brücken$" type="Brücke"/>
-
-oder
-
-  <line pattern="^Brücke[:\s].*$" type="Brücke"/>
-
-Die erste Variante bestimmt die Kategorie, die pro KM-Datei
-gelten soll. 'pattern' ist hierbei ein regulärer Ausdruck,
-der auf den Dateinamen angewandt wird. Passt der Name
-der Datei auf den regulären Ausdruck, wird 'type' als
-Vorgabe angenommen. Treffen mehrere <file>-Regeln zu,
-wird der erste Treffer angewandt. Findet keine der <file>-Regeln
-Anwendung, wird die Kategorie ausgewählt, die in der <types>-Section
-das Attribut 'default' gesetzt hat.
-
-Die zweite Regel-Variante <line> wird auf jeden Eintrag
-innerhalb einer KM-Datei auf den Bezeichner der Streckenfavoriten
-angewandt. Als Muster dient auch hier ein regulärer Ausdruck,
-der über das Attribut 'pattern' definiert wird. Die Kategorie
-wird in Trefferfall über das Attribut 'type' bestimmt. Treffen
-mehrere Regeln zu, wird die Kategorie gewählt, die zum ersten
-Treffer gehört. Trifft keine Regel zu wird der Eintrag der
-Kategorie zugeteilt, die für die beinhaltende Datei als Vorgabe
-gilt.
-
-Anhang 'Fehler und Warnungen':
-=============================
-
-Fehler:
--------
-
-- 'error while parsing gew'
-  Die GEW-Datei ist fehlerhaft oder konnte nicht geöffnet werden.
-
-- 'File 'XYZ' is broken!'
-  Die Datei XYZ ist inkonsistent und führt zu Fehlern.
-
-- 'Error while parsing file for morph. width.'
-  Beim Lesen der morphologischen Breite trat ein Fehler auf.
-
-- 'Error while storing flow velocity model.'
-  Beim Schreiben eines Fliessgeschwindigkeitsmodells trat ein Fehler auf.
-
-- 'Error while storing flow velocity measurement.'
-  Beim Schreiben einer Fliessgeschwindigkeitsmessung trat ein Fehler auf. 
-
-- 'Error while storing sediment yield.'
-  Beim Schreiben einer Sedimentablagerung trat ein Fehler auf.
-
-- 'Error while storing waterlevel diff.'
-  Beim Schreiben einer Wassspiegeldifferenz trat ein Fehler auf.
-
-- 'Error while storing sq relation.'
-  Beim Schreiben einer S(Q) Beziehung trat ein Fehler auf.
-
-- 'Error reading PRF file.'
-  Beim Lesen einer PRF-Datei trat ein Fehler auf.
-
-- 'Error closing PRF file.'
-  Beim Schliessen einer PRF-Datei trat ein Fehler auf.
-
-- 'HYK 1: not enough elements in line #'
-- 'HYK 2: not enough elements in line #'
-- 'HYK 5: not enough elements in line #'
-- 'HYK 6: not enough elements in line #'
-  Eine Zeile in einer HYK-Datei hat nicht genügend Elemente.
-
-- 'HYK: parsing num zones, bottom or top height failed in line #'
-- 'HYK: HYK: number of flow zones mismatches in line #'
-  Die Anzahl der Zonen oder Daten über die Zonen sind nicht korrekt.
-
-- 'HYK: cannot parse number in line #'
-  Eine Zahl wurde erwartet.
-
-- 'HYK: Error reading file.'
-  Beim Lesen einer HYK-Datei trat ein Fehler auf.
-
-- 'HYK: Error closing file.'
-  Beim Schliessen einer HYK-Datei trat ein Fehler auf.
-
-Warnungen:
-----------
-
-- 'annotation type file 'XYZ' is not readable.'
-  Die Datein XYZ kann nicht gelesen werden.
-
-- 'cannot parse annotation types file.'
-  Während der Verarbeitung der Annotationsdatei ist Fehler aufgetreten.
-
-- 'Cannot read directory.'
-  verzeichnis konnte nicht gelesen werden.
-
-- 'no official lines wst file found'
-  Keine Datei mit amtlichen Linien gefunden.
-
-- 'cannot read fixations wst file directory'
-  Das Verzeichnis mit den Fixierungen kann nicht gelesen werden.
-
-- 'cannot read extra longitudinal wst file directory'
-  Das Verzeichnis mit den zusätzlichen Längsschnitten kann nicht gelesen werden.
-
-- 'cannot read gauges from 'XYZ''
-  Die Pegelgültigkeiten können nicht gelesen werden.
-
-- 'HYK file 'XYZ' seems to be a duplicate.'
-  Die HYK-Datei wurde unter anderem Namen aber gleichen Inhalts
-  bereits gefunden.
-
-- 'PRF file 'XYZ' seems to be a duplicate.'
-  Die PRF-Datei wurde unter anderem Namen aber gleichen Inhalts
-  bereits gefunden.
-
-- 'Skip invalid SedimentYield: time interval or unit null!'
-  Eine Sedimentablagerung ist ungültig und wurde ausgelassen.
-
-- 'skip flow velocity model: No discharge zone specified.'
-  Da kein Abflussbereich angegeben wurde, wurde das Fliessgeschwindigkeitsmodell ausgelassen.
-
-- 'skip invalid waterlevel - no unit set!'
-  Ein einheitenloser Wasserstand wurde ausgelassen.
-
-- 'Cannot parse time range.'
-  Das Zeitformat wurde nicht erkannt.
-
-- 'skip invalid data line #'
-  Ungültige Datenzeile wurde ausgelassen.
-
-- 'Error while parsing sq relation row #'
-  Eine Zeile in der S(Q)-Beziehung ist ungültig.
-
-- 'GLT: no gauge found in line #'
-  In der GLT-Datei wurde ein Pegel erwartet, aber nicht gefunden.
-
-- 'GLT: line # has not enough columns.'
-  Eine Zeile in der Pegelgültigkeitsdatei hat nicht genug spalten.
-
-- 'Error while parsing flow velocity values.'
-- 'skip invalid data line: #'
-  Invalide Datenzeile in einer Datei mit einer Fliessgeschwindigkeitsmessung.
-
-- 'skip invalid waterlevel line: #'
-- 'Error while parsing value: #'
-- 'Error while parsing station: #'
-  Invalide Datenzeile in einer Datei mit Wasserstandsdifferenzen.
-
-- 'skip invalid MainValue part: #'
-- 'skip invalid gauge part: #'
-- 'Error while parsing Q value: <Q>'
-- 'skip invalid data line: #'
-- 'Error while parsing flow velocity values.'
-  Invalide Datenzeile in einer Datei Fliessgeschwindigkeitsmodellen.
-
-- 'Error while parsing number from data row: #'
-  TODO INGO
-
-- 'Unknown meta line: #'
-- 'Error while parsing numbers in: #'
-- 'skip invalid data line: #'
-- 'Error while parsing numbers in #'
-  Invalide Datenzeile in einer Datei mit Sedimentdichten.
-
-- 'STA file is empty'
-- 'STA file has not enough lines'
-- 'STA file is too short'
-  Stammdatendatei ist leer oder hat zu wenige Zeilen.
-
-- 'First line in STA file is too short.'
-  Die erste Zeile der Stammdaten ist zu kurz.
-
-- 'STA: second line is too short'
-  Die zweite Zeile ist zu kurz.
-
-- 'STA: parsing of the datum of the gauge failed'
-
-- 'STA: 'XYZ' is not a valid long number.'
-  Die Pegelnummer ist invalide.
-
-- 'STA: Not enough columns for aeo and datum.
-  AEO und Pegelnullpunkt können nicht ermittelt werden.
-
-- 'STA: cannot parse aeo or datum.'
-  AEO oder Pegelnullpunkt sind invalide.
-
-- 'STA: value not parseable in line #'
-  Wert ist nicht als Zahl zu interpretieren.
-  
-- 'PRF: cannot open file <FILE>'
-  Die PRF kann nicht geöffnet werden.
-
-- PRF: file is empty
-- PRF: First line does not look like a PRF data pattern.
-- PRF: premature EOF. Expected integer in line 2
-- PRF: Expected <num> in line 2
-- PRF: invalid integer in line 2
-- PRF: premature EOF. Expected pattern for km extraction
-- PRF: line 4 does not look like a PRF km extraction pattern.
-- PRF: premature EOF. Expected skip row count.
-- PRF: line 5 is not an positive integer.
-- PRF: cannot extract km in line #
-  Das PRF-Format ist komplex. Hier sollten weitere Information
-  zur genaueren Analyse herangezogen werden.
-
-- 'cannot access WST file <FILE>'
-  Die WST-Datei konnte nicht gefunden werden.
-
-- 'Found an invalid row in the AT file.'
-  Eine Zeile in einer AT-Datei ist nicht korrekt.
-
-- 'AT: invalid number <XYZ>'
-  Eine Zahl wurde erwartet aber nicht gefunden.
-
-- 'Try to add Q range without waterlevel!'
-  Q-Bereich ohne Wasserstand gefunden.
-
-- 'Error while parsing Q range: #'
-  Invalider Q-Bereich
-
-- 'skip invalid waterlevel line: #'
-  Ungültige Wasserstandslinie
-
-- 'Error while parsing number values: #'
-  Ungültige Zahlenwerte.
-
-- 'ANN: not enough columns in line #'
-  Nicht genug Zeichenspalten in KM-Datei
-
-- 'ANN: invalid number in line #'
-  Ungültige Zahl.
-
-- 'ANN: cannot parse 'Unterkante' in line #'
-  Die Unterkante in einer KM-Datei konnte nicht gelesen werden.
-
-- 'ANN: cannot parse 'Unterkante' or 'Oberkante' in line #'
-  Unter- oder Oberkannte liegen in einem falschen Format vor.
-
-- 'ANN: duplicated annotation 'XYZ' in line #'
-  Ein Duplikat eines Streckenfavoriten wurde gefunden.
-
-- 'ANN: 'XYZ' is not a directory.'
-  Unterverzeichnis konnte nicht geöffnet werden.
-
-- 'ANN: cannot list directory 'XYZ''
-  Unterverzeichnis konnte nicht durchsucht werden.
-
-- 'BHP: Meta line did not match any known type: #'
-  Unbekannter Typ.
-
-- 'BHP: Error while parsing timeinterval!'
-  Ungültiges Zeitinterval.
-
-- 'BHP: Error while parsing year!'
-  Ungültige Jahresangabe.
-
-- 'BHP: Error while parsing sounding width!'
-  Unbekannte Peilungsbreite.
-
-- 'BHP: Error while parsing range!'
-  Bereichsangabe fehlerhaft.
-
-- 'MWP: Unknown meta line: #'
-  Meta-Informationen ungültig.
-
-- 'MWP: skip invalid data line: #'
-  Ungültige Datenzeile wurde übersprungen.
-
-- 'MWP: Error while parsing numbers in #'
-  Falsche Zahlenformat.
-
-- 'ANNCLASS: rule has no name'
-  Klassifizierungsregel für Streckenfavoriten hat keinen Namen.
-
-- 'ANNCLASS: pattern has no 'pattern' attribute.'
-  Klassifizierungsmuster für Streckenfavoriten hat kein Muster.
-
-- 'ANNCLASS: pattern has unknown type 'XYZ''
-  Klassifizierungsmuster für Streckenfavoriten konnte keinem Typ zugeordnet werden.
-
-- 'ANNCLASS: pattern 'XYZ' is invalid.'
-  Klassifizierungsmuster für Streckenfavoriten ist ungültig.
-
-- 'BSP: Error while parsing data row.'
-  Ungültige Datenzeile.
-
-- 'SYP: Unknown meta line: #'
-  Ungültige Metadatenzeile.
-
-- 'SYP: skip invalid data line #'
-  Ungültige Datenzeile wurde übersprungen.
-
-- 'SYP: Error while parsing numbers in #'
-  Ungültige Zahlenformatierung.
-
-- 'SYP: Unknown time interval string <XYZ>'
-  Falsches Datumformat.
-
-- 'SYP: Error while parsing years <XYZ>'
-  Falsches Jahreszahlformat.
- 
-- 'SYP: Error while parsing ranges of <XYZ>'
-  Bereichsangaben fehlerhaft.
-
-- 'SYP: Unknown grain fraction <XYZ>'
-  Unbekannte Kornfraktion.
-
-- 'WST: invalid number.'
-  Ungültige Zahl.
-
-- 'WST: km <km> (<Zeile>) found more than once. -> ignored.'
-  Ein Kilometer ist doppelt in einer WST-Datei enthalten.
-
-- 'HYK: zone coordinates swapped in line #'
-  Fliesszonenkordinaten wurden in umgekehrter Reihenfolge angeben.
-
-- 'BHS: Skip invalid file 'XYZ''
-  Die Inhalte der Datei sind ungültig.
-
-- 'ISQ: Unable to store sq relation value.'
-  S(Q) Beziehung konnte nicht gespeichert werden.
-
-- 'ISQ: Cannot determine sq relation without time interval.'
-  Einer S(Q)-Beziehung ist keine zeitliche Gültigkeit zugeordnet.
-
-- 'IWD: skip invalid waterlevel difference - no unit set!'
-  Wasserstandsdifferenz hat keine Einheit.
-
-- 'BHE: Skip file - invalid current elevation model.'
-  Höhenmodell ungültig.
-
-- 'BHE: Skip file - invalid time range.'
-  Zeitbereich ungültig.
-
-- 'BHE: Skip file - invalid km range.'
-  Kilometerbereich ungültig.
-  
--- a/backend/doc/documentation/de/importer-geodaesie.tex	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/doc/documentation/de/importer-geodaesie.tex	Wed Oct 16 13:03:13 2013 +0200
@@ -3,10 +3,10 @@
 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.
+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
+GDAL und GDAL-Python-Bindings 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}.
@@ -19,187 +19,311 @@
 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
+den einzelnen Parsern sind Kapitel \ref{Beschreibung der Parser} zu
+entnehmen. 
+
+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 
+im Datenbankfeld 'path' gespeichert. Anwendungen, die auf der Datenbank
+aufbauen, können die Geodaten eines Shapefiles später anhand dieses Merkmals
+gruppieren und anzeigen.
+
+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
+die Daten eines Shapefiles bereits in der Datenbank befinden, oder nicht. 
+Ein erneuter Import der Geodaten würde also dazu führen, dass Geometrien doppelt in der
+Datenbank abgelegt werden.
+
+\subsection{Koordination-Transformation}
+Für die Transformation der Daten verwendet GDAL wiederum die PROJ4-Bibliothek.
+Die Daten werden vor dem Schreiben in die Datenbank alle
+in die Gauß-Krüger-Projektion Zone 3 (EPSG-Code 31467) transformiert.
+Ist für die zu importierenden Daten keine Projektion ersichtlich 
+(fehlende \textit{*.prj}-Datei), so findet keine Transformation statt.
+Dies führt nur zu Problemen mit dem Fachdienst FLYS, falls die Daten nicht
+bereits in der genannten Projektion vorlagen.
+
+Im Falle der Digitalen Geländemodelle (DGM) findet keine Transformation statt,
+da zu diesen lediglich Metadaten in der Datenbank gespeichert werden 
+(siehe Kapitel \ref{dgm_parser}),
+während die Daten selbst von der Anwendung Dive4Elements River
+aus dem Dateisystem geholt werden.
+Für Berechnungen mit den DGM werden die Geometrien aus der Datenbank
+in Dive4Elements River in die Projektion des jeweiligen DGM transformiert.
+Daher ist es besonders wichtig, dass die Angaben des EPSG-Codes
+in der Spalte SRID in DGMs.csv korrekt sind (siehe Kapitel \ref{dgm_parser})
+
+\subsection{Logfile}
+Der Erfolg oder Misserfolg eines Shape-Imports wird 
+im Logfile vermerkt. Folgende Einträge können dem Logfile
 entnommen werden:
 
-%TODO etwas zum srs schreiben.
+\textbf{INFO: Inserted \# features}
+\\Gibt die Anzahl der erfolgreich importierten Features an.
 
-\textbf{INFO: Inserted 4 features}
-\\Gibt die Anzahl der erfolgreich importierten Features an.\\
+\textbf{INFO: Failed to create \# features}
+\\Gibt die Anzahl der Features an, die nicht importiert werden konnten.
 
-\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}
+\textbf{INFO: Found 3 unsupported features of type: '...'}
 \\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.\\
+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{INFO: Did not import values from fields: '...' ...}
+\\Der Importer schreibt neben der geographischen Information weitere
+Attribut-Daten in die Datenbank. 
+Attribut-Spalten die nicht importiert wurden (z.B. auf Grund
+von Tippfehlern oder unterschiedlicher Schreibweise),
+werden wie angegeben im Logfile aufgeführt.
 
 \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
+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.\\
+\\Beim Lesen 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.\\
+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.
+Weitere Fehler, die von der Oracle-Datenbank kommen, können ebenfalls im 
+Logfile angezeigt werden.
 
 
 \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
+der BfG angepasst. 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.
+\\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.
+In Klammern als alternativ bezeichnete Attribut-Namen werden in
+das gleiche Datenbankfeld geschrieben, wie das vorgenannte Feld.
+Die alternativen Namen werden vom Importer zusätzlich unterstützt, 
+um Dateien aus dem heterogenen Bestand der BfG unverändert 
+importieren zu können.
 
+Zudem werden Datenbank-Attribute beschrieben, die nicht direkt aus 
+Attribut-Spalten des Shapefiles gelesen werden.
 
 \subsubsection{Achsen}
-\hspace{1cm}
-\begin{tabular}[t]{ll}
+\hspace{5mm}
+\begin{tabular*}{155mm}[t]{l@{\extracolsep\fill}p{125mm}}
 Pfad        &   Geodaesie/Flussachse+km \\
-Geometrie   &   LINESTRING \\
-Attribute   &   name, kind \\
-\end{tabular}
+Geometrie   &   LINESTRING, MULTILINESTRING \\
+\end{tabular*}
 
+Das Attribut 'name' wird auf den Namen des Shapefiles gesetzt.
+Zusätzlich wird das Attribut 'kind\_id' gesetzt, welches 
+für die aktuelle Achse (\textit{achse.shp}) 1 ist 
+und für sonstige Achsen (weitere Linien-Shapes) 2.
 
-\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{Hydr. Grenzen}
+\hspace{5mm}
+\begin{tabular*}{155mm}[t]{l@{\extracolsep\fill}p{125mm}}
+Pfad        &   Hydrologie/Hydr.Grenzen \\
+Geometrie   &   LINESTRING, MULTILINESTRING, POLYGON, MULTIPOLYGON \\
+Attribute   &   SECTIE, STROVOER \\
+\end{tabular*}
+
+Das Attribut 'name' wird auf den Namen des Shapefiles gesetzt.
+Das Attribut 'kind' wird 1 gesetzt für Daten aus dem 
+Unterverzeichnis \textit{Linien/BfG}, 
+2 für Daten aus \textit{Linien/Land},
+3 für Daten aus \textit{Sonstige}
+und für alle übrigen 0.
+Ausgenommen sind Dateien, in deren Namen 'Talaue' 
+(Groß-Klein-Schreibung irrelevant) vorkommt.
+
+Linien und Polygone werden in der Datenbank in unterschiedlichen
+Tabellen gespeichert.
 
 \subsubsection{Bauwerke}
-\hspace{1cm}
-\begin{tabular}[t]{ll}
+\hspace{5mm}
+\begin{tabular*}{155mm}[t]{l@{\extracolsep\fill}p{125mm}}
 Pfad        &   Geodaesie/Bauwerke \\
 Geometrie   &   LINESTRING \\
-Attribute   &   name, Name, KWNAAM \\
-\end{tabular}
-
+Attribute   &   Name (alternativ: KWNAAM), 
+  km (alternativ: station, wsv-km), 
+  z (alternativ: Höhe, Hoehe, m+NHN)\\
+\end{tabular*}
 
-\subsubsection{Einzugsgebiete}
-\hspace{1cm}
-\begin{tabular}[t]{ll}
-Pfad        &   Hydrologie/Einzugsgebiet \\
-Geometrie   &   POLYGON, MULTIPOLYGON \\
-Attribute   &   name, Name, AREA, area \\
-\end{tabular}
-
+Das Attribut 'name' wird auf den Namen des Shapefiles gesetzt.
+Das Attribut 'kind\_id' ist 0 für Sonstige,
+1 für Brücken, 2 für Wehre, 3 für Pegel.
+Es wird aus dem Dateinamen hergeleitet 
+(\textit{bruecken.shp, wehre.shp, pegel.shp}, 
+teilweise auch alternative Schreibweisen unterstützt)
+oder je Feature gesetzt, wenn in einer Attributspalte 
+die Werte 'bruecke' und 'wehr' 
+(teilweise auch alternative Schreibweisen unterstützt) vorkommen.
+Ausgenommen sind Dateien, in deren Namen 'Buhnen' 
+(Groß-Klein-Schreibung irrelevant) vorkommt.
 
 \subsubsection{Querprofilspuren}
-\hspace{1cm}
-\begin{tabular}[t]{ll}
+\hspace{5mm}
+\begin{tabular*}{155mm}[t]{l@{\extracolsep\fill}p{125mm}}
 Pfad        &   Geodaesie/Querprofile \\
 Geometrie   &   LINESTRING \\
-Attribute   &   KILOMETER, KM, STATION, ELEVATION \\
-\end{tabular}
+Attribute   &   KILOMETER (alternativ: KM, STATION), ELEVATION \\
+\end{tabular*}
 
+Das Attribut 'kind\_id' wird 1 gesetzt für die Datei \textit{qps.shp} (aktuelle Querprofilspuren)
+und 0 für alle weiteren.
 
 \subsubsection{Festpunkte}
-\hspace{1cm}
-\begin{tabular}[t]{ll}
+\hspace{5mm}
+\begin{tabular*}{155mm}[t]{l@{\extracolsep\fill}p{125mm}}
 Pfad        &   Geodaesie/Festpunkte \\
 Geometrie   &   POINT \\
-Attribute   &   name, KM, ELBE\_KM, X, Y, HPGP \\
-\end{tabular}
+Attribute   &   KM (alternativ: ELBE\_KM), X, Y, HPGP (alternativ: ART) \\
+\end{tabular*}
 
+Das Attribut 'name' wird auf den Namen des Shapefiles gesetzt.
+
+\subsubsection{Hochwassermarken}
+\hspace{5mm}
+\begin{tabular*}{155mm}[t]{l@{\extracolsep\fill}p{125mm}}
+Pfad        &   Hydrologie/HW-Marken/hw-marken.shp \\
+Geometrie   &   POINT \\
+Attribute   &   Ort (alternativ: Pegel),
+  km (alternativ: station, wsv-km, FlussKm), 
+  z (alternativ: z mit anschließender Zahl, m+NHN)\\
+\end{tabular*}
+
+Groß-Klein-Schreibung im Dateinamen ist irrelevant.
+Für das Attribut 'year' wird im Dateinamen nach einer Jahreszahl
+nach folgendem Muster gesucht: \textit{\_YYYY\_} oder \textit{-YYYY-}. 
+Gelingt dies nicht, erscheint im Logfile die Warnung
+'Could not extract year from filename: ...'.
 
 \subsubsection{Talaue}
-\hspace{1cm}
-\begin{tabular}[t]{ll}
+\hspace{5mm}
+\begin{tabular*}{155mm}[t]{l@{\extracolsep\fill}p{125mm}}
 Pfad        &   Hydrologie/Hydr.Grenzen \\
 Geometrie   &   POLYGON, MULTIPOLYGON \\
-Attribute   &   name \\
-\end{tabular}
-
+\end{tabular*}
 
-\subsubsection{Pegelstationen}
-\hspace{1cm}
+Es werden nur Dateien betrachtet, in deren Namen das Wort 'Talaue'
+(Groß-Klein-Schreibung irrelevant) vorkommt.
+Das Attribut 'name' wird auf den Namen des Shapefiles gesetzt.
+Das Attribut 'kind\_id' wird 1 gesetzt für die Datei \textit{talaue.shp} (aktuelle Talaue)
+und 0 für alle weiteren.
+
+\subsubsection{Hochwasserschutzanlagen}
+\hspace{5mm}
+\begin{tabular*}{155mm}[t]{l@{\extracolsep\fill}p{125mm}}
+Pfad        &   Hydrologie/HW-Schutzanlagen \\
+Geometrie   &   LINESTRING, MULTILINESTRING, POINT \\
+Attribute   &   Name, Art, Quelle, Anmerkung, Stand, Verband,
+                km (alternativ: Deich\_km), Bereich, 
+                Hoehe, Hoehe\_soll, WSP\_Bfg100, Bundesland
+                (Teilweise auch alternative Schreibweisen unterstützt)\\
+\end{tabular*}
+
+Das Attribut 'name' wird auf den Namen des Shapefiles gesetzt, 
+wenn kein Attribut 'Name' im Shapefile vorhanden ist.
+Das Feld 'kind\_id' wird per Default auf 2 (für Damm) gesetzt.
+Wird ein Attribut 'ART' im Shapefile gefunden, 
+so wird 'kind\_id' entsprechend dieses Feldes gesetzt 
+(1 für die Werte 'Durchlass', 'Rohr1', 'Rohr 1', 'Rohr 2',
+2 für die Werte 'Damm', 'Deich', 'Hochufer', 'Hauptdeich', 'Sommerdeich',
+3 für den Wert 'Graben').
+Es wird versucht das Bundesland aus dem Dateinamen zu ermitteln,
+wenn das Shapefile kein Attribut 'Bundesland' enthält.
+
+Linien und Punkte werden in der Datenbank in unterschiedlichen
+Tabellen gespeichert.
+
+\subsubsection{Buhnen}
+\hspace{5mm}
+\begin{tabular*}{155mm}[t]{l@{\extracolsep\fill}p{125mm}}
+Pfad        &   Geodaesie/Bauwerke/Buhnen.shp \\
+Geometrie   &   POINT \\
+Attribute   &   station (alternativ: km, wsv-km), 
+                z (alternativ: Hoehe, Höhe, m+NHN) \\
+\end{tabular*}
+
+Das Attribut 'kind\_id' wird für 
+Buhnenkopf (\textit{bkl, bkr, bk}) 0,
+für Buhnenfuß (\textit{bfl, bfr, bf}) 1 und
+für Buhnenwurzel (\textit{bwl, bwr, bw}) 2 gesetzt,
+
+\subsubsection{Stationierung}
+\hspace{5mm}
+\begin{tabular*}{155mm}[t]{l@{\extracolsep\fill}p{125mm}}
+Pfad        &   Geodaesie/Flussachse+km/km.shp \\
+Geometrie   &   POINT \\
+Attribute   &   km (alternativ: KM), landkm \\
+\end{tabular*}
+
+Das Attribut 'name' wird auf den Namen des Shapefiles gesetzt.
+
+\subsubsection{Überschwemmungsfläche}
+\hspace{5mm}
+\begin{tabular*}{155mm}[t]{l@{\extracolsep\fill}p{125mm}}
+Pfad        &   Hydrologie/UeSG \\
+Geometrie   &   POLYGON, MULTIPOLYGON \\
+Attribut    &   diff, count, area, perimeter, GEWAESSER \\
+\end{tabular*}
+
+Das Attribut 'name' wird auf den Namen des Shapefiles gesetzt.
+Das Attribut 'kind' wird nach folgendem Schema gesetzt:
+
+\hspace{5mm}
 \begin{tabular}[t]{ll}
-Pfad        &   Hydrologie/Streckendaten \\
-Geometrie   &   POINT \\
-Attribute   &   Name, name, MPNAAM \\
+Unterverzeichnis & Wert \\
+\textit{Berechnungen/Aktuell/BfG} & 111 \\
+\textit{Berechnungen/Aktuell/Bundesländer} & 112 \\
+\textit{Berechnungen/Potentiell/BfG} & 121 \\
+\textit{Berechnungen/Potentiell/Bundesländer} & 122 \\
+\textit{Messungen} & 200 \\
 \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}
-
+Das Attribut 'source' wird auf den Namen des Verzeichnisses gesetzt,
+indem sich das jeweilige Shapefile befindet.
 
-\subsubsection{Kilometrierung}
-\hspace{1cm}
-\begin{tabular}[t]{ll}
-Pfad        &   Geodaesie/Flussachse+km \\
-Geometrie   &   POINT \\
-Attribute   &   name, km, KM \\
-\end{tabular}
+\subsubsection{Metadaten zu Digitalen Gelände-Modellen}
+\label{dgm_parser}
+\hspace{5mm}
+\begin{tabular*}{155mm}[t]{l@{\extracolsep\fill}p{125mm}}
+Pfad        &   ../DGMs.csv \\
+Attribut    &   Projektion, Höhenstatus, Format, Bruchkanten,
+                Auflösung, SRID, Pfad\_Bestand,
+                km\_von, km\_bis, Jahr\_von, Jahr\_bis \\
+\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}
+Aus der Spalte 'Gewässer' in DGMs.csv wird entnommen, 
+für welches Gewässer das angegebene DGM verwendet wird. 
+Die Spalte muss daher den exakt gleichen Namen enthalten 
+wie in der *.gew-Datei des Gewässers angegeben 
+(siehe auch Kapitel \ref{start-hydr}).
+Die eigentlichen Geo-Daten der DGM werden nicht in die Datenbank importiert.
+Diese werden von der Anwendung Dive4Elements River aus dem Dateisystem geholt.
 
 \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.
+Der Geodaten Importer kann über das Skript \textit{./run\_geo.sh}
+konfiguriert werden. Öffnen Sie die Datei mit einem Texteditor Ihrer Wahl
+und passen Sie ggf.\ folgende Variablen an:
 
 \textbf{HOST}
 \\Der Host der Datenbank.
@@ -210,7 +334,7 @@
 \textbf{PASS}
 \\Das Passwort für USER zum Verbinden zur Datenbank.
 
-In den Zeilen 12-23 werden weitere Optionen definiert, die bei Bedarf angepasst
+In den weiteren Zeilen 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.
 
@@ -225,16 +349,16 @@
 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.
+\\Hiermit kann direkt ein beliebiger Verbindungs-String angegegeben
+werden, welcher dann anstatt HOST, USER und PASS verwendet wird.
+Diese Option wird direkt an die OGR-Bibliothek weitergegeben und ermöglicht
+verbesserte Tests und Entwicklung mit verschiedenen Backends.
 
 \textbf{SKIP\_AXIS}
 \\Bei gesetztem Wert `1` werden keine Flussachsen importiert.
 
 \textbf{SKIP\_KMS}
-\\Bei gesetztem Wert `1` werden keine Kilometrierungen importiert.
+\\Bei gesetztem Wert `1` werden keine Stationierungen importiert.
 
 \textbf{SKIP\_CROSSSECTIONS}
 \\Bei gesetztem Wert `1` werden keine Querprofilespuren importiert.
@@ -252,43 +376,35 @@
 \\Bei gesetztem Wert `1` werden keine hydrologischen Grenzen importiert.
 
 \textbf{SKIP\_HWS\_LINES}
-\\Bei gesetztem Wert `1` werden kein Hochwasserschutz Liniendaten importiert.
+\\Bei gesetztem Wert `1` werden kein Hochwasserschutzanlagen  (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.
+\\Bei gesetztem Wert `1` werden kein Hochwasserschutzanlagen (Punktdaten) 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.
+\\Bei gesetztem Wert `1` werden keine Metadaten zu Digitalen Geländemodellen importiert.
 
 \textbf{SKIP\_JETTIES}
-\\Bei gesetztem Wert `1` werden keine Informationen über Buhnen importiert.
+\\Bei gesetztem Wert `1` werden keine Buhnen importiert.
 
 \textbf{SKIP\_FLOODMARKS}
-\\Bei gesetztem Wert `1` werden keine Informationen über HW-Marken importiert.
+\\Bei gesetztem Wert `1` werden keine HW-Marken importiert.
 
 \subsection{Starten des Geodaten Importers}
 \label{Starten des Geodaten Importers}
-Der Geodaten Importer wird mittels eines Shellskripts von einer Konsole
+Der Geodaten Importer wird mittels des Shellskripts,
+dass auch für die Konfiguration verwendet wird, von einer Konsole
 gestartet. Dazu führen Sie folgenden Befehl aus:\\
 
 \begin{lstlisting}
-    sh contrib/run_geo.sh > geo-import.log
+    sh ./run_geo.sh pfad/zur/beispiel.gew > geo-import.log
 \end{lstlisting}
 
+Bezüglich des übergebenen Pfades siehe auch Kapitel \ref{start-hydr}.
 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.
 
--- a/backend/doc/documentation/de/importer-hydr-morph.tex	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/doc/documentation/de/importer-hydr-morph.tex	Wed Oct 16 13:03:13 2013 +0200
@@ -10,12 +10,21 @@
     \item Schreiben der erfolgreich eingelesenen Daten in die Datenbank.
 \end{itemize}
 
+Beim Import wird versucht, Datensätze nicht zu importieren, 
+die bereits in der Datenbank vorhanden sind. 
+Dies kann aber nicht immer eindeutig bestimmt werden, 
+so dass vor dem Import geänderter Daten 
+ein Löschen der entsprechenden Datensätze in der Datenbank notwendig sein kann,
+da sonst möglicherweise aus fachlicher Sicht Duplikate in der Datenbank vorhanden sind, 
+geänderte Daten nicht importiert werden
+oder es zu unerwarteten Fehlern kommt.
+
 Sollte beim Lese- oder Schreib-Vorgang eines Gewässers ein Fehler auftreten, so
 werden sämtliche Daten des Gewässers verworfen. Beide Phasen zusammen bilden
 somit eine Transaktion.
 
 \textbf{Hinweis}
-\\Der Import geht wie auch Desktop-FLYS davon aus, dass die Dateien Latin-1
+\\Der Import geht, wie auch Desktop-FLYS, davon aus, dass die Dateien Latin-1
 encodiert vorliegen! Stellen Sie also sicher, dass das von Ihnen verwendete
 Encoding korrekt ist. Andernfalls ist es möglich, dass es während des Imports zu
 unerwarteten Problemen kommt.
@@ -32,7 +41,7 @@
 \end{lstlisting}
 
 Auf gleiche Weise können dem Importer sämtliche Optionen zur Konfiguration
-beim Start mitgegeben werden. Im Folgenden werden die möglichen System-Properties und
+beim Start mitgegeben werden. Im Folgenden werden die möglichen \textit{System-Properties} und
 ihre Auswirkung auf den Import genauer beschrieben. In den Kapiteln
 \ref{configuration} und \ref{start-hydr} wird zur Einfachheit jedoch ein
 Shellskript verwendet, das eine Standardkonfiguration vorgibt und den Importer
@@ -40,9 +49,30 @@
 
 
 \subsection{Importierte Daten}
-In diesem Kapitel werden die Datentypen aufgelistet und erläutert, wie sie vom
+\label{import_data}
+In diesem Kapitel werden die verschiedenen Daten aufgelistet und erläutert, wie sie vom
 Importer eingelesen werden.
 
+\subsubsection{Wasserstandsmodell-Stammdaten und Höhenreferenz (Basis-*.wst-Datei)}
+Der Import von Wasserständen der Basis-*.wst-Datei 
+kann mit \textbf{-Dflys.backend.importer.skip.wst=true} unterdrückt werden.
+Aus der Basis-*.wst-Datei wird auch die Höhenreferenz und -einheit 
+des Gewässers ausgelesen (z.B. 'NN + m'). 
+Der Import dieser Information in die Datenbank wird daher ebenfalls durch
+diese Option unterdrückt.
+Da es sich hierbei um Gewässer-Stammdaten handelt, 
+kann diese Option erst genutzt werden, wenn sich das Gewässer bereits
+in der Datenbank befindet.
+
+\subsubsection{Pegel-Stammdaten (*.glt, *.at und *.sta-Dateien)}
+Der Import von Pegel- und Stammdaten kann mit \textbf{'-Dflys.backend.importer.skip.gauges=true'}
+unterdrückt werden. Die *.glt-Datei, die neben der Basis-*.wst-Datei liegt, wird zuerst
+ausgelesen. Es werden nur Stammdaten von Pegeln geladen, die in der .glt-Datei
+vermerkt sind.
+
+Die System-Property \textbf{flys.backend.main.value.types} kann einen String
+mit gültigen Typen von Stammdaten enthalten. Vorbelegt ist \textit{QWTD-}.
+
 \subsubsection{Streckenfavoriten (*.km-Dateien)}
 Der Import der Streckenfavoriten kann mit \textbf{-Dflys.backend.importer.skip.annotations=true}
 unterdrückt werden.
@@ -54,44 +84,33 @@
 vorgenommen wird. Details hierzu befinden sich im Kapitel \ref{annotation-types}.
 
 \subsubsection{Bundeswasserstraßen-IDs}
-Der Import und die Zuweisung der Bundeswasserstraßen-IDs kann mit
-\textbf{-Dflys.backend.importer.skip.bwastr=true} unterbunden werden.
-Beim Import wird davon ausgegangen dass sich die Datei \textbf{BWASTR\_ID.csv}
+Der Import und die Zuweisung der Bundeswasserstraßen-IDs kann unterbunden werden 
+mit \textbf{-Dflys.backend.importer.skip.bwastr=true}.
+Beim Import wird davon ausgegangen, dass sich die Datei \textbf{BWASTR\_ID.csv}
 neben der oder den zu importierenden gew-Dateien befindet.
 
-\subsubsection{Pegel, Stammdaten (*.glt, *.sta-Dateien)}
-Der Import von Pegel- und Stammdaten kann mit \textbf{'-Dflys.backend.importer.skip.gauges=true'}
-unterdrückt werden. Die .glt-Datei, die neben der .wst-Datei liegt, wird zuerst
-ausgelesen. Es werden nur *.sta-Datei von Pegeln geladen, die in der .glt-Datei
-vermerkt sind.
-
 \subsubsection{Historische Abflusstafeln (*.at-Dateien)}
-Der Import von historischen Abflusstafeln kann mit
-\textbf{'-Dflys.backend.importer.skip.historical.discharge.tables=true'}
+Mit \textbf{'-Dflys.backend.importer.skip.historical.discharge.tables=true'} 
+kann der Import von historischen Abflusstafeln 
 unterdrückt werden. Diese Flagge wird nur ausgewertet, wenn überhaupt
 Pegel-Daten (siehe oben) importiert werden.
 
-Mittels \textbf{-Dflys.backend.sta.parse.gauge.numbers=true} wird versucht, die
-offiziellen Pegelnummern aus den Stammdaten zu extrahieren.
-\textbf{Dies ist mit Vorsicht zu behandeln, denn die meisten STA-Dateien
-enthalten invalide Pegelnummern.}
-
-Die System-Property \textbf{flys.backend.main.value.types} kann einen String
-mit gültigen Typen von Stammdaten enthalten. Vorbelegt ist \textit{QWTD}. In der
-Praxis ist \textit{QWD} eine sinnvolle Belegung.
-
-\subsubsection{Basis-Wasserstände (gewaesser.wst-Dateien)}
-Der Import von Wasserständen kann mit \textbf{-Dflys.backend.importer.skip.wst=true} unterdrückt werden.
+% Mittels \textbf{-Dflys.backend.sta.parse.gauge.numbers=true} wird versucht, die
+% offiziellen Pegelnummern aus den Stammdaten zu extrahieren.
+% \textbf{Dies ist mit Vorsicht zu behandeln, denn die meisten STA-Dateien
+% enthalten invalide Pegelnummern.}
 
 \subsubsection{Zusätzliche Längsschnitte (*.zus, *.wst-Dateien)}
-Der Import von zusätzlichen Längsschnitten kann mit \textbf{-Dflys.backend.importer.skip.extra.wsts=true}
+Mit \textbf{-Dflys.backend.importer.skip.extra.wsts=true} kann
+der Import von zusätzlichen Längs\-schnitten 
 unterdrückt werden. Es werden die *.zus- und *.wst-Dateien aus dem Verzeichnis
-\textit{../Zus.Längsschnitte} relativ zur gewaesser.wst-Datei betrachtet.
+\textit{../Zus.Längsschnitte} relativ zur 
+\textit{gewaesser}.wst-Datei betrachtet.
 
 \subsubsection{Fixierungen (*.wst-Dateien)}
 Der Import von Fixierungen kann mit \textbf{-Dflys.backend.importer.skip.fixations=true}
-unterdrückt werden. Es werden die *.wst-Dateien aus dem Verzeichnis
-\textit{../Fixierungen} relativ zur gewaesser.wst-Datei betrachtet.
+unterdrückt werden. Es werden die *.wst-Dateien aus 
+\textit{../Fixierungen} relativ zur \textit{gewaesser}.wst-Datei betrachtet.
 
 \subsubsection{Amtliche Linien (*.wst-Dateien)}
 Der Import von amtlichen Linien kann mit \textbf{-Dflys.backend.importer.skip.official.lines=true}
@@ -99,89 +118,117 @@
 Verzeichnis \textit{../Basisdaten} und \textit{../Fixierungen} relativ zur
 \textit{gewaesser.wst}-Datei betrachtet.
 
+Für die Zuordnung zu den Hauptwerten wird zudem die Datei 
+\textit{Amtl\_Linien.config} benötigt.
+
 \subsubsection{Profilspuren (*.prf-Dateien)}
 Der Import von Profilspuren kann mit \textbf{-Dflys.backend.importer.skip.prfs=true}
 unterdrückt werden. Es werden rekursiv alle *.prf-Dateien aus \textit{../../..}
-relativ zur gewaesser.wst-Datei betrachtet. Vor dem Import werden mit Hilfe
+relativ zur gewaesser.wst-Datei betrachtet. 
+
+Vor dem Import von Profilspuren werden mit Hilfe
 eines Längen- und eines MD5-Summen-Vergleichs inhaltliche Duplikate
 ausgeschlossen.
 
 \subsubsection{Profilspuren (*.w80-Dateien)}
-Der Import von W80-Profilspuren kann mit \textbf{-Dflys.backend.importer.skip.w80=true}
+Der Import von W80-Profilspuren kann mit \textbf{-Dflys.backend.importer.skip.w80s=true}
 unterdrückt werden. Es werden rekursiv alle *.w80-Dateien aus \textit{../../..}
-relativ zur gewaesser.wst-Datei betrachtet. Vor dem Import werden mit Hilfe
-eines Längen- und eines MD5-Summen-Vergleichs inhaltliche Duplikate
-ausgeschlossen.
+relativ zur \textit{gewaesser}.wst-Datei betrachtet.
+
+\subsubsection{Profilspuren (*.d50-Dateien)}
+Der Import von D50-Profilspuren kann mit \textbf{-Dflys.backend.importer.skip.da50s=true}
+unterdrückt werden. Es werden rekursiv alle *.d50-Dateien aus \textit{../../..}
+relativ zur \textit{gewaesser}.wst-Datei betrachtet.
+
+\subsubsection{Profilspuren (*.d66-Dateien)}
+Der Import von D66-Profilspuren kann mit \textbf{-Dflys.backend.importer.skip.da66s=true}
+unterdrückt werden. Es werden rekursiv alle *.d66-Dateien aus \textit{../../..}
+relativ zur \textit{gewaesser}.wst-Datei betrachtet.
+
+\subsubsection{Profilspuren (*.csv-Dateien)}
+Der Import von CSV-Profilspuren kann mit
+\textbf{-Dflys.backend.importer.skip.w80.csvs=true}
+unterdrückt werden.
+Es werden rekursiv alle *.csv-Dateien aus 
+\textit{./Geodaesie/Querprofile/QP-Daten} im Verzeichnis des 
+Gewässers betrachtet.
 
 \subsubsection{Hydraulische Kennzahlen (*.hyk)}
 Der Import von hydraulischen Kennzahlen kann mit \textbf{-Dflys.backend.importer.skip.hyks=true} unterdrückt
 werden. Es werden rekursiv alle *.hyk-Dateien aus \textit{../../..} relativ zur
-gewaesser.wst-Datei betrachtet. Vor dem Import werden mit Hilfe eines Längen- und
+\textit{gewaesser}.wst-Datei betrachtet. Vor dem Import werden mit Hilfe eines Längen- und
 eines MD5-Summen-Vergleichs inhaltliche Duplikate ausgeschlossen.
 
 \subsubsection{Hochwassermarken (*.zus, *.wst)}
 Der Import von Hochwassermarken kann mit \textbf{-Dflys.backend.importer.skip.flood.water=true}
 unterdrückt werden. Es werden die *.zus- und *.wst-Dateien aus dem Verzeichnis
-\textit{../HW-Marken} relativ zur gewaesser.wst-Datei betrachtet.
+\textit{../HW-Marken} relativ zur \textit{gewaesser}.wst-Datei betrachtet.
 
-\subsubsection{Hochwasserschutzanlagen (*.zus)}
-Der Import von Hochwasserschutzanlagen kann mit \textbf{-Dflys.backend.importer.skip.flood.protection=true}
+\subsubsection{Hochwasserschutzanlagen (*.zus, *.wst)}
+Mit \textbf{-Dflys.backend.importer.skip.flood.protection=true}
+kann der Import von Hochwasserschutzanlagen 
 unterdrückt werden. Es werden die *.zus- und *.wst-Dateien aus dem Verzeichnis
 \textit{../HW-Schutzanlagen} relativ zur \textit{gewaesser.wst}-Datei betrachtet.
 
+\subsubsection{Messstellen-Stammdaten}
+Mit \textbf{-Dflys.backend.importer.skip.measurement.stations=true}
+kann der Import von Messstellen-Stammdaten aus 
+\textit{Morphologie/Basisdaten/Messstellen-Stammdaten.csv} 
+unterdrückt werden.
+
 \subsubsection{Sohlhöhen (Peilungen)}
 Der Import von Sohlhöhen-Peilungen kann mit \textbf{-Dflys.backend.importer.skip.bed.height.single=true}
-unterdrückt werden. Es werden die Dateien aus dem Verzeichnis
+unterdrückt werden. Es werden die CSV-Dateien aus dem Verzeichnis
 \textit{Morphologie/Sohlhoehen/Einzeljahre} geladen.
 
 \subsubsection{Sohlhöhen (Epochen)}
 Der Import Sohlhöhen-Epochen kann mit \textbf{-Dflys.backend.importer.skip.bed.height.epoch=true}
-unterdrückt werden. Es werden die Dateien aus dem Verzeichnis
+unterdrückt werden. Es werden die CSV-Dateien aus dem Verzeichnis
 \textit{Morphologie/Sohlhoehen/Epochen} geladen.
 
 \subsubsection{Sedimentdichte}
 Der Import der Sedimentdichte kann mit
 \textbf{-Dflys.backend.importer.skip.sediment.density=true}
-unterdrückt werden. Es werden alle Dateien aus dem Verzeichnis
+unterdrückt werden. Es werden die CSV-Dateien aus dem Verzeichnis
 \textit{Morphologie/Sedimentdichte} geladen.
 
 \subsubsection{Morphologische Breite}
 Der Import der morphologischen Breite kann mit
 \textbf{-Dflys.backend.importer.skip.morphological.width=true}
-unterdrückt werden. Es werden alle Dateien aus dem Verzeichnis
+unterdrückt werden. Es werden alle CSV-Dateien aus dem Verzeichnis
 \textit{Morphologie/morphologische\_Breite} geladen.
 
 \subsubsection{Fließgeschwindigkeit}
 Der Import der Fließgeschwindigkeit kann mit
 \textbf{-Dflys.backend.importer.skip.flow.velocity=true}
-unterdrückt werden. Es werden alle Modellrechnungen aus dem Verzeichnis\\
+unterdrückt werden. Es werden die CSV-Dateien aus dem Verzeichnis\\
 \textit{Morphologie/Geschwindigkeit\_Schubspannung/Modellrechnungen} und\\
 \textit{Morphologie/Geschwindigkeit\_Schubspannung/v-Messungen} geladen.
 
 \subsubsection{Sedimentfracht}
 Der Import der Sedimentfracht kann mit
 \textbf{-Dflys.backend.importer.skip.sediment.yield=true}
-unterdrückt werden. Es werden alle Dateien aus dem Verzeichnis
+unterdrückt werden. Es werden die CSV-Dateien aus dem Verzeichnis
 \textit{Morphologie/Fracht} geladen. Dabei werden die Dateien aus dem
 Unterverzeichnissen \textit{Einzeljahre} und \textit{Epochen} entsprechend als
-\textit{Einzeljahre} und \textit{Epochen} vermerkt.
+\textit{Einzeljahre} und \textit{Epochen} gespeichert.
 
-\subsubsection{Wasserspiegellagen für MINFO}
-Der Import der MINFO spezifischen Wasserspiegellagen kann mit\\
+\subsubsection{Wasserspiegellagen für M-INFO}
+Der Import der für M-INFO spezifischen Wasserspiegellagen kann mit\\
 \textbf{-Dflys.backend.importer.skip.waterlevels=true}
-unterdrückt werden. Es werden alle Dateien aus dem Verzeichnis
+unterdrückt werden. Es werden die CSV-Dateien aus dem Verzeichnis
 \textit{Morphologie/Fixierungsanalyse/Wasserspiegellagen} geladen.
 
-\subsubsection{Wasserspiegeldifferenzen für MINFO}
-Der Import der Wasserspiegellagendifferenzen kann mit\\
+\subsubsection{Wasserspiegeldifferenzen für M-INFO}
+Der Import der für M-INFO spezifischen Wasserspiegeldifferenzen kann mit\\
 \textbf{-Dflys.backend.importer.skip.waterlevel.differences=true}
-unterdrückt werden. Es werden alle Dateien aus dem Verzeichnis
+unterdrückt werden. Es werden die CSV-Dateien aus dem Verzeichnis
 \textit{Morphologie/Fixierungsanalyse/Wasserspiegeldifferenzen} geladen.
 
 \subsubsection{Transport Abfluss Beziehung}
 Der Import der Daten für die Transport Abfluss Beziehung kann mit\\
 \textbf{flys.backend.importer.skip.sq.relation=true} unterdrückt
-werden. Es werden alle Dateien unter
+werden. Es werden die CSV-Dateien unter
 \textit{Feststofftransport-Abfluss-Beziehung} geladen.
 
 
@@ -248,7 +295,7 @@
 ein regulärer Ausdruck, der über das Attribut \textit{pattern} definiert wird.
 Die Kategorie wird im Trefferfall über das Attribut \textit{type} bestimmt.
 Treffen mehrere Regeln zu, wird die Kategorie gewählt, die zum ersten Treffer
-gehört. Trifft keine Regel zu wird der Eintrag der Kategorie zugeteilt, die für
+gehört. Trifft keine Regel zu, wird der Eintrag der Kategorie zugeteilt, die für
 die beinhaltende Datei als Vorgabe gilt.
 
 
@@ -260,13 +307,6 @@
 beschrieben, die beim Starten des Importers berücksichtigt werden. Folgende
 Einstellungen sind zwangsläufig an die bestehende Umgebung anzupassen:
 
-\textbf{INFO\_GEW}
-\\Diese Option muss auf eine valide *.gew Datei verweisen (bekannt aus
-Desktop-FLYS). Wichtig für den Importer sind in dieser Datei die Zeilen, die mit
-\textit{WSTDatei:} beginnen. In ihnen wird der Pfad zu der zentralen WST-Datei
-des jeweiligen Gewässers angegeben. Alle anderen importierten Dateien werden in
-ihrer Lage im Dateisystem relativ zur Lage dieser Datei betrachtet.
-
 \textbf{BACKEND\_USER}
 \\Der Nutzername, der zum Verbinden zur Datenbank verwendet werden soll.
 
@@ -300,8 +340,9 @@
 
 
 Weitere Details zum Verbinden zu einer Oracle Datenbank finden Sie unter\\
-\href{http://www.orafaq.com/wiki/JDBC}{http://www.orafaq.com/wiki/JDBC}. Alle weiteren Einstellungen sind
-optional anpassbar:
+\href{http://www.orafaq.com/wiki/JDBC}{http://www.orafaq.com/wiki/JDBC}. 
+
+Alle weiteren Einstellungen sind optional anpassbar:
 
 \textbf{LOG4J\_CONFIG}
 \\Der Fachdatenimport verwendet die externe Bibliothek \textit{Apache Log4J} zum Loggen
@@ -320,10 +361,10 @@
 
 \textbf{IMPORTER\_MAINVALUE\_TYPES}
 \\Diese Einstellung erlaubt die Angabe eines Textes, der aus den gültigen Typen
-für Hauptwerte zusammengesetzt ist. \textit{QWTD} ist standardmäßig gesetzt.
+für Hauptwerte zusammengesetzt ist. \textit{QWTD-} ist standardmäßig gesetzt.
 
 \textbf{IMPORTER\_ANNOTATION\_TYPES}
-\\Diese Einstellung verweist auf eine Datei (relativ zum Ort der \textit{run.sh}
+\\Diese Einstellung verweist auf eine Datei (relativ zum Ort der \textit{run\_hydr\_morph.sh}
 im Dateisystem), die die möglichen Typen von Streckenfavoriten und deren Regeln
 definiert. Siehe hierzu auch Kapitel \ref{annotation-types}.
 
@@ -333,81 +374,29 @@
 
 \textbf{IMPORTER\_DRY\_RUN}
 \\Falls \textit{true} gesetzt wird, wird der Import nur simuliert. Es werden
-keine Daten in die Datenbank geschrieben. Dies kann z.B.: zum Ermitteln
-potentieller Dateninkonsistenzen sinnvoll sein.
-
-\textbf{IMPORTER\_SKIP\_GAUGES}
-\\Wenn \textit{true} gesetzt ist werden keine Pegel- und Stammdaten bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_ANNOTATIONS}
-\\Wenn \textit{true} gesetzt ist werden keine Streckenfavoriten bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_WST}
-\\Wenn \textit{true} gesetzt ist werden keine WST Dateien bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_PRFS}
-\\Wenn \textit{true} gesetzt ist werden keine Querprofilspuren bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_HYKS}
-\\Wenn \textit{true} gesetzt ist werden keine HYK Dateien bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_EXTRA\_WST}
-\\Wenn \textit{true} gesetzt ist werden keine zusätzlichen Längsschnitte
-bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_FIXATIONS}
-\\Wenn \textit{true} gesetzt ist werden keine Fixierungen bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_OFFICIAL\_LINES}
-\\Wenn \textit{true} gesetzt ist werden keine offiziellen Linien bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_FLOOD\_WATER}
-\\Wenn \textit{true} gesetzt ist werden keine Hochwassermarken bearbeitet.
+keine Daten in die Datenbank geschrieben. Die Log-Dateien können dann verwendet werden, um Fehler in den Daten vor dem Schreiben in die
+Datenbank zu ermitteln.
 
-\textbf{IMPORTER\_SKIP\_FLOOD\_PROTECTION}
-\\Wenn \textit{true} gesetzt ist werden keine Hochwasserschutzanlagen
-bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_BED\_HEIGHT\_SINGLE}
-\\Wenn \textit{true} gesetzt ist werden keine mittleren Sohlhöhen (Peilungen) bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_BED\_HEIGHT\_EPOCH}
-\\Wenn \textit{true} gesetzt ist werden keine mittleren Sohlhöhen (Epochen)
-bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_SEDIMENT\_DENSITY}
-\\Wenn \textit{true} gesetzt ist werden keine Dateien zur Sedimentdichte
-bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_MORPHOLOGICAL\_WIDTH}
-\\Wenn \textit{true} gesetzt ist wird keine morphologische Breite bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_FLOW\_VELOCITY}
-\\Wenn \textit{true} gesetzt ist werden keine Fließgeschwindigkeiten bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_SEDIMENT\_YIELD}
-\\Wenn \textit{true} gesetzt ist werden keine Sedimentfrachten bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_WATERLEVELS}
-\\Wenn \textit{true} gesetzt ist werden keine Wasserspiegellagen für MINFO bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_WATERLEVEL\_DIFFERENCES}
-\\Wenn \textit{true} gesetzt ist werden keine Wasserspiegellagendifferenzen für
-MINFO bearbeitet.
-
-\textbf{IMPORTER\_SKIP\_SQ\_RELATION}
-\\Wenn \textit{true} gesetzt ist werden keine Daten für die Berechnungsart
-SQ-Beziehung bearbeitet.
-
-
+Die weiteren Optionen entsprechen jenen, die in Kapitel \ref{import_data}
+bereits erläutert wurden.
 
 \subsection{Fehler und Warnungen}
+Selbsterklärende Meldungen sind hier nicht alle aufgeführt.
 
 \subsubsection{Fehler}
 
 \textbf{error while parsing gew}
 \\Die GEW-Datei ist fehlerhaft oder konnte nicht geöffnet werden.
 
+\textbf{River not yet in database. You cannot skip importing waterlevel model.}
+\\\textbf{-Dflys.backend.importer.skip.wst=true} wurde verwendet,
+obwohl sich das Gewässer noch nicht in der Datenbank befindet 
+(siehe Kapitel \ref{import_data}).
+
+\textbf{Stations in 'XYZ' near line \# not ordered. File rejected.}
+\\Die Stationen in einer WST-Datei sind nicht konsequent auf- oder 
+absteigend geordnet. Die Datei wird verworfen.
+
 \textbf{File 'XYZ' is broken!}
 \\Die Datei XYZ ist inkonsistent und führt zu Fehlern.
 
@@ -426,9 +415,37 @@
 \textbf{Error while storing waterlevel diff.}
 \\Beim Schreiben einer Wasserspiegeldifferenz trat ein Fehler auf.
 
+\textbf{No core data file '...' found}
+\\Keine \textit{Stammdaten\_Messstellen.csv} gefunden.
+
+\textbf{No measurement stations found at km \#}
+\\Für eine in einer SQ-Beziehungs-Datei gegebene Station liegt
+keine Messstelle vor.
+
+\textbf{No km for measurement station: Can not reference measurement station: ...}
+\\In der gegebenen Zeile einer SQ-Beziehungs-Datei liegt ist keine
+Station gegeben. Damit ist keine Zuordnung zu einer Messstelle möglich.
+Die Zeile wird verworfen.
+
+\textbf{Incomplete SQ-relation row (missing a, b, Qmax or parameter): ...}
+\\In der gegebenen Zeile einer SQ-Beziehungs-Datei liegt mindestens
+ein Pflicht-Wert nicht vor. Die Zeile wird verworfen.
+
 \textbf{Error while storing sq relation.}
 \\Beim Schreiben einer S(Q) Beziehung trat ein Fehler auf.
 
+\textbf{Unknown bed height type: \#. File ignored.}
+\\Die gegebene Aufnahmeart ist unbekannt. Die Datei wird ignoriert.
+\\Bekannte Aufnahmearten:
+\begin{itemize}
+\item Querprofile
+\item Flächenpeilung
+\item Flächen- u. Querprofilpeilungen
+\item DGM
+\item TIN
+\item Modell
+\end{itemize}
+
 \textbf{Error reading PRF file.}
 \\Beim Lesen einer PRF-Datei trat ein Fehler auf.
 
@@ -462,7 +479,25 @@
 \textbf{HYK: Error closing file.}
 \\Beim Schließen einer HYK-Datei trat ein Fehler auf.
 
+\textbf{Null Start time will be ignored}
+\\Für ein Zeitintervall wurde keine Anfangszeit gegeben.
+
+\textbf{Skipping malformed w80csv line \#}
+\\Die genannte Zeile einer QP-Daten-CSV-Datei wurde verworfen 
+(z.B.\ weil keine Höhe gegeben war).
+
 \subsubsection{Warnungen}
+\textbf{No unit given. Waterlevel-model WST-file has to be imported already.}
+\\Es wird keine Höhenreferenz mit dazugehöriger Einheit importiert.
+Dies ist nur möglich, wenn sich die Gewässer-Stammdaten bereits
+in der Datenbank befinden (siehe Kapitel \ref{import_data}).
+
+\textbf{no unit and height reference found. Using default.}
+\\Aus einer WST-Datei konnte keine Höhenreferenz 
+mit dazugehöriger Einheit ausgelesen werden. 
+Als Default wird 'm ü. unbekannte Referenz' verwendet.
+Dies hat nur im Falle der Basis-WST-Datei einen Einfluss auf den Import.
+
 \textbf{annotation type file 'XYZ' is not readable.}
 \\Die Datein XYZ kann nicht gelesen werden.
 
@@ -475,6 +510,10 @@
 \textbf{no official lines wst file found}
 \\Keine Datei mit amtlichen Linien gefunden.
 
+\textbf{Invalid bwastr-id line: ...}
+\\Aus einer Zeile in \textbf{BWASTR\_ID.csv} konnte kein Gewässer bzw.
+Bundeswasserstraßen-ID gelesen werden.
+
 \textbf{cannot read fixations wst file directory}
 \\Das Verzeichnis mit den Fixierungen kann nicht gelesen werden.
 
@@ -517,10 +556,14 @@
 \\Eine Zeile in der Pegelgültigkeitsdatei hat nicht genug Spalten.
 
 \textbf{Error while parsing flow velocity values.}
-\\Invalide Datenzeile in einer Datei mit einer Fliessgeschwindigkeitsmessung.
+\\Invalide Datenzeile in einer Datei mit einer Fließgeschwindigkeitsmessung.
 
 \textbf{skip invalid data line: \#}
-\\Invalide Datenzeile in einer Datei mit einer Fliessgeschwindigkeitsmessung.
+\\Invalide Datenzeile (weniger als acht Spalten)
+in einer Datei mit einer Fließgeschwindigkeitsmessung.
+
+\textbf{Unparseable flow velocity values: ...}
+\\Invalide Werte in einer Datenzeile einer Fließgeschwindigkeitsmessung.
 
 \textbf{skip invalid waterlevel line: \#}
 \\Invalide Datenzeile in einer Datei mit Wasserstandsdifferenzen.
@@ -550,16 +593,17 @@
 \\In der eingelesenen Zeile konnte keine Zahl gefunden werden.
 
 \textbf{Unknown meta line: \#}
-\\Invalide Datenzeile in einer Datei mit Sedimentdichten.
+\\Meta-Informationen unbekannt. Werden ignoriert.
 
-\textbf{Error while parsing numbers in: \#}
-\\Invalide Datenzeile in einer Datei mit Sedimentdichten.
+\textbf{Unparseable numbers in '...'}
+\\Invalide Zahlen in einer Datenzeile in einer Datei mit Sedimentdichten.
 
 \textbf{skip invalid data line: \#}
-\\Invalide Datenzeile in einer Datei mit Sedimentdichten.
+\\Invalide Datenzeile in einer Datei mit Sedimentdichten wird ignoriert.
 
-\textbf{Error while parsing numbers in \#}
-\\Invalide Datenzeile in einer Datei mit Sedimentdichten.
+\textbf{SDP: No km nor density given. Skip line}
+\\Weder Station noch Dichte gegeben in einer Datenzeile in einer Datei mit Sedimentdichten.
+Zeile wird ignoriert.
 
 \textbf{STA file is empty}
 \\Stammdatendatei ist leer oder hat zu wenige Zeilen.
@@ -577,7 +621,7 @@
 \\Die zweite Zeile ist zu kurz.
 
 \textbf{STA: parsing of the datum of the gauge failed}
-\\Das Datum in der Stammdatendatei konnte nicht gelesen werden.
+\\Die Station in der Stammdatendatei konnte nicht gelesen werden.
 
 \textbf{STA: 'XYZ' is not a valid long number.}
 \\Die Pegelnummer ist invalide.
@@ -589,22 +633,45 @@
 \\AEO oder Pegelnullpunkt sind invalide.
 
 \textbf{STA: value not parseable in line \#}
-\\Wert ist nicht als Zahl zu interpretieren.
+\\Wert ist nicht als Zahl zu interpretieren (meist Kommentare).
+
+\textbf{STA: Invalid date ...}
+\textbf{STA: Invalid start date ...}
+\textbf{STA: Invalid end date ...}
+\textbf{STA: Need start date.}
+\\Mögliche Datumsangabe zu Hauptwert ist kein gültiger Zeitraum.
 
 \textbf{PRF: cannot open file $<FILE>$}
-\\Die PRF kann nicht geöffnet werden.
+\\Die PRF-Datei kann nicht geöffnet werden.
 
-\textbf{PRF: file is empty}\\
-\textbf{PRF: First line does not look like a PRF data pattern.}\\
-\textbf{PRF: premature EOF. Expected integer in line 2}\\
-\textbf{PRF: Expected $<num>$ in line 2}\\
-\textbf{PRF: invalid integer in line 2}\\
-\textbf{PRF: premature EOF. Expected pattern for km extraction}\\
-\textbf{PRF: line 4 does not look like a PRF km extraction pattern.}\\
-\textbf{PRF: premature EOF. Expected skip row count.}\\
-\textbf{PRF: line 5 is not an positive integer.}\\
+\textbf{PRF: First line does not look like a PRF data pattern.}
+\\Erste Zeile entspricht nicht der PRF-Spezifikation.
+
+\textbf{PRF: premature EOF. Expected integer in line 2}
+\\Zweite Zeile entspricht nicht der PRF-Spezifikation.
+
+\textbf{PRF: Expected $<num>$ in line 2}
+\\Zweite Zeile entspricht nicht der PRF-Spezifikation.
+
+\textbf{PRF: invalid integer in line 2}
+\\Zweite Zeile entspricht nicht der PRF-Spezifikation.
+
+\textbf{PRF: premature EOF. Expected pattern for km extraction}
+\\Vierte Zeile entspricht nicht der PRF-Spezifikation.
+
+\textbf{PRF: line 4 does not look like a PRF km extraction pattern.}
+\\Vierte Zeile entspricht nicht der PRF-Spezifikation.
+
+\textbf{PRF: premature EOF. Expected skip row count.}
+\\Fünfte Zeile entspricht nicht der PRF-Spezifikation.
+
+\textbf{PRF: line 5 is not an positive integer.}
+\\Fünfte Zeile entspricht nicht der PRF-Spezifikation.
+
 \textbf{PRF: cannot extract km in line \#}
-\\Das PRF-Format ist komplex. Bei oben genannten Fehlern sollten weitere
+\\Der gegebenen Zeile konnte die Station nicht entnommen werden.
+
+Das PRF-Format ist komplex! Bei oben genannten Fehlern sollten ggf. weitere
 Information zur genaueren Analyse herangezogen werden.
 
 \textbf{cannot access WST file $FILE$}
@@ -623,7 +690,7 @@
 \\Invalider Q-Bereich
 
 \textbf{skip invalid waterlevel line: \#}
-\\Ungültige Wasserstandslinie
+\\Ungültige Wasserstands-Zeile.
 
 \textbf{Error while parsing number values: \#}
 \\Ungültige Zahlenwerte.
@@ -650,7 +717,7 @@
 \\Unterverzeichnis konnte nicht durchsucht werden.
 
 \textbf{BHP: Meta line did not match any known type: \#}
-\\Unbekannter Typ.
+\\Meta-Informationen unbekannt. Werden ignoriert.
 
 \textbf{BHP: Error while parsing timeinterval!}
 \\Ungültiges Zeitinterval.
@@ -664,13 +731,20 @@
 \textbf{BHP: Error while parsing range!}
 \\Bereichsangabe fehlerhaft.
 
+\textbf{BHP: Could not parse sounding width in line '...'. -$>$ Set default value '0'}
+\\Peilbreite in gegebener Zeile wurde nicht als gültige Zahl erkannt. Setze 0.
+
+\textbf{Unparseable number in data row: \#}
+\\In der gegebenen Zeile wurde eine Zahl erwartet, 
+es konnte aber an entsprechender Stelle nichts als solche gelesen werden.
+
 \textbf{MWP: Unknown meta line: \#}
-\\Meta-Informationen ungültig.
+\\Meta-Informationen unbekannt. Werden ignoriert.
 
 \textbf{MWP: skip invalid data line: \#}
 \\Ungültige Datenzeile wurde übersprungen.
 
-\textbf{MWP: Error while parsing numbers in \#}
+\textbf{MWP: unparseable number in data row: \#}
 \\Falsche Zahlenformat.
 
 \textbf{ANNCLASS: rule has no name}
@@ -688,8 +762,29 @@
 \textbf{BSP: Error while parsing data row.}
 \\Ungültige Datenzeile.
 
+\textbf{duplicate station '...': -$>$ ignored}
+\\Duplikat einer Station. Wird ignoriert.
+
+\textbf{BSP: unparseable height ...}
+\\Nicht lesbare Sohlhöhe in einer Sohlhöhen-Datei.
+
+\textbf{BSP: unparseable uncertainty value ...}
+\\Nicht lesbare Unsicherheit in einer Sohlhöhen-Datei.
+
+\textbf{BSP: unparseable data gap ...}
+\\Nicht lesbare Datenlücke in einer Sohlhöhen-Datei.
+
+\textbf{BSP: unparseable sounding width ...}
+\\Nicht lesbare Peilbreite in einer Sohlhöhen-Datei.
+
+\textbf{BSP: unparseable width ...}
+\\Nicht lesbare Breite in einer Sohlhöhen-Datei.
+
+\textbf{BSP: unparseable value in data row.}
+\\Nicht lesbare Werte in einer Sohlhöhen-Datei.
+
 \textbf{SYP: Unknown meta line: \#}
-\\Ungültige Metadatenzeile.
+\\Meta-Informationen unbekannt. Werden ignoriert.
 
 \textbf{SYP: skip invalid data line \#}
 \\Ungültige Datenzeile wurde übersprungen.
@@ -712,9 +807,12 @@
 \textbf{WST: invalid number.}
 \\Ungültige Zahl.
 
-\textbf{WST: km $km$ ($<Zeile>$) found more than once. $->$ ignored.}
+\textbf{WST: km $km$ ($<Zeile>$) found more than once. -$>$ ignored.}
 \\Ein Kilometer ist doppelt in einer WST-Datei enthalten.
 
+\textbf{WST: String ... could not be interpreted as valid timestamp}
+\\In einer Kopfzeile einer WST-Datei konnte ein Eintrag nicht als Datum erkannt werden.
+
 \textbf{HYK: zone coordinates swapped in line \#}
 \\Fließzonenkordinaten wurden in umgekehrter Reihenfolge angeben.
 
@@ -727,6 +825,9 @@
 \textbf{ISQ: Cannot determine sq relation without time interval.}
 \\Einer S(Q)-Beziehung ist keine zeitliche Gültigkeit zugeordnet.
 
+\textbf{Unparseable ... in sq relation row: ...}
+\\Der gegebene Wert in der gegebenen Zeile konnte nicht als Zahl gelesen werden.
+
 \textbf{IWD: skip invalid waterlevel difference - no unit set!}
 \\Wasserstandsdifferenz hat keine Einheit.
 
@@ -739,6 +840,20 @@
 \textbf{BHE: Skip file - invalid km range.}
 \\Kilometerbereich ungültig.
 
+\textbf{No upper value for range found in ...}
+\textbf{No range found for measurement station '...'}
+\\Streckengültigkeit einer Messstelle in \textit{Stammdaten\_Messstellen.csv} ungültig.
+
+\textbf{invalid gauge found: ...}
+\\Kein gültiger Pegel zur Messstelle gegeben.
+
+\textbf{Found invalid observation time ...}
+\textbf{Observation time date invalid: ...}
+\textbf{Observation time date not parseable: ...}
+\\Kein gültiger zeitlicher Bezug zur Messstelle gegeben.
+
+\textbf{No gauge found for measurement station '...'}
+\\Der in \textit{Stammdaten\_Messstellen.csv} gegebene Pegel existiert nicht in der Datenbank.
 
 \subsection{Hinweise zum Betrieb}
 Aufgrund des hohen Speicherverbrauchs des Importers wird empfohlen, der JVM
@@ -760,9 +875,26 @@
 gestartet. Dazu führen folgenden Befehl aus:\\
 
 \begin{lstlisting}
-    ./run_hydr_morph.sh
+    ./run_hydr_morph.sh pfad/zur/beispiel.gew
 \end{lstlisting}
+\textbf{INFO\_GEW}
+Der übergebene Pfad muss auf eine valide *.gew Datei verweisen (bekannt aus
+Desktop-FLYS). Wichtig für den Importer sind in dieser Datei die Zeilen, die mit
+\textit{WSTDatei:} beginnen. In ihnen wird der Pfad zu der zentralen WST-Datei
+des jeweiligen Gewässers angegeben. Alle anderen importierten Dateien werden in
+ihrer Lage im Dateisystem relativ zur Lage dieser Datei betrachtet.
+Ebenfalls wichtig ist die Zeile beginnend mit \textit{Gewässer:}
+in der der Name des Gewässers festgelegt wird.
 
 Nachdem der Prompt der Konsole zurückkehrt, ist der Import abgeschlossen oder es
 ist ein Fehler aufgetreten. Weitere Informationen entnehmen Sie der Log-Datei.
 
+Um einen Gewässerdatensatz in einem Durchlauf (inkl.\ Geodaten) 
+zu importieren, kann auch das Skript \textit{import\_river.sh} verwendet werden.
+
+Details zur Verwendung erhalten Sie auf der Kommandozeile mit 
+\begin{lstlisting}
+    ./import_river.sh --help
+\end{lstlisting}
+Alternativ können auch in diesem Skript einige Variablen 
+(\textit{DEFAULT\_*}) angepasst werden.
--- a/backend/doc/documentation/de/importer-manual.tex	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/doc/documentation/de/importer-manual.tex	Wed Oct 16 13:03:13 2013 +0200
@@ -26,9 +26,9 @@
 % Document DATE and VERSION
 % set these values when releasing a new version
 
-\newcommand{\documentdate}{19. Februar 2013}
-\newcommand{\documentversion}{1.1}
-\newcommand{\documentrevision}{rev5062}
+\newcommand{\documentdate}{\today}
+\newcommand{\documentversion}{1.2}
+\newcommand{\documentrevision}{rev6811}
 \newcommand{\documentID}{importer-manual.tex}
 %----------------------------------------------
 
--- a/backend/doc/documentation/de/overview.tex	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/doc/documentation/de/overview.tex	Wed Oct 16 13:03:13 2013 +0200
@@ -2,8 +2,7 @@
 
 Diese Dokumentation beschreibt die von Intevation entwickelten Werkzeuge zum
 Importieren der hydrologischen, morphologischen und geodätischen Daten der BfG.
-Die im Folgenden\\ beschriebenen Werkzeuge zum Importieren der fachlichen und
-geodätischen Daten sind speziell auf das Verzeichnissystem der BfG ausgerichtet.
+Die im Folgenden beschriebenen Werkzeuge zum Importieren der Daten sind speziell auf das Verzeichnissystem der BfG ausgerichtet.
 Dabei wird angenommen, dass sich das Verzeichnis eines Gewässers auf oberster
 Ebene in drei Unterverzeichnisse aufgliedert:
 
@@ -69,7 +68,7 @@
 \end{lstlisting}
 
 \subsubsection{Java}
-Der flys-importer benötigt Java Version 6 um diese zu installieren laden Sie
+Der flys-importer benötigt Java Version 6. Um diese zu installieren laden Sie
 bitte von \url{http://www.oracle.com/technetwork/java/javase/downloads/jdk6downloads-1902814.html}
 eine aktulle Java Version als -rpm.bin herunter. Zum Beispiel: jdk-6u41-linux-x64-rpm.bin
 
@@ -95,9 +94,10 @@
  \begin{lstlisting}
      zypper ar http://download.opensuse.org/repositories/home:/intevation:/bfg/SLE_11/ "intevation:bfg"
      rpm --import http://download.opensuse.org/repositories/home:/intevation:/bfg/SLE_11/repodata/repomd.xml.key
-     zypper ref # Paketlist neu laden
-     zypper in python libgeos0 libproj0 proj netcdf libnetcdf4 \
-        xerces-c libxerces-c-3_0 unixODBC postgresql-libs
+     zypper ref # Paketliste neu laden
+     zypper in python libgeos0 libproj0 proj netcdf \
+        libnetcdf4 xerces-c libxerces-c-3_0 unixODBC \
+        postgresql-libs
      zypper mr -d "intevation:bfg"
      zypper ref # Paketliste neu laden
  \end{lstlisting}
@@ -188,8 +188,8 @@
 führen Sie im Importer Verzeichnis folgende Befehle aus:
 
 \begin{lstlisting}
-export LD_LIBRARY_PATH=opt/instantclient\_11\_2/lib:$LD_LIBRARY_PATH
-export PATH=opt/instantclient\_11\_2:$PATH
+export LD_LIBRARY_PATH=opt/instantclient_11_2/lib:$LD_LIBRARY_PATH
+export PATH=opt/instantclient_11_2:$PATH
 \end{lstlisting}
 
 Damit alle in den UTF8-codierten SQL-Skripten vorhandenen Zeichen (also z.B.\ 
@@ -200,13 +200,30 @@
 export NLS_LANG=.AL32UTF8
 \end{lstlisting}
 
-Nun erstellen Sie das Schema:
+Nun verbinden Sie sich mit der Datenbank
+\begin{lstlisting}
+    sqlplus user/password@connect_identifier
+\end{lstlisting}
+
+und erstellen das Schema:
 
 \begin{lstlisting}
-    sqlplus benutzername/passwort @schema/oracle.sql
-    sqlplus benutzername/passwort @schema/oracle-minfo.sql
-    sqlplus benutzername/passwort @schema/oracle-spatial.sql
-    sqlplus benutzername/passwort @schema/oracle-spatial_idx.sql
+    @schema/oracle.sql
+    @schema/oracle-minfo.sql
+    @schema/oracle-spatial.sql
+    @schema/oracle-spatial_idx.sql
 \end{lstlisting}
 
+Hierbei ist 
+\begin{lstlisting}
+user/password@connect_identifier
+\end{lstlisting}
+so etwas wie 
+\begin{lstlisting}
+ICH/geheim@127.0.0.1:1234/DB.TEST.FIRMA.DE
+\end{lstlisting}
 
+Um sqlplus zu verlassen verwenden Sie
+\begin{lstlisting}
+exit
+\end{lstlisting}
--- a/backend/doc/documentation/de/title.tex	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/doc/documentation/de/title.tex	Wed Oct 16 13:03:13 2013 +0200
@@ -44,6 +44,7 @@
  {\bf Authors}:\\
  Ingo Weinzierl$<$ingo.weinzierl@intevation.de$>$\\
  Sascha Teichmann $<$sascha.teichmann@intevation.de$>$\\
+ Tom Gottfried $<$tom.gottfried@intevation.de$>$\\
  {\bf Intevation GmbH},\\
  Neuer Graben 17, 49074 Osnabrück, Germany\\
  Tel: ++49 541 33 50 83 - 0 \\
--- a/backend/doc/schema/oracle-drop-minfo.sql	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/doc/schema/oracle-drop-minfo.sql	Wed Oct 16 13:03:13 2013 +0200
@@ -27,14 +27,6 @@
 ALTER TABLE sediment_yield DROP CONSTRAINT fk_sy_time_interval_id;
 ALTER TABLE sediment_yield DROP CONSTRAINT fk_sy_river_id;
 ALTER TABLE sediment_yield_values DROP CONSTRAINT fk_syv_sediment_yield_id;
-ALTER TABLE waterlevel DROP CONSTRAINT fk_w_river_id;
-ALTER TABLE waterlevel DROP CONSTRAINT fk_w_unit_id;
-ALTER TABLE waterlevel_q_range DROP CONSTRAINT fk_wqr_waterlevel_id;
-ALTER TABLE waterlevel_values DROP CONSTRAINT fk_wv_waterlevel_q_range_id;
-ALTER TABLE waterlevel_difference DROP CONSTRAINT fk_wd_river_id;
-ALTER TABLE waterlevel_difference DROP CONSTRAINT fk_wd_unit_id;
-ALTER TABLE waterlevel_difference_column DROP CONSTRAINT fk_wdc_difference_id;
-ALTER TABLE waterlevel_difference_values DROP CONSTRAINT fk_wdv_column_id;
 ALTER TABLE sq_relation DROP CONSTRAINT fk_sqr_tinterval_id;
 ALTER TABLE sq_relation DROP CONSTRAINT fk_sqr_river_id;
 ALTER TABLE sq_relation_value DROP CONSTRAINT fk_sqr_id;
@@ -44,37 +36,30 @@
 ALTER TABLE measurement_station DROP CONSTRAINT fk_ms_reference_gauge_id;
 ALTER TABLE measurement_station DROP CONSTRAINT fk_ms_observation_timerange_id;
 
-DROP TABLE bed_height_type;
-DROP TABLE location_system;
-DROP TABLE elevation_model;
-DROP TABLE bed_height_single;
-DROP TABLE bed_height_single_values;
-DROP TABLE bed_height_epoch_values;
-DROP TABLE bed_height_epoch;
-DROP TABLE depths;
-DROP TABLE sediment_density;
-DROP TABLE sediment_density_values;
-DROP TABLE morphologic_width;
-DROP TABLE morphologic_width_values;
-DROP TABLE discharge_zone;
-DROP TABLE flow_velocity_model;
-DROP TABLE flow_velocity_model_values;
-DROP TABLE flow_velocity_measurements;
-DROP TABLE flow_velocity_measure_values;
-DROP TABLE grain_fraction;
-DROP TABLE sediment_yield;
-DROP TABLE sediment_yield_values;
-DROP TABLE waterlevel;
-DROP TABLE waterlevel_q_range;
-DROP TABLE waterlevel_values;
-DROP TABLE waterlevel_difference;
-DROP TABLE waterlevel_difference_column;
-DROP TABLE waterlevel_difference_values;
-DROP TABLE measurement_station;
-DROP TABLE sq_relation_value;
-DROP TABLE sq_relation;
+DROP TABLE bed_height_type PURGE;
+DROP TABLE location_system PURGE;
+DROP TABLE elevation_model PURGE;
+DROP TABLE bed_height_single PURGE;
+DROP TABLE bed_height_single_values PURGE;
+DROP TABLE bed_height_epoch_values PURGE;
+DROP TABLE bed_height_epoch PURGE;
+DROP TABLE depths PURGE;
+DROP TABLE sediment_density PURGE;
+DROP TABLE sediment_density_values PURGE;
+DROP TABLE morphologic_width PURGE;
+DROP TABLE morphologic_width_values PURGE;
+DROP TABLE discharge_zone PURGE;
+DROP TABLE flow_velocity_model PURGE;
+DROP TABLE flow_velocity_model_values PURGE;
+DROP TABLE flow_velocity_measurements PURGE;
+DROP TABLE flow_velocity_measure_values PURGE;
+DROP TABLE grain_fraction PURGE;
+DROP TABLE sediment_yield PURGE;
+DROP TABLE sediment_yield_values PURGE;
+DROP TABLE measurement_station PURGE;
+DROP TABLE sq_relation_value PURGE;
+DROP TABLE sq_relation PURGE;
 
-DROP SEQUENCE BED_HEIGHT_TYPE_SEQ;
 DROP SEQUENCE LOCATION_SYSTEM_SEQ;
 DROP SEQUENCE ELEVATION_MODEL_SEQ;
 DROP SEQUENCE BED_HEIGHT_SINGLE_ID_SEQ;
@@ -94,11 +79,6 @@
 DROP SEQUENCE GRAIN_FRACTION_ID_SEQ;
 DROP SEQUENCE SEDIMENT_YIELD_ID_SEQ;
 DROP SEQUENCE SEDIMENT_YIELD_VALUES_ID_SEQ;
-DROP SEQUENCE WATERLEVEL_ID_SEQ;
-DROP SEQUENCE WATERLEVEL_Q_RANGES_ID_SEQ;
-DROP SEQUENCE WATERLEVEL_VALUES_ID_SEQ;
-DROP SEQUENCE WATERLEVEL_DIFFERENCE_ID_SEQ;
-DROP SEQUENCE WATERLEVEL_DIFF_COLUMN_ID_SEQ;
-DROP SEQUENCE WATERLEVEL_DIFF_VALUES_ID_SEQ;
+DROP SEQUENCE MEASUREMENT_STATION_ID_SEQ;
 DROP SEQUENCE SQ_RELATION_ID_SEQ;
 DROP SEQUENCE SQ_RELATION_VALUES_ID_SEQ;
--- a/backend/doc/schema/oracle-drop-spatial.sql	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/doc/schema/oracle-drop-spatial.sql	Wed Oct 16 13:03:13 2013 +0200
@@ -1,88 +1,85 @@
 DROP TRIGGER river_axes_trigger;
-DROP TABLE river_axes;
+DROP TABLE river_axes PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'RIVER_AXES';
 DROP SEQUENCE RIVER_AXES_ID_SEQ;
 
 DROP TRIGGER river_axes_km_trigger;
-DROP TABLE river_axes_km;
+DROP TABLE river_axes_km PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'RIVER_AXES_KM';
 DROP SEQUENCE RIVER_AXES_KM_ID_SEQ;
 
 DROP TRIGGER cross_section_tracks_trigger;
-DROP TABLE cross_section_tracks;
+DROP TABLE cross_section_tracks PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'CROSS_SECTION_TRACKS';
 DROP SEQUENCE CROSS_SECTION_TRACKS_ID_SEQ;
 
 DROP TRIGGER buildings_trigger;
-DROP TABLE buildings;
+DROP TABLE buildings PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'BUILDINGS';
 DROP SEQUENCE BUILDINGS_ID_SEQ;
 
 DROP TRIGGER fixpoints_trigger;
-DROP TABLE fixpoints;
+DROP TABLE fixpoints PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'FIXPOINTS';
 DROP SEQUENCE FIXPOINTS_ID_SEQ;
 
 DROP TRIGGER floodplain_trigger;
-DROP TABLE floodplain;
+DROP TABLE floodplain PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'FLOODPLAIN';
 DROP SEQUENCE FLOODPLAIN_ID_SEQ;
 
 DROP TRIGGER dem_trigger;
-DROP TABLE dem;
+DROP TABLE dem PURGE;
 DROP SEQUENCE DEM_ID_SEQ;
 
-DROP TRIGGER catchment_trigger;
-DROP TABLE catchment;
-DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'CATCHMENT';
-DROP SEQUENCE CATCHMENT_ID_SEQ;
-
 DROP TRIGGER hws_lines_trigger;
-DROP TABLE hws_lines;
+DROP TABLE hws_lines PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'HWS_LINES';
 DROP SEQUENCE HWS_LINES_ID_SEQ;
 
 DROP TRIGGER hws_points_trigger;
-DROP TABLE hws_points;
+DROP TABLE hws_points PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'HWS_POINTS';
 DROP SEQUENCE HWS_POINTS_ID_SEQ;
 
 DROP TRIGGER floodmaps_trigger;
-DROP TABLE floodmaps;
+DROP TABLE floodmaps PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'FLOODMAPS';
 DROP SEQUENCE FLOODMAPS_ID_SEQ;
 
 DROP TRIGGER hydr_boundaries_trigger;
-DROP TABLE hydr_boundaries;
+DROP TABLE hydr_boundaries PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'HYDR_BOUNDARIES';
 DROP SEQUENCE HYDR_BOUNDARIES_ID_SEQ;
 
 DROP TRIGGER hydr_boundaries_poly_trigger;
-DROP TABLE hydr_boundaries_poly;
+DROP TABLE hydr_boundaries_poly PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'HYDR_BOUNDARIES_POLY';
 DROP SEQUENCE HYDR_BOUNDARIES_POLY_ID_SEQ;
 
 DROP TRIGGER gauge_location_trigger;
-DROP TABLE gauge_location;
+DROP TABLE gauge_location PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'GAUGE_LOCATION';
 DROP SEQUENCE GAUGE_LOCATION_ID_SEQ;
 
 DROP TRIGGER jetties_trigger;
-DROP TABLE jetties;
+DROP TABLE jetties PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'JETTIES';
 DROP SEQUENCE JETTIES_ID_SEQ;
 
 DROP TRIGGER flood_marks_trigger;
-DROP TABLE flood_marks;
+DROP TABLE flood_marks PURGE;
 DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'FLOOD_MARKS';
 DROP SEQUENCE FLOOD_MARKS_ID_SEQ;
 
-DROP TABLE hws_kinds;
-DROP TABLE sectie_kinds;
-DROP TABLE sobek_kinds;
-DROP TABLE fed_states;
-DROP TABLE axis_kinds;
-DROP TABLE boundary_kinds;
-DROP TABLE cross_section_track_kinds;
-DROP TABLE floodplain_kinds;
-DROP TABLE building_kinds;
+DROP TABLE hws_kinds PURGE;
+DROP TABLE sectie_kinds PURGE;
+DROP TABLE sobek_kinds PURGE;
+DROP TABLE fed_states PURGE;
+DROP TABLE axis_kinds PURGE;
+DROP TABLE boundary_kinds PURGE;
+DROP TABLE cross_section_track_kinds PURGE;
+DROP TABLE floodplain_kinds PURGE;
+DROP TABLE floodmap_kinds PURGE;
+DROP TABLE building_kinds PURGE;
+DROP TABLE jetty_kinds PURGE;
--- a/backend/doc/schema/oracle-drop.sql	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/doc/schema/oracle-drop.sql	Wed Oct 16 13:03:13 2013 +0200
@@ -20,6 +20,8 @@
 ALTER TABLE main_values DROP CONSTRAINT cMainValuesGauges;
 ALTER TABLE main_values DROP CONSTRAINT cMainValuesNamedMainValues;
 ALTER TABLE named_main_values DROP CONSTRAINT cNamedMainValuesMainValueTypes;
+ALTER TABLE official_lines DROP CONSTRAINT cOffLinesNamedMainValues;
+ALTER TABLE official_lines DROP CONSTRAINT cOffLinesWstColumns;
 ALTER TABLE ranges DROP CONSTRAINT cRangesRivers;
 ALTER TABLE rivers DROP CONSTRAINT cRiversUnits;
 ALTER TABLE wst_column_q_ranges DROP CONSTRAINT cWstColumnQRangesWstColums;
@@ -30,36 +32,36 @@
 ALTER TABLE wst_q_ranges DROP CONSTRAINT cWstQRangesRanges;
 ALTER TABLE wsts DROP CONSTRAINT cWstsRivers;
 ALTER TABLE wsts DROP CONSTRAINT cWstsWstKinds;
-DROP TABLE annotation_types;
-DROP TABLE annotations;
-DROP TABLE attributes;
-DROP TABLE cross_section_lines;
-DROP TABLE cross_section_points;
-DROP TABLE cross_sections;
-DROP TABLE discharge_table_values;
-DROP TABLE discharge_tables;
-DROP TABLE edges;
-DROP TABLE gauges;
-DROP TABLE hyk_entries;
-DROP TABLE hyk_flow_zone_types;
-DROP TABLE hyk_flow_zones;
-DROP TABLE hyk_formations;
-DROP TABLE hyks;
-DROP TABLE main_value_types;
-DROP TABLE main_values;
-DROP TABLE named_main_values;
-DROP TABLE positions;
-DROP TABLE ranges;
-DROP TABLE rivers;
-DROP TABLE time_intervals;
-DROP TABLE units;
-DROP TABLE wst_column_q_ranges;
-DROP TABLE wst_column_values;
-DROP TABLE wst_columns;
-DROP TABLE wst_q_ranges;
-DROP TABLE official_lines;
-DROP TABLE wsts;
-DROP TABLE wst_kinds;
+DROP TABLE annotation_types PURGE;
+DROP TABLE annotations PURGE;
+DROP TABLE attributes PURGE;
+DROP TABLE cross_section_lines PURGE;
+DROP TABLE cross_section_points PURGE;
+DROP TABLE cross_sections PURGE;
+DROP TABLE discharge_table_values PURGE;
+DROP TABLE discharge_tables PURGE;
+DROP TABLE edges PURGE;
+DROP TABLE gauges PURGE;
+DROP TABLE hyk_entries PURGE;
+DROP TABLE hyk_flow_zone_types PURGE;
+DROP TABLE hyk_flow_zones PURGE;
+DROP TABLE hyk_formations PURGE;
+DROP TABLE hyks PURGE;
+DROP TABLE main_value_types PURGE;
+DROP TABLE main_values PURGE;
+DROP TABLE named_main_values PURGE;
+DROP TABLE positions PURGE;
+DROP TABLE ranges PURGE;
+DROP TABLE rivers PURGE;
+DROP TABLE time_intervals PURGE;
+DROP TABLE units PURGE;
+DROP TABLE wst_column_q_ranges PURGE;
+DROP TABLE wst_column_values PURGE;
+DROP TABLE wst_columns PURGE;
+DROP TABLE wst_q_ranges PURGE;
+DROP TABLE official_lines PURGE;
+DROP TABLE wsts PURGE;
+DROP TABLE wst_kinds PURGE;
 DROP SEQUENCE ANNOTATION_TYPES_ID_SEQ;
 DROP SEQUENCE ANNOTATIONS_ID_SEQ;
 DROP SEQUENCE ATTRIBUTES_ID_SEQ;
--- a/backend/doc/schema/oracle-minfo.sql	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/doc/schema/oracle-minfo.sql	Wed Oct 16 13:03:13 2013 +0200
@@ -85,12 +85,12 @@
 CREATE TABLE bed_height_single_values (
     id                      NUMBER(38,0) NOT NULL,
     bed_height_single_id    NUMBER(38,0) NOT NULL,
-    station                 NUMBER(38,2) NOT NULL,
-    height                  NUMBER(38,2),
-    uncertainty             NUMBER(38,2),
-    data_gap                NUMBER(38,2),
-    sounding_width          NUMBER(38,2),
-    width                   NUMBER(38,2),
+    station                 DOUBLE PRECISION NOT NULL,
+    height                  DOUBLE PRECISION,
+    uncertainty             DOUBLE PRECISION,
+    data_gap                DOUBLE PRECISION,
+    sounding_width          DOUBLE PRECISION,
+    width                   DOUBLE PRECISION,
     PRIMARY KEY(id),
     UNIQUE (station, bed_height_single_id),
     CONSTRAINT fk_bed_single_values_parent FOREIGN KEY (bed_height_single_id) REFERENCES bed_height_single(id) ON DELETE CASCADE
@@ -179,8 +179,8 @@
     river_id                NUMBER(38,0) NOT NULL,
     gauge_name              VARCHAR(64)  NOT NULL, -- this is not very proper, but there are gauges with no db instance
     value                   NUMBER(38,3) NOT NULL,
-    lower_discharge         VARCHAR(16)  NOT NULL,
-    upper_discharge         VARCHAR(16),
+    lower_discharge         VARCHAR(64)  NOT NULL,
+    upper_discharge         VARCHAR(64),
     PRIMARY KEY(id),
     CONSTRAINT fk_dz_river_id FOREIGN KEY (river_id) REFERENCES rivers(id) ON DELETE CASCADE
 );
@@ -247,7 +247,7 @@
     name    VARCHAR(64)    NOT NULL,
     lower   NUMBER(38,3),
     upper   NUMBER(38,3),
-    PRIMARY KEY (id),
+    PRIMARY KEY (id)
 );
 
 
--- a/backend/doc/schema/oracle-spatial.sql	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/doc/schema/oracle-spatial.sql	Wed Oct 16 13:03:13 2013 +0200
@@ -1,4 +1,4 @@
-WHENEVER SQLERROR EXIT;
+--WHENEVER SQLERROR EXIT;
 
 CREATE TABLE axis_kinds(
     id NUMBER PRIMARY KEY NOT NULL,
@@ -14,7 +14,7 @@
     OGR_FID NUMBER(38),
     GEOM MDSYS.SDO_GEOMETRY,
     river_id NUMBER(38) REFERENCES rivers(id) ON DELETE CASCADE,
-    kind_id  NUMBER(38) REFERENCES axis_kinds(id) NOT NULL DEFAULT 0,
+    kind_id  NUMBER(38) DEFAULT 0 NOT NULL REFERENCES axis_kinds(id),
     name     VARCHAR(64),
     path     VARCHAR(256),
     ID NUMBER PRIMARY KEY NOT NULL
@@ -62,7 +62,7 @@
     OGR_FID NUMBER(38),
     GEOM MDSYS.SDO_GEOMETRY,
     river_id NUMBER(38) REFERENCES rivers(id) ON DELETE CASCADE,
-    kind_id  NUMBER(38) REFERENCES cross_section_track_kinds(id) NOT NULL DEFAULT 0,
+    kind_id  NUMBER(38) DEFAULT 0 NOT NULL REFERENCES cross_section_track_kinds(id),
     km       NUMBER(38,12) NOT NULL,
     z        NUMBER(38,12) DEFAULT 0 NOT NULL,
     name     VARCHAR(64),
@@ -145,7 +145,7 @@
     OGR_FID NUMBER(38),
     GEOM MDSYS.SDO_GEOMETRY,
     river_id NUMBER(38) REFERENCES rivers(id) ON DELETE CASCADE,
-    kind_id  NUMBER(38) REFERENCES floodplain_kinds(id) NOT NULL DEFAULT 0,
+    kind_id  NUMBER(38) DEFAULT 0 NOT NULL REFERENCES floodplain_kinds(id),
     name     VARCHAR(64),
     path     VARCHAR(256),
     ID NUMBER PRIMARY KEY NOT NULL
@@ -165,7 +165,7 @@
     ID               NUMBER PRIMARY KEY NOT NULL,
     river_id         NUMBER(38) REFERENCES rivers(id) ON DELETE CASCADE,
     name             VARCHAR(64),
-    range_id         NUMBER(38) REFERENCES ranges(id),
+    range_id         NUMBER(38) REFERENCES ranges(id) ON DELETE CASCADE,
     time_interval_id NUMBER(38) REFERENCES time_intervals(id),
     projection       VARCHAR(32),
     elevation_state  VARCHAR(32),
--- a/backend/doc/schema/oracle.sql	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/doc/schema/oracle.sql	Wed Oct 16 13:03:13 2013 +0200
@@ -27,17 +27,18 @@
 
 CREATE TABLE attributes (
     id              NUMBER(38,0) NOT NULL, 
-    value           VARCHAR2(255) NOT NULL UNIQUE, 
+    value           VARCHAR2(255) UNIQUE, 
     primary key     (id)
 );
-
+-- value can not be NOT NULL in Oracle:
+-- '' is needed here and silently converted to NULL in Oracle
 
 -- CROSS_SECTION_LINES
 CREATE SEQUENCE CROSS_SECTION_LINES_ID_SEQ;
 
 CREATE TABLE cross_section_lines (
     id                  NUMBER(38,0) NOT NULL,
-    km                  NUMBER(38,2) NOT NULL,
+    km                  NUMBER(38,5) NOT NULL,
     cross_section_id    NUMBER(38,0) NOT NULL, 
     PRIMARY KEY         (id),
     UNIQUE (km, cross_section_id)
@@ -53,7 +54,7 @@
     x                       NUMBER(38,2) NOT NULL,
     y                       NUMBER(38,2) NOT NULL,
     cross_section_line_id   NUMBER(38,0) NOT NULL,
-    PRIMARY KEY             (id),
+    PRIMARY KEY             (id)
 );
 
 
@@ -94,7 +95,7 @@
     id                  NUMBER(38,0) NOT NULL,
     description         VARCHAR2(255) NOT NULL,
     bfg_id              VARCHAR2(50),
-    kind                NUMBER(38,0) NOT NULL DEFAULT 0,
+    kind                NUMBER(38,0) DEFAULT 0 NOT NULL,
     gauge_id            NUMBER(38,0) NOT NULL,
     time_interval_id    NUMBER(38,0),
     PRIMARY KEY         (id),
@@ -121,9 +122,9 @@
     aeo                 NUMBER(38,2) NOT NULL,
     datum               NUMBER(38,2) NOT NULL, 
     name                VARCHAR2(255) NOT NULL,
-    station             NUMBER(38,2) NOT NULL,
+    station             NUMBER(38,4) NOT NULL,
     official_number     NUMBER(38,0),
-    range_id            NUMBER(38,0) NOT NULL,
+    range_id            NUMBER(38,0),
     -- TODO: remove river id here because range_id references river already
     river_id            NUMBER(38,0) NOT NULL,
     PRIMARY KEY         (id),
@@ -215,8 +216,6 @@
     gauge_id            NUMBER(38,0) NOT NULL,
     named_value_id      NUMBER(38,0) NOT NULL,
     time_interval_id    NUMBER(38,0),
-
-    -- TODO: better checks
     UNIQUE (gauge_id, named_value_id, time_interval_id),
     PRIMARY KEY         (id)
 );
@@ -252,7 +251,8 @@
     b                   NUMBER(38,10),
     river_id            NUMBER(38,0),
     UNIQUE (river_id, a, b),
-    PRIMARY KEY (id)
+    PRIMARY KEY (id),
+    CHECK (a < b)
 );
 
 
@@ -263,7 +263,7 @@
 CREATE TABLE rivers (
     id                  NUMBER(38,0) NOT NULL,
     official_number     NUMBER(38,0),
-    km_up               NUMBER(38,0) NOT NULL DEFAULT 0,
+    km_up               NUMBER(38,0) DEFAULT 0 NOT NULL,
     name                VARCHAR2(255) NOT NULL UNIQUE,
     wst_unit_id         NUMBER(38,0) NOT NULL,
     PRIMARY KEY         (id)
@@ -325,7 +325,8 @@
     id                  NUMBER(38,0) NOT NULL,
     description         VARCHAR2(255),
     name                VARCHAR2(255) NOT NULL,
-    position            NUMBER(38,0) NOT NULL DEFAULT 0,
+    source              VARCHAR(256),
+    position            NUMBER(38,0) DEFAULT 0 NOT NULL,
     time_interval_id    NUMBER(38,0),
     wst_id              NUMBER(38,0) NOT NULL,
     UNIQUE (wst_id, name),
@@ -416,7 +417,7 @@
 ALTER TABLE wst_column_q_ranges ADD CONSTRAINT cWstColumnQRangesWstQRanges FOREIGN KEY (wst_q_range_id) REFERENCES wst_q_ranges ON DELETE CASCADE;
 ALTER TABLE wst_columns ADD CONSTRAINT cWstColumnsWsts FOREIGN KEY (wst_id) REFERENCES wsts ON DELETE CASCADE;
 ALTER TABLE wst_column_values ADD CONSTRAINT cWstColumnValuesWstColumns FOREIGN KEY (wst_column_id) REFERENCES wst_columns ON DELETE CASCADE;
-ALTER TABLE wst_q_ranges ADD CONSTRAINT cWstQRangesRanges FOREIGN KEY (range_id) REFERENCES RANGES ON LETE CASCADE;
+ALTER TABLE wst_q_ranges ADD CONSTRAINT cWstQRangesRanges FOREIGN KEY (range_id) REFERENCES RANGES ON DELETE CASCADE;
 ALTER TABLE wsts ADD CONSTRAINT cWstsRivers FOREIGN KEY (river_id) REFERENCES rivers ON DELETE CASCADE;
 ALTER TABLE wsts ADD CONSTRAINT cWstsWstKinds FOREIGN KEY (kind) REFERENCES wst_kinds;
 
--- a/backend/doc/schema/postgresql-minfo.sql	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/doc/schema/postgresql-minfo.sql	Wed Oct 16 13:03:13 2013 +0200
@@ -179,8 +179,8 @@
     river_id                int NOT NULL,
     gauge_name              VARCHAR(64)  NOT NULL, -- this is not very proper, but there are gauges with no db instance
     value                   NUMERIC NOT NULL,
-    lower_discharge         VARCHAR(16)  NOT NULL,
-    upper_discharge         VARCHAR(16),
+    lower_discharge         VARCHAR(64)  NOT NULL,
+    upper_discharge         VARCHAR(64),
     PRIMARY KEY(id),
     CONSTRAINT fk_dz_river_id FOREIGN KEY (river_id) REFERENCES rivers(id) ON DELETE CASCADE
 );
@@ -247,7 +247,7 @@
     name    VARCHAR(64)    NOT NULL,
     lower   NUMERIC,
     upper   NUMERIC,
-    PRIMARY KEY (id),
+    PRIMARY KEY (id)
 );
 
 
--- a/backend/doc/schema/postgresql-setup.sh	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/doc/schema/postgresql-setup.sh	Wed Oct 16 13:03:13 2013 +0200
@@ -11,9 +11,12 @@
 createuser -S -D -R $1
 createdb $1
 createlang plpgsql $1
-# Appears e.g. as /usr/share/postgresql/contrib/postgis-1.5/ on other systems.
-psql -d $1 -f /usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql
-psql -d $1 -f /usr/share/postgresql/8.4/contrib/postgis-1.5/spatial_ref_sys.sql
+# Path appears e.g. as /usr/share/postgresql/contrib/postgis-1.5/ on some systems,
+# /usr/share/postgresql/8.4/contrib/postgis-1.5/ on others
+POST_INIT_DIR=`find /usr/share/postgresql/ -name spatial_ref_sys.sql | sed -n '1p'`
+POST_INIT_DIR=`dirname $POST_INIT_DIR`
+psql -d $1 -f $POST_INIT_DIR/postgis.sql
+psql -d $1 -f $POST_INIT_DIR/spatial_ref_sys.sql
 psql -d $1 -c "ALTER USER $1 WITH PASSWORD '$1';"
 psql -d $1 -c "GRANT ALL ON geometry_columns TO $1; GRANT ALL ON geography_columns TO $1; GRANT ALL ON spatial_ref_sys TO $1;"
 
--- a/backend/doc/schema/postgresql-spatial.sql	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/doc/schema/postgresql-spatial.sql	Wed Oct 16 13:03:13 2013 +0200
@@ -123,7 +123,7 @@
     id       int PRIMARY KEY NOT NULL,
     river_id int REFERENCES rivers(id) ON DELETE CASCADE,
     name             VARCHAR(64),
-    range_id         INT REFERENCES ranges(id),
+    range_id         INT REFERENCES ranges(id) ON DELETE CASCADE,
     time_interval_id INT REFERENCES time_intervals(id),
     projection       VARCHAR(32),
     srid	     int NOT NULL,
--- a/backend/doc/schema/postgresql.sql	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/doc/schema/postgresql.sql	Wed Oct 16 13:03:13 2013 +0200
@@ -34,7 +34,8 @@
     river_id int             NOT NULL REFERENCES rivers(id) ON DELETE CASCADE,
     a        NUMERIC         NOT NULL,
     b        NUMERIC,
-    UNIQUE (river_id, a, b)
+    UNIQUE (river_id, a, b),
+    CHECK (a < b)
 );
 
 
@@ -91,7 +92,7 @@
     -- Pegelnullpunkt
     datum    NUMERIC NOT NULL,
     -- Streckengueltigkeit
-    range_id int NOT NULL REFERENCES ranges (id) ON DELETE CASCADE,
+    range_id int REFERENCES ranges (id) ON DELETE CASCADE,
 
     UNIQUE (name, river_id),
     UNIQUE (official_number, river_id),
@@ -201,6 +202,7 @@
     wst_id      int NOT NULL REFERENCES wsts(id) ON DELETE CASCADE,
     name        VARCHAR(256) NOT NULL,
     description VARCHAR(256),
+    source      VARCHAR(256),
     position    int NOT NULL DEFAULT 0,
 
     time_interval_id int REFERENCES time_intervals(id),
@@ -324,7 +326,7 @@
     cross_section_line_id int             NOT NULL REFERENCES cross_section_lines(id) ON DELETE CASCADE,
     col_pos               int             NOT NULL,
     x                     NUMERIC         NOT NULL,
-    y                     NUMERIC         NOT NULL,
+    y                     NUMERIC         NOT NULL
 );
 
 -- Indices for faster access of the points
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightSingleValue.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/ImportBedHeightSingleValue.java	Wed Oct 16 13:03:13 2013 +0200
@@ -10,7 +10,7 @@
 
 import java.util.List;
 
-import java.math.BigDecimal;
+//import java.math.BigDecimal;
 
 import org.apache.log4j.Logger;
 
@@ -29,24 +29,26 @@
 
     protected ImportBedHeightSingle bedHeight;
 
-    protected BigDecimal station;
-    protected BigDecimal height;
-    protected BigDecimal uncertainty;
-    protected BigDecimal dataGap;
-    protected BigDecimal soundingWidth;
-    protected BigDecimal width;
+    protected Double station;
+    protected Double height;
+    protected Double uncertainty;
+    protected Double dataGap;
+    //    protected BigDecimal soundingWidth;
+    protected Double soundingWidth;
+    protected Double width;
 
     protected BedHeightSingleValue peer;
 
 
     public ImportBedHeightSingleValue(
         ImportBedHeightSingle bedHeight,
-        BigDecimal station,
-        BigDecimal height,
-        BigDecimal uncertainty,
-        BigDecimal dataGap,
-        BigDecimal soundingWidth,
-        BigDecimal width
+        Double station,
+        Double height,
+        Double uncertainty,
+        Double dataGap,
+	//        BigDecimal soundingWidth,
+	Double soundingWidth,
+        Double width
     ) {
         this.bedHeight     = bedHeight;
         this.station       = station;
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportOfficialLine.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/ImportOfficialLine.java	Wed Oct 16 13:03:13 2013 +0200
@@ -45,7 +45,7 @@
             // XXX: This is a bit odd. We do not have not enough infos here
             // to create a new NamedMainValue. So we just look for existing ones.
             Session session = ImporterSession.getInstance().getDatabaseSession();
-            NamedMainValue nmv = NamedMainValue.fetchByName(name, session);
+            NamedMainValue nmv = NamedMainValue.fetchByNameAndType(name, "Q", session);
             if (nmv == null) {
                 // failed -> failed to create OfficialLine
                 return null;
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportRange.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/ImportRange.java	Wed Oct 16 13:03:13 2013 +0200
@@ -31,8 +31,30 @@
     }
 
     public ImportRange(BigDecimal a, BigDecimal b) {
-        this.a = a;
-        this.b = b;
+
+	// enforce a<b and set only a for zero-length ranges
+        if (a != null && b == null) {
+            this.a = a;
+            this.b = null;
+        }
+        else if (a == null && b != null) {
+            this.a = b;
+            this.b = null;
+        }
+        else if (a == null && b == null) {
+            throw new IllegalArgumentException("Both a and b are null.");
+        }
+        else if (a == b) {
+            this.a = a;
+            this.b = null;
+        }
+        else {
+            if (a.compareTo(b) > 0) {
+		BigDecimal t = a; a = b; b = t;
+            }
+            this.a = a;
+            this.b = b;
+        }
     }
 
     private static final int compare(BigDecimal a, BigDecimal b) {
@@ -48,12 +70,6 @@
         return a.compareTo(b);
     }
 
-    public void fixRangesOrder() {
-        if (compare(a, b) > 0) {
-            BigDecimal t = a; a = b; b = t;
-        }
-    }
-
     public int compareTo(ImportRange other) {
         int cmp = compare(a, other.a);
         if (cmp != 0) return cmp;
@@ -65,7 +81,12 @@
     }
 
     public void setA(BigDecimal a) {
-        this.a = a;
+        if (this.b != null && a.compareTo(b) >= 0) {
+            throw new IllegalArgumentException("a (" + a + ") must be smaller than b (" + b + ").");
+        }
+        else {
+            this.a = a;
+        }
     }
 
     public BigDecimal getB() {
@@ -73,7 +94,12 @@
     }
 
     public void setB(BigDecimal b) {
-        this.b = b;
+        if (b != null && b.compareTo(a) <= 0) {
+            throw new IllegalArgumentException("b (" + b + ") must be greater than a (" + a + ") or null.");
+        }
+        else {
+            this.b = b;
+        }
     }
 
     public Range getPeer(River river) {
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportRiver.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/ImportRiver.java	Wed Oct 16 13:03:13 2013 +0200
@@ -365,7 +365,7 @@
                 floodProtection.add(iw);
             }
             catch (WstParser.ParseException e) {
-                log.error(e);
+                log.error(e.getMessage());
             }
         }
     }
@@ -782,7 +782,7 @@
                 floodWater.add(iw);
             }
             catch (WstParser.ParseException e) {
-                log.error(e);
+                log.error(e.getMessage());
             }
         }
     }
@@ -819,7 +819,7 @@
                 wstParser.parse(file);
             }
             catch (WstParser.ParseException e) {
-                log.error(e);
+                log.error(e.getMessage());
                 continue;
             }
 
@@ -904,7 +904,7 @@
                 fixations.add(iw);
             }
             catch (WstParser.ParseException e) {
-                log.error(e);
+                log.error(e.getMessage());
             }
         }
     }
@@ -953,7 +953,7 @@
                 extraWsts.add(iw);
             }
             catch (WstParser.ParseException e) {
-                log.error(e);
+                log.error(e.getMessage());
             }
         }
 
@@ -972,7 +972,7 @@
             wst.setKmUp(wst.guessWaterLevelIncreasing());
         }
         catch (WstParser.ParseException e) {
-            log.error(e);
+            log.error(e.getMessage());
         }
     }
 
@@ -1186,6 +1186,18 @@
     }
 
     public void storeDependencies() {
+        /* test whether river is already in database.
+         * Otherwise it makes no sense to skip waterlevel model WST-file
+         * because the altitude reference is taken from there. */
+        Session session = ImporterSession.getInstance().getDatabaseSession();
+        Query query = session.createQuery("from River where name=:name");
+        query.setString("name", name);
+        List<River> rivers = query.list();
+        if (rivers.isEmpty() && Config.INSTANCE.skipWst()){
+            log.error("River not yet in database. You cannot skip importing waterlevel model.");
+            return;
+        }
+
         storeWstUnit();
         storeAnnotations();
         storeHYKs();
@@ -1211,7 +1223,7 @@
 
     public void storeWstUnit() {
         if (wst == null) {
-            wstUnit = new ImportUnit("NN + m");
+            log.warn("No unit given. Waterlevel-model WST-file has to be imported already.");
         }
         else {
             wstUnit = wst.getUnit();
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportWst.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/ImportWst.java	Wed Oct 16 13:03:13 2013 +0200
@@ -147,12 +147,6 @@
         return up > columns.size() - up;
     }
 
-    public void fixRangesOrder() {
-        for (ImportWstColumn column: columns) {
-            column.fixRangesOrder();
-        }
-    }
-
     /** Get corresponding mapped wst (from database). */
     public Wst getPeer(River river) {
         if (peer == null) {
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportWstColumn.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/ImportWstColumn.java	Wed Oct 16 13:03:13 2013 +0200
@@ -212,10 +212,5 @@
         return peer;
     }
 
-    public void fixRangesOrder() {
-        for (ImportWstColumnQRange wcqr: columnQRanges) {
-            wcqr.fixRangesOrder();
-        }
-    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportWstColumnQRange.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/ImportWstColumnQRange.java	Wed Oct 16 13:03:13 2013 +0200
@@ -52,10 +52,6 @@
         this.qRange = qRange;
     }
 
-    public void fixRangesOrder() {
-        qRange.fixRangesOrder();
-    }
-
     public WstColumnQRange getPeer(River river) {
         if (peer == null) {
             WstColumn c = wstColumn.getPeer(river);
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportWstQRange.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/ImportWstQRange.java	Wed Oct 16 13:03:13 2013 +0200
@@ -62,10 +62,6 @@
         this.q = q;
     }
 
-    public void fixRangesOrder() {
-        range.fixRangesOrder();
-    }
-
     public WstQRange getPeer(River river) {
         if (peer == null) {
             Range r = range.getPeer(river);
--- a/backend/src/main/java/org/dive4elements/river/importer/Importer.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/Importer.java	Wed Oct 16 13:03:13 2013 +0200
@@ -183,7 +183,7 @@
                 // Now link rivers with official numbers.
                 for(ImportRiver river: infoGewParser.getRivers()) {
                     for(Map.Entry<String, Long> entry: map.entrySet()) {
-                        if (StringUtil.containsIgnoreCase(entry.getKey(), river.getName())) {
+                        if (StringUtil.containsIgnoreCase(river.getName(), entry.getKey())) {
                             river.setOfficialNumber(entry.getValue());
                             log.debug(river.getName() + " is mapped to bwastr " + entry.getValue());
                         }
--- a/backend/src/main/java/org/dive4elements/river/importer/parsers/BedHeightParser.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/BedHeightParser.java	Wed Oct 16 13:03:13 2013 +0200
@@ -18,6 +18,7 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.TreeSet;
 import java.util.Locale;
 
 import java.util.regex.Matcher;
@@ -39,6 +40,8 @@
 import org.dive4elements.river.importer.ImportUnit;
 import org.dive4elements.river.model.BedHeightType;
 import org.dive4elements.river.importer.ImporterSession;
+import org.dive4elements.river.utils.EpsilonComparator;
+import org.dive4elements.river.importer.parsers.LineParser;
 
 public abstract class BedHeightParser {
 
@@ -97,9 +100,11 @@
         String          line
     );
 
+    protected TreeSet<Double> kmExists;
 
     public BedHeightParser() {
-        this.bedHeights = new ArrayList<ImportBedHeight>();
+        bedHeights = new ArrayList<ImportBedHeight>();
+        kmExists = new TreeSet<Double>(EpsilonComparator.CMP);
     }
 
 
@@ -113,12 +118,15 @@
 
         ImportBedHeight obj = newImportBedHeight(file.getName().replaceAll("\\.csv", ""));
 
-        LineNumberReader in =
-            new LineNumberReader(
-            new InputStreamReader(
-            new FileInputStream(file), ENCODING));
+        kmExists.clear();
 
+        LineNumberReader in = null;
         try {
+            in =
+                new LineNumberReader(
+                new InputStreamReader(
+                new FileInputStream(file), ENCODING));
+
             String line = null;
             while ((line = in.readLine()) != null) {
                 if ((line = line.trim()).length() == 0) {
@@ -137,7 +145,9 @@
             bedHeights.add(obj);
         }
         finally {
-            in.close();
+            if (in != null) {
+                in.close();
+            }
         }
     }
 
@@ -327,7 +337,7 @@
             String tmp = m.group(1).replace(";", "").trim();
 
             BedHeightType bht = BedHeightType.fetchBedHeightTypeForType(
-                tmp, ImporterSession.getInstance().getDatabaseSession());
+		tmp, ImporterSession.getInstance().getDatabaseSession());
 
             if (bht != null) {
                 obj.setType(new ImportBedHeightType(bht));
--- a/backend/src/main/java/org/dive4elements/river/importer/parsers/BedHeightSingleParser.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/BedHeightSingleParser.java	Wed Oct 16 13:03:13 2013 +0200
@@ -46,11 +46,21 @@
             return;
         }
 
-        BigDecimal km;
+        Double km;
 
         try {
-            km = new BigDecimal(nf.parse(values[0]).doubleValue());
-        }
+            km = new Double(nf.parse(values[0]).doubleValue());
+	    
+            Double key = Double.valueOf(km);
+
+            if (kmExists.contains(key)) {
+                log.warn("duplicate station '" + km + "': -> ignored");
+                return;
+            }
+
+            kmExists.add(key);
+	}
+
         catch (ParseException e) {
             // We expect a lot of ";;;;;;" lines.
             //log.warn("BSP: Error while parsing km of data row.", e);
@@ -66,44 +76,95 @@
         // Because we cannot enforce consistency of values with complete data
         // via null constraints in the database (as there are "gap" values),
         // do this checks manually.
-        if (values[3].length() == 0 || values[4].length() == 0
-            || values[5].length() == 0) {
+	//        if (values[3].length() == 0 || values[4].length() == 0
+	//  || values[5].length() == 0) {
             //log.warn("BSP: Error while parsing data row (manual null constraint violated).");
-            return;
-        }
+	//  return;
+        //}
 
-        try {
-            ImportBedHeightSingleValue value = new ImportBedHeightSingleValue(
-                (ImportBedHeightSingle) obj,
-                km,
-                new BigDecimal(nf.parse(values[1]).doubleValue()),
-                new BigDecimal(nf.parse(values[2]).doubleValue()),
-                new BigDecimal(nf.parse(values[3]).doubleValue()),
-                parseBigDecimal(values[4], line),
-                new BigDecimal(nf.parse(values[5]).doubleValue())
-            );
+	Double height = null;
+	if (values[1].length() > 0) {
+	    try {
+		height = new Double(nf.parse(values[1]).doubleValue());
+	    }
+	    catch (ParseException e) {
+		log.warn("BSP: unparseable height " + values[1]);
+	    }
+	}
 
-            obj.addValue(value);
-        }
-        catch (ParseException e) {
-            log.warn("BSP: unparseable value in data row.", e);
-        }
+	Double uncertainty = null;
+	if (values[2].length() > 0) {
+	    try {
+		uncertainty = new Double(nf.parse(values[2]).doubleValue());
+	    }
+	    catch (ParseException e) {
+		log.warn("BSP: unparseable uncertainty value " + values[2]);
+	    }
+	}
+
+	Double dataGap = null;
+	if (values[3].length() > 0) {
+	    try {
+		dataGap = new Double(nf.parse(values[3]).doubleValue());
+	    }
+	    catch (ParseException e) {
+		log.warn("BSP: unparseable data gap " + values[3]);
+	    }
+	}
+
+	Double soundingWidth = null;
+	if (values[4].length() > 0) {
+	    try {
+		soundingWidth = new Double(nf.parse(values[4]).doubleValue());
+	    }
+	    catch (ParseException e) {
+		log.warn("BSP: unparseable sounding width " + values[4]);
+	    }
+	}
+
+	Double width = null;
+	if (values[5].length() > 0) {
+	    try {
+		width = new Double(nf.parse(values[5]).doubleValue());
+	    }
+	    catch (ParseException e) {
+		log.warn("BSP: unparseable width " + values[5]);
+	    }
+	}
+
+	//        try {
+	ImportBedHeightSingleValue value = new ImportBedHeightSingleValue(
+	    (ImportBedHeightSingle) obj,
+	    km,
+	    height,//new Double(nf.parse(values[1]).doubleValue()),
+	    uncertainty,
+	    dataGap,
+	    soundingWidth,
+	    //                parseBigDecimal(values[4], line),
+	    width
+	);
+
+	obj.addValue(value);
+        // }
+//         catch (ParseException e) {
+//             log.warn("BSP: unparseable value in data row.", e);
+        //}
     }
 
-    private BigDecimal parseBigDecimal(String value, String line) {
-        BigDecimal result = null;
-        try {
-            Double dValue = Double.valueOf(value.replace(",", "."));
-            result = new BigDecimal(dValue.doubleValue());
-        }
-        catch (NumberFormatException nfe) {
-            log.warn(
-                "Could not parse " +
-                value +
-                " in bed heigt single row: "
-                + line);
-        }
-        return result;
-    }
+//     private BigDecimal parseBigDecimal(String value, String line) {
+//         BigDecimal result = null;
+//         try {
+//             Double dValue = Double.valueOf(value.replace(",", "."));
+//             result = new BigDecimal(dValue.doubleValue());
+//         }
+//         catch (NumberFormatException nfe) {
+//             log.warn(
+//                 "Could not parse " +
+//                 value +
+//                 " in bed heigt single row: "
+//                 + line);
+//         }
+//        return result;
+//    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/backend/src/main/java/org/dive4elements/river/importer/parsers/FlowVelocityModelParser.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/FlowVelocityModelParser.java	Wed Oct 16 13:03:13 2013 +0200
@@ -34,25 +34,25 @@
         Logger.getLogger(FlowVelocityModelParser.class);
 
     private static final Pattern META_REGEX =
-        Pattern.compile(".*Rechnung (.*) \\(Pegel (.*)\\).*");
+        Pattern.compile(".*Rechnung [unter ]*(.*) \\(Pegel (.*)\\).*");
 
     private static final Pattern META_GAUGE =
         Pattern.compile("(.*) Q=(\\w*)m3/s");
 
     private static final Pattern META_MAINVALUE_A =
-        Pattern.compile("([a-zA-Z]+)+(\\d+)*");
+        Pattern.compile("([a-zA-Z]+)+(\\d+)*[\\w()]*");
 
     private static final Pattern META_MAINVALUE_B =
-        Pattern.compile("(([a-zA-Z]+)+(\\d+)*)\\s*-\\s*(([a-zA-Z]+)+(\\d+)*)");
+        Pattern.compile("(([a-zA-Z]+)+(\\d+)*)\\s*-\\s*(([a-zA-Z]+)+(\\d+)*\\S*)");
 
     private static final Pattern META_MAINVALUE_C =
-        Pattern.compile("([0-9]++)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*)");
+        Pattern.compile("([0-9]++)\\s?(\\S*)|([0-9]++,[0-9]++)\\s?(\\S*)");
 
     private static final Pattern META_MAINVALUE_D =
-        Pattern.compile("(([0-9]*)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*)) bis (([0-9]*)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*))");
+        Pattern.compile("(([0-9]*)\\s?(\\w*)|([0-9]++,[0-9]++)\\s?(\\w*))\\s*bis (([0-9]*)\\s?(\\S*)|([0-9]++,[0-9]++)\\s?(\\S*))");
 
     private static final Pattern META_MAINVALUE_E =
-        Pattern.compile("(([a-zA-Z]+)+(\\d+)*) bis (([a-zA-Z]+)+(\\d+)*)");
+        Pattern.compile("(([a-zA-Z]+)+(\\d+)*)\\s*bis (([a-zA-Z]+)+(\\d+)*\\S*)");
 
     private static final NumberFormat nf =
         NumberFormat.getInstance(DEFAULT_LOCALE);
@@ -114,18 +114,19 @@
 
         if (m.matches()) {
             String mainValueStr = m.group(1);
+	    log.debug("mainValueStr = '" + mainValueStr + "'");
             String gaugeStr     = m.group(2);
 
             Object[] valueData = handleMainValueString(mainValueStr);
             Object[] gaugeData = handleGaugeString(gaugeStr);
 
             if (valueData == null || valueData.length < 2) {
-                log.warn("skip invalid MainValue part: '" + line + "'");
+                log.warn("skip invalid MainValue part in '" + line + "'");
                 return;
             }
 
             if (gaugeData == null || gaugeData.length < 2) {
-                log.warn("skip invalid gauge part: '" + line + "'");
+                log.warn("skip invalid gauge part in '" + line + "'");
                 return;
             }
 
@@ -148,23 +149,26 @@
 
 
     protected Object[] handleMainValueString(String mainValueStr) {
-        Matcher mA = META_MAINVALUE_A.matcher(mainValueStr);
+        Matcher mA = META_MAINVALUE_A.matcher(mainValueStr.trim());
         if (mA.matches()) {
+	    log.debug("mainValueStr matches META_MAINVALUE_A");
             String name = mA.group(0);
 
             return new Object[] { name, name };
         }
 
-        Matcher mB = META_MAINVALUE_B.matcher(mainValueStr);
+        Matcher mB = META_MAINVALUE_B.matcher(mainValueStr.trim());
         if (mB.matches()) {
+	    log.debug("mainValueStr matches META_MAINVALUE_B");
             String lower = mB.group(1);
             String upper = mB.group(4);
 
             return new Object[] { lower, upper };
         }
 
-        Matcher mC = META_MAINVALUE_C.matcher(mainValueStr);
+        Matcher mC = META_MAINVALUE_C.matcher(mainValueStr.trim());
         if (mC.matches()) {
+	    log.debug("mainValueStr matches META_MAINVALUE_C");
             String facA  = mC.group(1);
             String nameA = mC.group(2);
             String facB  = mC.group(3);
@@ -178,8 +182,9 @@
             return new Object[] { mainValue, mainValue };
         }
 
-        Matcher mD = META_MAINVALUE_D.matcher(mainValueStr);
+        Matcher mD = META_MAINVALUE_D.matcher(mainValueStr.trim());
         if (mD.matches()) {
+	    log.debug("mainValueStr matches META_MAINVALUE_D");
             String loFacA  = mD.group(2);
             String loNameA = mD.group(3);
             String loFacB  = mD.group(4);
@@ -202,14 +207,16 @@
             return new Object[] { loMainValue, upMainValue };
         }
 
-        Matcher mE = META_MAINVALUE_E.matcher(mainValueStr);
+        Matcher mE = META_MAINVALUE_E.matcher(mainValueStr.trim());
         if (mE.matches()) {
+	    log.debug("mainValueStr matches META_MAINVALUE_E");
             String lower = mE.group(1);
             String upper = mE.group(4);
 
             return new Object[] { lower, upper };
         }
 
+	log.debug("mainValueStr not matched");
         return null;
     }
 
--- a/backend/src/main/java/org/dive4elements/river/importer/parsers/SedimentDensityParser.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/SedimentDensityParser.java	Wed Oct 16 13:03:13 2013 +0200
@@ -39,12 +39,16 @@
     public static final Pattern META_DEPTH =
         Pattern.compile("^Tiefe: (\\w++)-(\\w++)( (\\w++))?.*");
 
+    public static final Pattern META_YEAR =
+        Pattern.compile("^Jahr: (\\d{4}).*");
+
     protected List<ImportSedimentDensity> sedimentDensities;
 
     protected ImportSedimentDensity current;
 
     protected String currentDescription;
 
+    protected String yearString;
 
     public SedimentDensityParser() {
         sedimentDensities = new ArrayList<ImportSedimentDensity>();
@@ -88,6 +92,9 @@
         if (handleMetaDepth(line)) {
             return;
         }
+	else if (handleMetaYear(line)) {
+	    return;
+	}
         else {
             log.warn("Unknown meta line: '" + line + "'");
         }
@@ -124,6 +131,23 @@
         return false;
     }
 
+    protected boolean handleMetaYear(String line) {
+        Matcher m = META_YEAR.matcher(line);
+
+        if (m.matches()) {
+            yearString = m.group(1);
+
+            log.info("Found sediment density year: " + yearString);
+
+	    return true;
+        }
+        else {
+            log.debug("Meta line doesn't contain year: " + line);
+        }
+
+        return false;
+    }
+
 
     protected void handleDataLine(String line) {
         String[] vals = line.split(SEPERATOR_CHAR);
@@ -153,6 +177,14 @@
         }
 
         BigDecimal year = null;
+	if (yearString != null) {
+	    try {
+		year = new BigDecimal(nf.parse(yearString).doubleValue());
+	    }
+	    catch (ParseException pe) {
+		log.warn("Unparseable year string");
+	    }
+	}
 
         current.addValue(new ImportSedimentDensityValue(
             km,
--- a/backend/src/main/java/org/dive4elements/river/importer/parsers/WstParser.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/WstParser.java	Wed Oct 16 13:03:13 2013 +0200
@@ -69,6 +69,8 @@
     protected ImportWst wst;
 
     protected ImportRange lastRange;
+    protected Double lastA;
+    protected Double lastB;
 
     public WstParser() {
     }
@@ -118,7 +120,12 @@
 
         log.info("Parsing WST file '" + file + "'");
 
-        wst = new ImportWst(file.getName());
+	if (wst == null) {
+	    wst = new ImportWst(file.getName());
+	}
+	else {
+	    wst.setDescription(file.getName());
+	}
 
         LineNumberReader in =
             new LineNumberReader(
@@ -145,7 +152,11 @@
 
             boolean columnHeaderChecked = false;
 
-            String einheit = "Wasserstand [NN + m]";
+            /* Default string for altitude reference 
+             * if none is found in WST-file.
+             * Use in case no unit comment is found in file */
+            String einheit = "m ü. unbekannte Referenz";
+            boolean unitFound = false;
 
             HashSet<BigDecimal> kms = new HashSet<BigDecimal>();
 
@@ -181,7 +192,7 @@
 
                     if (aktAbfluesse != null) {
                         if (kmHist1 != null && kmHist2 != null
-                        && kmHist1.compareTo(kmHist2) < 0) {
+                        && kmHist1.compareTo(kmHist2) < 0) { // stations descending in file
                             BigDecimal t = minKm; minKm = maxKm; maxKm = t;
                         }
                         addInterval(minKm, maxKm, aktAbfluesse);
@@ -264,7 +275,9 @@
                         m = UNIT.matcher(units[0]);
                         einheit = m.matches() ? m.group(1) : units[0];
                         log.debug("unit: " + einheit);
+                        unitFound = true;
                     }
+
                     continue;
                 }
 
@@ -325,9 +338,19 @@
                         continue;
                     }
 
+                    // check consistence of station ordering in file
+                    if (kmHist2 != null && 
+                        kmHist2.compareTo(kmHist1) != kmHist1.compareTo(kaem)) {
+                        throw new ParseException("Stations in " + file + 
+                            " near line " + in.getLineNumber() + 
+                            " not ordered. File rejected.");
+		    }
+
+                    // remember stations in two previous lines
                     kmHist2 = kmHist1;
                     kmHist1 = kaem;
 
+                    // iteratively determine actual km-range
                     if (kaem.compareTo(minKm) < 0) {
                         minKm = kaem;
                     }
@@ -373,25 +396,22 @@
 
             } // for all lines in WST file
 
+            if (!unitFound) {
+                log.warn("no unit and height reference found. Using default.");
+            }
             wst.setUnit(new ImportUnit(einheit));
 
             if (kmHist1 != null && kmHist2 != null
-            && kmHist1.compareTo(kmHist2) < 0) {
+            && kmHist1.compareTo(kmHist2) < 0) { // stations descending in file
                 BigDecimal t = minKm; minKm = maxKm; maxKm = t;
             }
             addInterval(minKm, maxKm, aktAbfluesse);
-
-            fixRangesOrder();
         }
         finally {
             in.close();
         }
     }
 
-    protected void fixRangesOrder() {
-        wst.fixRangesOrder();
-    }
-
     protected void addValue(BigDecimal km, BigDecimal w, int index) {
         if (w != null) {
             ImportWstColumn column = wst.getColumn(index);
@@ -423,6 +443,16 @@
             return;
         }
 
+	// expand single-line i.e. 0-lenght Q-range to minimal length
+	if (from == to) {
+	    if (lastRange != null && lastA > lastB) {
+		to = new BigDecimal(from.doubleValue() - INTERVAL_GAP);
+	    }
+	    else {
+		to = new BigDecimal(from.doubleValue() + INTERVAL_GAP);
+	    }
+	}
+
         ImportRange range = new ImportRange(from, to);
 
         // little workaround to make the q ranges tightly fit.
@@ -430,15 +460,14 @@
         // still work.
 
         if (lastRange != null) {
-            double a1 = lastRange.getA().doubleValue();
-            double b1 = lastRange.getB().doubleValue();
             double a2 = range.getA().doubleValue();
+            double b2 = range.getB().doubleValue();
 
-            if (a1 < b1) {
+            if (lastA < lastB) {
                 lastRange.setB(new BigDecimal(a2 - INTERVAL_GAP));
             }
-            else { // a1 >= b1
-                lastRange.setB(new BigDecimal(a2 + INTERVAL_GAP));
+            else { // lastA >= lastB
+                lastRange.setA(new BigDecimal(b2 + INTERVAL_GAP));
             }
         }
 
@@ -448,6 +477,8 @@
             column.addColumnQRange(wstQRange);
         }
 
+        lastA = from.doubleValue();
+        lastB = to.doubleValue();
         lastRange = range;
     }
 
--- a/backend/src/main/java/org/dive4elements/river/model/BedHeightSingleValue.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/model/BedHeightSingleValue.java	Wed Oct 16 13:03:13 2013 +0200
@@ -11,7 +11,7 @@
 import java.util.List;
 
 import java.io.Serializable;
-import java.math.BigDecimal;
+//import java.math.BigDecimal;
 
 import javax.persistence.Entity;
 import javax.persistence.Id;
@@ -43,12 +43,13 @@
 
     private BedHeightSingle bedHeight;
 
-    private BigDecimal station;
-    private BigDecimal height;
-    private BigDecimal uncertainty;
-    private BigDecimal dataGap;
-    private BigDecimal soundingWidth;
-    private BigDecimal width;
+    private Double station;
+    private Double height;
+    private Double uncertainty;
+    private Double dataGap;
+    //    private BigDecimal soundingWidth;
+    private Double soundingWidth;
+    private Double width;
 
 
     public BedHeightSingleValue() {
@@ -56,12 +57,13 @@
 
     public BedHeightSingleValue(
         BedHeightSingle bedHeight,
-        BigDecimal station,
-        BigDecimal height,
-        BigDecimal uncertainty,
-        BigDecimal dataGap,
-        BigDecimal soundingWidth,
-        BigDecimal width
+        Double station,
+        Double height,
+        Double uncertainty,
+        Double dataGap,
+	//        BigDecimal soundingWidth,
+	Double soundingWidth,
+        Double width
     ) {
         this.bedHeight     = bedHeight;
         this.station       = station;
@@ -100,56 +102,58 @@
     }
 
     @Column(name = "station")
-    public BigDecimal getStation() {
+    public Double getStation() {
         return station;
     }
 
-    public void setStation(BigDecimal station) {
+    public void setStation(Double station) {
         this.station = station;
     }
 
     @Column(name = "height")
-    public BigDecimal getHeight() {
+    public Double getHeight() {
         return height;
     }
 
-    public void setHeight(BigDecimal height) {
+    public void setHeight(Double height) {
         this.height = height;
     }
 
     @Column(name="uncertainty")
-    public BigDecimal getUncertainty() {
+    public Double getUncertainty() {
         return uncertainty;
     }
 
-    public void setUncertainty(BigDecimal uncertainty) {
+    public void setUncertainty(Double uncertainty) {
         this.uncertainty = uncertainty;
     }
 
     @Column(name="data_gap")
-    public BigDecimal getDataGap() {
+    public Double getDataGap() {
         return dataGap;
     }
 
-    public void setDataGap(BigDecimal dataGap) {
+    public void setDataGap(Double dataGap) {
         this.dataGap = dataGap;
     }
 
     @Column(name="sounding_width")
-    public BigDecimal getSoundingWidth() {
+    //    public BigDecimal getSoundingWidth() {
+    public Double getSoundingWidth() {
         return soundingWidth;
     }
 
-    public void setSoundingWidth(BigDecimal soundingWidth) {
+    //public void setSoundingWidth(BigDecimal soundingWidth) {
+    public void setSoundingWidth(Double soundingWidth) {
         this.soundingWidth = soundingWidth;
     }
 
     @Column(name="width")
-    public BigDecimal getWidth() {
+    public Double getWidth() {
         return width;
     }
 
-    public void setWidth(BigDecimal width) {
+    public void setWidth(Double width) {
         this.width = width;
     }
 
@@ -166,8 +170,8 @@
             "   and station >= :kmLo and station <= :kmHi");
 
         query.setParameter("single", single);
-        query.setParameter("kmLo", new BigDecimal(kmLo));
-        query.setParameter("kmHi", new BigDecimal(kmHi));
+        query.setParameter("kmLo", new Double(kmLo));
+        query.setParameter("kmHi", new Double(kmHi));
 
         return query.list();
     }
--- a/backend/src/main/java/org/dive4elements/river/model/NamedMainValue.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/model/NamedMainValue.java	Wed Oct 16 13:03:13 2013 +0200
@@ -90,10 +90,12 @@
         this.officialLines = officialLines;
     }
 
-    public static NamedMainValue fetchByName(String name, Session session) {
+    public static NamedMainValue fetchByNameAndType(
+        String name, String type, Session session) {
         Query query = session.createQuery(
-            "from NamedMainValue where name=:name");
+            "from NamedMainValue where name=:name and type.name = :type");
         query.setString("name", name);
+        query.setString("type", type);
         List<NamedMainValue> named = query.list();
         return named.isEmpty() ? null : named.get(0);
     }
--- a/backend/src/main/java/org/dive4elements/river/model/OfficialLine.java	Wed Oct 16 12:39:33 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/model/OfficialLine.java	Wed Oct 16 13:03:13 2013 +0200
@@ -45,7 +45,7 @@
     @Id
     @SequenceGenerator(
         name           = "SEQUENCE_OFFICIAL_LINES_ID_SEQ",
-        sequenceName   = "OFFICIAL_LINES_ID_SEQ_ID_SEQ",
+        sequenceName   = "OFFICIAL_LINES_ID_SEQ",
         allocationSize = 1)
     @GeneratedValue(
         strategy  = GenerationType.SEQUENCE,
--- a/contrib/make_flys_release/bin/make-importer-package.sh	Wed Oct 16 12:39:33 2013 +0200
+++ b/contrib/make_flys_release/bin/make-importer-package.sh	Wed Oct 16 13:03:13 2013 +0200
@@ -47,8 +47,15 @@
 
 cp ${FLYS_DIR}/backend/doc/schema/*.sql $PKG_DIR/schema
 
+# create PDF of manual
+REV=`hg parent | sed -n '1s/[[:alnum:]]*: *\([0-9]*:.*\)/\1/;1p'`
 cd ${FLYS_DIR}/backend/doc/documentation/de/
-make importer-manual.pdf
+sed -i "s/documentrevision..rev.*/documentrevision}{rev$REV}/" \
+    importer-manual.tex
+# run pdflatex three times to get references and page numbering right
+pdflatex importer-manual.tex
+pdflatex importer-manual.tex
+pdflatex importer-manual.tex
 cp importer-manual.pdf $PKG_DIR
 
 sed -i 's/shpimporter\/shp/geodaesie\/shp/' $PKG_DIR/run_geo.sh

http://dive4elements.wald.intevation.org