use geo_types::{Coord, Geometry};
use crate::algorithm::interior_point_area::interior_point_area;
use crate::algorithm::interior_point_line::interior_point_line;
use crate::algorithm::interior_point_point::interior_point_point;
use crate::geometry_adapter::{dimension, is_geometry_empty};
pub fn interior_point(geom: &Geometry<f64>) -> Option<Coord<f64>> {
if is_geometry_empty(geom) {
return None;
}
let interior_pt;
let dim = dimension_non_empty(geom);
if dim < 0 {
return None;
}
if dim == 0 {
interior_pt = interior_point_point(geom);
} else if dim == 1 {
interior_pt = interior_point_line(geom);
} else {
interior_pt = interior_point_area(geom);
}
interior_pt
}
pub(crate) fn dimension_non_empty(geom: &Geometry<f64>) -> i32 {
dimension_non_empty_filter(geom)
}
fn dimension_non_empty_filter(elem: &Geometry<f64>) -> i32 {
let mut dim = -1;
if let Geometry::GeometryCollection(gc) = elem {
for g in &gc.0 {
let elem_dim = dimension_non_empty_filter(g);
if elem_dim > dim {
dim = elem_dim;
}
}
return dim;
}
if !is_geometry_empty(elem) {
let elem_dim = dimension(elem);
if elem_dim > dim {
dim = elem_dim;
}
}
dim
}