geoarrow_array/geozero/export/scalar/
geometry.rs

1use geo_traits::{GeometryTrait, GeometryType};
2use geozero::{GeomProcessor, GeozeroGeometry};
3
4use super::{
5    process_geometry_collection, process_line_string, process_multi_line_string,
6    process_multi_point, process_multi_polygon, process_point, process_polygon, process_rect,
7};
8use crate::builder::geo_trait_wrappers::{LineWrapper, TriangleWrapper};
9use crate::scalar::Geometry;
10
11pub(crate) fn process_geometry<P: GeomProcessor>(
12    geom: &impl GeometryTrait<T = f64>,
13    geom_idx: usize,
14    processor: &mut P,
15) -> geozero::error::Result<()> {
16    use GeometryType::*;
17
18    match geom.as_type() {
19        Point(g) => process_point(g, geom_idx, processor)?,
20        LineString(g) => process_line_string(g, geom_idx, processor)?,
21        Polygon(g) => process_polygon(g, true, geom_idx, processor)?,
22        MultiPoint(g) => process_multi_point(g, geom_idx, processor)?,
23        MultiLineString(g) => process_multi_line_string(g, geom_idx, processor)?,
24        MultiPolygon(g) => process_multi_polygon(g, geom_idx, processor)?,
25        GeometryCollection(g) => process_geometry_collection(g, geom_idx, processor)?,
26        Rect(r) => process_rect(r, geom_idx, processor)?,
27        Triangle(tri) => process_polygon(&TriangleWrapper(tri), true, geom_idx, processor)?,
28        Line(l) => process_line_string(&LineWrapper(l), geom_idx, processor)?,
29    };
30
31    Ok(())
32}
33
34impl GeozeroGeometry for Geometry<'_> {
35    fn process_geom<P: GeomProcessor>(&self, processor: &mut P) -> geozero::error::Result<()>
36    where
37        Self: Sized,
38    {
39        process_geometry(&self, 0, processor)
40    }
41}