예제 #1
0
        public static double GreaterCircleMeasure(MeasurementInputs startLocation, Location endLocation)
        {
            double sineAngle = Math.Sin(startLocation.LatitudeRadians) * Math.Sin(endLocation.LatitudeRadians);
            double cosAngle  = Math.Cos(startLocation.LatitudeRadians) * Math.Cos(endLocation.LatitudeRadians)
                               * Math.Cos(endLocation.LongitudeRadians - startLocation.LongitudeRadians);

            double distanceMetres = startLocation.EarthRadius * Math.Acos(sineAngle + cosAngle);

            return(distanceMetres);
        }
예제 #2
0
        public static ObservableCollection <DistanceResult> GenerateResults(MeasurementInputs measurementInputs, Unit selectedUnit)
        {
            var DistanceResults = new ObservableCollection <DistanceResult>();

            foreach (var route in measurementInputs.Routes)
            {
                DistanceResults.Add(new DistanceResult(measurementInputs.Start, route.End, selectedUnit));
            }

            return(DistanceResults);
        }
        [InlineData(12.34, 43.21, 43.21, 12.34, 4536.98)] // Current result from test run, saved to check tampering.
        public void Should_return_correct_distance(double startLat, double startLong, double endLat, double endLong, double expectedDistance)
        {
            // Arrange
            var startLocation = new MeasurementInputs(startLat, startLong);
            var endLocation   = new Location(endLat, endLong);

            // Act
            var actualDistance = GreaterCircleMeasure(startLocation, endLocation).ToUnit(Unit.Kilometres, 2);

            // Assert
            actualDistance.Should().Be(expectedDistance);
        }
예제 #4
0
        public static double HaversineMeasure(MeasurementInputs startLocation, Location endLocation)
        {
            double dlat = endLocation.LatitudeRadians - startLocation.LatitudeRadians;
            double dlon = endLocation.LongitudeRadians - startLocation.LongitudeRadians;

            double squaredSinLat = Math.Sin(dlat / 2) * Math.Sin(dlat / 2);
            double squaredSinLon = Math.Sin(dlon / 2) * Math.Sin(dlon / 2);

            double squaredCos = Math.Cos(startLocation.LatitudeRadians) * Math.Cos(endLocation.LatitudeRadians);

            double squared = squaredSinLat + squaredSinLon * squaredCos;

            double distanceMetres = startLocation.EarthRadius * 2 * Math.Asin(Math.Sqrt(squared));

            return(distanceMetres);
        }
예제 #5
0
        //public static double GetEarthRadius(double startLatInDegree)
        //    => RadiusLatitudeAdjustment.LatitudeAdjustment(startLatInDegree);

        //public static Location ConvertStartLocationToRadians(Location startLocationInDegree)
        //    => Helper.ConvertToRadians(startLocationInDegree);

        public static ObservableCollection <DistanceResult> MeasureDistance(ObservableCollection <Location> endpoints,
                                                                            Unit selectedUnit, MeasurementInputs measurementInputs)
        {
            ObservableCollection <DistanceResult> DistanceResults = new ObservableCollection <DistanceResult>();

            foreach (Location endLocation in endpoints)
            {
                DistanceResult result = new DistanceResult(endLocation);
                //{
                //    EndLocation = endLocation
                //};
                //var endLocationInRadian = Helper.ConvertToRadians(endLocation);

                //ModifiedPythagorasMeasure(result, selectedUnit, measurementInputs);

                // NOTE: result now contains endLocation, redundant parameter, or?
                //GreatCircleMeasure(result, endLocation, selectedUnit, measurementInputs);
                //HaversineForumlaMeasure(result, endLocation, selectedUnit, measurementInputs);

                result.ModifiedPythagorasResult = ModifiedPythagorasMeasure(measurementInputs, endLocation).ToUnit(selectedUnit);
                result.GreaterCircleResult      = GreaterCircleMeasure(measurementInputs, endLocation).ToUnit(selectedUnit);
                result.HaversineFormulaResult   = HaversineMeasure(measurementInputs, endLocation).ToUnit(selectedUnit);

                // NOTE: Is this missing or how does it work?
                //DistanceResults.Add(result);
            }
            return(DistanceResults);
        }