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 }

http://dive4elements.wald.intevation.org