comparison artifacts/src/main/java/org/dive4elements/river/exports/process/DischargeProcessor.java @ 8182:0b4cd7a5f079

Changed discharge processor to plot only discharge curves and added processor for computed discharge curves.
author Raimund Renkert <rrenkert@intevation.de>
date Thu, 04 Sep 2014 11:14:24 +0200
parents 67e87c2d3748
children 59e50aa0c6c2
comparison
equal deleted inserted replaced
8181:209f8a9e8a75 8182:0b4cd7a5f079
10 10
11 import java.util.ArrayList; 11 import java.util.ArrayList;
12 import java.util.List; 12 import java.util.List;
13 13
14 import org.apache.log4j.Logger; 14 import org.apache.log4j.Logger;
15 import org.jfree.chart.annotations.XYTextAnnotation;
15 import org.jfree.data.xy.XYSeries; 16 import org.jfree.data.xy.XYSeries;
16 17
17 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; 18 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
18 import org.dive4elements.artifacts.CallContext; 19 import org.dive4elements.artifacts.CallContext;
20 import org.dive4elements.river.artifacts.D4EArtifact;
21 import org.dive4elements.river.artifacts.access.RiverAccess;
19 import org.dive4elements.river.artifacts.model.FacetTypes; 22 import org.dive4elements.river.artifacts.model.FacetTypes;
20 import org.dive4elements.river.artifacts.model.WQKms; 23 import org.dive4elements.river.artifacts.model.WQKms;
24 import org.dive4elements.river.exports.DiagramGenerator;
21 import org.dive4elements.river.exports.DischargeCurveGenerator; 25 import org.dive4elements.river.exports.DischargeCurveGenerator;
26 import org.dive4elements.river.exports.StyledSeriesBuilder;
22 import org.dive4elements.river.exports.XYChartGenerator; 27 import org.dive4elements.river.exports.XYChartGenerator;
23 import org.dive4elements.river.jfree.CollisionFreeXYTextAnnotation; 28 import org.dive4elements.river.jfree.CollisionFreeXYTextAnnotation;
24 import org.dive4elements.river.jfree.RiverAnnotation; 29 import org.dive4elements.river.jfree.RiverAnnotation;
25 import org.dive4elements.river.jfree.StickyAxisAnnotation; 30 import org.dive4elements.river.jfree.StickyAxisAnnotation;
26 import org.dive4elements.river.jfree.StyledXYSeries; 31 import org.dive4elements.river.jfree.StyledXYSeries;
32 import org.dive4elements.river.model.Gauge;
33 import org.dive4elements.river.model.River;
27 import org.dive4elements.river.themes.ThemeDocument; 34 import org.dive4elements.river.themes.ThemeDocument;
28
29 import org.jfree.chart.annotations.XYTextAnnotation;
30 35
31 36
32 /** Helper for data handling in discharge diagrams. */ 37 /** Helper for data handling in discharge diagrams. */
33 public class DischargeProcessor 38 public class DischargeProcessor
34 extends DefaultProcessor implements FacetTypes { 39 extends DefaultProcessor implements FacetTypes {
42 /** Tolerance for comparison of kilometers. */ 47 /** Tolerance for comparison of kilometers. */
43 public static final double KM_EPSILON = 0.001d; 48 public static final double KM_EPSILON = 0.001d;
44 49
45 50
46 /** This processor needs to be constructed with a given km. */ 51 /** This processor needs to be constructed with a given km. */
47 private DischargeProcessor() { 52 public DischargeProcessor() {
48 km = Double.NaN; 53 km = Double.NaN;
49 } 54 }
50 55
51 56
52 public DischargeProcessor(double km) { 57 public DischargeProcessor(double km) {
55 60
56 61
57 /** Process data, add it to plot. */ 62 /** Process data, add it to plot. */
58 @Override 63 @Override
59 public void doOut( 64 public void doOut(
60 XYChartGenerator generator, 65 DiagramGenerator generator,
61 ArtifactAndFacet bundle, 66 ArtifactAndFacet bundle,
62 ThemeDocument theme, 67 ThemeDocument theme,
63 boolean visible, 68 boolean visible
64 int axisIndex
65 ) { 69 ) {
66 CallContext context = generator.getCallContext(); 70 CallContext context = generator.getCallContext();
67 Object data = bundle.getData(context); 71 Object data = bundle.getData(context);
68 if (data instanceof WQKms) { 72 if (data instanceof WQKms) {
69 doWQKmsPointOut( 73 doDischargeOut(
70 generator, (WQKms) data, bundle, theme, visible, axisIndex); 74 generator,
71 return; 75 bundle,
72 } 76 bundle.getFacetName(),
73 else if (data instanceof RiverAnnotation) { 77 theme,
74 doRiverAnnotationOut( 78 visible);
75 generator, (RiverAnnotation) data, bundle, theme, visible);
76 return;
77 }
78 else if (data instanceof double[][]) {
79 doMarksOut(
80 generator, (double[][]) data, bundle, theme, visible);
81 return;
82 } 79 }
83 else { 80 else {
84 logger.error("Can't process " 81 logger.error("Can't process "
85 + data.getClass().getName() + " objects of facet " 82 + data.getClass().getName() + " objects of facet "
86 + bundle.getFacetName()); 83 + bundle.getFacetName());
87 } 84 }
88 } 85 }
89 86
90
91 /** True if this processor knows how to deal with facetType. */ 87 /** True if this processor knows how to deal with facetType. */
92 @Override 88 @Override
93 public boolean canHandle(String facetType) { 89 public boolean canHandle(String facetType) {
94 return STATIC_WQKMS_W.equals(facetType) 90 return DISCHARGE_CURVE.equals(facetType)
95 || COMPUTED_DISCHARGE_MAINVALUES_Q.equals(facetType) 91 || GAUGE_DISCHARGE_CURVE.equals(facetType);
96 || MAINVALUES_Q.equals(facetType)
97 || COMPUTED_DISCHARGE_MAINVALUES_W.equals(facetType)
98 || MAINVALUES_W.equals(facetType)
99 || STATIC_W_INTERPOL.equals(facetType);
100 } 92 }
101 93
102 94
103 /** The station of the current calculation/view. */ 95 /** The station of the current calculation/view. */
104 protected double getKm() { 96 protected double getKm() {
105 return km; 97 return km;
106 } 98 }
107 99
100 /**
101 * Add series with discharge curve to diagram.
102 */
103 protected void doDischargeOut(
104 DiagramGenerator generator,
105 ArtifactAndFacet bundle,
106 String name,
107 ThemeDocument theme,
108 boolean visible)
109 {
110 logger.debug("DischargeCurveGenerator.doDischargeOut");
111 CallContext context = generator.getCallContext();
112 WQKms data = (WQKms)bundle.getData(context);
113 XYSeries series = new StyledXYSeries(name, theme);
114 double[][] wqData = new double[2][data.size()];
115 for (int i = 0; i < data.size(); i++) {
116 wqData[0][i] = data.getQ(i);
117 wqData[1][i] = data.getW(i);
118 }
119 StyledSeriesBuilder.addPoints(series, wqData, false);
108 120
109 /** Handle WQKms data by finding w/q values at given km. */ 121 String gaugeName = data.getName();
110 protected void doWQKmsPointOut(XYChartGenerator generator, 122 RiverAccess access = new RiverAccess((D4EArtifact)bundle.getArtifact());
111 WQKms wqkms, 123 River river = access.getRiver();
112 ArtifactAndFacet bundle,
113 ThemeDocument theme,
114 boolean visible,
115 int axidx
116 ) {
117 logger.debug("doWQKmsPointOut");
118 String title = bundle.getFacetDescription();
119 XYSeries series = new StyledXYSeries(
120 title,
121 theme);
122 124
123 double[] kms = wqkms.getKms(); 125 if (river == null) {
124 126 logger.debug("no river found");
125 for (int i = 0 ; i< kms.length; i++) {
126 if (Math.abs(kms[i] - getKm()) <= KM_EPSILON) {
127 series.add(wqkms.getQ(i), wqkms.getW(i));
128 generator.addAxisSeries(series, axidx, visible);
129 if(visible && theme.parseShowPointLabel()) {
130 List<XYTextAnnotation> textAnnos = new ArrayList<XYTextAnnotation>();
131 XYTextAnnotation anno = new CollisionFreeXYTextAnnotation(
132 title,
133 wqkms.getQ(i),
134 // TODO add a percentage to the extend of W axis
135 wqkms.getW(i));
136 textAnnos.add(anno);
137 RiverAnnotation flysAnno = new RiverAnnotation(null, null, null, theme);
138 flysAnno.setTextAnnotations(textAnnos);
139 generator.addAnnotations(flysAnno);
140 }
141 return;
142 }
143 }
144
145 logger.warn("No WQ found for km " + getKm());
146 }
147
148 protected void doRiverAnnotationOut(XYChartGenerator generator,
149 RiverAnnotation annotations,
150 ArtifactAndFacet bundle,
151 ThemeDocument theme,
152 boolean visible
153 ) {
154 if (!(generator instanceof DischargeCurveGenerator)) {
155 logger.error("DischargeProcessor can only be used in " +
156 " in DischargeCurveGenerator-classes.");
157 return;
158 }
159 logger.debug("doRiverAnnotationOut");
160 DischargeCurveGenerator dGenerator =
161 (DischargeCurveGenerator) generator;
162
163 dGenerator.translateRiverAnnotation(annotations);
164 dGenerator.doAnnotations(
165 annotations,
166 bundle, theme, visible);
167 }
168
169
170 /**
171 * Put Sticky Axis Markers to Y-axis for each value.
172 * @param data [[-,y1],[-,y2],...] ('x'-coordinates ignored)
173 */
174 protected void doMarksOut(XYChartGenerator generator,
175 double[][] data,
176 ArtifactAndFacet bundle,
177 ThemeDocument theme,
178 boolean visible
179 ) {
180 logger.debug("doMarksOut");
181
182 if (!visible) {
183 return; 127 return;
184 } 128 }
185 129
186 // TODO subtract gauge null point if at gauge. 130 Gauge gauge = river.determineGaugeByName(gaugeName);
187 String title = bundle.getFacetDescription();
188 List<StickyAxisAnnotation> yMarks = new ArrayList<StickyAxisAnnotation>();
189 131
190 for (double yPos: data[1]) { 132 if (gauge == null) {
191 yMarks.add(new StickyAxisAnnotation( 133 logger.debug("no gauge found");
192 title, 134 return;
193 (float) yPos,
194 StickyAxisAnnotation.SimpleAxis.Y_AXIS));
195 } 135 }
196 136
197 generator.doAnnotations(new RiverAnnotation(title, yMarks), 137 generator.addAxisSeries(series, axisName, visible);
198 bundle, theme, visible);
199 } 138 }
200 } 139 }
201 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : 140 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org