Mercurial > dive4elements > gnv-client
diff gnv-artifacts/src/main/java/de/intevation/gnv/chart/ChartFactory.java @ 217:3dcd2b0b456e
Added configurable TimeGap Support to the TimeSeries-Chart-Generation. issu45
gnv-artifacts/trunk@275 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Tim Englich <tim.englich@intevation.de> |
---|---|
date | Thu, 29 Oct 2009 15:58:47 +0000 |
parents | 34f233123a6f |
children | 21152e1bf325 |
line wrap: on
line diff
--- a/gnv-artifacts/src/main/java/de/intevation/gnv/chart/ChartFactory.java Wed Oct 28 16:26:03 2009 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/ChartFactory.java Thu Oct 29 15:58:47 2009 +0000 @@ -44,6 +44,7 @@ import de.intevation.gnv.chart.exception.TechnicalChartException; import de.intevation.gnv.geobackend.base.Result; +import de.intevation.gnv.timeseries.gap.TimeGap; import de.intevation.gnv.transition.describedata.KeyValueDescibeData; /** @@ -72,7 +73,8 @@ Collection<KeyValueDescibeData> parameters, Collection<KeyValueDescibeData> measurements, OutputStream outputStream, - Collection<Result> resultSet) + Collection<Result> resultSet, + Collection<TimeGap> timeGaps) throws IOException, TechnicalChartException { if (sDebug) @@ -90,7 +92,7 @@ if (sDebug) sLogger.debug(" vor createDataset()"); XYDataset lSet = this.createDataset(resultSet, lUpperLevel, - lLowerLevel, parameters, measurements); + lLowerLevel, parameters, measurements,timeGaps); if (sDebug) sLogger.debug(" nach createDataset()"); final Color[] color = { Color.black, Color.red, Color.green, Color.blue }; @@ -219,8 +221,7 @@ private TimeSeries createTimeSeries(String pTimeSeriesName, Collection<Result> resultSet, int lUpperCut, int lLowerCut, - int pStart, int pEnd, Date dStart, - Date dEnd) + int pStart, int pEnd, long maxGap) throws TechnicalChartException { if (sDebug) sLogger.debug("createTimeSeries()"); @@ -231,9 +232,9 @@ TimeSeries lTimeseries = new TimeSeries(pTimeSeriesName, org.jfree.data.time.Minute.class); try { - long maxGap = 0, lDateDiff = 0; + long lDateDiff = 0; double lValue = 0; - + int i = 0; Iterator<Result> resultIterator = resultSet.iterator(); while (resultIterator.hasNext()) { @@ -241,28 +242,6 @@ if (i >= pStart + 1 && i <= pEnd) { if (i == pStart + 1) { lRow0 = lRow;// - - // Handle Gaps > 0.5% timeserieslength, i.e do not draw - // here - // +TODO mache maxGap variabel über diagram options - maxGap = (dEnd.getTime() - dStart.getTime()) / 200; // 0,5 - // prozent - // der - // Länge - if (maxGap < 3600000) - maxGap = 3600010; - if (maxGap < (dEnd.getTime() - dStart.getTime()) - / (pEnd - pStart)) - maxGap = (dEnd.getTime() - dStart.getTime()) - / (pEnd - pStart) + 1000; - - if (sDebug) - sLogger.debug("MaxGap : " + maxGap / 1000 - + " Länge : " - + (dEnd.getTime() - dStart.getTime()) - / 1000 + "Intervall " - + (dEnd.getTime() - dStart.getTime()) - / (pEnd - pStart) / 1000); lDate = lRow0.getDate("XORDINATE"); lDate0 = lDate; lValue = lRow0.getDouble("YORDINATE"); @@ -316,7 +295,8 @@ private XYDataset createDataset(Collection<Result> resultSet, int lUpperCut, int lLowerCut, Collection<KeyValueDescibeData> parameters, - Collection<KeyValueDescibeData> measurements) + Collection<KeyValueDescibeData> measurements, + Collection<TimeGap> timeGaps) throws TechnicalChartException { TimeSeriesCollection lTimeSeriesCollection = new TimeSeriesCollection(); @@ -335,6 +315,7 @@ break3 = row.getString("GROUP3"); // 4 dStart = row.getDate("XORDINATE"); int i = 1; + Integer gapID = -1; while (resultIterator.hasNext()) { row = resultIterator.next(); if (!break1.equals(row.getString("GROUP1")) @@ -345,10 +326,14 @@ + " " + findValueTitle(measurements, break2) + "m"; - + long maxGap = this.calculateMaxGap(dStart, dEnd,mStart, + mEnd, gapID.intValue(), + timeGaps); + + lTimeSeriesCollection.addSeries(createTimeSeries( mTimeSeriesName, resultSet, lUpperCut, - lLowerCut, mStart, mEnd, dStart, dEnd)); + lLowerCut, mStart, mEnd,maxGap)); mStart = i; dStart = row.getDate("XORDINATE"); break1 = row.getString("GROUP1"); @@ -358,6 +343,7 @@ } mEnd = i; dEnd = row.getDate("XORDINATE"); + gapID = row.getInteger("GAPID"); i = i + 1; } @@ -365,13 +351,17 @@ + " " + findValueTitle(measurements, break2) + "m"; + long maxGap = this.calculateMaxGap(dStart, dEnd,mStart, + mEnd,gapID.intValue(), + timeGaps); lTimeSeriesCollection.addSeries(createTimeSeries( mTimeSeriesName, resultSet, lUpperCut, lLowerCut, - mStart, mEnd, dStart, dEnd)); + mStart, mEnd, maxGap)); }else{ + // Es sind keine Daten vorhanden: Es wird eine Zeitserie eingefügt. lTimeSeriesCollection.addSeries(createTimeSeries( "", resultSet, lUpperCut, lLowerCut, - mStart, mEnd, dStart, dEnd)); + mStart, mEnd, 999999)); } } catch (Exception e) { sLogger.error(e.getMessage(), e); @@ -380,6 +370,74 @@ return lTimeSeriesCollection; } + /** + * @param dStart + * @param dEnd + */ + private long calculateMaxGap(Date dStart, Date dEnd, int pStart , + int pEnd, int gapID, + Collection<TimeGap> timeGaps) { + + // umgesetzt nach issue 45 + // Handle Gaps > 0.5% timeserieslength, + // i.e do not draw here + long maxGap = (dEnd.getTime() - dStart.getTime()) / 200; + // 0,5 prozent der Länge + long timeInterval = this.getTimeGapValue(dStart, dEnd, pStart, + pEnd, gapID, timeGaps); + + if (maxGap < timeInterval){ + maxGap = timeInterval + 10; + } +// if (maxGap < (dEnd.getTime() - dStart.getTime()) +// / (pEnd - pStart)) +// maxGap = (dEnd.getTime() - dStart.getTime()) +// / (pEnd - pStart) + 1000; + + return maxGap; + } + + private long getTimeGapValue(Date dStart, Date dEnd, + int pStart ,int pEnd, + int gapID, Collection<TimeGap> timeGaps){ + long gap = 0; + + if (gapID < 0 || gapID >= 99){ + if (pEnd-pStart < 60) + gap = (3/(pEnd-pStart)) * (dEnd.getTime() - dStart.getTime()); + }else{ + + Iterator<TimeGap> it = timeGaps.iterator(); + + while (it.hasNext()){ + TimeGap tempTimeGap = it.next(); + if (tempTimeGap.getKey() == gapID){ + int gapValue = tempTimeGap.getValue(); + String unit = tempTimeGap.getUnit(); + + if (unit.equals(TimeGap.TIME_UNIT_MINUTE)){ + gap = gapValue * TimeGap.MINUTE_IN_MILLIS; + }else if (unit.equals(TimeGap.TIME_UNIT_HOUR)){ + gap = gapValue * TimeGap.HOUR_IN_MILLIS; + }else if (unit.equals(TimeGap.TIME_UNIT_DAY)){ + gap = gapValue * TimeGap.DAY_IN_MILLIS; + }else if (unit.equals(TimeGap.TIME_UNIT_WEEK)){ + gap = gapValue * TimeGap.WEEK_IN_MILLIS; + }else if (unit.equals(TimeGap.TIME_UNIT_MONTH)){ + // TODO wie soll das laufen + gap = gapValue * (TimeGap.DAY_IN_MILLIS *30); + }else if (unit.equals(TimeGap.TIME_UNIT_YEAR)){ + // TODO wie soll das laufen für schaltjahre + gap = gapValue * (TimeGap.DAY_IN_MILLIS *365); + } + break; + } + } + } + + return gap; + } + private void encodeChart(JFreeChart pChart, ChartStyle pStyle, OutputStream outputStream) throws IOException { if (sDebug)