annotate artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadFacet.java @ 6382:43ef4943e0c2

SedimentLoadFacet: Now that we have total load values with correct ranges in place, use them accordingly instead of guessing ranges based on point data.
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Fri, 21 Jun 2013 11:42:11 +0200
parents 588e99129883
children c74261e05a62
rev   line source
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
2 * Software engineering by Intevation GmbH
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
3 *
5994
af13ceeba52a Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5867
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the
5994
af13ceeba52a Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5867
diff changeset
6 * documentation coming with Dive4Elements River for details.
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
7 */
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
8
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
9 package org.dive4elements.river.artifacts.model.minfo;
5778
4a1bd43e7aa6 Removed obsolete imports.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5744
diff changeset
10
6382
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
11 import gnu.trove.TDoubleArrayList;
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
12
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
13 import org.dive4elements.artifactdatabase.state.Facet;
5778
4a1bd43e7aa6 Removed obsolete imports.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5744
diff changeset
14
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
15 import org.dive4elements.artifacts.Artifact;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
16 import org.dive4elements.artifacts.CallContext;
5778
4a1bd43e7aa6 Removed obsolete imports.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5744
diff changeset
17
5867
59ff03ff48f1 River artifacts: Renamed FLYSArtifact(Collection) to D4EArtifact(Collection).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5865
diff changeset
18 import org.dive4elements.river.artifacts.D4EArtifact;
5778
4a1bd43e7aa6 Removed obsolete imports.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5744
diff changeset
19
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
20 import org.dive4elements.river.artifacts.model.CalculationResult;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
21 import org.dive4elements.river.artifacts.model.DataFacet;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
22 import org.dive4elements.river.artifacts.model.FacetTypes;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
23
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
24 import org.dive4elements.river.artifacts.states.DefaultState.ComputeType;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
25
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
26 import org.dive4elements.river.model.MeasurementStation;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5778
diff changeset
27
5865
73da40528cf2 River artifacts: Renamed FLYSUtils to RiverUtils.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
28 import org.dive4elements.river.utils.RiverUtils;
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
29
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
30 import java.util.ArrayList;
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
31 import java.util.Collections;
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
32 import java.util.List;
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
33 import java.util.Map;
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
34 import java.util.TreeMap;
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
35
5778
4a1bd43e7aa6 Removed obsolete imports.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5744
diff changeset
36 import org.apache.log4j.Logger;
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
37
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
38
5647
ddb2a4e982b8 Doc and cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5645
diff changeset
39 /** Facet to access various sediment loads. */
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
40 public class SedimentLoadFacet
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
41 extends DataFacet
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
42 {
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
43 /** Very own logger. */
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
44 private static Logger logger = Logger.getLogger(SedimentLoadFacet.class);
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
45
5647
ddb2a4e982b8 Doc and cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5645
diff changeset
46 /** Used as tolerance value when fetching measurement stations. */
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
47 private static double EPSILON = 1e-5;
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
48
5647
ddb2a4e982b8 Doc and cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5645
diff changeset
49
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
50 public SedimentLoadFacet() {
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
51 }
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
52
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
53 public SedimentLoadFacet(int idx, String name, String description,
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
54 ComputeType type, String stateId, String hash) {
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
55 super(idx, name, description, type, hash, stateId);
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
56 }
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
57
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
58 public Object getData(Artifact artifact, CallContext context) {
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
59 logger.debug("Get data for sediment load at index: " + index);
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
60
5867
59ff03ff48f1 River artifacts: Renamed FLYSArtifact(Collection) to D4EArtifact(Collection).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5865
diff changeset
61 D4EArtifact flys = (D4EArtifact) artifact;
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
62
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
63 CalculationResult res = (CalculationResult) flys.compute(context, hash,
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
64 stateId, type, false);
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
65
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
66 Object[] data =
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
67 (SedimentLoadResult[]) res.getData(); // TODO CAST TO SPECIFIC CLASS
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
68
5865
73da40528cf2 River artifacts: Renamed FLYSUtils to RiverUtils.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
69 List<MeasurementStation> allStations = RiverUtils.getRiver(flys).getMeasurementStations();
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
70 SedimentLoadResult result = data != null && data.length > index ? (SedimentLoadResult)data[index] : null;
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
71 if (result == null) {
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
72 return null;
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
73 }
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
74
6382
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
75 // These complicated calculations were necessary because
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
76 // SedimentLoad/Fraction did not contain the ranges of the given
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
77 // values. Since this changed, the code is somewhat obsolete, but stable.
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
78 // For an example of easier calculation, see the "total" part below.
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
79
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
80 List<Double> sortedStarts = new ArrayList<Double>();
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
81 // Filter stations according to type.
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
82 List<MeasurementStation> stations = new ArrayList<MeasurementStation>();
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
83 for (MeasurementStation station: allStations) {
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
84 if (station.getRange() == null || station.getMeasurementType() == null) {
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
85 continue;
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
86 }
5647
ddb2a4e982b8 Doc and cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5645
diff changeset
87 if (FacetTypes.IS.SEDIMENT_LOAD_NO_FLOAT(this.getName())
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
88 && station.getMeasurementType().equals("Geschiebe")) {
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
89 stations.add(station);
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
90 sortedStarts.add(station.getStation());
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
91 }
5647
ddb2a4e982b8 Doc and cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5645
diff changeset
92 else if (!FacetTypes.IS.SEDIMENT_LOAD_NO_FLOAT(this.getName())
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
93 && station.getMeasurementType().equals("Schwebstoff")) {
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
94 stations.add(station);
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
95 sortedStarts.add(station.getStation());
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
96 }
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
97 }
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
98 Collections.sort(sortedStarts);
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
99
6382
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
100 // Handle sediment load differently, as it respects already
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
101 // the ranges that were added to SedimentLoad/Fraction.
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
102 if (getName().equals(FacetTypes.SEDIMENT_LOAD_TOTAL)) {
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
103 SedimentLoad load = result.getLoad();
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
104 TDoubleArrayList xPos = new TDoubleArrayList();
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
105 TDoubleArrayList yPos = new TDoubleArrayList();
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
106 double lastX = -1d;
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
107 for (double km: load.getKms()) {
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
108 SedimentLoadFraction fraction = load.getFraction(km);
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
109 if (fraction.getTotal() != 0) {
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
110 if (Math.abs(lastX-km) >= EPSILON) {
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
111 xPos.add(Double.NaN);
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
112 yPos.add(Double.NaN);
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
113 }
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
114 xPos.add(km);
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
115 yPos.add(fraction.getTotal());
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
116 xPos.add(fraction.getTotalRange().getEnd());
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
117 yPos.add(fraction.getTotal());
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
118 lastX = fraction.getTotalRange().getEnd();
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
119 }
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
120 }
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
121 return new double[][] {xPos.toNativeArray(), yPos.toNativeArray()};
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
122 }
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
123
43ef4943e0c2 SedimentLoadFacet: Now that we have total load values with correct ranges in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6343
diff changeset
124 // Access data according to type (except total - see above).
5648
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
125 double[][] sd = getLoadData(result);
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
126
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
127 // Sort by km.
6340
fbe2d4c2b2dd In prep for 1235: Renamed variables for improved readability.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5994
diff changeset
128 TreeMap<Double, Double> sortedKmLoad = new TreeMap<Double,Double>();
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
129
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
130 double[] km = sd[0];
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
131 double[] load = sd[1];
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
132
6342
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
133 // Build map of km->load, but directly exclude the ones which do
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
134 // not match against a measurements station ranges start.
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
135 for (int i = 0 ; i < km.length; i++) {
6342
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
136 for (MeasurementStation station: stations) {
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
137 if (Math.abs(station.getStation() - km[i]) <= EPSILON) {
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
138 sortedKmLoad.put(km[i], load[i]);
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
139 continue;
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
140 }
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
141 }
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
142 }
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
143
6341
3ec08ff0f497 Comment.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6340
diff changeset
144 // [0] -> x, [1] -> y
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
145 double[][] values = new double[2][];
6342
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
146 values[0] = new double[sortedKmLoad.size()*3];
b8cd8e2d0c35 SedimentLoadFacet, issue1235: Ignore values not measured at measurement stations
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6341
diff changeset
147 values[1] = new double[sortedKmLoad.size()*3];
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
148
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
149 // Find station via its station (km).
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
150 // TODO use a binarySearch instead of linear absdiff approach
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
151 int i = 0;
6340
fbe2d4c2b2dd In prep for 1235: Renamed variables for improved readability.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5994
diff changeset
152 for (Map.Entry<Double, Double> kmLoad: sortedKmLoad.entrySet()) {
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
153 boolean matchFound = false;
6343
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
154 for (int k = 0; k < stations.size(); k++) {
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
155 MeasurementStation station = stations.get(k);
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
156 if (Math.abs(station.getStation() - kmLoad.getKey()) < EPSILON) {
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
157 // Value has been taken at measurement station.
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
158 values[0][i*3] = station.getRange().getA().doubleValue() + EPSILON;
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
159 values[1][i*3] = kmLoad.getValue();
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
160 double endValue = 0d;
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
161 // Valid until next measurements stations begin of range,
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
162 // or end of current range if last value.
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
163 if (k+2 <= stations.size()) {
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
164 endValue = stations.get(k+1).getRange().getA().doubleValue();
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
165 }
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
166 else {
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
167 endValue = station.getRange().getB().doubleValue();
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
168 }
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
169 values[0][i*3+1] = endValue;
6340
fbe2d4c2b2dd In prep for 1235: Renamed variables for improved readability.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5994
diff changeset
170 values[1][i*3+1] = kmLoad.getValue();
6343
588e99129883 issue1235: Values are valid until next measurements station range start.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6342
diff changeset
171 values[0][i*3+2] = endValue;
6340
fbe2d4c2b2dd In prep for 1235: Renamed variables for improved readability.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5994
diff changeset
172 values[1][i*3+2] = kmLoad.getValue();
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
173 matchFound = true;
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
174 }
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
175 }
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
176 // Store points without match for later assessment.
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
177 if (!matchFound) {
6340
fbe2d4c2b2dd In prep for 1235: Renamed variables for improved readability.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5994
diff changeset
178 logger.warn("measurement without station ("+kmLoad.getKey()+")!");
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
179 }
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
180 i++;
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
181 }
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
182
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
183 for (int x = 0; x < values[0].length-1; x++) {
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
184 // Introduce gaps where no data in measurement station.
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
185 if (Math.abs(values[0][x+1] - values[0][x]) > 3*EPSILON
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
186 && values[1][x+1] != values[1][x]) {
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
187 values[0][x] = Double.NaN;
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
188 values[1][x] = Double.NaN;
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
189 }
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
190 }
5653
5231e6b849ce issue1077: Handle overlapping measurement station ranges, refactored Generator,
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5648
diff changeset
191
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
192 return values;
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
193 }
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
194
5645
696d710470f5 flys/issue1077: Show loads as step line, therefore transform data in
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 4372
diff changeset
195
5648
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
196 /** Get data according to type of facet. */
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
197 private double[][] getLoadData(SedimentLoadResult result) {
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
198 if (getName().equals(FacetTypes.SEDIMENT_LOAD_SAND))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
199 return result.getSandData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
200 else if (getName().equals(FacetTypes.SEDIMENT_LOAD_COARSE))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
201 return result.getCoarseData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
202 else if (getName().equals(FacetTypes.SEDIMENT_LOAD_FINEMIDDLE))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
203 return result.getFineMiddleData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
204 else if (getName().equals(FacetTypes.SEDIMENT_LOAD_SUSP_SAND))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
205 return result.getSuspSandData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
206 else if (getName().equals(FacetTypes.SEDIMENT_LOAD_SUSP_SAND_BED))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
207 return result.getSuspSandBedData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
208 else if (getName().equals(FacetTypes.SEDIMENT_LOAD_SUSP_SEDIMENT))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
209 return result.getSuspSedimentData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
210 else if (getName().equals(FacetTypes.SEDIMENT_LOAD_TOTAL_LOAD))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
211 return result.getTotalLoadData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
212 else if (getName().equals(FacetTypes.SEDIMENT_LOAD_TOTAL))
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
213 return result.getTotalData();
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
214 else {
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
215 logger.error("SedimentLoadFacet " + getName() + " cannot determine data type.");
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
216 return null;
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
217 }
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
218 }
4feda81c38bc SedimentLoadFacet: Minor refactor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 5647
diff changeset
219
4372
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
220 /** Copy deeply. */
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
221 @Override
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
222 public Facet deepCopy() {
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
223 SedimentLoadFacet copy = new SedimentLoadFacet();
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
224 copy.set(this);
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
225 copy.type = type;
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
226 copy.hash = hash;
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
227 copy.stateId = stateId;
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
228 return copy;
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
229 }
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
230 }
19772b414d46 New facet and result set for sediment load.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
231 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org