changeset 6443:28c390debd9b double-precision

merged changes from default into double-precision branch
author Tom Gottfried <tom.gottfried@intevation.de>
date Wed, 26 Jun 2013 16:40:25 +0200
parents 9787773e7bee (current diff) f3078357ec65 (diff)
children 25912df0facf
files
diffstat 34 files changed, 591 insertions(+), 69 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/doc/conf/artifacts/fixanalysis.xml	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/doc/conf/artifacts/fixanalysis.xml	Wed Jun 26 16:40:25 2013 +0200
@@ -204,6 +204,8 @@
                         <facet name="fix_analysis_events_ls" description="Average values for Ws in Q sectors."/>
                         <facet name="fix_reference_events_ls" description="Average values for Ws in Q sectors."/>
                         <facet name="fix_longitudinal_section_curve.manualpoints" description="Manual points"/>
+                        <facet name="other.wqkms.q"          description="W-Type of data" />
+                        <facet name="other.wqkms.w"          description="W-Type of data" />
                     </facets>
                 </outputmode>
                 <outputmode name="fix_derivate_curve" description="output.fix_derivate_curve" mine-type="image/png" type="chart">
@@ -268,6 +270,8 @@
                         <facet name="w_differences" description="facet.w_differences"/>
                         <facet name="other.wkms" description="facet.other.wkms"/>
                         <facet name="other.wqkms" description="facet.other.wqkms"/>
+                        <facet name="other.wqkms.q"          description="W-Type of data" />
+                        <facet name="other.wqkms.w"          description="W-Type of data" />
                         <facet name="heightmarks_points" description="facet.other.wkms.heightmarks_points"/>
                         <facet name="w_differences.manualpoints" description="Manuelle Punkte"/>
                         <facet name="longitudinal_section.manualpoints" description="Manuelle Punkte"/>
--- a/artifacts/doc/conf/artifacts/winfo.xml	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/doc/conf/artifacts/winfo.xml	Wed Jun 26 16:40:25 2013 +0200
@@ -266,6 +266,8 @@
                         <facet name="w_differences" description="facet.w_differences"/>
                         <facet name="other.wkms" description="facet.other.wkms"/>
                         <facet name="other.wqkms" description="facet.other.wqkms"/>
+                        <facet name="other.wqkms.w"          description="W-Type of data" />
+                        <facet name="other.wqkms.q"          description="Q-Type of data" />
                         <facet name="heightmarks_points" description="facet.other.wkms.heightmarks_points"/>
                         <facet name="w_differences.manualpoints" description="Manuelle Punkte"/>
                         <facet name="longitudinal_section.annotations" description="facet.longitudinal_section.annotations"/>
--- a/artifacts/doc/conf/meta-data.xml	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/doc/conf/meta-data.xml	Wed Jun 26 16:40:25 2013 +0200
@@ -164,7 +164,7 @@
                     <dc:call-macro name="discharge_fix_wq"/>
                   </dc:when>
                   <dc:when test="$out = 'fix_longitudinal_section_curve'">
-                    <dc:call-macro name="annotations"/>
+                    <dc:call-macro name="longitudinal-section-prototype"/>
                   </dc:when>
                   <dc:when test="$out = 'map'">
                     <dc:call-macro name="flood-map-complete"/>
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/Calculation.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/Calculation.java	Wed Jun 26 16:40:25 2013 +0200
@@ -78,6 +78,21 @@
         }
 
         @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder("problem: ");
+            if (km != null) {
+                sb.append("km: ").append(km).append(' ');
+            }
+            sb.append(msg);
+            if (args != null) {
+                for (Object arg: args) {
+                    sb.append(' ').append(arg);
+                }
+            }
+            return sb.toString();
+        }
+
+        @Override
         public boolean equals(Object other) {
             if (!(other instanceof Problem)) {
                 return false;
@@ -159,6 +174,18 @@
         return problems;
     }
 
+    public String problemsToString() {
+        StringBuilder sb = new StringBuilder("[");
+        for (int i = 0, N = problems.size(); i < N; ++i) {
+            if (i > 0) {
+                sb.append(", ");
+            }
+            sb.append(problems.get(i));
+        }
+        sb.append(']');
+        return sb.toString();
+    }
+
     public void toXML(Document document, CallMeta meta) {
 
         Element root = document.createElement("problems");
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/Calculation2.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/Calculation2.java	Wed Jun 26 16:40:25 2013 +0200
@@ -8,6 +8,9 @@
 
 package org.dive4elements.river.artifacts.model;
 
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
 import java.util.Arrays;
 
 import org.apache.log4j.Logger;
@@ -28,12 +31,57 @@
         this.km = km;
     }
 
+    private void dump(double [][] wqs) {
+        double [] ws = wqs[0];
+        double [] qs = wqs[1];
+
+        String filename = "/tmp/computed-discharge-curve-" + km + "-" +
+            System.currentTimeMillis() + ".txt";
+
+        PrintWriter pw = null;
+        try {
+            pw =
+                new PrintWriter(
+                new FileWriter(filename));
+
+            for (int i = 0; i < ws.length; ++i) {
+                pw.println(ws[i] + " " + qs[i]);
+            }
+
+            pw.flush();
+        }
+        catch (IOException ioe) {
+            logger.error(ioe);
+        }
+        finally {
+            if (pw != null) {
+                pw.close();
+            }
+        }
+    }
+
     public CalculationResult calculate(WstValueTable wst) {
 
-        logger.debug("Calculation2.calculate");
+        boolean debug = logger.isDebugEnabled();
+
+        if (debug) {
+            logger.debug("Calculation2.calculate: km " + km);
+        }
 
         double [][] wqs = wst.interpolateWQ(km, this);
 
+        if (debug) {
+            if (hasProblems()) {
+                logger.debug("problems: " + problemsToString());
+            }
+            logger.debug("wqs: " + wqs);
+            if (wqs != null && wqs[0] != null) {
+                logger.debug("wqs length: " + wqs[0].length);
+                // TODO: Uncomment to see the data externally.
+                //dump(wqs);
+            }
+        }
+
         if (wqs == null || wqs[0].length == 0) {
             addProblem("cannot.compute.discharge.curve");
             return new CalculationResult(new WQKms[0], this);
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/WstValueTable.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/WstValueTable.java	Wed Jun 26 16:40:25 2013 +0200
@@ -12,6 +12,7 @@
 
 import org.dive4elements.river.artifacts.math.Linear;
 import org.dive4elements.river.artifacts.math.Function;
+import org.dive4elements.river.utils.DoubleUtil;
 
 import java.util.Arrays;
 import java.util.ArrayList;
@@ -327,6 +328,8 @@
                 splineQs[i] = wqs;
             }
 
+            DoubleUtil.sortByFirst(splineQs, splineWs);
+
             SplineInterpolator interpolator = new SplineInterpolator();
 
             try {
--- a/artifacts/src/main/java/org/dive4elements/river/exports/ChartGenerator.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/ChartGenerator.java	Wed Jun 26 16:40:25 2013 +0200
@@ -717,6 +717,15 @@
     }
 
 
+    /**
+     * Gets the master artifact.
+     * @return the master artifact.
+     */
+    public Artifact getMaster() {
+        return master;
+    }
+
+
     /** Sets the collection. */
     @Override
     public void setCollection(D4EArtifactCollection collection) {
--- a/artifacts/src/main/java/org/dive4elements/river/exports/ComputedDischargeCurveGenerator.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/ComputedDischargeCurveGenerator.java	Wed Jun 26 16:40:25 2013 +0200
@@ -20,13 +20,21 @@
 import org.dive4elements.river.jfree.StickyAxisAnnotation;
 import org.dive4elements.river.jfree.StyledXYSeries;
 
+import org.dive4elements.river.model.Gauge;
 import org.dive4elements.river.utils.RiverUtils;
 
+import org.dive4elements.artifacts.Artifact;
+
+import java.awt.Font;
+
 import java.util.ArrayList;
 import java.util.List;
 
+import org.jfree.chart.axis.NumberAxis;
+import org.jfree.data.xy.XYSeries;
+
 import org.apache.log4j.Logger;
-import org.jfree.data.xy.XYSeries;
+
 import org.w3c.dom.Document;
 
 
@@ -57,6 +65,7 @@
     public static final String I18N_MAINVALUES_Q_LABEL = "Q (Haupt- und Extremwerte)";
     public static final String I18N_MAINVALUES_W_LABEL = "W (Haupt- und Extremwerte)";
 
+    protected NumberAxis firstYAxis;
 
     /** Trivial Constructor. */
     public ComputedDischargeCurveGenerator () {
@@ -83,6 +92,20 @@
     }
 
 
+    /**
+     * Returns the PNP (Datum) of gauge, if at gauge, 0 otherwise.
+     */
+    protected int getCurrentGaugeDatum() {
+        // Code borrowed from FixATWriter.
+        Gauge gauge = RiverUtils.getGauge((D4EArtifact) getMaster());
+        int subtractPNP = 0;
+        if (Math.abs(getRange()[0] - gauge.getStation().doubleValue()) < 1e-4) {
+            subtractPNP = (int) Math.round(gauge.getDatum().doubleValue() /** 100*/);
+        }
+        return subtractPNP;
+    }
+
+
     @Override
     protected String getDefaultYAxisLabel(int pos) {
         D4EArtifact flys = (D4EArtifact) master;
@@ -94,6 +117,36 @@
 
 
     /**
+     * Create Y (range) axis for given index.
+     * Shall be overriden by subclasses.
+     */
+    protected NumberAxis createYAxis(int index) {
+        if (index == 0) {
+            firstYAxis = super.createYAxis(0);
+            return firstYAxis;
+        }
+        YAxisWalker walker = getYAxisWalker();
+
+        Font labelFont = new Font(
+            DEFAULT_FONT_NAME,
+            Font.BOLD,
+            getYAxisFontSize(index));
+
+        SyncNumberAxis axis = new SyncNumberAxis(
+            walker.getId(index),
+            getYAxisLabel(index),
+            firstYAxis);
+
+        axis.setAutoRangeIncludesZero(false);
+        axis.setLabelFont(labelFont);
+        axis.setTickLabelFont(labelFont);
+        axis.setShift((double)-getCurrentGaugeDatum());
+
+        return axis;
+    }
+
+
+    /**
      * Process data, build up plot.
      */
     @Override
@@ -114,7 +167,7 @@
         //XXX DEAD CODE // Facet facet = artifactFacet.getFacet();
 
         if (name.equals(COMPUTED_DISCHARGE_Q)) {
-            doQOut((WQKms) artifactFacet.getData(context), artifactFacet, attr, visible);
+            doDischargeQOut((WQKms) artifactFacet.getData(context), artifactFacet, attr, visible);
         }
         else if (name.equals(STATIC_WQ)) {
             doWQOut(artifactFacet.getData(context), artifactFacet, attr, visible);
@@ -189,6 +242,38 @@
 
 
     /**
+     * Add discharge Q-Series to plot, scale if at gauge.
+     * @param wqkms actual data
+     * @param theme theme to use.
+     */
+    protected void doDischargeQOut(
+        WQKms            wqkms,
+        ArtifactAndFacet aaf,
+        Document         theme,
+        boolean          visible
+    ) {
+        logger.debug("ComputedDischargeCurveGenerator: doDischargeQOut");
+        XYSeries series = new StyledXYSeries(aaf.getFacetDescription(), theme);
+
+        int subtractPNP = getCurrentGaugeDatum();
+
+        if (subtractPNP == 0) {
+            StyledSeriesBuilder.addPointsQW(series, wqkms);
+            addAxisSeries(series, YAXIS.W.idx, visible);
+        }
+        else {
+            XYSeries series2 = new StyledXYSeries(aaf.getFacetDescription(), theme);
+            StyledSeriesBuilder.addPointsQW(series2, wqkms);
+            addAxisSeries(series2, YAXIS.W.idx, false);
+
+            // Use second axis...
+            StyledSeriesBuilder.addPointsQW(series, wqkms, -subtractPNP, 100d);
+            addAxisSeries(series, YAXIS.WCm.idx, visible);
+        }
+    }
+
+
+    /**
      * Add Q-Series to plot.
      * @param wqkms actual data
      * @param theme theme to use.
--- a/artifacts/src/main/java/org/dive4elements/river/exports/DischargeCurveGenerator.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/DischargeCurveGenerator.java	Wed Jun 26 16:40:25 2013 +0200
@@ -37,7 +37,8 @@
 implements   FacetTypes {
 
     public static enum YAXIS {
-        W(0);
+        W(0),
+        WCm(1);
         protected int idx;
         private YAXIS(int c) {
             idx = c;
--- a/artifacts/src/main/java/org/dive4elements/river/exports/DischargeLongitudinalSectionGenerator.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/DischargeLongitudinalSectionGenerator.java	Wed Jun 26 16:40:25 2013 +0200
@@ -85,6 +85,13 @@
                 artifactFacet,
                 attr, visible, YAXIS.W.idx);
         }
+        else if (name.equals(STATIC_WQKMS_Q)) {
+            doQOut(
+                (WQKms) artifactFacet.getData(context),
+                artifactFacet,
+                attr,
+                visible);
+        }
         else {
             Processor processor = new WOutProcessor();
             if (processor.canHandle(name)) {
--- a/artifacts/src/main/java/org/dive4elements/river/exports/IdentifiableNumberAxis.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/IdentifiableNumberAxis.java	Wed Jun 26 16:40:25 2013 +0200
@@ -10,7 +10,7 @@
 
 import org.jfree.chart.axis.NumberAxis;
 
-
+/** Axis of which label and key differs. */
 public class IdentifiableNumberAxis extends NumberAxis {
 
 
--- a/artifacts/src/main/java/org/dive4elements/river/exports/MiddleBedHeightGenerator.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/MiddleBedHeightGenerator.java	Wed Jun 26 16:40:25 2013 +0200
@@ -219,6 +219,13 @@
                 visible,
                 YAXIS.H.idx);
         }
+        else if (name.equals(LONGITUDINAL_ANNOTATION)) {
+            doAnnotations(
+                (RiverAnnotation) artifactAndFacet.getData(context),
+                 artifactAndFacet,
+                 attr,
+                 visible);
+        }
         else if (bedp.canHandle(name)) {
             bedp.doOut(this, artifactAndFacet, attr, visible, YAXIS.P.idx);
         }
--- a/artifacts/src/main/java/org/dive4elements/river/exports/StyledSeriesBuilder.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/StyledSeriesBuilder.java	Wed Jun 26 16:40:25 2013 +0200
@@ -214,6 +214,26 @@
         }
     }
 
+    /**
+     * Add points to series (q to 1st dim, w to 2nd dim), adding wTrans to the
+     * W values and scaling it with wScale.
+     *
+     * @param series Series to add points to.
+     * @param wqkms WQKms to add to series.
+     * @param wAdd Value to add to each Q while adding to series.
+     * @param wScale multiply with
+     */
+    public static void addPointsQW(XYSeries series, WQKms wqkms, double wTrans, double wScale) {
+        if (wqkms == null) {
+            return;
+        }
+
+        int size = wqkms.size();
+
+        for (int i = 0; i < size; i++) {
+            series.add(wqkms.getQ(i), wScale * (wqkms.getW(i) + wTrans), false);
+        }
+    }
 
     /**
      * Add points to series (q to 1st dim, w to 2nd dim).
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/SyncNumberAxis.java	Wed Jun 26 16:40:25 2013 +0200
@@ -0,0 +1,131 @@
+/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
+ * Software engineering by Intevation GmbH
+ *
+ * This file is Free Software under the GNU AGPL (>=v3)
+ * and comes with ABSOLUTELY NO WARRANTY! Check out the
+ * documentation coming with Dive4Elements River for details.
+ */
+
+package org.dive4elements.river.exports;
+
+import org.jfree.chart.axis.NumberAxis;
+import org.jfree.chart.event.AxisChangeEvent;
+import org.jfree.chart.event.AxisChangeListener;
+import org.jfree.data.Range;
+
+import org.apache.log4j.Logger;
+
+/**
+ * Axis which is to be registered with other axis and tries
+ * to clone its range. The cloned range is transformed.
+ */
+public class SyncNumberAxis extends IdentifiableNumberAxis
+        implements AxisChangeListener
+{
+    /** The logger used in this generator. */
+    private static Logger logger =
+        Logger.getLogger(SyncNumberAxis.class);
+
+    /** The other axis to clone range from. */
+    protected NumberAxis proxyAxis;
+
+    /** Value to translate range by. */
+    protected double shift;
+
+
+    protected SyncNumberAxis(String key, String label, NumberAxis n) {
+        super(key, label);
+        this.proxyAxis = n;
+    }
+
+
+    /** Range of other axis changed, adjust own range. */
+    @Override
+    public void axisChanged(AxisChangeEvent event) {
+        logger.debug("SyncNumberAxis: axischange event");
+        this.setRange(
+            transRange(((NumberAxis)event.getAxis()).getRange()));
+    }
+
+    /** Set value by which to translate the range. */
+    protected void setShift(double shift) {
+        this.shift = shift;
+    }
+
+
+    /** Set other axis to relate to, register listener. */
+    public void setProxyAxis(NumberAxis ax) {
+        proxyAxis = ax;
+        proxyAxis.addChangeListener(this);
+    }
+
+    /** Translate range by shift, scale by 100. */
+    protected Range transRange(Range r) {
+        return new Range(100d*(r.getLowerBound()+shift),
+            100d*(r.getUpperBound()+shift));
+    }
+
+    /** Set Range. */
+    @Override
+    public void setRange(Range r) {
+        super.setRange(r);
+        logger.debug("SyncAxis: setRange");
+    }
+
+
+    /*
+    @Override
+    public Range getRange() {
+        Range r = new Range(100d*(proxyAxis.getRange().getLowerBound()+shift),
+            100d*(proxyAxis.getRange().getUpperBound()+shift));
+        return r;
+    }
+
+    @Override
+    public void setLowerBound(double max) {
+    }
+
+    @Override
+    public void setLowerMargin(double margin) {
+    }
+
+    @Override
+    public void setUpperBound(double max) {
+    }
+
+    @Override
+    public void setUpperMargin(double margin) {
+    }
+
+    @Override
+    public void setRange(double a, double b) {
+    }
+
+    @Override
+    public void setRange(Range range, boolean turnOffAutoRange, boolean notify){
+    }
+
+    @Override
+    public void setRangeAboutValue(double value, double length) {}
+
+    @Override
+    public void setRangeWithMargins(double lower, double upper) {}
+
+    @Override
+    public void setRangeWithMargins(Range range) {}
+
+    @Override
+    public void pan(double percent) {}
+
+    @Override
+    public void resizeRange(double p){}
+
+    @Override
+    public void resizeRange(double p, double a){}
+
+    @Override
+    public void resizeRange2(double p, double a){}
+
+    */
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixLongitudinalSectionGenerator.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixLongitudinalSectionGenerator.java	Wed Jun 26 16:40:25 2013 +0200
@@ -12,23 +12,29 @@
 import java.awt.Color;
 
 import org.apache.log4j.Logger;
+import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
+import org.dive4elements.river.artifacts.D4EArtifact;
+import org.dive4elements.river.artifacts.model.FacetTypes;
+import org.dive4elements.river.artifacts.model.WKms;
+import org.dive4elements.river.artifacts.model.WQKms;
+import org.dive4elements.river.artifacts.model.fixings.AnalysisPeriod;
+import org.dive4elements.river.artifacts.model.fixings.QWD;
+import org.dive4elements.river.exports.ChartGenerator;
+import org.dive4elements.river.exports.StyledSeriesBuilder;
+import org.dive4elements.river.exports.process.KMIndexProcessor;
+import org.dive4elements.river.exports.process.Processor;
+import org.dive4elements.river.exports.process.WOutProcessor;
+import org.dive4elements.river.jfree.RiverAnnotation;
+import org.dive4elements.river.jfree.StyledAreaSeriesCollection;
+import org.dive4elements.river.jfree.StyledXYSeries;
+import org.dive4elements.river.utils.DataUtil;
+import org.dive4elements.river.utils.KMIndex;
+import org.dive4elements.river.utils.RiverUtils;
 import org.jfree.chart.plot.Marker;
 import org.jfree.chart.plot.ValueMarker;
 import org.jfree.data.xy.XYSeries;
 import org.w3c.dom.Document;
 
-import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
-import org.dive4elements.river.artifacts.model.FacetTypes;
-import org.dive4elements.river.artifacts.model.fixings.AnalysisPeriod;
-import org.dive4elements.river.artifacts.model.fixings.QWD;
-import org.dive4elements.river.exports.ChartGenerator;
-import org.dive4elements.river.exports.process.KMIndexProcessor;
-import org.dive4elements.river.exports.process.Processor;
-import org.dive4elements.river.jfree.RiverAnnotation;
-import org.dive4elements.river.jfree.StyledAreaSeriesCollection;
-import org.dive4elements.river.jfree.StyledXYSeries;
-import org.dive4elements.river.utils.KMIndex;
-
 public class FixLongitudinalSectionGenerator
 extends FixChartGenerator
 implements FacetTypes
@@ -57,8 +63,17 @@
     public static final String I18N_DW_YAXIS_LABEL =
             "chart.fixings.longitudinalsection.yaxis.label";
 
+    public static final String I18N_W_YAXIS_LABEL =
+        "chart.longitudinal.section.yaxis.label";
+
+    public static final String I18N_Q_YAXIS_LABEL =
+        "chart.longitudinal.section.yaxis.second.label";
+
+    public static final String I18N_W_YAXIS_LABEL_DEFAULT  = "W [NN + m]";
+    public static final String I18N_Q_YAXIS_LABEL_DEFAULT = "Q [m\u00b3/s]";
+
     public static enum YAXIS {
-        dW(0);
+        dW(0), W(1), Q(2);
         public int idx;
         private YAXIS(int c) {
             idx = c;
@@ -71,12 +86,23 @@
         logger.debug("FixLongitudinalSectionGenerator: doOut: " + name);
 
         Processor processor = new KMIndexProcessor();
+        Processor wProcessor = new WOutProcessor();
         if (name.contains(FIX_SECTOR_AVERAGE_LS_DEVIATION)) {
             doSectorAverageDeviationOut(aaf, doc, visible);
         }
         else if (processor.canHandle(name)) {
             processor.doOut(this, aaf, doc, visible, YAXIS.dW.idx);
         }
+        else if (wProcessor.canHandle(name)) {
+            wProcessor.doOut(this, aaf, doc, visible, YAXIS.W.idx);
+        }
+        else if (name.equals(STATIC_WQKMS_Q)) {
+            doQOut(
+                (WQKms) aaf.getData(context),
+                aaf,
+                doc,
+                visible);
+        }
         else if (name.equals(FIX_DEVIATION_LS)) {
             doReferenceDeviationOut(aaf, doc, visible);
         }
@@ -97,6 +123,64 @@
         }
     }
 
+    /**
+     * Process the output for Q facets in a longitudinal section curve.
+     *
+     * @param wqkms An array of WQKms values.
+     * @param aandf The facet and artifact. This facet does NOT support any data objects. Use
+     * D4EArtifact.getNativeFacet() instead to retrieve a Facet which supports
+     * data.
+     * @param theme The theme that contains styling information.
+     * @param visible The visibility of the curve.
+     */
+    protected void doQOut(
+        WQKms    wqkms,
+        ArtifactAndFacet aandf,
+        Document theme,
+        boolean  visible
+    ) {
+        logger.debug("LongitudinalSectionGenerator.doQOut");
+
+        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
+
+        StyledSeriesBuilder.addStepPointsKmQ(series, wqkms);
+
+        addAxisSeries(series, YAXIS.Q.idx, visible);
+
+        if (needInvertAxis(wqkms)) {
+            setInverted(true);
+        }
+    }
+
+    /**
+     * This method determines - taking JFreeCharts auto x value ordering into
+     * account - if the x axis need to be inverted. Waterlines in these charts
+     * should decrease.
+     *
+     * @param wkms The data object that stores the x and y values used for this
+     * chart.
+     */
+    public boolean needInvertAxis(WKms wkms) {
+        boolean wsUp = wkms.guessWaterIncreasing();
+        boolean kmUp = DataUtil.guessWaterIncreasing(wkms.allKms());
+        boolean inv = (wsUp && kmUp) || (!wsUp && !kmUp);
+
+        int size = wkms.size();
+
+        if (logger.isDebugEnabled()) {
+            logger.debug("(Wkms)Values  : " + size);
+            if (size > 0) {
+                logger.debug("Start km: " + wkms.getKm(0));
+                logger.debug("End   km: " + wkms.getKm(size-1));
+            }
+            logger.debug("wsUp: " + wsUp);
+            logger.debug("kmUp: " + kmUp);
+            logger.debug("inv:  " + inv);
+        }
+
+        return inv;
+    }
+
     @SuppressWarnings("unchecked")
     protected void doSectorAverageDeviationOut(
             ArtifactAndFacet aaf,
@@ -199,7 +283,21 @@
 
     @Override
     protected String getDefaultYAxisLabel(int pos) {
-        return msg(I18N_DW_YAXIS_LABEL, I18N_DW_YAXIS_LABEL_DEFAULT);
+        if (pos == YAXIS.dW.idx) {
+            return msg(I18N_DW_YAXIS_LABEL, I18N_DW_YAXIS_LABEL_DEFAULT);
+        }
+        else if (pos == YAXIS.W.idx) {
+            D4EArtifact flys = (D4EArtifact) master;
+            String unit = RiverUtils.getRiver(flys).getWstUnit().getName();
+            return msg(
+                I18N_W_YAXIS_LABEL,
+                I18N_W_YAXIS_LABEL_DEFAULT,
+                new Object[] { unit });
+        }
+        else if (pos == YAXIS.Q.idx) {
+            return msg(I18N_Q_YAXIS_LABEL, I18N_Q_YAXIS_LABEL_DEFAULT);
+        }
+        return "";
     }
 
     @Override
--- a/artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixWQCurveGenerator.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/fixings/FixWQCurveGenerator.java	Wed Jun 26 16:40:25 2013 +0200
@@ -94,8 +94,7 @@
     public static final double EPSILON = 0.001d;
 
     public static enum YAXIS {
-        W(0),
-        Q(1);
+        W(0);
         public int idx;
         private YAXIS(int c) {
             idx = c;
@@ -120,7 +119,7 @@
     public boolean prepareChartData(ArtifactAndFacet aaf, Document doc, boolean visible) {
         String name = aaf.getFacetName();
 
-        this.artifact = (D4EArtifact)aaf.getArtifact();
+        this.artifact = (D4EArtifact) aaf.getArtifact();
 
         if(name.startsWith(FIX_SECTOR_AVERAGE_WQ)) {
             doSectorAverageOut(aaf, doc, visible);
@@ -184,7 +183,7 @@
     }
 
 
-    /** Add sector average points to chart */
+    /** Add sector average points to chart. */
     protected void doSectorAverageOut(ArtifactAndFacet aaf, Document doc, boolean visible) {
         logger.debug("doSectorAverageOut");
 
@@ -199,7 +198,7 @@
         }
     }
 
-    /** Add analysis event points to chart */
+    /** Add analysis event points to chart. */
     protected void doAnalysisEventsOut(ArtifactAndFacet aaf, Document doc, boolean visible) {
         logger.debug("doAnalysisEventsOut");
 
@@ -219,7 +218,7 @@
                     qwd.getW());
             textAnnos.add(anno);
 
-            addAxisSeries(series, 0, visible);
+            addAxisSeries(series, YAXIS.W.idx, visible);
             if(visible && ThemeUtil.parseShowPointLabel(doc)) {
                 RiverAnnotation flysAnno = new RiverAnnotation(null, null, null, doc);
                 flysAnno.setTextAnnotations(textAnnos);
@@ -232,7 +231,7 @@
     }
 
 
-    /** Add reference event points to chart */
+    /** Add reference event points to chart. */
     protected void doReferenceEventsOut(ArtifactAndFacet aaf, Document doc, boolean visible) {
         logger.debug("doReferenceEventsOut");
 
@@ -252,7 +251,7 @@
                     qwd.getW());
             textAnnos.add(anno);
 
-            addAxisSeries(series, 0, visible);
+            addAxisSeries(series, YAXIS.W.idx, visible);
             if(visible && ThemeUtil.parseShowPointLabel(doc)) {
                 RiverAnnotation flysAnno = new RiverAnnotation(null, null, null, doc);
                 flysAnno.setTextAnnotations(textAnnos);
@@ -317,7 +316,7 @@
                     0.0 ,  // start
                     maxQ); // end
 
-            addAxisSeries(series, 0, visible);
+            addAxisSeries(series, YAXIS.W.idx, visible);
         }
         else {
             logger.warn("doWQCurveOut: maxQ <= 0");
@@ -529,7 +528,7 @@
             textAnnos.add(anno);
         }
 
-        addAxisSeries(series, 0, visible);
+        addAxisSeries(series, YAXIS.W.idx, visible);
         if (visible && ThemeUtil.parseShowPointLabel(theme)) {
             RiverAnnotation flysAnno =
                     new RiverAnnotation(null, null, null, theme);
--- a/artifacts/src/main/java/org/dive4elements/river/utils/DoubleUtil.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/utils/DoubleUtil.java	Wed Jun 26 16:40:25 2013 +0200
@@ -13,6 +13,7 @@
 import gnu.trove.TDoubleArrayList;
 
 import java.util.Arrays;
+import java.util.Comparator;
 
 import org.apache.log4j.Logger;
 
@@ -24,6 +25,17 @@
 
     public static final double DEFAULT_STEP_PRECISION = 1e6;
 
+    public static final Comparator<double []> DOUBLE_PAIR_CMP =
+        new Comparator<double []>() {
+            @Override
+            public int compare(double [] a, double [] b) {
+                double diff = a[0] - b[0];
+                if (diff < 0d) return -1;
+                if (diff > 0d) return +1;
+                return 0;
+            }
+        };
+
     /** EPSILON for comparison of double precision values. */
     public static final double EPSILON = 1e-4;
 
@@ -225,6 +237,26 @@
         return max;
     }
 
+
+
+    /** Sort a and b with a as key. b is ordered accordingly */
+    public static final void sortByFirst(double [] a, double [] b) {
+        // XXX: Not efficient but bulletproof.
+        double [][] pairs = new double[a.length][2];
+        for (int i = 0; i < a.length; ++i) {
+            double [] p = pairs[i];
+            p[0] = a[i];
+            p[1] = b[i];
+
+        }
+        Arrays.sort(pairs, DOUBLE_PAIR_CMP);
+        for (int i = 0; i < a.length; ++i) {
+            double [] p = pairs[i];
+            a[i] = p[0];
+            b[i] = p[1];
+        }
+    }
+
     public static void removeNaNs(TDoubleArrayList [] arrays) {
 
         int dest = 0;
--- a/backend/contrib/import_river.sh	Tue Jun 25 13:34:03 2013 +0200
+++ b/backend/contrib/import_river.sh	Wed Jun 26 16:40:25 2013 +0200
@@ -215,6 +215,7 @@
     -Dflys.backend.importer.skip.prfs=false \
     -Dflys.backend.importer.skip.w80s=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 \
     -Dflys.backend.importer.skip.sq.relation=true \
@@ -260,6 +261,7 @@
     -Dflys.backend.importer.skip.prfs=true \
     -Dflys.backend.importer.skip.w80s=true \
     -Dflys.backend.importer.skip.wst=true \
+    -Dflys.backend.importer.skip.measurement.stations=false \
     -Dflys.backend.importer.skip.waterlevel.differences=false \
     -Dflys.backend.importer.skip.waterlevels=false \
     -Dflys.backend.importer.skip.sq.relation=false \
@@ -305,6 +307,7 @@
     -Dflys.backend.importer.skip.prfs=true \
     -Dflys.backend.importer.skip.w80s=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 \
     -Dflys.backend.importer.skip.sq.relation=true \
--- a/backend/contrib/run_hydr_morph.sh	Tue Jun 25 13:34:03 2013 +0200
+++ b/backend/contrib/run_hydr_morph.sh	Wed Jun 26 16:40:25 2013 +0200
@@ -42,6 +42,7 @@
 IMPORTER_SKIP_W80_CSVS=false
 IMPORTER_SKIP_WST=false
 
+IMPORTER_SKIP_MEASUREMENT_STATIONS=false
 IMPORTER_SKIP_BED_HEIGHT_SINGLE=false
 IMPORTER_SKIP_BED_HEIGHT_EPOCH=false
 IMPORTER_SKIP_FLOW_VELOCITY=false
@@ -85,6 +86,7 @@
     -Dflys.backend.importer.skip.fixations=$IMPORTER_SKIP_FIXATIONS \
     -Dflys.backend.importer.skip.flood.water=$IMPORTER_SKIP_FLOOD_WATER \
     -Dflys.backend.importer.skip.flood.protection=$IMPORTER_SKIP_FLOOD_PROTECTION \
+    -Dflys.backend.importer.skip.measurement.stations=$IMPORTER_SKIP_MEASUREMENT_STATIONS \
     -Dflys.backend.importer.skip.flow.velocity=$IMPORTER_SKIP_FLOW_VELOCITY \
     -Dflys.backend.importer.skip.gauges=$IMPORTER_SKIP_GAUGES \
     -Dflys.backend.importer.skip.historical.discharge.tables=$IMPORTER_SKIP_HISTORICAL_DISCHARGE_GAUGES \
--- a/backend/src/main/java/org/dive4elements/river/importer/parsers/PRFParser.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/PRFParser.java	Wed Jun 26 16:40:25 2013 +0200
@@ -342,7 +342,7 @@
                 return false;
             }
 
-            int skip = lineSkipCount;
+            int skip = 0;
 
             while ((line = in.readLine()) != null) {
                 // Expecting dummy lines.
--- a/contrib/make_flys_release/make_release.sh	Tue Jun 25 13:34:03 2013 +0200
+++ b/contrib/make_flys_release/make_release.sh	Wed Jun 26 16:40:25 2013 +0200
@@ -196,6 +196,9 @@
        -e "s@http://localhost:8888@http://localhost:$TOMCAT_PORT@g" \
     $FLYS_SOURCE_DIR/river/gwt-client/src/main/webapp/WEB-INF/web.xml
 
+sed -i -e "s@https://flys3-devel.bafg.de/wiki@${WIKI_URL}@g" \
+    $FLYS_SOURCE_DIR/river/gwt-client/src/main/java/org/dive4elements/river/client/client/config.xml
+
 sed -i -e "s@/tmp/flys-client.log@${LOG_DIR}/client-${VERSION}.log@g" \
     $FLYS_SOURCE_DIR/river/gwt-client/src/main/webapp/WEB-INF/log4j.properties
 
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/Config.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/Config.java	Wed Jun 26 16:40:25 2013 +0200
@@ -9,7 +9,6 @@
 package org.dive4elements.river.client.client;
 
 import com.google.gwt.i18n.client.LocaleInfo;
-
 import com.google.gwt.xml.client.Document;
 import com.google.gwt.xml.client.Node;
 
@@ -81,6 +80,17 @@
 
 
     /**
+     * Returns the URL of the FLYS/d4e-Wiki.
+     *
+     * @return wiki base URL
+     */
+    public String getWikiUrl() {
+        Node server = config.getElementsByTagName("wiki").item(0);
+        return server.getFirstChild().getNodeValue();
+    }
+
+
+    /**
      * Returns the name of the current locale.
      *
      * @return the name of the current locale.
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties	Tue Jun 25 13:34:03 2013 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties	Wed Jun 26 16:40:25 2013 +0200
@@ -632,8 +632,8 @@
 gauge_q_unit = m\u00b3/s
 gauge_river_info_link = Riverinfo
 gauge_info_link = Gaugeinfo
-gauge_url = https://flys-intern.intevation.de/PegelInfo/
-gauge_river_url = https://flys-intern.intevation.de/GewaesserInfo/
+gauge_url = /PegelInfo/
+gauge_river_url = /GewaesserInfo/
 gauge_curve_link = Dischargecurve/-table
 discharge_timeranges = DC-Timeranges
 discharge_chart = W/Q-Preview
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties	Tue Jun 25 13:34:03 2013 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties	Wed Jun 26 16:40:25 2013 +0200
@@ -631,8 +631,8 @@
 gauge_q_unit = m\u00b3/s
 gauge_river_info_link = Gew\u00e4sserinfo
 gauge_info_link = Pegelinfo
-gauge_url = https://flys-intern.intevation.de/PegelInfo/
-gauge_river_url = https://flys-intern.intevation.de/GewaesserInfo/
+gauge_url = /PegelInfo/
+gauge_river_url = /GewaesserInfo/
 gauge_curve_link = Abflusskurve/-tafel
 discharge_timeranges = AK-Zeitr\u00e4ume
 discharge_chart = W/Q-Vorschau
@@ -640,7 +640,7 @@
 measurement_station_type = Messstellenart
 measurement_station_operator = Betreiber
 measurement_station_start_time = Beginn der Aufzeichnung
-measurement_station_url = https://flys-intern.intevation.de/MessstellenInfo/
+measurement_station_url = /MessstellenInfo/
 measurement_station_info_link = Messstelleninfo
 measurement_station_gauge_name = hydrologischer Bezugspegel
 
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_en.properties	Tue Jun 25 13:34:03 2013 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_en.properties	Wed Jun 26 16:40:25 2013 +0200
@@ -606,8 +606,8 @@
 gauge_q_unit = m\u00b3/s
 gauge_river_info_link = Riverinfo
 gauge_info_link = Gaugeinfo
-gauge_url = https://flys-intern.intevation.de/PegelInfo/
-gauge_river_url = https://flys-intern.intevation.de/GewaesserInfo/
+gauge_url = /PegelInfo/
+gauge_river_url = /GewaesserInfo/
 gauge_curve_link = Dischargecurve/-table
 discharge_timeranges = DC-Timeranges
 discharge_chart = W/Q-Preview
@@ -615,7 +615,7 @@
 measurement_station_type = Type of Measurement Station
 measurement_station_operator = Operator
 measurement_station_start_time = Observation Start Time
-measurement_station_url = https://flys-intern.intevation.de/MessstellenInfo/
+measurement_station_url = /MessstellenInfo/
 measurement_station_info_link = Measurement Station Info
 measurement_station_gauge_name = Reference Gauge
 
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/config.xml	Tue Jun 25 13:34:03 2013 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/config.xml	Wed Jun 26 16:40:25 2013 +0200
@@ -1,5 +1,7 @@
 <config>
     <server>http://localhost:8181</server>
+    
+    <wiki>https://flys3-devel.bafg.de/wiki</wiki>
 
     <projectlist>
         <!-- The interval to update the user's projects (in ms) -->
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/FLYSHeader.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/FLYSHeader.java	Wed Jun 26 16:40:25 2013 +0200
@@ -12,7 +12,6 @@
 import com.google.gwt.i18n.client.LocaleInfo;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.rpc.AsyncCallback;
-
 import com.smartgwt.client.types.Alignment;
 import com.smartgwt.client.types.VerticalAlignment;
 import com.smartgwt.client.util.BooleanCallback;
@@ -20,10 +19,11 @@
 import com.smartgwt.client.widgets.Button;
 import com.smartgwt.client.widgets.Img;
 import com.smartgwt.client.widgets.Label;
-import com.smartgwt.client.widgets.layout.HLayout;
 import com.smartgwt.client.widgets.events.ClickEvent;
 import com.smartgwt.client.widgets.events.ClickHandler;
+import com.smartgwt.client.widgets.layout.HLayout;
 
+import org.dive4elements.river.client.client.Config;
 import org.dive4elements.river.client.client.FLYS;
 import org.dive4elements.river.client.client.FLYSConstants;
 import org.dive4elements.river.client.client.services.UserService;
@@ -32,12 +32,14 @@
 
 
 /**
+ * Header of the FLYS webpage/app.
+ *
  * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
  */
 public class FLYSHeader extends HLayout {
 
     /** The interface that provides the message resources. */
-    private FLYSConstants MESSAGES = GWT.create(FLYSConstants.class);
+    private final FLYSConstants MESSAGES = GWT.create(FLYSConstants.class);
 
     /** The height used for this header.*/
     public static final int HEIGHT = 56;
@@ -49,25 +51,25 @@
     private User currentUser;
 
     /** The label that displays the current logged in user. */
-    private Label userText;
+    private final Label userText;
 
     /** The button to log the current user out.*/
-    private Button logout;
+    private final Button logout;
 
     /** The button to open the project list.*/
-    private Button projectList;
+    private final Button projectList;
 
     /** The button to switch between the english and german version.*/
-    private Button language;
+    private final Button language;
 
     /** The button to open an info panel.*/
-    private Button info;
+    private final Button info;
 
-    private UserServiceAsync userService =
+    private final UserServiceAsync userService =
         GWT.create(UserService.class);
 
     /** An instance to FLYS.*/
-    private FLYS flys;
+    private final FLYS flys;
 
 
     public FLYSHeader(FLYS flys) {
@@ -94,9 +96,11 @@
             public void onClick(ClickEvent event) {
                 GWT.log("Clicked 'logout' button.");
                 userService.logoutCurrentUser(new AsyncCallback<Void>() {
+                    @Override
                     public void onFailure(Throwable caught) {
                     }
 
+                    @Override
                     public void onSuccess(Void result) {
                         /* Just reload the page. GGInAFilter is goint to redirect
                          * to the correct login page */
@@ -132,7 +136,8 @@
             @Override
             public void onClick(ClickEvent event) {
                 GWT.log("Clicked 'info' button.");
-                GWT.log("IMPLEMENT the 'open info panel' function.");
+                String wikiLink = Config.getInstance().getWikiUrl() + "/Info";
+                Window.open(wikiLink, "_blank", null);
             }
         });
         init();
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RiverInfoPanel.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/RiverInfoPanel.java	Wed Jun 26 16:40:25 2013 +0200
@@ -8,12 +8,6 @@
 
 package org.dive4elements.river.client.client.ui;
 
-import java.util.Iterator;
-
-import org.dive4elements.river.client.client.FLYS;
-import org.dive4elements.river.client.client.FLYSConstants;
-import org.dive4elements.river.client.shared.model.RiverInfo;
-
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.i18n.client.NumberFormat;
 import com.google.gwt.user.client.ui.HorizontalPanel;
@@ -22,6 +16,13 @@
 import com.smartgwt.client.widgets.form.DynamicForm;
 import com.smartgwt.client.widgets.form.fields.LinkItem;
 
+import java.util.Iterator;
+
+import org.dive4elements.river.client.client.Config;
+import org.dive4elements.river.client.client.FLYS;
+import org.dive4elements.river.client.client.FLYSConstants;
+import org.dive4elements.river.client.shared.model.RiverInfo;
+
 /**
  * Panel to display information about a river.
  * @author <a href="mailto:bjoern.ricks@intevation.de">Björn Ricks</a>
@@ -97,7 +98,8 @@
         String url = number != null ?
             MSG.gauge_river_url() + number :
             MSG.gauge_river_url();
-        DynamicForm infoLink = WikiLinks.linkHTML(this.flys, url,
+        String wikiBaseUrl = Config.getInstance().getWikiUrl();
+        DynamicForm infoLink = WikiLinks.linkHTML(this.flys, wikiBaseUrl + url,
                                         MSG.gauge_river_info_link());
         infoLink.setTop(5);
         LinkItem item = (LinkItem)infoLink.getField("saml");
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/GaugeRecord.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/GaugeRecord.java	Wed Jun 26 16:40:25 2013 +0200
@@ -11,6 +11,7 @@
 import com.google.gwt.core.client.GWT;
 import com.smartgwt.client.widgets.grid.ListGridRecord;
 
+import org.dive4elements.river.client.client.Config;
 import org.dive4elements.river.client.client.FLYSConstants;
 import org.dive4elements.river.client.shared.model.GaugeInfo;
 
@@ -20,15 +21,17 @@
 public class GaugeRecord extends ListGridRecord implements GaugeInfo {
 
     /** The message class that provides i18n strings.*/
-    private FLYSConstants MSG = GWT.create(FLYSConstants.class);
+    private final FLYSConstants MSG = GWT.create(FLYSConstants.class);
 
     public GaugeRecord(GaugeInfo gauge) {
+        String wikiBaseUrl = Config.getInstance().getWikiUrl();
+
         setCanExpand(true);
         Long number = gauge.getOfficialNumber();
         String url = number != null ?
                 MSG.gauge_url() + number :
                 MSG.gauge_url();
-        setLink(url);
+        setLink(wikiBaseUrl + url);
         setLinkText(MSG.gauge_info_link());
         setName(gauge.getName());
         setKmStart(gauge.getKmStart());
@@ -59,6 +62,7 @@
         return this.getAttributeAsString("link");
     }
 
+    @Override
     public String getName() {
         return this.getAttributeAsString("name");
     }
@@ -67,6 +71,7 @@
         this.setAttribute("name", value);
     }
 
+    @Override
     public Double getKmStart() {
         return this.getAttributeAsDouble("kmstart");
     }
@@ -75,6 +80,7 @@
         this.setAttribute("kmstart", value);
     }
 
+    @Override
     public Double getKmEnd() {
         return this.getAttributeAsDouble("kmend");
     }
@@ -83,6 +89,7 @@
         this.setAttribute("kmend", value);
     }
 
+    @Override
     public Double getMinQ() {
         return this.getAttributeAsDouble("minq");
     }
@@ -91,6 +98,7 @@
         this.setAttribute("minq", value);
     }
 
+    @Override
     public Double getMaxQ() {
         return this.getAttributeAsDouble("maxq");
     }
@@ -99,6 +107,7 @@
         this.setAttribute("maxq", value);
     }
 
+    @Override
     public Double getMinW() {
         return this.getAttributeAsDouble("minw");
     }
@@ -107,6 +116,7 @@
         this.setAttribute("minw", value);
     }
 
+    @Override
     public Double getMaxW() {
         return this.getAttributeAsDouble("maxw");
     }
@@ -115,6 +125,7 @@
         this.setAttribute("maxw", value);
     }
 
+    @Override
     public Double getDatum() {
         return this.getAttributeAsDouble("datum");
     }
@@ -123,6 +134,7 @@
         this.setAttribute("datum", value);
     }
 
+    @Override
     public Double getAeo() {
         return this.getAttributeAsDouble("aeo");
     }
@@ -131,6 +143,7 @@
         this.setAttribute("aeo", value);
     }
 
+    @Override
     public boolean isKmUp() {
         return this.getAttributeAsBoolean("kmup");
     }
@@ -139,6 +152,7 @@
         this.setAttribute("kmup", value);
     }
 
+    @Override
     public Double getStation() {
         return this.getAttributeAsDouble("station");
     }
@@ -147,6 +161,7 @@
         this.setAttribute("station", value);
     }
 
+    @Override
     public String getWstUnit() {
         return this.getAttributeAsString("wstunit");
     }
@@ -155,6 +170,7 @@
         this.setAttribute("wstunit", value);
     }
 
+    @Override
     public Long getOfficialNumber() {
         return this.getAttributeAsLong("officialnumber");
     }
@@ -163,6 +179,7 @@
         this.setAttribute("officialnumber", number);
     }
 
+    @Override
     public String getRiverName() {
         return this.getAttributeAsString("rivername");
     }
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/MeasurementStationRecord.java	Tue Jun 25 13:34:03 2013 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/MeasurementStationRecord.java	Wed Jun 26 16:40:25 2013 +0200
@@ -8,11 +8,12 @@
 
 package org.dive4elements.river.client.client.ui.stationinfo;
 
-import java.util.Date;
-
 import com.google.gwt.core.client.GWT;
 import com.smartgwt.client.widgets.grid.ListGridRecord;
 
+import java.util.Date;
+
+import org.dive4elements.river.client.client.Config;
 import org.dive4elements.river.client.client.FLYSConstants;
 import org.dive4elements.river.client.shared.model.MeasurementStation;
 
@@ -24,16 +25,18 @@
 implements MeasurementStation {
 
     /** The message class that provides i18n strings.*/
-    private FLYSConstants MSG = GWT.create(FLYSConstants.class);
+    private final FLYSConstants MSG = GWT.create(FLYSConstants.class);
 
     public MeasurementStationRecord(MeasurementStation station) {
         this.setCanExpand(true);
 
+        String wikiBaseUrl = Config.getInstance().getWikiUrl();
+
         Integer number = station.getID();
         String stationName = station.getName();
         String stationIdent = stationName.replaceAll("\\W", "");
         String stationType = station.getMeasurementType();
-        String link = MSG.measurement_station_url() +
+        String link = wikiBaseUrl + MSG.measurement_station_url() +
             stationIdent + stationType;
         this.setLink(link);
         this.setLinkText(MSG.measurement_station_info_link());
--- a/gwt-client/src/main/webapp/images/FLYS_Karte_interactive.html	Tue Jun 25 13:34:03 2013 +0200
+++ b/gwt-client/src/main/webapp/images/FLYS_Karte_interactive.html	Wed Jun 26 16:40:25 2013 +0200
@@ -71,15 +71,15 @@
         <area id="main_area" shape="poly" onmouseover="highlight('Main'); highlightList('Main')" onmouseout="unHighlight('Main'); unHighlightList('Main')" onclick="selectRiver('Main')" coords="240,492,240,466,303,462,335,445,375,444,454,469,468,501,394,500,381,480,350,480,337,493,344,541,308,529,272,524,269,504" />
         <area id="main_limbach_area" shape="poly" onmouseover="highlight('Main (Wehrarm Limbach)'); highlightList('Main (Wehrarm Limbach)')" onmouseout="unHighlight('Main (Wehrarm Limbach)'); unHighlightList('Main (Wehrarm Limbach)')" onclick="selectRiver('Main (Wehrarm Limbach)')" coords="360,480,381,480,393,500,383,519,368,520" />
         <area id="main_volkach_area" shape="poly" onmouseover="highlight('Main (Wehrarm Volkach)'); highlightList('Main (Wehrarm Volkach)')" onmouseout="unHighlight('Main (Wehrarm Volkach)'); unHighlightList('Main (Wehrarm Volkach)')" onclick="selectRiver('Main (Wehrarm Volkach)')" coords="350,480,360,480,368,522,343,541,337,493" />
-        <area id="mosel_area" shape="poly" onmouseover="highlight('Mosel'); highlightList('Mosel')" onmouseout="unHighlight('Mosel'); unHighlightList('Mosel')" onclick="selectRiver('Mosel')" coords="190,467,170,461,138,453,102,466,103,494,98,537,86,600,125,604,149,583,130,543,140,518,162,515,194,511" />
+        <area id="mosel_area" shape="poly" onmouseover="highlight('Mosel'); highlightList('Mosel')" onmouseout="unHighlight('Mosel'); unHighlightList('Mosel')" onclick="selectRiver('Mosel')" coords="190,466,170,460,138,452,102,465,103,493,98,536,93,589,119,587,128,542,130,528,140,517,162,512,194,510" />
         <area id="neckar_area" shape="poly" onmouseover="highlight('Neckar'); highlightList('Neckar')" onmouseout="unHighlight('Neckar'); unHighlightList('Neckar')" onclick="selectRiver('Neckar')" coords="231,641,253,653,288,640,386,577,357,559,342,541,319,540,292,547,290,583,308,590,306,615,250,604,226,630" />
         <area id="neckar_wehrarm_area" shape="poly" onmouseover="highlight('Neckar (über Wehrarme)'); highlightList('Neckar (über Wehrarme)')" onmouseout="unHighlight('Neckar (über Wehrarme)'); unHighlightList('Neckar (über Wehrarme)')" onclick="selectRiver('Neckar (über Wehrarme)')" coords="272,524,248,540,253,561,259,570,254,605,306,615,308,590,290,583,292,546,320,540,309,529" />
         <area id="oder_area" shape="poly" onmouseover="highlight('Oder'); highlightList('Oder')" onmouseout="unHighlight('Oder'); unHighlightList('Oder')" onclick="selectRiver('Oder')" coords="572,143,542,155,542,178,529,203,541,238,565,252,583,273,570,307,603,327,641,320,639,286,633,275,614,269,619,246,635,236,637,195,606,160" />
         <area id="rhein_area" shape="poly" onmouseover="highlight('Rhein'); highlightList('Rhein')" onmouseout="unHighlight('Rhein'); unHighlightList('Rhein')" onclick="selectRiver('Rhein')" coords="86,301,138,317,157,334,153,355,177,381,185,407,198,450,197,464,219,471,224,478,240,473,241,492,269,502,273,523,249,539,254,561,260,570,256,597,227,628,229,639,252,653,277,644,279,668,236,670,237,690,265,687,281,696,283,717,248,728,188,737,170,718,167,669,203,569,222,545,213,521,195,521,193,467,171,459,145,444,122,403,49,391,52,352,23,344,4,304" />
-        <area id="saale_area" shape="poly" onmouseover="highlight('Saale'); highlightList('Saale')" onmouseout="unHighlight('Saale'); unHighlightList('Saale')" onclick="selectRiver('Saale')" coords="445,314,414,311,366,299,366,342,395,346,404,356,477,371,463,341" />
-        <area id="saale_thueringen_area" shape="poly" onmouseover="highlight('Saale-Thüringen'); highlightList('Saale-Thüringen')" onmouseout="unHighlight('Saale-Thüringen'); unHighlightList('Saale-Thüringen')" onclick="selectRiver('Saale-Thüringen')" coords="430,365,462,377,477,385,430,461,375,444,387,415,402,408,420,387,435,383" />
-        <area id="saar_area" shape="poly" onmouseover="highlight('Saar'); highlightList('Saar')" onmouseout="unHighlight('Saar'); unHighlightList('Saar')" onclick="selectRiver('Saar')" coords="150,539,129,544,139,564,155,588,181,593,187,565,201,536,195,526,195,512,154,516" />
-        <area id="saar_wiltingerbogen_area" shape="poly" onmouseover="highlight('Saar (Wiltinger Bogen)'); highlightList('Saar (Wiltinger Bogen)')" onmouseout="unHighlight('Saar (Wiltinger Bogen)'); unHighlightList('Saar (Wiltinger Bogen)')" onclick="selectRiver('Saar (Wiltinger Bogen)')" coords="139,518,155,516,149,540,130,542" />
+        <area id="saale_area" shape="poly" onmouseover="highlight('Saale'); highlightList('Saale')" onmouseout="unHighlight('Saale'); unHighlightList('Saale')" onclick="selectRiver('Saale')" coords="445,314,414,311,366,299,366,342,395,346,404,356,469,350,463,341" />
+        <area id="saale_thueringen_area" shape="poly" onmouseover="highlight('Saale-Thüringen'); highlightList('Saale-Thüringen')" onmouseout="unHighlight('Saale-Thüringen'); unHighlightList('Saale-Thüringen')" onclick="selectRiver('Saale-Thüringen')" coords="460,395,430,461,375,444,387,415,402,408,420,387,435,383" />
+        <area id="saar_area" shape="poly" onmouseover="highlight('Saar'); highlightList('Saar')" onmouseout="unHighlight('Saar'); unHighlightList('Saar')" onclick="selectRiver('Saar')" coords="152,515,193,511,193,545,180,599,151,589,146,566,147,559,143,544,153,535" />
+        <area id="saar_wiltingerbogen_area" shape="poly" onmouseover="highlight('Saar (Wiltinger Bogen)'); highlightList('Saar (Wiltinger Bogen)')" onmouseout="unHighlight('Saar (Wiltinger Bogen)'); unHighlightList('Saar (Wiltinger Bogen)')" onclick="selectRiver('Saar (Wiltinger Bogen)')" coords="130,528,139,517,152,515,152,536,142,543,147,560,134,570,126,558" />
         <area id="werra_sommer_area" shape="poly" onmouseover="highlight('Werra (Sommer)'); highlightList('Werra (Sommer)')" onmouseout="unHighlight('Werra (Sommer)'); unHighlightList('Werra (Sommer)')" onclick="selectRiver('Werra (Sommer)')" coords="316,361,334,351,360,342,387,345,398,354,384,372,381,389,371,400,350,390,345,382,336,378,334,372,329,368" />
         <area id="werra_winter_area" shape="poly" onmouseover="highlight('Werra (Winter)'); highlightList('Werra (Winter)')" onmouseout="unHighlight('Werra (Winter)'); unHighlightList('Werra (Winter)')" onclick="selectRiver('Werra (Winter)')" coords="315,362,326,388,334,398,350,409,370,400,353,391,347,388,346,385,344,382,335,378,333,372,329,368" />
         <area id="weser_area" shape="poly" onmouseover="highlight('Weser'); highlightList('Weser')" onmouseout="unHighlight('Weser'); unHighlightList('Weser')" onclick="selectRiver('Weser')" coords="255,166,227,172,232,227,268,237,241,279,246,298,247,313,275,313,282,330,289,353,314,363,332,351,318,328,316,308,299,280,303,255,300,217,263,203,273,176" />
@@ -97,6 +97,7 @@
         <area id="Ems_area" shape="poly" onmouseover="highlight('Ems')" onmouseout="unHighlight('Ems')" onclick="selectRiver('Ems')" coords="175,170,144,199,176,306,156,337,154,357,171,374,245,349,229,309,226,262,208,227,215,169" />
         <area id="Main_Donau_area" shape="poly" onmouseover="highlight('Main_Donau')" onmouseout="unHighlight('Main_Donau')" onclick="selectRiver('Main_Donau')" coords="384,519,371,521,343,541,355,558,396,578,433,576,442,556,426,500,392,500" />
         <area id="Saale_1_area" shape="poly" onmouseover="highlight('Saale_1')" onmouseout="unHighlight('Saale_1')" onclick="selectRiver('Saale_1')" coords="423,358,395,356,382,375,381,390,402,407,419,387,435,383" />
+        <area id="Saale_z_area" shape="poly" onmouseover="highlight('Saale_Zwischen')" onmouseout="unHighlight('Saale_Zwischen')" onclick="selectRiver('Saale_Zwischen')" coords="423,354,469,351,483,382,461,395,435,382" />
         <area id="Spree_area" shape="poly" onmouseover="highlight('Spree')" onmouseout="unHighlight('Spree')" onclick="selectRiver('Spree')" coords="530,234,550,244,563,251,582,274,573,295,516,283"  />
         <area id="Weser_1_area" shape="poly" onmouseover="highlight('Weser_1')" onmouseout="unHighlight('Weser_1')" onclick="selectRiver('Weser_1')" coords="260,202,274,183,299,201,299,217,285,216" />
         <area id="Weser_2_area" shape="poly" onmouseover="highlight('Weser_2')" onmouseout="unHighlight('Weser_2')" onclick="selectRiver('Weser_2')" coords="300,216,333,231,352,343,329,346,318,327,317,307,300,279,304,252" />
@@ -158,6 +159,7 @@
       <img src="images/FLYS_Neckar_inactive.png" style="position: absolute; left: 8px; top: 8px; visibility: hidden; z-index: 50;" id="Neckar (über Wehrarme)_inactive" >
       <img src="images/FLYS_Saale_inactive.png" style="position: absolute; left: 8px; top: 8px; visibility: hidden; z-index: 50;" id="Saale_inactive" >
       <img src="images/FLYS_Saale_Thueringen_inactive.png" style="position: absolute; left: 8px; top: 8px; visibility: hidden; z-index: 50;" id="Saale-Thüringen_inactive" >
+      <img src="images/FLYS_Saale_Zwischen_inactive.png" style="position: absolute; left: 8px; top: 8px; visibility: hidden; z-index: 50;" id="Saale_Zwischen_inactive" >
       <img src="images/FLYS_Saar_inactive.png" style="position: absolute; left: 8px; top: 8px; visibility: hidden; z-index: 50;" id="Saar_inactive" >
       <img src="images/FLYS_Werra_inactive.png" style="position: absolute; left: 8px; top: 8px; visibility: hidden; z-index: 50;" id="Werra (Sommer)_inactive" >
       <img src="images/FLYS_Werra_inactive.png" style="position: absolute; left: 8px; top: 8px; visibility: hidden; z-index: 50;" id="Werra (Winter)_inactive" >
Binary file gwt-client/src/main/webapp/images/FLYS_Saale_Zwischen_inactive.png has changed
Binary file gwt-client/src/main/webapp/images/FLYS_Saar.png has changed
Binary file gwt-client/src/main/webapp/images/FLYS_Saar_WiltingerBogen.png has changed

http://dive4elements.wald.intevation.org