geoarrow_array/geozero/export/array/
multipolygon.rs

1use geozero::{GeomProcessor, GeozeroGeometry};
2
3use crate::array::MultiPolygonArray;
4use crate::geozero::export::scalar::process_multi_polygon;
5use crate::{GeoArrowArray, GeoArrowArrayAccessor};
6
7impl GeozeroGeometry for MultiPolygonArray {
8    fn process_geom<P: GeomProcessor>(&self, processor: &mut P) -> geozero::error::Result<()>
9    where
10        Self: Sized,
11    {
12        let num_geometries = self.len();
13        processor.geometrycollection_begin(num_geometries, 0)?;
14
15        for geom_idx in 0..num_geometries {
16            process_multi_polygon(&self.value(geom_idx).unwrap(), geom_idx, processor)?;
17        }
18
19        processor.geometrycollection_end(num_geometries - 1)?;
20        Ok(())
21    }
22}
23
24#[cfg(test)]
25mod test {
26    use geoarrow_schema::{Dimension, MultiPolygonType};
27    use geozero::ToWkt;
28
29    use crate::builder::MultiPolygonBuilder;
30    use crate::test::multipolygon::{mp0, mp1};
31
32    #[test]
33    fn geozero_process_geom() -> geozero::error::Result<()> {
34        let typ = MultiPolygonType::new(Dimension::XY, Default::default());
35        let geo_arr = MultiPolygonBuilder::from_multi_polygons(&[&mp0(), &mp1()], typ).finish();
36        let wkt = ToWkt::to_wkt(&geo_arr)?;
37        let expected = "GEOMETRYCOLLECTION(MULTIPOLYGON(((-111 45,-111 41,-104 41,-104 45,-111 45)),((-111 45,-111 41,-104 41,-104 45,-111 45),(-110 44,-110 42,-105 42,-105 44,-110 44))),MULTIPOLYGON(((-111 45,-111 41,-104 41,-104 45,-111 45)),((-110 44,-110 42,-105 42,-105 44,-110 44))))";
38        assert_eq!(wkt, expected);
39        Ok(())
40    }
41}