diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentLoadFacet.java @ 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 19772b414d46
children ddb2a4e982b8
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() {

http://dive4elements.wald.intevation.org