Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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));
        }
Beispiel #3
0
 static GreatCircle()
 {
     GeoidCalculations.geod_init(out _geod, Wgs84A, Wgs84F);
 }
Beispiel #4
0
 /// <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 _);
 }
Beispiel #5
0
 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);
 }
Beispiel #6
0
 /// <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 _);
 }