comparison 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
comparison
equal deleted inserted replaced
8203:238fc722f87a 8204:c657ddcf1fa6
9 package org.dive4elements.river.exports.process; 9 package org.dive4elements.river.exports.process;
10 10
11 import org.apache.log4j.Logger; 11 import org.apache.log4j.Logger;
12 import org.jfree.data.xy.XYSeries; 12 import org.jfree.data.xy.XYSeries;
13 13
14 import gnu.trove.TDoubleArrayList;
15
14 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; 16 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
15 import org.dive4elements.artifacts.CallContext; 17 import org.dive4elements.artifacts.CallContext;
16 import org.dive4elements.river.exports.DiagramGenerator; 18 import org.dive4elements.river.exports.DiagramGenerator;
17 import org.dive4elements.river.exports.StyledSeriesBuilder; 19 import org.dive4elements.river.exports.StyledSeriesBuilder;
18 import org.dive4elements.river.jfree.StyledXYSeries; 20 import org.dive4elements.river.jfree.StyledXYSeries;
19 import org.dive4elements.river.themes.ThemeDocument; 21 import org.dive4elements.river.themes.ThemeDocument;
20 22
23 import org.dive4elements.river.artifacts.D4EArtifact;
24 import org.dive4elements.river.artifacts.access.RiverAccess;
25 import org.dive4elements.river.artifacts.model.minfo.SedimentLoadData;
26 import org.dive4elements.river.artifacts.model.minfo.SedimentLoadData.Station;
27 import org.dive4elements.river.artifacts.model.minfo.SedimentLoadDataFactory;
28
21 // Base class for SedimantLoad$UNITProcessors 29 // Base class for SedimantLoad$UNITProcessors
22 public class SedimentLoadProcessor extends DefaultProcessor 30 public class SedimentLoadProcessor extends DefaultProcessor
23 { 31 {
24 private final static Logger log = 32 private final static Logger log =
25 Logger.getLogger(SedimentLoadProcessor.class); 33 Logger.getLogger(SedimentLoadProcessor.class);
34
35 private static final double EPS = 1e-4;
26 36
27 @Override 37 @Override
28 public void doOut( 38 public void doOut(
29 DiagramGenerator generator, 39 DiagramGenerator generator,
30 ArtifactAndFacet bundle, 40 ArtifactAndFacet bundle,
35 XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), 45 XYSeries series = new StyledXYSeries(bundle.getFacetDescription(),
36 false, // Handle NaN 46 false, // Handle NaN
37 theme); 47 theme);
38 Object data = bundle.getData(context); 48 Object data = bundle.getData(context);
39 String facetName = bundle.getFacetName(); 49 String facetName = bundle.getFacetName();
40 double [][] points;
41 50
42 log.debug("Do out for: " + facetName); 51 log.debug("Do out for: " + facetName);
43 if (facetName.startsWith("sedimentload.")) { 52 if (facetName.startsWith("sedimentload.")) {
44 points = (double[][]) data; 53 /* Remove stations (with NaN-values) at stations of
54 different type than appropriate for current fraction.*/
55 String [] facetNameParts = facetName.split("\\.");
56 int gfSType = SedimentLoadData.measurementStationType(
57 SedimentLoadData.grainFractionIndex(
58 facetNameParts[facetNameParts.length-1]));
59
60 RiverAccess access =
61 new RiverAccess((D4EArtifact)bundle.getArtifact());
62 String river = access.getRiverName();
63 SedimentLoadData sld =
64 SedimentLoadDataFactory.INSTANCE.getSedimentLoadData(river);
65
66 double [][] allData = (double[][]) data;
67 TDoubleArrayList cleanedKms =
68 new TDoubleArrayList(allData[0].length);
69 TDoubleArrayList cleanedValues =
70 new TDoubleArrayList(allData[0].length);
71
72 for (int i = 0; i < allData[0].length; ++i) {
73 double km = allData[0][i];
74 Station station = sld.findStations(km-EPS, km+EPS).get(0);
75 if (station.isType(gfSType)) {
76 cleanedKms.add(km);
77 cleanedValues.add(allData[1][i]);
78 }
79 }
80
81 double [][] points = new double[2][cleanedKms.size()];
82 points[0] = cleanedKms.toNativeArray();
83 points[1] = cleanedValues.toNativeArray();
84
85 StyledSeriesBuilder.addPoints(series, points, false); // Keep NaN
86
87 generator.addAxisSeries(series, axisName, visible);
88
45 } else { 89 } else {
46 log.error("Unknown facet name: " + facetName); 90 log.error("Unknown facet name: " + facetName);
47 return; 91 return;
48 } 92 }
49
50 StyledSeriesBuilder.addPoints(series, points, false); // Keep NaN
51
52 generator.addAxisSeries(series, axisName, visible);
53 } 93 }
54 } 94 }
55 95

http://dive4elements.wald.intevation.org