From 0b5a5f0cf56868117e63083d8362e565d6478686 Mon Sep 17 00:00:00 2001 From: Erik Brakkee Date: Sun, 20 Sep 2009 10:39:16 +0000 Subject: [PATCH] --- .../main/java/org/wamblee/gpx/GpxPlotter.java | 3 + .../java/org/wamblee/gpx/TrackStatistics.java | 86 +++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 gps/src/main/java/org/wamblee/gpx/TrackStatistics.java diff --git a/gps/src/main/java/org/wamblee/gpx/GpxPlotter.java b/gps/src/main/java/org/wamblee/gpx/GpxPlotter.java index a1485101..232c7013 100644 --- a/gps/src/main/java/org/wamblee/gpx/GpxPlotter.java +++ b/gps/src/main/java/org/wamblee/gpx/GpxPlotter.java @@ -55,6 +55,9 @@ public class GpxPlotter { File file = new File(aArgs[0]); GpxParser parser = new GpxParser(); Track track = parser.parse(new FileInputStream(file)); + + TrackStatistics profile = new TrackStatistics(track); + profile.writeHeightProfileJpg(new FileOutputStream("x.jpg"), 600, 300); List> elevationProfile = computeElevationProfile(track); printTrack(elevationProfile); 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(); + } +} -- 2.31.1