geoarrow_array/geozero/export/scalar/
polygon.rs

1use geo_traits::{LineStringTrait, PolygonTrait};
2use geozero::{GeomProcessor, GeozeroGeometry};
3
4use super::process_coord;
5use crate::scalar::Polygon;
6
7fn process_ring<P: GeomProcessor>(
8    ring: impl LineStringTrait<T = f64>,
9    ring_idx: usize,
10    processor: &mut P,
11) -> geozero::error::Result<()> {
12    processor.linestring_begin(false, ring.num_coords(), ring_idx)?;
13
14    for (coord_idx, coord) in ring.coords().enumerate() {
15        process_coord(&coord, coord_idx, processor)?;
16    }
17
18    processor.linestring_end(false, ring_idx)?;
19    Ok(())
20}
21
22pub(crate) fn process_polygon<P: GeomProcessor>(
23    geom: &impl PolygonTrait<T = f64>,
24    tagged: bool,
25    geom_idx: usize,
26    processor: &mut P,
27) -> geozero::error::Result<()> {
28    processor.polygon_begin(tagged, geom.num_interiors() + 1, geom_idx)?;
29
30    if let Some(exterior) = geom.exterior() {
31        process_ring(exterior, 0, processor)?;
32    }
33
34    for (interior_ring_idx, interior_ring) in geom.interiors().enumerate() {
35        process_ring(interior_ring, interior_ring_idx + 1, processor)?;
36    }
37
38    processor.polygon_end(tagged, geom_idx)?;
39
40    Ok(())
41}
42
43impl GeozeroGeometry for Polygon<'_> {
44    fn process_geom<P: GeomProcessor>(&self, processor: &mut P) -> geozero::error::Result<()>
45    where
46        Self: Sized,
47    {
48        process_polygon(self, true, 0, processor)
49    }
50}