X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=gps%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fgpx%2FTrackStatistics.java;fp=gps%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fgpx%2FTrackStatistics.java;h=6c4df6cd59ff6cc9670ac49d8309c74b09c763a4;hb=0b5a5f0cf56868117e63083d8362e565d6478686;hp=0000000000000000000000000000000000000000;hpb=873ec34510f84cb60f75736b4ab7512a1db82ed9;p=utils diff --git a/gps/src/main/java/org/wamblee/gpx/TrackStatistics.java b/gps/src/main/java/org/wamblee/gpx/TrackStatistics.java new file mode 100644 index 00000000..6c4df6cd --- /dev/null +++ b/gps/src/main/java/org/wamblee/gpx/TrackStatistics.java @@ -0,0 +1,86 @@ +package org.wamblee.gpx; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; + +import org.jfree.chart.ChartFactory; +import org.jfree.chart.ChartUtilities; +import org.jfree.chart.JFreeChart; +import org.jfree.chart.plot.PlotOrientation; +import org.jfree.data.xy.XYSeries; +import org.jfree.data.xy.XYSeriesCollection; +import org.wamblee.general.Pair; +import org.wamblee.gps.geometry.Point; +import org.wamblee.gps.geometry.ReferenceCoordinateSystem; +import org.wamblee.gps.track.Track; + +public class TrackStatistics { + + private Track _track; + + public TrackStatistics(Track aTrack) { + _track = aTrack; + } + + public void writeHeightProfileJpg(OutputStream aStream, int aWidth, int aHeight) throws IOException { + List> data = computeElevationProfile(); + XYSeriesCollection dataset = createDataset(data, "height"); + JFreeChart chart = ChartFactory.createXYLineChart( + "Height Profile", + "Distance(m)", + "Height(m)", + dataset, + PlotOrientation.VERTICAL, + true, + true, + false); + ChartUtilities.writeChartAsJPEG(aStream, chart, aWidth, aHeight); + } + + private static XYSeriesCollection createDataset(List> aHeightProfile, String aName) { + XYSeries series = new XYSeries(aName, false); + for (Pair point: aHeightProfile) { + series.add(point.getFirst()/1000.0, point.getSecond()); + } + XYSeriesCollection dataset = new XYSeriesCollection(series); + return dataset; + } + + public List> computeElevationProfile() { + List> results = new ArrayList>(); + double distance = 0.0; + for (int i = 0; i < _track.size(); i++) { + Point point = _track.getPoint(i); + results.add(new Pair(distance, point.getCoordinates().getX3())); + if ( i+1 < _track.size()) { + Point nextPoint = _track.getPoint(i+1); + distance += ReferenceCoordinateSystem.distance(point, nextPoint); + } + } + return results; + } + + public double getTotalClimb() { + + List> data = computeElevationProfile(); + double result = 0.0; + + double lastHeight = data.get(0).getSecond(); + for ( int i = 1; i < data.size(); i++) { + double height = data.get(i).getSecond(); + if ( height > lastHeight) { + result += (height-lastHeight); + } + lastHeight = height; + } + return result; + } + + public double getDistance() { + List> data = computeElevationProfile(); + return data.get(data.size()-1).getFirst(); + } +}