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