1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
use crate::array::*;
use arrow_array::OffsetSizeTrait;
use geo::algorithm::bounding_rect::BoundingRect as GeoBoundingRect;
use geo::Rect;
/// Calculation of the bounding rectangle of a geometry.
pub trait BoundingRect {
/// Return the bounding rectangle of a geometry
///
/// # Examples
///
/// ```
/// use geo::BoundingRect;
/// use geo::line_string;
///
/// let line_string = line_string![
/// (x: 40.02f64, y: 116.34),
/// (x: 42.02f64, y: 116.34),
/// (x: 42.02f64, y: 118.34),
/// ];
///
/// let bounding_rect = line_string.bounding_rect().unwrap();
///
/// assert_eq!(40.02f64, bounding_rect.min().x);
/// assert_eq!(42.02f64, bounding_rect.max().x);
/// assert_eq!(116.34, bounding_rect.min().y);
/// assert_eq!(118.34, bounding_rect.max().y);
/// ```
fn bounding_rect(&self) -> RectArray;
}
impl BoundingRect for PointArray {
fn bounding_rect(&self) -> RectArray {
let output_geoms: Vec<Option<Rect>> = self
.iter_geo()
.map(|maybe_g| maybe_g.map(|geom| geom.bounding_rect()))
.collect();
output_geoms.into()
}
}
/// Implementation that iterates over geo objects
macro_rules! iter_geo_impl {
($type:ty) => {
impl<O: OffsetSizeTrait> BoundingRect for $type {
fn bounding_rect(&self) -> RectArray {
let output_geoms: Vec<Option<Rect>> = self
.iter_geo()
.map(|maybe_g| maybe_g.and_then(|geom| geom.bounding_rect()))
.collect();
output_geoms.into()
}
}
};
}
iter_geo_impl!(LineStringArray<O>);
iter_geo_impl!(PolygonArray<O>);
iter_geo_impl!(MultiPointArray<O>);
iter_geo_impl!(MultiLineStringArray<O>);
iter_geo_impl!(MultiPolygonArray<O>);
iter_geo_impl!(WKBArray<O>);
impl<O: OffsetSizeTrait> BoundingRect for GeometryArray<O> {
crate::geometry_array_delegate_impl! {
fn bounding_rect(&self) -> RectArray;
}
}