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));
        }
示例#3
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));
        }