use geo::algorithm::simplify::Simplify;
use geo::{LineString, Polygon};
pub fn simplify_linestring(line: &LineString<f64>, epsilon: f64) -> LineString<f64> {
let num_coords = line.coords().count();
if num_coords <= 2 {
return line.clone();
}
line.simplify(&epsilon)
}
pub fn simplify_polygon(polygon: &Polygon<f64>, epsilon: f64) -> Polygon<f64> {
polygon.simplify(&epsilon)
}
pub fn bounding_box_line(line: &LineString<f64>) -> crate::types::BoundingBox {
use geo::algorithm::bounding_rect::BoundingRect;
if let Some(rect) = line.bounding_rect() {
crate::types::BoundingBox::new(rect.min().x, rect.min().y, rect.max().x, rect.max().y)
} else {
crate::types::BoundingBox::default()
}
}
pub fn bounding_box_polygon(polygon: &Polygon<f64>) -> crate::types::BoundingBox {
use geo::algorithm::bounding_rect::BoundingRect;
if let Some(rect) = polygon.bounding_rect() {
crate::types::BoundingBox::new(rect.min().x, rect.min().y, rect.max().x, rect.max().y)
} else {
crate::types::BoundingBox::default()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_simplify_linestring() {
let line: LineString<f64> =
vec![(0.0, 0.0), (1.0, 0.1), (2.0, 0.0), (3.0, 0.1), (4.0, 0.0)].into();
let simplified = simplify_linestring(&line, 0.5);
let num_coords = simplified.coords().count();
let orig_coords = line.coords().count();
assert!(num_coords < orig_coords);
}
}