comparison flys-artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentDensity.java @ 5831:bd047b71ab37

Repaired internal references
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Apr 2013 12:06:39 +0200
parents flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentDensity.java@84e02b3f7a4f
children
comparison
equal deleted inserted replaced
5830:160f53ee0870 5831:bd047b71ab37
1 package org.dive4elements.river.artifacts.model.minfo;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.Set;
9
10 import org.apache.log4j.Logger;
11
12
13 public class SedimentDensity
14 {
15 private static final Logger logger = Logger
16 .getLogger(SedimentDensity.class);
17
18 private Map<Integer, List<SedimentDensityValue>> densities;
19 private List<Integer> years;
20
21 public SedimentDensity() {
22 this.densities = new HashMap<Integer, List<SedimentDensityValue>>();
23 this.years = new ArrayList<Integer>();
24 }
25
26 public Map<Integer, List<SedimentDensityValue>> getDensities() {
27 return densities;
28 }
29
30 public void setDensities(Map<Integer, List<SedimentDensityValue>> densities) {
31 this.densities = densities;
32 }
33
34 public void addDensity(double km, double density, int year) {
35 logger.debug("adding " + year);
36 if (this.densities.containsKey(year)) {
37 List<SedimentDensityValue> list = this.densities.get(year);
38 list.add(new SedimentDensityValue(km, density, year));
39 }
40 else {
41 List<SedimentDensityValue> list =
42 new ArrayList<SedimentDensityValue>();
43 list.add(new SedimentDensityValue(km, density, year));
44 densities.put(year, list);
45 }
46 if (!this.years.contains(new Integer(year))) {
47 logger.debug("new year");
48 years.add(new Integer(year));
49 }
50 }
51
52 public List<Integer> getYears() {
53 return years;
54 }
55
56 public void setYears(List<Integer> years) {
57 this.years = years;
58 }
59
60 public double getDensity(double km, int year) {
61 Collections.sort(this.years);
62 if (this.years.size() == 1) {
63 return getDensityAtKm(densities.get(year), km);
64 }
65 else {
66 for (int i = 0; i < years.size() -1; i++) {
67 int y1 = years.get(i);
68 int y2 = years.get(i + 1);
69 int mid = Math.round((y1 + y2) / 2);
70 if (year < mid) {
71 return getDensityAtKm(densities.get(y1), km);
72 }
73 else if (i == years.size() -1) {
74 continue;
75 }
76 else {
77 return getDensityAtKm(densities.get(y2), km);
78 }
79 }
80 }
81 return 1.8d;
82 }
83
84 private double getDensityAtKm(
85 List<SedimentDensityValue> values,
86 double km
87 ) {
88 boolean found = true;
89 SedimentDensityValue prev = null;
90 SedimentDensityValue next = null;
91 for (SedimentDensityValue sdv: values) {
92 logger.debug("year: " + sdv.getYear());
93 if (sdv.getKm() == km) {
94 prev = sdv;
95 found = true;
96 break;
97 }
98 if (sdv.getKm() > km) {
99 next = sdv;
100 break;
101 }
102 prev = sdv;
103 }
104 if (found) {
105 return prev.getDensity();
106 }
107 else {
108 return spline(prev, next, km);
109 }
110 }
111
112 private double spline(
113 SedimentDensityValue prev,
114 SedimentDensityValue next,
115 double km
116 ) {
117 double lower = prev.getKm();
118 double upper = next.getKm();
119 double upperDensity = next.getDensity();
120 double lowerDensity = prev.getDensity();
121
122 double m =(upperDensity - lowerDensity)/(upper - lower) * km;
123 double b = lowerDensity -
124 ((upperDensity - lowerDensity)/(upper - lower) * lower);
125 return (m * km) + b;
126 }
127
128 public void cleanUp() {
129 Set<Integer> keys = densities.keySet();
130 for (Integer key : keys) {
131 List<SedimentDensityValue> list = densities.get(key);
132 if (list.size() == 0) {
133 return;
134 }
135 List<SedimentDensityValue> cleaned =
136 new ArrayList<SedimentDensityValue>();
137 double prevkm = list.get(0).getKm();
138 int counter = 0;
139 double sum = 0d;
140 for (SedimentDensityValue value : list) {
141 if (value.getKm() == prevkm) {
142 sum += value.getDensity();
143 counter++;
144 }
145 else {
146 cleaned.add(new SedimentDensityValue(
147 prevkm,
148 sum / counter,
149 value.getYear()));
150 sum = value.getDensity();
151 counter = 1;
152 }
153 prevkm = value.getKm();
154 }
155 this.densities.put(key, cleaned);
156 }
157 }
158 }

http://dive4elements.wald.intevation.org