1 package org.wamblee.gpx;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.OutputStream;
7 import java.io.Serializable;
8 import java.util.ArrayList;
11 import org.jfree.chart.ChartFactory;
12 import org.jfree.chart.ChartUtilities;
13 import org.jfree.chart.JFreeChart;
14 import org.jfree.chart.plot.PlotOrientation;
15 import org.jfree.data.xy.XYSeries;
16 import org.jfree.data.xy.XYSeriesCollection;
17 import org.wamblee.general.Pair;
18 import org.wamblee.gps.geometry.Point;
19 import org.wamblee.gps.geometry.ReferenceCoordinateSystem;
20 import org.wamblee.gps.track.Track;
22 public class TrackStatistics implements Serializable {
26 public TrackStatistics(Track aTrack) {
30 public void writeHeightProfilePng(OutputStream aStream, int aWidth, int aHeight) throws IOException {
31 List<Pair<Double,Double>> data = computeElevationProfile();
32 XYSeriesCollection dataset = createDataset(data, "height");
33 JFreeChart chart = ChartFactory.createXYLineChart(
38 PlotOrientation.VERTICAL,
42 chart.setBackgroundPaint(Color.WHITE);
43 ChartUtilities.writeChartAsPNG(aStream, chart, aWidth, aHeight);
46 private static XYSeriesCollection createDataset(List<Pair<Double, Double>> aHeightProfile, String aName) {
47 XYSeries series = new XYSeries(aName, false);
48 for (Pair<Double,Double> point: aHeightProfile) {
49 series.add(point.getFirst()/1000.0, point.getSecond());
51 XYSeriesCollection dataset = new XYSeriesCollection(series);
55 public List<Pair<Double, Double>> computeElevationProfile() {
56 List<Pair<Double,Double>> results = new ArrayList<Pair<Double,Double>>();
57 double distance = 0.0;
58 for (int i = 0; i < _track.size(); i++) {
59 Point point = _track.getPoint(i);
60 results.add(new Pair<Double,Double>(distance, point.getCoordinates().getX3()));
61 if ( i+1 < _track.size()) {
62 Point nextPoint = _track.getPoint(i+1);
63 distance += ReferenceCoordinateSystem.distance(point, nextPoint);
69 public double getTotalClimb() {
71 List<Pair<Double,Double>> data = computeElevationProfile();
74 double lastHeight = data.get(0).getSecond();
75 for ( int i = 1; i < data.size(); i++) {
76 double height = data.get(i).getSecond();
77 if ( height > lastHeight) {
78 result += (height-lastHeight);
85 public double getDistance() {
86 List<Pair<Double,Double>> data = computeElevationProfile();
87 return data.get(data.size()-1).getFirst();