use geo::Area;
use geo_types::Geometry;
#[must_use]
pub fn passes_min_area(g: &Geometry<f64>, min_area: f64) -> bool {
if min_area <= 0.0 {
return true;
}
match g {
Geometry::Polygon(p) => p.unsigned_area() >= min_area,
Geometry::MultiPolygon(mp) => mp.unsigned_area() >= min_area,
_ => true,
}
}
#[cfg(test)]
mod tests {
use super::*;
use geo_types::{LineString, Point, Polygon};
fn square(side: f64) -> Polygon<f64> {
Polygon::new(
LineString::from(vec![[0.0, 0.0], [side, 0.0], [side, side], [0.0, side], [0.0, 0.0]]),
vec![],
)
}
#[test]
fn drops_small_polygon() {
let g: Geometry<f64> = Geometry::Polygon(square(1.0)); assert!(!passes_min_area(&g, 4.0));
}
#[test]
fn keeps_large_polygon() {
let g: Geometry<f64> = Geometry::Polygon(square(10.0)); assert!(passes_min_area(&g, 4.0));
}
#[test]
fn zero_threshold_keeps_everything() {
let g: Geometry<f64> = Geometry::Polygon(square(0.1));
assert!(passes_min_area(&g, 0.0));
}
#[test]
fn non_polygon_unaffected() {
let g: Geometry<f64> = Geometry::Point(Point::new(0.0, 0.0));
assert!(passes_min_area(&g, 100.0));
}
}