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