Mercurial > dive4elements > river
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 : |