Mercurial > dive4elements > river
annotate artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthProcessor.java @ 8915:d9dbf0b74bc2
Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
author | gernotbelger |
---|---|
date | Wed, 28 Feb 2018 17:27:15 +0100 |
parents | 90b7f45ff4ae |
children | 5d5d0051723f |
rev | line source |
---|---|
8854 | 1 /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde |
8884 | 2 * Software engineering by |
3 * Björnsen Beratende Ingenieure GmbH | |
8854 | 4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt |
5 * | |
6 * This file is Free Software under the GNU AGPL (>=v3) | |
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the | |
8 * documentation coming with Dive4Elements River for details. | |
9 */ | |
10 | |
11 package org.dive4elements.river.artifacts.sinfo.flowdepth; | |
12 | |
8884 | 13 import java.util.HashSet; |
8886 | 14 import java.util.Map; |
8884 | 15 import java.util.Set; |
8854 | 16 |
8886 | 17 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; |
8890
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
18 import org.dive4elements.artifacts.Artifact; |
8886 | 19 import org.dive4elements.artifacts.CallContext; |
8890
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
20 import org.dive4elements.river.artifacts.D4EArtifact; |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
21 import org.dive4elements.river.artifacts.access.RiverAccess; |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
22 import org.dive4elements.river.artifacts.context.RiverContext; |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
23 import org.dive4elements.river.artifacts.math.MovingAverage; |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
24 import org.dive4elements.river.artifacts.model.ZoomScale; |
8886 | 25 import org.dive4elements.river.exports.DiagramGenerator; |
26 import org.dive4elements.river.exports.StyledSeriesBuilder; | |
27 import org.dive4elements.river.jfree.StyledXYSeries; | |
28 import org.dive4elements.river.themes.ThemeDocument; | |
29 | |
8884 | 30 public final class FlowDepthProcessor extends AbstractSInfoProcessor { |
8854 | 31 |
8884 | 32 /* Theme name, usually defined in 'FacetTypes', but that is soooo bad dependencies... */ |
33 // REMARK: these mustend with 'filtered' so extra handling happens in chart: point are always recalculated, because data | |
34 // changes depending on zoom state | |
8854 | 35 static String FACET_FLOW_DEPTH_FILTERED = "sinfo_flow_depth.filtered"; |
36 | |
8884 | 37 static String FACET_FLOW_DEPTH_TKH_FILTERED = "sinfo_flow_depth.tkh.filtered"; |
38 | |
39 private static final Set<String> HANDLED_FACET_TYPES = new HashSet<>(); | |
40 | |
41 static { | |
42 HANDLED_FACET_TYPES.add(FACET_FLOW_DEPTH_FILTERED); | |
43 HANDLED_FACET_TYPES.add(FACET_FLOW_DEPTH_TKH_FILTERED); | |
44 } | |
8854 | 45 |
46 private static final String I18N_AXIS_LABEL = "sinfo.chart.flow_depth.section.yaxis.label"; | |
47 | |
8884 | 48 public FlowDepthProcessor() { |
49 super(I18N_AXIS_LABEL, HANDLED_FACET_TYPES); | |
8854 | 50 } |
51 | |
8886 | 52 @Override |
53 protected final String generateSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible) { | |
54 | |
55 final CallContext context = generator.getCallContext(); | |
56 final Map<String, String> metaData = bundle.getFacet().getMetaData(); | |
57 | |
8890
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
58 final Artifact artifact = bundle.getArtifact(); |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
59 |
8886 | 60 final StyledXYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme); |
8890
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
61 series.putMetaData(metaData, artifact, context); |
8886 | 62 |
63 final String facetName = bundle.getFacetName(); | |
64 final FlowDepthCalculationResult data = (FlowDepthCalculationResult) bundle.getData(context); | |
65 if (data == null) { | |
66 // Check has been here before so we keep it for security reasons | |
67 // this should never happen though. | |
68 throw new IllegalStateException("Data is null for facet: " + facetName); | |
69 } | |
70 | |
8890
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
71 final Double radius = findRadius(context, artifact); |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
72 |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
73 final double[][] points = generatePoints(radius, data, facetName); |
8886 | 74 |
75 StyledSeriesBuilder.addPoints(series, points, true); | |
76 generator.addAxisSeries(series, getAxisName(), visible); | |
77 | |
78 return metaData.get("Y"); | |
79 } | |
80 | |
8890
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
81 private Double findRadius(final CallContext context, final Artifact artifact) { |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
82 final Double start = (Double) context.getContextValue("startkm"); |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
83 final Double end = (Double) context.getContextValue("endkm"); |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
84 |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
85 if (start == null || end == null) |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
86 return null; |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
87 |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
88 final RiverContext fc = (RiverContext) context.globalContext(); |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
89 final ZoomScale scales = (ZoomScale) fc.get("zoomscale"); |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
90 final RiverAccess access = new RiverAccess((D4EArtifact) artifact); |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
91 final String river = access.getRiverName(); |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
92 |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
93 return scales.getRadius(river, start, end); |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
94 } |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
95 |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
96 private double[][] generatePoints(final Double radius, final FlowDepthCalculationResult data, final String facetName) { |
8854 | 97 |
8884 | 98 if (FACET_FLOW_DEPTH_FILTERED.contentEquals(facetName)) |
8890
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
99 return movingAverage(radius, data.getFlowDepthPoints()); |
8854 | 100 |
8884 | 101 if (FACET_FLOW_DEPTH_TKH_FILTERED.contentEquals(facetName)) |
8890
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
102 return movingAverage(radius, data.getFlowDepthTkhPoints()); |
8854 | 103 |
8886 | 104 final String error = String.format("Unknown facet name: %s", facetName); |
105 throw new UnsupportedOperationException(error); | |
8854 | 106 } |
8890
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
107 |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
108 private double[][] movingAverage(final Double radius, final double[][] points) { |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
109 |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
110 if (radius == null) |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
111 return points; |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
112 |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
113 return MovingAverage.weighted(points, radius); |
90b7f45ff4ae
Calculating moving average of flow depth output
gernotbelger
parents:
8886
diff
changeset
|
114 } |
8854 | 115 } |