From bea8336110d8f764276f41f5f943eb3781bd7f50 Mon Sep 17 00:00:00 2001 From: Evgeny Grigorenko Date: Sat, 10 Aug 2024 23:17:46 +0400 Subject: [PATCH 01/12] feat: add DensifyGeodesic trait --- geo/src/algorithm/densify_geodesic.rs | 15 +++++++++++++++ geo/src/algorithm/mod.rs | 10 ++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 geo/src/algorithm/densify_geodesic.rs diff --git a/geo/src/algorithm/densify_geodesic.rs b/geo/src/algorithm/densify_geodesic.rs new file mode 100644 index 000000000..f41f1e9cf --- /dev/null +++ b/geo/src/algorithm/densify_geodesic.rs @@ -0,0 +1,15 @@ +use crate::CoordFloat; + +/// Returns a new geometry on a spheroid containing both existing and new interpolated coordinates with +/// a maximum distance of `max_distance` between them. +/// +/// Note: `max_distance` must be greater than 0. +/// +/// ## Units +/// +/// `max_distance`: meters +pub trait DensifyGeodesic { + type Output; + + fn densify_geodesic(&self, max_distance: F) -> Self::Output; +} \ No newline at end of file diff --git a/geo/src/algorithm/mod.rs b/geo/src/algorithm/mod.rs index 1697d0385..6669962a4 100644 --- a/geo/src/algorithm/mod.rs +++ b/geo/src/algorithm/mod.rs @@ -7,10 +7,8 @@ pub mod area; pub use area::Area; /// Calculate the bearing to another `Point`, in degrees. -#[deprecated( - since = "0.24.1", - note = "renamed to `haversine_bearing::HaversineBearing`" -)] +#[deprecated(since = "0.24.1", + note = "renamed to `haversine_bearing::HaversineBearing`")] pub mod bearing; #[allow(deprecated)] #[deprecated(since = "0.24.1", note = "renamed to `HaversineBearing`")] @@ -84,6 +82,10 @@ pub use densify::Densify; pub mod densify_haversine; pub use densify_haversine::DensifyHaversine; +/// Densify geometry components on a spheroid; +pub mod densify_geodesic; +pub use densify_geodesic::DensifyGeodesic; + /// Dimensionality of a geometry and its boundary, based on OGC-SFA. pub mod dimensions; pub use dimensions::HasDimensions; From 1015d5419a474b2247d30f8da47f52352611f3e8 Mon Sep 17 00:00:00 2001 From: Evgeny Grigorenko Date: Sat, 10 Aug 2024 23:18:09 +0400 Subject: [PATCH 02/12] chore: add `DensifyGeodesic` to crate docs --- geo/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/geo/src/lib.rs b/geo/src/lib.rs index f6ecfae66..379ebf7b2 100644 --- a/geo/src/lib.rs +++ b/geo/src/lib.rs @@ -158,6 +158,7 @@ //! - **[`ChaikinSmoothing`]**: Smoothen `LineString`, `Polygon`, `MultiLineString` and `MultiPolygon` using Chaikin's algorithm. //! - **[`Densify`]**: Densify linear geometry components by interpolating points //! - **[`DensifyHaversine`]**: Densify spherical geometry by interpolating points on a sphere +//! - **[`DensifyGeodesic`]**: Densify geometry by interpolating points on a spheroid //! - **[`GeodesicDestination`]**: Given a start point, bearing, and distance, calculate the destination point on a [geodesic](https://en.wikipedia.org/wiki/Geodesics_on_an_ellipsoid) //! - **[`GeodesicIntermediate`]**: Calculate intermediate points on a [geodesic](https://en.wikipedia.org/wiki/Geodesics_on_an_ellipsoid) //! - **[`HaversineDestination`]**: Given a start point, bearing, and distance, calculate the destination point on a sphere assuming travel on a great circle From b4660152a89d6c6feefabb5902d13d1356a9793a Mon Sep 17 00:00:00 2001 From: Evgeny Grigorenko Date: Sat, 10 Aug 2024 23:19:58 +0400 Subject: [PATCH 03/12] feat: add helper function for densification trait (T = f64) --- geo/src/algorithm/densify_geodesic.rs | 30 ++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/geo/src/algorithm/densify_geodesic.rs b/geo/src/algorithm/densify_geodesic.rs index f41f1e9cf..4d4e0dd1b 100644 --- a/geo/src/algorithm/densify_geodesic.rs +++ b/geo/src/algorithm/densify_geodesic.rs @@ -1,4 +1,8 @@ -use crate::CoordFloat; +use num_traits::ToPrimitive; + +use crate::{CoordFloat, Line, Point}; + +use crate::{GeodesicIntermediate, GeodesicLength}; /// Returns a new geometry on a spheroid containing both existing and new interpolated coordinates with /// a maximum distance of `max_distance` between them. @@ -12,4 +16,28 @@ pub trait DensifyGeodesic { type Output; fn densify_geodesic(&self, max_distance: F) -> Self::Output; +} + +// Helper for densification trait +fn densify_line( + line: Line, + container: &mut Vec>, + max_distance: f64, +) { + assert!(max_distance > 0.0); + + container.push(line.start_point()); + + let num_segments = (line.geodesic_length() / max_distance).ceil().to_u64().unwrap(); + // distance "unit" for this line segment + let frac = 1.0 / num_segments as f64; + + let start = line.start; + let end = line.end; + + for segment_idx in 1..num_segments { + let ratio = frac * segment_idx as f64; + let interpolated_point = Point::from(start).geodesic_intermediate(&Point::from(end), ratio); + container.push(interpolated_point); + } } \ No newline at end of file From 5f72d9572a85b3de54908374ec0f7dbc0850a789 Mon Sep 17 00:00:00 2001 From: Evgeny Grigorenko Date: Sat, 10 Aug 2024 23:21:54 +0400 Subject: [PATCH 04/12] feat: implement `DensifyGeodesic` for geo types (T = f64) --- geo/src/algorithm/densify_geodesic.rs | 104 +++++++++++++++++++++++++- 1 file changed, 103 insertions(+), 1 deletion(-) diff --git a/geo/src/algorithm/densify_geodesic.rs b/geo/src/algorithm/densify_geodesic.rs index 4d4e0dd1b..0c6b411dd 100644 --- a/geo/src/algorithm/densify_geodesic.rs +++ b/geo/src/algorithm/densify_geodesic.rs @@ -1,6 +1,6 @@ use num_traits::ToPrimitive; -use crate::{CoordFloat, Line, Point}; +use crate::{CoordFloat, CoordsIter, Line, LineString, MultiLineString, MultiPolygon, Point, Polygon, Rect, Triangle}; use crate::{GeodesicIntermediate, GeodesicLength}; @@ -40,4 +40,106 @@ fn densify_line( let interpolated_point = Point::from(start).geodesic_intermediate(&Point::from(end), ratio); container.push(interpolated_point); } +} + +impl DensifyGeodesic for MultiPolygon +where + Line: GeodesicLength, + LineString: GeodesicLength, +{ + type Output = MultiPolygon; + + fn densify_geodesic(&self, max_distance: f64) -> Self::Output { + MultiPolygon::new( + self.iter().map(|polygon| polygon.densify_geodesic(max_distance)).collect(), + ) + } +} + +impl DensifyGeodesic for Polygon +where + Line: GeodesicLength, + LineString: GeodesicLength, +{ + type Output = Polygon; + + fn densify_geodesic(&self, max_distance: f64) -> Self::Output { + let densified_exterior = self.exterior().densify_geodesic(max_distance); + let densified_interiors = self.interiors().iter().map(|ring| ring.densify_geodesic(max_distance)).collect(); + Polygon::new(densified_exterior, densified_interiors) + } +} + +impl DensifyGeodesic for MultiLineString +where + Line: GeodesicLength, + LineString: GeodesicLength, +{ + type Output = MultiLineString; + + fn densify_geodesic(&self, max_distance: f64) -> Self::Output { + MultiLineString::new( + self.iter().map(|linestring| linestring.densify_geodesic(max_distance)).collect(), + ) + } +} + +impl DensifyGeodesic for LineString +where + Line: GeodesicLength, + LineString: GeodesicLength, +{ + type Output = LineString; + + fn densify_geodesic(&self, max_distance: f64) -> Self::Output { + if self.coords_count() == 0 { + return LineString::new(vec![]); + } + + let mut new_line = vec![]; + self.lines().for_each(|line| densify_line(line, &mut new_line, max_distance)); + // we're done, push the last coordinate on to finish + new_line.push(self.points().last().unwrap()); + LineString::from(new_line) + } +} + +impl DensifyGeodesic for Line +where + Line: GeodesicLength, + LineString: GeodesicLength, +{ + type Output = LineString; + + fn densify_geodesic(&self, max_distance: f64) -> Self::Output { + let mut new_line = vec![]; + densify_line(*self, &mut new_line, max_distance); + // we're done, push the last coordinate on to finish + new_line.push(self.end_point()); + LineString::from(new_line) + } +} + +impl DensifyGeodesic for Triangle +where + Line: GeodesicLength, + LineString: GeodesicLength, +{ + type Output = Polygon; + + fn densify_geodesic(&self, max_distance: f64) -> Self::Output { + self.to_polygon().densify_geodesic(max_distance) + } +} + +impl DensifyGeodesic for Rect +where + Line: GeodesicLength, + LineString: GeodesicLength, +{ + type Output = Polygon; + + fn densify_geodesic(&self, max_distance: f64) -> Self::Output { + self.to_polygon().densify_geodesic(max_distance) + } } \ No newline at end of file From f164463804c1041de3d58c5625b16389923f3561 Mon Sep 17 00:00:00 2001 From: Evgeny Grigorenko Date: Sat, 10 Aug 2024 23:22:40 +0400 Subject: [PATCH 05/12] chore: add example for geodesic densification --- geo/src/algorithm/densify_geodesic.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/geo/src/algorithm/densify_geodesic.rs b/geo/src/algorithm/densify_geodesic.rs index 0c6b411dd..bfd127613 100644 --- a/geo/src/algorithm/densify_geodesic.rs +++ b/geo/src/algorithm/densify_geodesic.rs @@ -12,6 +12,22 @@ use crate::{GeodesicIntermediate, GeodesicLength}; /// ## Units /// /// `max_distance`: meters +/// +/// # Examples +/// ``` +/// use approx::assert_relative_eq; +/// +/// use geo::{coord, GeodesicLength, Line, LineString}; +/// use geo::DensifyGeodesic; +/// +/// let line = Line::new(coord! {x: 10.0, y: 20.0}, coord! { x: 125.0, y: 25.00 }); +/// // known output +/// let output: LineString = vec![[10.0, 20.0], [65.879360, 37.722253], [125.0, 25.00]].into(); +/// // densify +/// let dense = line.densify_geodesic(5703861.471800622); +/// +/// assert_relative_eq!(dense, output, epsilon = 1.0e-6); +///``` pub trait DensifyGeodesic { type Output; From 6a4ea2aae75552bb34b60443393ce7fc6af7d3e1 Mon Sep 17 00:00:00 2001 From: Evgeny Grigorenko Date: Sat, 10 Aug 2024 23:35:55 +0400 Subject: [PATCH 06/12] chore: add tests for `DensifyGeodesic` --- geo/src/algorithm/densify_geodesic.rs | 86 ++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 2 deletions(-) diff --git a/geo/src/algorithm/densify_geodesic.rs b/geo/src/algorithm/densify_geodesic.rs index bfd127613..b7d3c1e43 100644 --- a/geo/src/algorithm/densify_geodesic.rs +++ b/geo/src/algorithm/densify_geodesic.rs @@ -1,4 +1,4 @@ -use num_traits::ToPrimitive; +use num_traits::{FromPrimitive, ToPrimitive}; use crate::{CoordFloat, CoordsIter, Line, LineString, MultiLineString, MultiPolygon, Point, Polygon, Rect, Triangle}; @@ -158,4 +158,86 @@ where fn densify_geodesic(&self, max_distance: f64) -> Self::Output { self.to_polygon().densify_geodesic(max_distance) } -} \ No newline at end of file +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::coord; + + #[test] + fn test_polygon_densify() { + let exterior: LineString = vec![ + [4.925, 45.804], + [4.732, 45.941], + [4.935, 46.513], + [5.821, 46.103], + [5.627, 45.611], + [5.355, 45.883], + [4.925, 45.804], + ].into(); + + let polygon = Polygon::new(exterior, vec![]); + + let output_exterior: LineString = vec![ + [4.925, 45.804], + [4.732, 45.941], + [4.832972865149862, 46.22705224065524], + [4.935, 46.513], + [5.379653814979939, 46.30886184400083], + [5.821, 46.103], + [5.723572275808633, 45.85704648840237], + [5.627, 45.611], + [5.355, 45.883], + [4.925, 45.804], + ].into(); + + let dense = polygon.densify_geodesic(50000.0); + assert_relative_eq!(dense.exterior(), &output_exterior, epsilon = 1.0e-6); + } + + #[test] + fn test_linestring_densify() { + let linestring: LineString = vec![ + [-3.202, 55.9471], + [-3.2012, 55.9476], + [-3.1994, 55.9476], + [-3.1977, 55.9481], + [-3.196, 55.9483], + [-3.1947, 55.9487], + [-3.1944, 55.9488], + [-3.1944, 55.949], + ].into(); + + let output: LineString = vec![ + [-3.202, 55.9471], + [-3.2012, 55.9476], + [-3.2002999999999995, 55.94760000327935], + [-3.1994, 55.9476], + [-3.1985500054877773, 55.94785000292509], + [-3.1977, 55.9481], + [-3.196, 55.9483], + [-3.1947, 55.9487], + [-3.1944, 55.9488], + [-3.1944, 55.949], + ].into(); + + let dense = linestring.densify_geodesic(110.0); + assert_relative_eq!(dense, output, epsilon = 1.0e-6); + } + + #[test] + fn test_line_densify() { + let output: LineString = vec![[10.0, 20.0], [65.879360, 37.722253], [125.0, 25.00]].into(); + let line = Line::new(coord! {x: 10.0, y: 20.0}, coord! { x: 125.0, y: 25.00 }); + let dense = line.densify_geodesic(5703861.471800622); + assert_relative_eq!(dense, output, epsilon = 1.0e-6); + } + + #[test] + fn test_empty_linestring() { + let linestring: LineString = LineString::new(vec![]); + let dense = linestring.densify_geodesic(10.0); + assert_eq!(0, dense.coords_count()); + } +} From 30258c2d75bc4b4fd929aedd6ffcf33f264b973e Mon Sep 17 00:00:00 2001 From: Evgeny Grigorenko Date: Sat, 10 Aug 2024 23:44:30 +0400 Subject: [PATCH 07/12] chore: update CHANGES.md --- geo/CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/geo/CHANGES.md b/geo/CHANGES.md index e68ac20e9..36ff081fc 100644 --- a/geo/CHANGES.md +++ b/geo/CHANGES.md @@ -18,6 +18,8 @@ * * Add `StitchTriangles` trait which implements a new kind of combining algorithm for `Triangle`s * +* Add `DensifyGeodesic` trait which implements densification by interpolating points on a spheroid + * ## 0.28.0 From ed3e202e2b88cfb57612f2a1f00e706dd3ff67c3 Mon Sep 17 00:00:00 2001 From: Evgeny Grigorenko Date: Tue, 13 Aug 2024 21:54:35 +0400 Subject: [PATCH 08/12] chore: remove redundant import --- geo/src/algorithm/densify_geodesic.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/geo/src/algorithm/densify_geodesic.rs b/geo/src/algorithm/densify_geodesic.rs index b7d3c1e43..b2cb075be 100644 --- a/geo/src/algorithm/densify_geodesic.rs +++ b/geo/src/algorithm/densify_geodesic.rs @@ -1,6 +1,9 @@ -use num_traits::{FromPrimitive, ToPrimitive}; +use num_traits::ToPrimitive; -use crate::{CoordFloat, CoordsIter, Line, LineString, MultiLineString, MultiPolygon, Point, Polygon, Rect, Triangle}; +use crate::{ + CoordFloat, CoordsIter, Line, LineString, MultiLineString, MultiPolygon, Point, Polygon, Rect, + Triangle, +}; use crate::{GeodesicIntermediate, GeodesicLength}; From 1abc5c411fd50f71e2a35001bd7c759cda1fd31f Mon Sep 17 00:00:00 2001 From: Evgeny Grigorenko Date: Tue, 13 Aug 2024 21:56:02 +0400 Subject: [PATCH 09/12] chore: rename `max_distance` to `max_meters` --- geo/src/algorithm/densify_geodesic.rs | 72 ++++++++++++++++----------- 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/geo/src/algorithm/densify_geodesic.rs b/geo/src/algorithm/densify_geodesic.rs index b2cb075be..ffb012096 100644 --- a/geo/src/algorithm/densify_geodesic.rs +++ b/geo/src/algorithm/densify_geodesic.rs @@ -8,13 +8,13 @@ use crate::{ use crate::{GeodesicIntermediate, GeodesicLength}; /// Returns a new geometry on a spheroid containing both existing and new interpolated coordinates with -/// a maximum distance of `max_distance` between them. +/// a maximum distance of `max_meters` between them. /// -/// Note: `max_distance` must be greater than 0. +/// Note: `max_meters` must be greater than 0. /// /// ## Units /// -/// `max_distance`: meters +/// `max_meters`: meters /// /// # Examples /// ``` @@ -34,20 +34,19 @@ use crate::{GeodesicIntermediate, GeodesicLength}; pub trait DensifyGeodesic { type Output; - fn densify_geodesic(&self, max_distance: F) -> Self::Output; + fn densify_geodesic(&self, max_meters: F) -> Self::Output; } // Helper for densification trait -fn densify_line( - line: Line, - container: &mut Vec>, - max_distance: f64, -) { - assert!(max_distance > 0.0); +fn densify_line(line: Line, container: &mut Vec>, max_meters: f64) { + assert!(max_meters > 0.0); container.push(line.start_point()); - let num_segments = (line.geodesic_length() / max_distance).ceil().to_u64().unwrap(); + let num_segments = (line.geodesic_length() / max_meters) + .ceil() + .to_u64() + .unwrap(); // distance "unit" for this line segment let frac = 1.0 / num_segments as f64; @@ -68,9 +67,11 @@ where { type Output = MultiPolygon; - fn densify_geodesic(&self, max_distance: f64) -> Self::Output { + fn densify_geodesic(&self, max_meters: f64) -> Self::Output { MultiPolygon::new( - self.iter().map(|polygon| polygon.densify_geodesic(max_distance)).collect(), + self.iter() + .map(|polygon| polygon.densify_geodesic(max_meters)) + .collect(), ) } } @@ -82,9 +83,13 @@ where { type Output = Polygon; - fn densify_geodesic(&self, max_distance: f64) -> Self::Output { - let densified_exterior = self.exterior().densify_geodesic(max_distance); - let densified_interiors = self.interiors().iter().map(|ring| ring.densify_geodesic(max_distance)).collect(); + fn densify_geodesic(&self, max_meters: f64) -> Self::Output { + let densified_exterior = self.exterior().densify_geodesic(max_meters); + let densified_interiors = self + .interiors() + .iter() + .map(|ring| ring.densify_geodesic(max_meters)) + .collect(); Polygon::new(densified_exterior, densified_interiors) } } @@ -96,9 +101,11 @@ where { type Output = MultiLineString; - fn densify_geodesic(&self, max_distance: f64) -> Self::Output { + fn densify_geodesic(&self, max_meters: f64) -> Self::Output { MultiLineString::new( - self.iter().map(|linestring| linestring.densify_geodesic(max_distance)).collect(), + self.iter() + .map(|linestring| linestring.densify_geodesic(max_meters)) + .collect(), ) } } @@ -110,13 +117,14 @@ where { type Output = LineString; - fn densify_geodesic(&self, max_distance: f64) -> Self::Output { + fn densify_geodesic(&self, max_meters: f64) -> Self::Output { if self.coords_count() == 0 { return LineString::new(vec![]); } let mut new_line = vec![]; - self.lines().for_each(|line| densify_line(line, &mut new_line, max_distance)); + self.lines() + .for_each(|line| densify_line(line, &mut new_line, max_meters)); // we're done, push the last coordinate on to finish new_line.push(self.points().last().unwrap()); LineString::from(new_line) @@ -130,9 +138,9 @@ where { type Output = LineString; - fn densify_geodesic(&self, max_distance: f64) -> Self::Output { + fn densify_geodesic(&self, max_meters: f64) -> Self::Output { let mut new_line = vec![]; - densify_line(*self, &mut new_line, max_distance); + densify_line(*self, &mut new_line, max_meters); // we're done, push the last coordinate on to finish new_line.push(self.end_point()); LineString::from(new_line) @@ -146,8 +154,8 @@ where { type Output = Polygon; - fn densify_geodesic(&self, max_distance: f64) -> Self::Output { - self.to_polygon().densify_geodesic(max_distance) + fn densify_geodesic(&self, max_meters: f64) -> Self::Output { + self.to_polygon().densify_geodesic(max_meters) } } @@ -158,8 +166,8 @@ where { type Output = Polygon; - fn densify_geodesic(&self, max_distance: f64) -> Self::Output { - self.to_polygon().densify_geodesic(max_distance) + fn densify_geodesic(&self, max_meters: f64) -> Self::Output { + self.to_polygon().densify_geodesic(max_meters) } } @@ -178,7 +186,8 @@ mod tests { [5.627, 45.611], [5.355, 45.883], [4.925, 45.804], - ].into(); + ] + .into(); let polygon = Polygon::new(exterior, vec![]); @@ -193,7 +202,8 @@ mod tests { [5.627, 45.611], [5.355, 45.883], [4.925, 45.804], - ].into(); + ] + .into(); let dense = polygon.densify_geodesic(50000.0); assert_relative_eq!(dense.exterior(), &output_exterior, epsilon = 1.0e-6); @@ -210,7 +220,8 @@ mod tests { [-3.1947, 55.9487], [-3.1944, 55.9488], [-3.1944, 55.949], - ].into(); + ] + .into(); let output: LineString = vec![ [-3.202, 55.9471], @@ -223,7 +234,8 @@ mod tests { [-3.1947, 55.9487], [-3.1944, 55.9488], [-3.1944, 55.949], - ].into(); + ] + .into(); let dense = linestring.densify_geodesic(110.0); assert_relative_eq!(dense, output, epsilon = 1.0e-6); From 09e4bd0f0d2fcf95f94d0cf2a46a5504cbaf9733 Mon Sep 17 00:00:00 2001 From: Evgeny Grigorenko Date: Tue, 13 Aug 2024 21:59:21 +0400 Subject: [PATCH 10/12] chore: add test case for no-op behavior --- geo/src/algorithm/densify_geodesic.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/geo/src/algorithm/densify_geodesic.rs b/geo/src/algorithm/densify_geodesic.rs index ffb012096..8d093485f 100644 --- a/geo/src/algorithm/densify_geodesic.rs +++ b/geo/src/algorithm/densify_geodesic.rs @@ -255,4 +255,14 @@ mod tests { let dense = linestring.densify_geodesic(10.0); assert_eq!(0, dense.coords_count()); } + + #[test] + fn test_no_op_densify() { + let linestring: LineString = vec![[0.0, 0.0], [1.0, 0.0], [2.0, 0.0], [3.0, 0.0]].into(); + let output: LineString = vec![[0.0, 0.0], [1.0, 0.0], [2.0, 0.0], [3.0, 0.0]].into(); + // Use a very large max_meters to ensure no points are added. + let dense = linestring.densify_geodesic(1000000.0); + // Check that the densified linestring is identical to the original. + assert_relative_eq!(dense, output, epsilon = 1.0e-6); + } } From e232b6d62c5dad28a4fdeec32ba3d337495a3913 Mon Sep 17 00:00:00 2001 From: Evgeny Grigorenko Date: Tue, 13 Aug 2024 22:01:00 +0400 Subject: [PATCH 11/12] chore: update docs to align with conventions --- geo/src/algorithm/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geo/src/algorithm/mod.rs b/geo/src/algorithm/mod.rs index 6669962a4..d13121a8d 100644 --- a/geo/src/algorithm/mod.rs +++ b/geo/src/algorithm/mod.rs @@ -82,7 +82,7 @@ pub use densify::Densify; pub mod densify_haversine; pub use densify_haversine::DensifyHaversine; -/// Densify geometry components on a spheroid; +/// Densify geometry components on a geodesic. pub mod densify_geodesic; pub use densify_geodesic::DensifyGeodesic; From ba4c22e71e5179f3c60a842b229bbac12e6d5c12 Mon Sep 17 00:00:00 2001 From: Evgeny Grigorenko Date: Tue, 13 Aug 2024 22:41:53 +0400 Subject: [PATCH 12/12] fix: adjust formatting with cargo fmt --- geo/src/algorithm/mod.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/geo/src/algorithm/mod.rs b/geo/src/algorithm/mod.rs index d13121a8d..aea243fc2 100644 --- a/geo/src/algorithm/mod.rs +++ b/geo/src/algorithm/mod.rs @@ -7,8 +7,10 @@ pub mod area; pub use area::Area; /// Calculate the bearing to another `Point`, in degrees. -#[deprecated(since = "0.24.1", - note = "renamed to `haversine_bearing::HaversineBearing`")] +#[deprecated( + since = "0.24.1", + note = "renamed to `haversine_bearing::HaversineBearing`" +)] pub mod bearing; #[allow(deprecated)] #[deprecated(since = "0.24.1", note = "renamed to `HaversineBearing`")]