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}