/// <summary> /// Calculate a list of waypoints along the route from start to end. /// </summary> /// <param name="start">Starting position</param> /// <param name="end">End position</param> /// <param name="distanceStep">Distance between waypoints</param> /// <returns>A list of waypoints</returns> public static IList <GeographicPosition> CalculateRoute(GeographicPosition start, GeographicPosition end, double distanceStep) { if (start == null) { throw new ArgumentNullException(nameof(start)); } if (end == null) { throw new ArgumentNullException(nameof(end)); } IList <GeographicPosition> ret = new List <GeographicPosition>(); GeoidCalculations.geod_geodesicline line; GeoidCalculations.geod_inverseline(out line, _geod, start.Latitude, start.Longitude, end.Latitude, end.Longitude, 0); double distanceTotal = line.s13; for (double d = 0; d <= distanceTotal; d += distanceStep) { GeoidCalculations.geod_position(line, d, out double lat2, out double lon2, out _); ret.Add(new GeographicPosition(lat2, lon2, 0)); } return(ret); }
/// <summary> /// Calculate the coordinate one will be when traveling for the given distance in the given direction /// </summary> /// <param name="start">Starting point</param> /// <param name="direction">Initial direction</param> /// <param name="distance">Distance to travel</param> /// <returns>The new position</returns> /// <exception cref="ArgumentNullException">The start position is null</exception> public static GeographicPosition CalcCoords(GeographicPosition start, Angle direction, Length distance) { if (start == null) { throw new ArgumentNullException(nameof(start)); } GeoidCalculations.geod_direct(_geod, start.Latitude, start.Longitude, direction.Degrees, distance.Meters, out double resultLatitude, out double resultLongitude, out _); return(new GeographicPosition(resultLatitude, resultLongitude, start.EllipsoidalHeight)); }
static GreatCircle() { GeoidCalculations.geod_init(out _geod, Wgs84A, Wgs84F); }
/// <summary> /// Calculate the coordinate one will be when traveling for the given distance in the given direction /// </summary> /// <param name="startLatitude">Starting point latitude</param> /// <param name="startLongitude">Starting point longitude</param> /// <param name="direction">Initial direction</param> /// <param name="distance">Distance to travel</param> /// <param name="resultLatitude">End point latitude</param> /// <param name="resultLongitude">End point longitude</param> /// <remarks>Prefer using <see cref="CalcCoords(Iot.Device.Common.GeographicPosition,UnitsNet.Angle,UnitsNet.Length)"/> to avoid errors from exchanged parameters or wrong units</remarks> public static void CalcCoords(double startLatitude, double startLongitude, double direction, double distance, out double resultLatitude, out double resultLongitude) { GeoidCalculations.geod_direct(_geod, startLatitude, startLongitude, direction, distance, out resultLatitude, out resultLongitude, out _); }
private static void DistAndDir(double latitude1, double longitude1, double latitude2, double longitude2, out double distance, out double directionAtStart, out double directionAtEnd) { GeoidCalculations.geod_inverse(_geod, latitude1, longitude1, latitude2, longitude2, out distance, out directionAtStart, out directionAtEnd); }
/// <summary> /// Returns the distance and direction between two points on the globe /// </summary> /// <param name="latitude1">Input latitude 1, in degrees</param> /// <param name="longitude1">Input longitude 1, in degrees</param> /// <param name="latitude2">Input latitude 2, in degrees</param> /// <param name="longitude2">Input longitude 2, in degrees</param> /// <param name="distance">Distance between points, on the great circle, in meters.</param> /// <param name="direction">Angle in which the voyage should start. True angle in which the direction lies when standing at the start position.</param> /// <remarks>This path does not follow a constant direction (for large distances). /// Prefer using the method <see cref="DistAndDir(Iot.Device.Common.GeographicPosition,Iot.Device.Common.GeographicPosition,out UnitsNet.Length,out UnitsNet.Angle)"/> instead, /// to avoid errors from exchanged parameters or wrong units</remarks> public static void DistAndDir(double latitude1, double longitude1, double latitude2, double longitude2, out double distance, out double direction) { GeoidCalculations.geod_inverse(_geod, latitude1, longitude1, latitude2, longitude2, out distance, out direction, out _); }