1use geo::algorithm::simplify::Simplify;
13use geo::{LineString, Polygon};
14
15pub fn simplify_linestring(line: &LineString<f64>, epsilon: f64) -> LineString<f64> {
20 let num_coords = line.coords().count();
21 if num_coords <= 2 {
22 return line.clone();
23 }
24 line.simplify(&epsilon)
25}
26
27pub fn simplify_polygon(polygon: &Polygon<f64>, epsilon: f64) -> Polygon<f64> {
32 polygon.simplify(&epsilon)
33}
34
35pub fn bounding_box_line(line: &LineString<f64>) -> crate::types::BoundingBox {
37 use geo::algorithm::bounding_rect::BoundingRect;
38
39 if let Some(rect) = line.bounding_rect() {
40 crate::types::BoundingBox::new(rect.min().x, rect.min().y, rect.max().x, rect.max().y)
41 } else {
42 crate::types::BoundingBox::default()
43 }
44}
45
46pub fn bounding_box_polygon(polygon: &Polygon<f64>) -> crate::types::BoundingBox {
48 use geo::algorithm::bounding_rect::BoundingRect;
49
50 if let Some(rect) = polygon.bounding_rect() {
51 crate::types::BoundingBox::new(rect.min().x, rect.min().y, rect.max().x, rect.max().y)
52 } else {
53 crate::types::BoundingBox::default()
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60
61 #[test]
62 fn test_simplify_linestring() {
63 let line: LineString<f64> =
64 vec![(0.0, 0.0), (1.0, 0.1), (2.0, 0.0), (3.0, 0.1), (4.0, 0.0)].into();
65 let simplified = simplify_linestring(&line, 0.5);
66 let num_coords = simplified.coords().count();
67 let orig_coords = line.coords().count();
68 assert!(num_coords < orig_coords);
69 }
70
71}