geoarrow-array 0.8.0

GeoArrow array definitions.
Documentation
use geo_traits::{LineStringTrait, PolygonTrait};
use geozero::{GeomProcessor, GeozeroGeometry};

use super::process_coord;
use crate::scalar::Polygon;

fn process_ring<P: GeomProcessor>(
    ring: impl LineStringTrait<T = f64>,
    ring_idx: usize,
    processor: &mut P,
) -> geozero::error::Result<()> {
    processor.linestring_begin(false, ring.num_coords(), ring_idx)?;

    for (coord_idx, coord) in ring.coords().enumerate() {
        process_coord(&coord, coord_idx, processor)?;
    }

    processor.linestring_end(false, ring_idx)?;
    Ok(())
}

pub(crate) fn process_polygon<P: GeomProcessor>(
    geom: &impl PolygonTrait<T = f64>,
    tagged: bool,
    geom_idx: usize,
    processor: &mut P,
) -> geozero::error::Result<()> {
    processor.polygon_begin(tagged, geom.num_interiors() + 1, geom_idx)?;

    if let Some(exterior) = geom.exterior() {
        process_ring(exterior, 0, processor)?;
    }

    for (interior_ring_idx, interior_ring) in geom.interiors().enumerate() {
        process_ring(interior_ring, interior_ring_idx + 1, processor)?;
    }

    processor.polygon_end(tagged, geom_idx)?;

    Ok(())
}

impl GeozeroGeometry for Polygon<'_> {
    fn process_geom<P: GeomProcessor>(&self, processor: &mut P) -> geozero::error::Result<()>
    where
        Self: Sized,
    {
        process_polygon(self, true, 0, processor)
    }
}