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);
 }