geo/algorithm/
geodesic_distance.rs

1use crate::{Distance, Geodesic, Point};
2
3#[deprecated(
4    since = "0.29.0",
5    note = "Please use the `Geodesic.distance` method from the `Distance` trait instead"
6)]
7/// Determine the distance between two geometries on an ellipsoidal model of the earth.
8///
9/// This uses the geodesic measurement methods given by [Karney (2013)]. As opposed to older methods
10/// like Vincenty, this method is accurate to a few nanometers and always converges.
11///
12/// [Karney (2013)]:  https://arxiv.org/pdf/1109.4448.pdf
13pub trait GeodesicDistance<T, Rhs = Self> {
14    /// Determine the distance between two geometries on an ellipsoidal model of the earth.
15    ///
16    /// This uses the geodesic measurement methods given by [Karney (2013)]. As opposed to older methods
17    /// like Vincenty, this method is accurate to a few nanometers and always converges.
18    ///
19    /// # Units
20    ///
21    /// - return value: meters
22    ///
23    /// # Examples
24    /// ```rust
25    /// use geo::prelude::*;
26    /// use geo::point;
27    ///
28    /// // New York City
29    /// let p1 = point!(x: -74.006, y: 40.7128);
30    ///
31    /// // London
32    /// let p2 = point!(x: -0.1278, y: 51.5074);
33    ///
34    /// # #[allow(deprecated)]
35    /// let distance = p1.geodesic_distance(&p2);
36    ///
37    /// assert_eq!(
38    ///     5_585_234., // meters
39    ///     distance.round()
40    /// );
41    /// ```
42    /// [Karney (2013)]:  https://arxiv.org/pdf/1109.4448.pdf
43    fn geodesic_distance(&self, rhs: &Rhs) -> T;
44}
45
46#[allow(deprecated)]
47impl GeodesicDistance<f64> for Point {
48    fn geodesic_distance(&self, rhs: &Point) -> f64 {
49        Geodesic.distance(*self, *rhs)
50    }
51}