/// <summary>
        /// Gets the elevation from this location to another location (positive = up).
        /// </summary>
        /// <param name="from">This starting point location.</param>
        /// <param name="to">The destination location.</param>
        /// <returns>The distance vector between the two locations.</returns>
        public static double ElevationTo(this ILocation from, ILocation to)
        {
            if (from == null)
            {
                throw new ArgumentNullException(nameof(from), "The from location is null");
            }

            if (to == null)
            {
                throw new ArgumentNullException(nameof(to), "The to location is null");
            }

            return(from.ElevationTo(to, from.HaversineDistanceTo(to)));
        }
        /// <summary>
        /// Gets the direction from this location to another location.
        /// </summary>
        /// <param name="from">This starting point location.</param>
        /// <param name="to">The destination location.</param>
        /// <returns>The distance vector between the two locations.</returns>
        public static IDirectionVector DirectionTo(this ILocation from, ILocation to)
        {
            if (from == null)
            {
                throw new ArgumentNullException(nameof(from), "The from location is null");
            }

            if (to == null)
            {
                throw new ArgumentNullException(nameof(to), "The to location is null");
            }

            // computing distance only once and passing it to elevation to optimize performance
            var distance = from.HaversineDistanceTo(to);

            return(new DirectionVector(
                       from,
                       to,
                       distance,
                       from.GreatCircleBearingTo(to),
                       from.ElevationTo(to, distance)));
        }