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 }

http://dive4elements.wald.intevation.org