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