public GpsTrackStatistics CalculateStatistics () { GpsTrackStatistics stat = new GpsTrackStatistics (); foreach (TrackPoint w in waypoints) { stat.Bounds.ExtendToCover (w.Location); if (w.Elevation.HasValue) { stat.MinElevation = Math.Min (stat.MinElevation, w.Elevation.Value); stat.MaxElevation = Math.Min (stat.MaxElevation, w.Elevation.Value); } if (w.Time.HasValue) { stat.StartTime = stat.StartTime <= w.Time.Value ? stat.StartTime : w.Time.Value; stat.EndTime = stat.EndTime >= w.Time.Value ? stat.EndTime : w.Time.Value; } } foreach (Track r in routes) { GpsTrackStatistics childStat = GpsUtilities.CalculateTrackStatistics (r); stat.Union (childStat); } foreach (Track t in tracks) { GpsTrackStatistics childStat = GpsUtilities.CalculateTrackStatistics (t); stat.Union (childStat); } return stat; }
/// <summary> /// Calculates statistics for a <see cref="IGpsTrack"/> object. /// </summary> /// <param name="gpsTrack"><see cref="IGpsTrack"/> object to calculate statistics for.</param> /// <returns>GpsTrackStatistics object containing the statistics data.</returns> public static GpsTrackStatistics CalculateTrackStatistics(Track track) { GpsTrackStatistics stat = new GpsTrackStatistics (); TrackPoint lastPoint = null; TrackPoint lastPointWithElevation = null; foreach (TrackSegment segment in track.Segments) { foreach (TrackPoint point in segment.Points) { stat.Bounds.ExtendToCover(point.Location); if (point.Elevation.HasValue) { stat.MinElevation = Math.Min(stat.MinElevation, point.Elevation.Value); stat.MaxElevation = Math.Max(stat.MaxElevation, point.Elevation.Value); } if (point.Time.HasValue) { if (false == stat.StartTime.HasValue || point.Time < stat.StartTime) stat.StartTime = point.Time.Value; if (false == stat.EndTime.HasValue || point.Time > stat.EndTime) stat.EndTime = point.Time.Value; } if (lastPoint != null) { double horizontalDistance = GpsUtilities.CalculateHorizontalDistance(lastPoint, point); stat.HorizontalDistance += horizontalDistance; } if (lastPointWithElevation != null) { // calculate ascent/descent if (point.Elevation.HasValue) { double elevationDifference = point.Elevation.Value - lastPointWithElevation.Elevation.Value; if (elevationDifference < 0) stat.TotalDescent -= elevationDifference; else stat.TotalAscent += elevationDifference; } } lastPoint = point; if (point.Elevation.HasValue) lastPointWithElevation = point; } } return stat; }
public void Union(GpsTrackStatistics tsStat) { if (tsStat == null) { throw new ArgumentNullException("tsStat"); } MinElevation = Math.Min(this.MinElevation, tsStat.MinElevation); MaxElevation = Math.Max(this.MaxElevation, tsStat.MaxElevation); Bounds = Bounds.Union(tsStat.Bounds); TotalAscent += tsStat.TotalAscent; TotalDescent += tsStat.TotalDescent; if (startTime.HasValue && tsStat.startTime.HasValue) { StartTime = StartTime <= tsStat.StartTime ? StartTime : tsStat.StartTime; } else if (startTime.HasValue) { StartTime = startTime; } else if (tsStat.startTime.HasValue) { StartTime = tsStat.StartTime; } if (endTime.HasValue && tsStat.endTime.HasValue) { EndTime = EndTime >= tsStat.EndTime ? EndTime : tsStat.EndTime; } else if (endTime.HasValue) { EndTime = endTime; } else if (tsStat.endTime.HasValue) { EndTime = tsStat.EndTime; } HorizontalDistance = HorizontalDistance + tsStat.HorizontalDistance; SlopeDistance = SlopeDistance + tsStat.SlopeDistance; }
public void Union(GpsTrackStatistics tsStat) { if (tsStat == null) throw new ArgumentNullException ("tsStat"); MinElevation = Math.Min (this.MinElevation, tsStat.MinElevation); MaxElevation = Math.Max (this.MaxElevation, tsStat.MaxElevation); Bounds = Bounds.Union (tsStat.Bounds); TotalAscent += tsStat.TotalAscent; TotalDescent += tsStat.TotalDescent; if (startTime.HasValue && tsStat.startTime.HasValue) StartTime = StartTime <= tsStat.StartTime ? StartTime : tsStat.StartTime; else if (startTime.HasValue) StartTime = startTime; else if (tsStat.startTime.HasValue) StartTime = tsStat.StartTime; if (endTime.HasValue && tsStat.endTime.HasValue) EndTime = EndTime >= tsStat.EndTime ? EndTime : tsStat.EndTime; else if (endTime.HasValue) EndTime = endTime; else if (tsStat.endTime.HasValue) EndTime = tsStat.EndTime; HorizontalDistance = HorizontalDistance + tsStat.HorizontalDistance; SlopeDistance = SlopeDistance + tsStat.SlopeDistance; }