geoarrow_array/geozero/export/scalar/
geometry.rs1use 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}