Mercurial > dive4elements > gnv-client
view gnv-artifacts/src/main/java/de/intevation/gnv/statistics/VectorStatistics.java @ 1085:ec512e7992c6
Improved data initialization and axis range calculation in vertical profiles (scalar and vector).
gnv-artifacts/trunk@1187 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Wed, 09 Jun 2010 17:11:54 +0000 |
parents | 5659b5c5e4b5 |
children | f953c9a559d8 |
line wrap: on
line source
package de.intevation.gnv.statistics; import de.intevation.gnv.geobackend.base.Result; import de.intevation.gnv.geobackend.base.ResultDescriptor; import de.intevation.gnv.state.describedata.KeyValueDescibeData; import de.intevation.gnv.statistics.exception.StatisticsException; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import org.apache.commons.math.stat.descriptive.DescriptiveStatistics; import org.apache.commons.math.stat.regression.SimpleRegression; import org.apache.log4j.Logger; /** * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> */ public abstract class VectorStatistics extends AbstractStatistics { private static Logger logger = Logger.getLogger(VectorStatistics.class); private ResultDescriptor rd; public VectorStatistics() { } public Collection<StatisticSet> calculateStatistics( Object result, Collection<KeyValueDescibeData> parameters, Collection<KeyValueDescibeData> measurements, Collection<KeyValueDescibeData> dates ) throws StatisticsException { if (!(result instanceof Collection)) return new ArrayList<StatisticSet>(); Collection<Result> results = (Collection<Result>) result; Collection<StatisticSet> stats = new ArrayList<StatisticSet>(); SimpleRegression lRegression = new SimpleRegression(); DescriptiveStatistics lStatistics = new DescriptiveStatistics(); Result previous = null; Result row = null; String seriesName = null; int valueIdx = -1; int seriesIdx = -1; Iterator<Result> iter = results.iterator(); while (iter.hasNext()) { row = iter.next(); previous = previous == null ? row : previous; if (rd == null || seriesIdx == -1) { rd = row.getResultDescriptor(); valueIdx = getValueIdx(rd); seriesIdx = rd.getColumnIndex("SERIES"); } if (seriesName != null && !row.getString(seriesIdx).equals(seriesName)) { stats.add(generateStatisticsValues( lStatistics, lRegression, seriesName)); lStatistics.clear(); lRegression.clear(); clear(); } Double yValue = getValue(row, valueIdx); if (yValue != null) { lStatistics.addValue(yValue); try { double x = calculateXOrdinateValue(previous, row); lRegression.addData(x, yValue); } catch (SQLException sqle) { logger.warn(sqle, sqle); } } seriesName = row.getString(seriesIdx); previous = row; } if (seriesName != null && row != null) { stats.add(generateStatisticsValues( lStatistics, lRegression, seriesName)); lStatistics.clear(); lRegression.clear(); } return stats; } protected Double getValue(Result row, int idx) { return row.getDouble(idx); } abstract protected void clear(); abstract protected int getValueIdx(ResultDescriptor rd); abstract protected double calculateXOrdinateValue(Result prev, Result now) throws SQLException; } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :