public void CalculateTourMetrics() { var distanceMeters = 0.0; var elevationUpMeters = 0.0; var elevationDownMeters = 0.0; var segmentCount = 0; var waypointCount = 0; foreach (var actSegment in this.Segments) { if (actSegment.Points.Count <= 1) { continue; } segmentCount++; var lastPoint = actSegment.Points[0]; foreach (var actPoint in actSegment.Points.GetRange(1, actSegment.Points.Count - 1)) { waypointCount++; distanceMeters += GeoCalculator.CalculateDistanceMeters( lastPoint, actPoint); if (lastPoint.ElevationSpecified && actPoint.ElevationSpecified) { var elevationLast = (double)lastPoint.Elevation !; var elevationAct = (double)actPoint.Elevation !; if (elevationLast.Equals3DigitPrecision(elevationAct)) { } if (elevationAct > elevationLast) { elevationUpMeters += (elevationAct - elevationLast); } else { elevationDownMeters += (elevationLast - elevationAct); } } lastPoint = actPoint; } } this.DistanceKm = distanceMeters / 1000.0; this.ElevationUpMeters = elevationUpMeters; this.ElevationDownMeters = elevationDownMeters; this.CountSegments = segmentCount; this.CountWaypointsWithinSegments = waypointCount; }
public void Check_CalculateDistance() { var point1 = new GpxWaypoint(); point1.Latitude = 49.638005001470447; point1.Longitude = 12.266169972717762; var point2 = new GpxWaypoint(); point2.Latitude = 49.6377810370177; point2.Longitude = 12.265615006908774; var distance = GeoCalculator.CalculateDistanceMeters(point1, point2); Assert.AreEqual(47.0, Math.Round(distance, 0)); }
private void RecreateChartValues(ILoadedGpxFileTourInfo?singleSelectedTour) { _lineSeries.Values = null; if (singleSelectedTour != null) { // Build a list of ObservablePoints before adding them to ChartValues<ObservablePoint> collection because of better performance // see https://lvcharts.net/App/examples/v1/Wpf/Performance%20Tips var actDistanceM = 0.0; var generatedChartValues = new List <ObservablePoint>(); foreach (var actSegment in singleSelectedTour.Segments) { GpxWaypoint?lastPoint = null; foreach (var actPoint in actSegment.Points) { if (lastPoint == null) { lastPoint = actPoint; generatedChartValues.Add(new ObservablePoint( actDistanceM / 1000.0, actPoint.Elevation ?? 0.0)); continue; } actDistanceM += GeoCalculator.CalculateDistanceMeters(lastPoint, actPoint); generatedChartValues.Add(new ObservablePoint( actDistanceM / 1000.0, actPoint.Elevation ?? 0.0)); lastPoint = actPoint; } } var chartValues = new ChartValues <ObservablePoint>(); chartValues.AddRange(generatedChartValues); _lineSeries.Values = chartValues; } this.RaisePropertyChanged(nameof(this.ElevationProfileVisibility)); }