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