diff artifacts/src/main/java/org/dive4elements/river/exports/process/SedimentLoadProcessor.java @ 8204:c657ddcf1fa6

Sediment loads at measurement stations and longitudinal sections need different processing and styling for diagrams.
author Tom Gottfried <tom@intevation.de>
date Fri, 05 Sep 2014 14:53:58 +0200
parents e4606eae8ea5
children 204905c16ade
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/exports/process/SedimentLoadProcessor.java	Fri Sep 05 13:19:22 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/SedimentLoadProcessor.java	Fri Sep 05 14:53:58 2014 +0200
@@ -11,6 +11,8 @@
 import org.apache.log4j.Logger;
 import org.jfree.data.xy.XYSeries;
 
+import gnu.trove.TDoubleArrayList;
+
 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
 import org.dive4elements.artifacts.CallContext;
 import org.dive4elements.river.exports.DiagramGenerator;
@@ -18,12 +20,20 @@
 import org.dive4elements.river.jfree.StyledXYSeries;
 import org.dive4elements.river.themes.ThemeDocument;
 
+import org.dive4elements.river.artifacts.D4EArtifact;
+import org.dive4elements.river.artifacts.access.RiverAccess;
+import org.dive4elements.river.artifacts.model.minfo.SedimentLoadData;
+import org.dive4elements.river.artifacts.model.minfo.SedimentLoadData.Station;
+import org.dive4elements.river.artifacts.model.minfo.SedimentLoadDataFactory;
+
 // Base class for SedimantLoad$UNITProcessors
 public class SedimentLoadProcessor extends DefaultProcessor
 {
     private final static Logger log =
             Logger.getLogger(SedimentLoadProcessor.class);
 
+    private static final double EPS = 1e-4;
+
     @Override
     public void doOut(
             DiagramGenerator generator,
@@ -37,19 +47,49 @@
                 theme);
         Object data = bundle.getData(context);
         String facetName = bundle.getFacetName();
-        double [][] points;
 
         log.debug("Do out for: " + facetName);
         if (facetName.startsWith("sedimentload.")) {
-            points = (double[][]) data;
+            /* Remove stations (with NaN-values) at stations of
+               different type than appropriate for current fraction.*/
+            String [] facetNameParts = facetName.split("\\.");
+            int gfSType = SedimentLoadData.measurementStationType(
+                SedimentLoadData.grainFractionIndex(
+                    facetNameParts[facetNameParts.length-1]));
+
+            RiverAccess access =
+                new RiverAccess((D4EArtifact)bundle.getArtifact());
+            String river = access.getRiverName();
+            SedimentLoadData sld =
+                SedimentLoadDataFactory.INSTANCE.getSedimentLoadData(river);
+
+            double [][] allData = (double[][]) data;
+            TDoubleArrayList cleanedKms =
+                new TDoubleArrayList(allData[0].length);
+            TDoubleArrayList cleanedValues =
+                new TDoubleArrayList(allData[0].length);
+
+            for (int i = 0; i < allData[0].length; ++i) {
+                double km = allData[0][i];
+                Station station = sld.findStations(km-EPS, km+EPS).get(0);
+                if (station.isType(gfSType)) {
+                    cleanedKms.add(km);
+                    cleanedValues.add(allData[1][i]);
+                }
+            }
+
+            double [][] points = new double[2][cleanedKms.size()];
+            points[0] = cleanedKms.toNativeArray();
+            points[1] = cleanedValues.toNativeArray();
+
+            StyledSeriesBuilder.addPoints(series, points, false); // Keep NaN
+
+            generator.addAxisSeries(series, axisName, visible);
+
         } else {
             log.error("Unknown facet name: " + facetName);
             return;
         }
-
-        StyledSeriesBuilder.addPoints(series, points, false); // Keep NaN
-
-        generator.addAxisSeries(series, axisName, visible);
     }
 }
 

http://dive4elements.wald.intevation.org