changeset 5645:696d710470f5

flys/issue1077: Show loads as step line, therefore transform data in SedimentLoadFacet to stretch as in the measurement stations bounds. Deal with this new kind of data in the Generator.
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Wed, 10 Apr 2013 09:35:07 +0200
parents bae2b1568f3d
children 14009b194871
files flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFacet.java flys-artifacts/src/main/java/de/intevation/flys/exports/minfo/SedimentLoadLSGenerator.java
diffstat 2 files changed, 120 insertions(+), 46 deletions(-) [+]
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFacet.java	Wed Apr 10 09:32:47 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFacet.java	Wed Apr 10 09:35:07 2013 +0200
@@ -2,20 +2,30 @@
 
 import org.apache.log4j.Logger;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import de.intevation.artifactdatabase.state.Facet;
 import de.intevation.artifacts.Artifact;
 import de.intevation.artifacts.CallContext;
 import de.intevation.flys.artifacts.FLYSArtifact;
 import de.intevation.flys.artifacts.model.CalculationResult;
 import de.intevation.flys.artifacts.model.DataFacet;
+import de.intevation.flys.model.MeasurementStation;
+import de.intevation.flys.artifacts.model.FacetTypes;
 import de.intevation.flys.artifacts.states.DefaultState.ComputeType;
 
+import de.intevation.flys.utils.FLYSUtils;
+
 
 public class SedimentLoadFacet
 extends DataFacet
 {
+    /** Very own logger. */
     private static Logger logger = Logger.getLogger(SedimentLoadFacet.class);
 
+    private static double EPSILON = 1e-5;
+
     public SedimentLoadFacet() {
     }
 
@@ -35,9 +45,73 @@
         Object[] data =
             (SedimentLoadResult[]) res.getData(); // TODO CAST TO SPECIFIC CLASS
 
-        return data != null && data.length > index ? data[index] : null;
+        List<MeasurementStation> allStations = FLYSUtils.getRiver(flys).getMeasurementStations();
+        SedimentLoadResult result = data != null && data.length > index ? (SedimentLoadResult)data[index] : null;
+        if (result == null) {
+            return null;
+        }
+
+        // Filter stations according to type.
+        List<MeasurementStation> stations = new ArrayList<MeasurementStation>();
+        for (MeasurementStation station: allStations) {
+            if (station.getRange() == null || station.getMeasurementType() == null) {
+                continue;
+            }
+            if (FacetTypes.IS.SEDIMENT_LOAD_NO_FLOAT(this.getName()) && station.getMeasurementType().equals("Geschiebe"))
+                stations.add(station);
+            else if (!FacetTypes.IS.SEDIMENT_LOAD_NO_FLOAT(this.getName()) && station.getMeasurementType().equals("Schwebstoff"))
+                stations.add(station);
+        }
+
+        // Access data according to type.
+        double[][] sd = null;
+        if (getName().equals(FacetTypes.SEDIMENT_LOAD_SAND))
+            sd = result.getSandData();
+        else if (getName().equals(FacetTypes.SEDIMENT_LOAD_COARSE))
+            sd = result.getCoarseData();
+        else if (getName().equals(FacetTypes.SEDIMENT_LOAD_FINEMIDDLE))
+            sd = result.getFineMiddleData();
+        else if (getName().equals(FacetTypes.SEDIMENT_LOAD_SUSP_SAND))
+            sd = result.getSuspSandData();
+        else if (getName().equals(FacetTypes.SEDIMENT_LOAD_SUSP_SAND_BED))
+            sd = result.getSuspSandBedData();
+        else if (getName().equals(FacetTypes.SEDIMENT_LOAD_SUSP_SEDIMENT))
+            sd = result.getSuspSedimentData();
+        else if (getName().equals(FacetTypes.SEDIMENT_LOAD_TOTAL_LOAD))
+            sd = result.getTotalLoadData();
+        else if (getName().equals(FacetTypes.SEDIMENT_LOAD_TOTAL))
+            sd = result.getTotalData();
+
+        double[] km   = sd[0];
+        double[] load = sd[1];
+
+        double[][] values = new double[2][];
+        values[0] = new double[km.length*2];
+        values[1] = new double[km.length*2];
+
+        // Find station via its station (km).
+        // TODO what to do with gaps in measurement stations.
+        for (int i = 0; i < km.length; i++) {
+            boolean matchFound = false;
+            for (MeasurementStation station: stations) {
+                if (Math.abs(station.getStation() - km[i]) < EPSILON) {
+                    values[0][i*2] = station.getRange().getA().doubleValue();
+                    values[1][i*2] = load[i];
+                    values[0][i*2+1] = station.getRange().getB().doubleValue();
+                    values[1][i*2+1] = load[i];
+                    matchFound = true;
+                }
+            }
+            if (!matchFound) {
+                values[0][i*2] = km[i];
+                values[1][i*2] = load[i];
+                logger.debug("No measurement station for km " + km[i]);
+            }
+        }
+        return values;
     }
 
+
     /** Copy deeply. */
     @Override
     public Facet deepCopy() {
--- a/flys-artifacts/src/main/java/de/intevation/flys/exports/minfo/SedimentLoadLSGenerator.java	Wed Apr 10 09:32:47 2013 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/minfo/SedimentLoadLSGenerator.java	Wed Apr 10 09:35:07 2013 +0200
@@ -128,56 +128,56 @@
         }
         if (name.equals(SEDIMENT_LOAD_COARSE)) {
             doSedimentLoadCoarseOut(
-                (SedimentLoadResult) bundle.getData(context),
+                (double[][]) bundle.getData(context),
                 bundle,
                 attr,
                 visible);
         }
         else if (name.equals(SEDIMENT_LOAD_SAND)) {
             doSedimentLoadSandOut(
-                (SedimentLoadResult) bundle.getData(context),
+                (double[][]) bundle.getData(context),
                 bundle,
                 attr,
                 visible);
         }
         else if (name.equals(SEDIMENT_LOAD_FINEMIDDLE)) {
             doSedimentLoadFineMiddleOut(
-                (SedimentLoadResult) bundle.getData(context),
+                (double[][]) bundle.getData(context),
                 bundle,
                 attr,
                 visible);
         }
         else if (name.equals(SEDIMENT_LOAD_SUSP_SAND)) {
             doSedimentLoadSuspSandOut(
-                (SedimentLoadResult) bundle.getData(context),
+                (double[][]) bundle.getData(context),
                 bundle,
                 attr,
                 visible);
         }
         else if (name.equals(SEDIMENT_LOAD_SUSP_SAND_BED)) {
             doSedimentLoadSuspSandBedOut(
-                (SedimentLoadResult) bundle.getData(context),
+                (double[][]) bundle.getData(context),
                 bundle,
                 attr,
                 visible);
         }
         else if (name.equals(SEDIMENT_LOAD_SUSP_SEDIMENT)) {
             doSedimentLoadSuspSedimentOut(
-                (SedimentLoadResult) bundle.getData(context),
+                (double[][]) bundle.getData(context),
                 bundle,
                 attr,
                 visible);
         }
         else if (name.equals(SEDIMENT_LOAD_TOTAL_LOAD)) {
             doSedimentLoadTotalLoadOut(
-                (SedimentLoadResult) bundle.getData(context),
+                (double[][]) bundle.getData(context),
                 bundle,
                 attr,
                 visible);
         }
         else if (name.equals(SEDIMENT_LOAD_TOTAL)) {
             doSedimentLoadTotalOut(
-                (SedimentLoadResult) bundle.getData(context),
+                (double[][]) bundle.getData(context),
                 bundle,
                 attr,
                 visible);
@@ -290,78 +290,78 @@
         return label;
     }
 
-    protected void doSedimentLoadCoarseOut(SedimentLoadResult data,
+    // TODO all double[][] eating *Out() can be subsumed.
+    protected void doSedimentLoadCoarseOut(double[][] data,
         ArtifactAndFacet aandf, Document theme, boolean visible) {
 
         XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data.getCoarseData(), true);
-
-        addAxisSeries(series, YAXIS.L.idx, visible);
-    }
-
-    protected void doSedimentLoadSandOut(SedimentLoadResult data,
-        ArtifactAndFacet aandf, Document theme, boolean visible) {
-
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data.getSandData(), true);
-
-        addAxisSeries(series, YAXIS.L.idx, visible);
-    }
-
-    protected void doSedimentLoadFineMiddleOut(SedimentLoadResult data,
-        ArtifactAndFacet aandf, Document theme, boolean visible) {
-
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data.getFineMiddleData(), true);
+        StyledSeriesBuilder.addPoints(series, data, true);
 
         addAxisSeries(series, YAXIS.L.idx, visible);
     }
 
-    protected void doSedimentLoadSuspSandOut(SedimentLoadResult data,
+    protected void doSedimentLoadSandOut(double[][] data,
         ArtifactAndFacet aandf, Document theme, boolean visible) {
 
         XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data.getSuspSandData(), true);
-
-        addAxisSeries(series, YAXIS.L.idx, visible);
-    }
-
-    protected void doSedimentLoadSuspSandBedOut(SedimentLoadResult data,
-        ArtifactAndFacet aandf, Document theme, boolean visible) {
-
-        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data.getSuspSandBedData(), true);
+        StyledSeriesBuilder.addPoints(series, data, true);
 
         addAxisSeries(series, YAXIS.L.idx, visible);
     }
 
-    protected void doSedimentLoadSuspSedimentOut(SedimentLoadResult data,
+    protected void doSedimentLoadFineMiddleOut(double[][] data,
         ArtifactAndFacet aandf, Document theme, boolean visible) {
 
         XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data.getSuspSedimentData(), true);
+        StyledSeriesBuilder.addPoints(series, data, true);
 
         addAxisSeries(series, YAXIS.L.idx, visible);
     }
 
-    protected void doSedimentLoadTotalLoadOut(SedimentLoadResult data,
+    protected void doSedimentLoadSuspSandOut(double[][] data,
         ArtifactAndFacet aandf, Document theme, boolean visible) {
 
         XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data.getTotalLoadData(), true);
+        StyledSeriesBuilder.addPoints(series, data, true);
 
         addAxisSeries(series, YAXIS.L.idx, visible);
     }
 
-    protected void doSedimentLoadTotalOut(SedimentLoadResult data,
+    protected void doSedimentLoadSuspSandBedOut(double[][] data,
         ArtifactAndFacet aandf, Document theme, boolean visible) {
 
         XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
-        StyledSeriesBuilder.addPoints(series, data.getTotalData(), true);
+        StyledSeriesBuilder.addPoints(series, data, true);
 
         addAxisSeries(series, YAXIS.L.idx, visible);
     }
 
+    protected void doSedimentLoadSuspSedimentOut(double[][] data,
+        ArtifactAndFacet aandf, Document theme, boolean visible) {
+
+        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
+        StyledSeriesBuilder.addPoints(series, data, true);
+
+        addAxisSeries(series, YAXIS.L.idx, visible);
+    }
+
+    protected void doSedimentLoadTotalLoadOut(double[][] data,
+        ArtifactAndFacet aandf, Document theme, boolean visible) {
+
+        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
+        StyledSeriesBuilder.addPoints(series, data, true);
+
+        addAxisSeries(series, YAXIS.L.idx, visible);
+    }
+
+    protected void doSedimentLoadTotalOut(double[][] data,
+        ArtifactAndFacet aandf, Document theme, boolean visible) {
+
+        XYSeries series = new StyledXYSeries(aandf.getFacetDescription(), theme);
+        StyledSeriesBuilder.addPoints(series, data, true);
+
+        addAxisSeries(series, YAXIS.L.idx, visible);
+
     protected void doFlowVelocityMainOut(
         FlowVelocityData data,
         ArtifactAndFacet aandf,

http://dive4elements.wald.intevation.org