public static void CalculateNodeData(List <GpsTrackPoint> points, GpsTrackSummary nodeSummary) { string sourceName = "Calculated"; if (points.Count > 0) { // Calculate Altitude Data nodeSummary.AltitudeMaximum = Math.Round(points.Max(p => p.Altitude), 1); nodeSummary.AltitudeMinimum = Math.Round(points.Min(p => p.Altitude), 1); nodeSummary.AltitudeAverage = Math.Round(points.Average(p => p.Altitude), 1); nodeSummary.AltitudeChanged = nodeSummary.AltitudeMaximum - nodeSummary.AltitudeMinimum; // Calculate Bounds double left = points.Min(p => p.Longitude.Numeric); double right = points.Max(p => p.Longitude.Numeric); double bottom = points.Min(p => p.Latitude.Numeric); double top = points.Max(p => p.Latitude.Numeric); nodeSummary.TopLeft = new GpsPosition(top, left); nodeSummary.TopLeft.Source = sourceName; nodeSummary.BottomRight = new GpsPosition(bottom, right); nodeSummary.BottomRight.Source = sourceName; // Calculate Center nodeSummary.Width = nodeSummary.TopLeft.Latitude.Numeric - nodeSummary.BottomRight.Latitude.Numeric; nodeSummary.Height = nodeSummary.BottomRight.Longitude.Numeric - nodeSummary.TopLeft.Longitude.Numeric; // Calculate Center nodeSummary.Center = new GpsPosition(left + (nodeSummary.Width / 2), bottom + (nodeSummary.Height / 2)); nodeSummary.Center.Source = sourceName; // Calculate Dates nodeSummary.StartUtc = points.Min(p => p.Time); nodeSummary.EndUtc = points.Max(p => p.Time); // Calculate Distances for (int i = 1; i < points.Count; i++) { nodeSummary.DistanceTracked += points[i].Distance(points[i - 1]); } nodeSummary.DistanceTracked = Math.Round(nodeSummary.DistanceTracked, 1); nodeSummary.DistanceEndToEnd = Math.Round(points.First().Distance(points.Last()), 1); } }
public static void CalculateNodeData(List <GpsTrackSegment> segments, GpsTrackSummary nodeSummary) { GpsUtils.CalculateNodeData(segments.SelectMany(x => x.Points).ToList(), nodeSummary); }