Mercurial > dive4elements > river
diff 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 |
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/BedQualityD50KmValueFinder.java Thu Feb 22 18:46:37 2018 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/BedQualityD50KmValueFinder.java Fri Feb 23 09:30:24 2018 +0100 @@ -161,15 +161,10 @@ private static final String[] SQL_BED_D50_SELECT_ALIAS = {"km", "mindate", "maxdate", "cnt", "mindepth", "maxdepth", "d50"}; /** - * Kms of the loaded river range + * Real linear interpolator for kms and d50 values */ - private TDoubleArrayList kms; + private PolynomialSplineFunction interpolator; - /** - * D50 for each km in kms - */ - private TDoubleArrayList values; - /***** METHODS *****/ @@ -178,6 +173,8 @@ * @return d50 (mm) of the km, or NaN */ public double findD50(double km) throws ArgumentOutsideDomainException { + return interpolator.value(km); + /* ohne interpolation: if ((kms == null) || (kms.size() == 0)) return Double.NaN; int i = kms.binarySearch(km); @@ -189,7 +186,7 @@ else if ((i >= 0) && (i <= kms.size() - 1) && Utils.epsilonEquals(km, kms.get(i), 0.0001)) return values.get(i); else - return Double.NaN; + return Double.NaN; */ } /** @@ -215,16 +212,24 @@ sqlQuery.setDate("todate", dateRange.getTo()); @SuppressWarnings("unchecked") final List<Object[]> rows = sqlQuery.list(); - kms = new TDoubleArrayList(); - values = new TDoubleArrayList(); + final double[] kms = new double[rows.size()]; + final double[] values = new double[rows.size()]; D50Measurement measurement; + int i = -1; for (Object[] row : rows) { measurement = new D50Measurement(row, SQL_BED_D50_SELECT_ALIAS); - kms.add(measurement.getKm()); - values.add(measurement.getD50()); - log.debug(String.format("loadValues km %.3f d50(mm) %.1f count %d", kms.get(kms.size()-1), values.get(values.size()-1), measurement.getCnt())); + i++; + kms[i] = measurement.getKm(); + values[i] = measurement.getD50(); + log.debug(String.format("loadValues km %.3f d50(mm) %.1f count %d", kms[i], values[i], measurement.getCnt())); } - return true; + try { + interpolator = new LinearInterpolator().interpolate(kms, values); + return true; + } catch (Exception e) { + interpolator = null; + return false; + } } }