Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/BedQualityD50KmValueFinder.java @ 8911:37ff7f435912
SINFO Flowdepth: more error checks, d50 interpolation, avoid negative tkh
author | mschaefer |
---|---|
date | Fri, 23 Feb 2018 09:30:24 +0100 |
parents | 0a900d605d52 |
children | 86395ab8ebc3 |
comparison
equal
deleted
inserted
replaced
8910:d9c89651bd67 | 8911:37ff7f435912 |
---|---|
159 + " GROUP BY t.km" | 159 + " GROUP BY t.km" |
160 + " ORDER BY t.km"; | 160 + " ORDER BY t.km"; |
161 private static final String[] SQL_BED_D50_SELECT_ALIAS = {"km", "mindate", "maxdate", "cnt", "mindepth", "maxdepth", "d50"}; | 161 private static final String[] SQL_BED_D50_SELECT_ALIAS = {"km", "mindate", "maxdate", "cnt", "mindepth", "maxdepth", "d50"}; |
162 | 162 |
163 /** | 163 /** |
164 * Kms of the loaded river range | 164 * Real linear interpolator for kms and d50 values |
165 */ | 165 */ |
166 private TDoubleArrayList kms; | 166 private PolynomialSplineFunction interpolator; |
167 | 167 |
168 /** | |
169 * D50 for each km in kms | |
170 */ | |
171 private TDoubleArrayList values; | |
172 | |
173 | 168 |
174 /***** METHODS *****/ | 169 /***** METHODS *****/ |
175 | 170 |
176 /** | 171 /** |
177 * Returns the d50 value interpolated according to a km | 172 * Returns the d50 value interpolated according to a km |
178 * @return d50 (mm) of the km, or NaN | 173 * @return d50 (mm) of the km, or NaN |
179 */ | 174 */ |
180 public double findD50(double km) throws ArgumentOutsideDomainException { | 175 public double findD50(double km) throws ArgumentOutsideDomainException { |
176 return interpolator.value(km); | |
177 /* ohne interpolation: | |
181 if ((kms == null) || (kms.size() == 0)) | 178 if ((kms == null) || (kms.size() == 0)) |
182 return Double.NaN; | 179 return Double.NaN; |
183 int i = kms.binarySearch(km); | 180 int i = kms.binarySearch(km); |
184 if (i >= 0) | 181 if (i >= 0) |
185 return values.get(i); | 182 return values.get(i); |
187 if ((i - 1 >= 0) && Utils.epsilonEquals(km, kms.get(i - 1), 0.0001)) | 184 if ((i - 1 >= 0) && Utils.epsilonEquals(km, kms.get(i - 1), 0.0001)) |
188 return values.get(i - 1); | 185 return values.get(i - 1); |
189 else if ((i >= 0) && (i <= kms.size() - 1) && Utils.epsilonEquals(km, kms.get(i), 0.0001)) | 186 else if ((i >= 0) && (i <= kms.size() - 1) && Utils.epsilonEquals(km, kms.get(i), 0.0001)) |
190 return values.get(i); | 187 return values.get(i); |
191 else | 188 else |
192 return Double.NaN; | 189 return Double.NaN; */ |
193 } | 190 } |
194 | 191 |
195 /** | 192 /** |
196 * Loads the range of the river's kms with their associated values. | 193 * Loads the range of the river's kms with their associated values. |
197 * @return Whether the load has been successful | 194 * @return Whether the load has been successful |
213 sqlQuery.setDouble("tokm", kmRange.getMaximumDouble()); | 210 sqlQuery.setDouble("tokm", kmRange.getMaximumDouble()); |
214 sqlQuery.setDate("fromdate", dateRange.getFrom()); | 211 sqlQuery.setDate("fromdate", dateRange.getFrom()); |
215 sqlQuery.setDate("todate", dateRange.getTo()); | 212 sqlQuery.setDate("todate", dateRange.getTo()); |
216 @SuppressWarnings("unchecked") | 213 @SuppressWarnings("unchecked") |
217 final List<Object[]> rows = sqlQuery.list(); | 214 final List<Object[]> rows = sqlQuery.list(); |
218 kms = new TDoubleArrayList(); | 215 final double[] kms = new double[rows.size()]; |
219 values = new TDoubleArrayList(); | 216 final double[] values = new double[rows.size()]; |
220 D50Measurement measurement; | 217 D50Measurement measurement; |
218 int i = -1; | |
221 for (Object[] row : rows) { | 219 for (Object[] row : rows) { |
222 measurement = new D50Measurement(row, SQL_BED_D50_SELECT_ALIAS); | 220 measurement = new D50Measurement(row, SQL_BED_D50_SELECT_ALIAS); |
223 kms.add(measurement.getKm()); | 221 i++; |
224 values.add(measurement.getD50()); | 222 kms[i] = measurement.getKm(); |
225 log.debug(String.format("loadValues km %.3f d50(mm) %.1f count %d", kms.get(kms.size()-1), values.get(values.size()-1), measurement.getCnt())); | 223 values[i] = measurement.getD50(); |
226 } | 224 log.debug(String.format("loadValues km %.3f d50(mm) %.1f count %d", kms[i], values[i], measurement.getCnt())); |
227 return true; | 225 } |
226 try { | |
227 interpolator = new LinearInterpolator().interpolate(kms, values); | |
228 return true; | |
229 } catch (Exception e) { | |
230 interpolator = null; | |
231 return false; | |
232 } | |
228 } | 233 } |
229 | 234 |
230 } | 235 } |