changeset 7352:c6825778de1f

Merged double-precision branch.
author Sascha L. Teichmann <teichmann@intevation.de>
date Wed, 16 Oct 2013 13:03:13 +0200 (2013-10-16)
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