comparison artifacts/src/main/java/org/dive4elements/river/exports/process/AreaProcessor.java @ 7714:0ee6aa11649b

(issue1574) Add area handling for correction curves
author Andre Heinecke <aheinecke@intevation.de>
date Fri, 20 Dec 2013 12:40:08 +0100
parents dfe3f78fd3e5
children e4606eae8ea5
comparison
equal deleted inserted replaced
7713:dfe3f78fd3e5 7714:0ee6aa11649b
16 import org.dive4elements.artifacts.CallContext; 16 import org.dive4elements.artifacts.CallContext;
17 17
18 import org.dive4elements.river.artifacts.geom.Lines; 18 import org.dive4elements.river.artifacts.geom.Lines;
19 import org.dive4elements.river.artifacts.model.WKms; 19 import org.dive4elements.river.artifacts.model.WKms;
20 import org.dive4elements.river.artifacts.model.WQKms; 20 import org.dive4elements.river.artifacts.model.WQKms;
21 import org.dive4elements.river.artifacts.model.WQCKms;
21 import org.dive4elements.river.artifacts.model.AreaFacet; 22 import org.dive4elements.river.artifacts.model.AreaFacet;
22 import org.dive4elements.river.artifacts.model.FacetTypes; 23 import org.dive4elements.river.artifacts.model.FacetTypes;
23 import org.dive4elements.river.exports.DiagramGenerator; 24 import org.dive4elements.river.exports.DiagramGenerator;
24 import org.dive4elements.river.exports.StyledSeriesBuilder; 25 import org.dive4elements.river.exports.StyledSeriesBuilder;
25 import org.dive4elements.river.jfree.StyledAreaSeriesCollection; 26 import org.dive4elements.river.jfree.StyledAreaSeriesCollection;
29 import org.jfree.data.xy.XYSeries; 30 import org.jfree.data.xy.XYSeries;
30 31
31 public class AreaProcessor extends DefaultProcessor { 32 public class AreaProcessor extends DefaultProcessor {
32 33
33 private static final Logger logger = Logger.getLogger(AreaProcessor.class); 34 private static final Logger logger = Logger.getLogger(AreaProcessor.class);
35
36 protected XYSeries getSeries(String seriesName, Object data, String facetType,
37 ThemeDocument theme) {
38 if (data == null || facetType == null) {
39 return null;
40 }
41
42 XYSeries series = new StyledXYSeries(seriesName, false, theme);
43
44 if (facetType.equals(FacetTypes.DISCHARGE_LONGITUDINAL_C)) {
45 WQCKms wqckms = (WQCKms) data;
46 int size = wqckms.size();
47 for (int i = 0; i < size; i++) {
48 series.add(wqckms.getKm(i), wqckms.getC(i), false);
49 }
50 } else if (data instanceof WQKms) {
51 if (FacetTypes.IS.Q(facetType)) {
52 StyledSeriesBuilder.addPointsKmQ(series, (WQKms) data);
53 }
54 else {
55 StyledSeriesBuilder.addPoints(series, (WKms) data);
56 }
57 }
58 else if (data instanceof double[][]) {
59 StyledSeriesBuilder.addPoints(series, (double [][]) data, false);
60 }
61 else if (data instanceof WKms) {
62 StyledSeriesBuilder.addPoints(series, (WKms) data);
63 }
64 else if (data instanceof Lines.LineData) {
65 StyledSeriesBuilder.addPoints(series, ((Lines.LineData) data).points, false);
66 }
67 else {
68 logger.error("Do not know how to deal with (up) area info from: "
69 + data);
70 }
71 return series;
72 }
73
34 74
35 @Override 75 @Override
36 public void doOut( 76 public void doOut(
37 DiagramGenerator generator, 77 DiagramGenerator generator,
38 ArtifactAndFacet bundle, 78 ArtifactAndFacet bundle,
44 84
45 logger.debug("Area Processor processing: " + seriesName); 85 logger.debug("Area Processor processing: " + seriesName);
46 86
47 AreaFacet.Data data = (AreaFacet.Data) bundle.getData(context); 87 AreaFacet.Data data = (AreaFacet.Data) bundle.getData(context);
48 88
49 XYSeries up = null; 89 String lowerFacetName = data.getLowerFacetName();
50 XYSeries down = null; 90 String upperFacetName = data.getUpperFacetName();
51 91
52 if (data.getUpperData() != null) { 92 XYSeries up = getSeries(seriesName, data.getUpperData(), upperFacetName, theme);
53 up = new StyledXYSeries(seriesName, false, theme); 93 XYSeries down = getSeries(seriesName + " ", data.getLowerData(), lowerFacetName, theme);
54 if (data.getUpperData() instanceof WQKms) { 94
55 if (FacetTypes.IS.Q(data.getRootFacetName())) {
56 StyledSeriesBuilder.addPointsKmQ(up, (WQKms) data.getUpperData());
57 }
58 else {
59 StyledSeriesBuilder.addPoints(up, (WKms) data.getUpperData());
60 }
61 }
62 else if (data.getUpperData() instanceof double[][]) {
63 StyledSeriesBuilder.addPoints(up, (double [][]) data.getUpperData(), false);
64 }
65 else if (data.getUpperData() instanceof WKms) {
66 StyledSeriesBuilder.addPoints(up, (WKms) data.getUpperData());
67 }
68 else if (data.getUpperData() instanceof Lines.LineData) {
69 StyledSeriesBuilder.addPoints(up, ((Lines.LineData) data.getUpperData()).points, false);
70 }
71 else {
72 logger.error("Do not know how to deal with (up) area info from: "
73 + data.getUpperData());
74 }
75 }
76 95
77 // TODO Depending on style, the area (e.g. 20m^2) should be added as annotation. 96 // TODO Depending on style, the area (e.g. 20m^2) should be added as annotation.
78
79 if (data.getLowerData() != null) {
80 // TODO: Sort this out: when the two series have the same name,
81 // the renderer (or anything in between) will not work correctly.
82 down = new StyledXYSeries(seriesName + " ", false, theme);
83 if (data.getLowerData() instanceof WQKms) {
84 if (FacetTypes.IS.Q(data.getRootFacetName())) {
85 StyledSeriesBuilder.addPointsKmQ(down, (WQKms) data.getLowerData());
86 }
87 else {
88 StyledSeriesBuilder.addPoints(down, (WQKms) data.getLowerData());
89 }
90 }
91 else if (data.getLowerData() instanceof double[][]) {
92 StyledSeriesBuilder.addPoints(down, (double[][]) data.getLowerData(), false);
93 }
94 else if (data.getLowerData() instanceof WKms) {
95 StyledSeriesBuilder.addPoints(down, (WKms) data.getLowerData());
96 }
97 else if (data.getLowerData() instanceof Lines.LineData) {
98 StyledSeriesBuilder.addPoints(down, ((Lines.LineData) data.getLowerData()).points, false);
99 }
100 else {
101 logger.error("Do not know how to deal with (down) area info from: "
102 + data.getLowerData());
103 }
104 }
105 97
106 if (up == null && down != null) { 98 if (up == null && down != null) {
107 area.setMode(StyledAreaSeriesCollection.FILL_MODE.ABOVE); 99 area.setMode(StyledAreaSeriesCollection.FILL_MODE.ABOVE);
108 down.setKey(seriesName); 100 down.setKey(seriesName);
109 area.addSeries(down); 101 area.addSeries(down);
123 } 115 }
124 area.addSeries(up); 116 area.addSeries(up);
125 area.addSeries(down); 117 area.addSeries(down);
126 } 118 }
127 119
120 String facetNameForAxis = lowerFacetName == null
121 ? upperFacetName
122 : lowerFacetName;
128 /* Decide axis name based on facet name */ 123 /* Decide axis name based on facet name */
129 generator.addAreaSeries(area, 124 generator.addAreaSeries(area,
130 axisNameForFacet(data.getRootFacetName()), visible); 125 axisNameForFacet(facetNameForAxis), visible);
131 } 126 }
132 127
133 /** Look up the axis identifier for a given facet type. */ 128 /** Look up the axis identifier for a given facet type. */
134 private String axisNameForFacet(String facetName) { 129 private String axisNameForFacet(String facetName) {
135 if (FacetTypes.W_DIFFERENCES.equals(facetName)) { 130 if (FacetTypes.W_DIFFERENCES.equals(facetName)) {
136 return "diffW"; 131 return "diffW";
137 } 132 }
138 if (FacetTypes.IS.W(facetName)) { 133 if (FacetTypes.IS.W(facetName) ||
134 FacetTypes.DISCHARGE_LONGITUDINAL_C.equals(facetName)) {
139 return "W"; 135 return "W";
140 } 136 }
141 if (FacetTypes.IS.Q(facetName)) { 137 if (FacetTypes.IS.Q(facetName)) {
142 return "Q"; 138 return "Q";
143 } 139 }

http://dive4elements.wald.intevation.org