Skip to main content

geoarrow_geojson/encoder/
wkt.rs

1use arrow_array::OffsetSizeTrait;
2use arrow_json::Encoder;
3use geoarrow_array::GeoArrowArrayAccessor;
4use geoarrow_array::array::{GenericWktArray, WktViewArray};
5
6use crate::encoder::geometry::encode_geometry;
7
8// An [Encoder] for [GenericWktArray].
9pub struct GenericWktEncoder<O: OffsetSizeTrait>(GenericWktArray<O>);
10
11impl<O: OffsetSizeTrait> GenericWktEncoder<O> {
12    pub fn new(array: GenericWktArray<O>) -> Self {
13        Self(array)
14    }
15}
16
17impl<O: OffsetSizeTrait> Encoder for GenericWktEncoder<O> {
18    fn encode(&mut self, idx: usize, out: &mut Vec<u8>) {
19        let geom = self.0.value(idx).unwrap();
20        encode_geometry(&geom, out);
21    }
22}
23
24// An [Encoder] for [WktViewArray].
25pub struct WktViewEncoder(WktViewArray);
26
27impl WktViewEncoder {
28    pub fn new(array: WktViewArray) -> Self {
29        Self(array)
30    }
31}
32
33impl Encoder for WktViewEncoder {
34    fn encode(&mut self, idx: usize, out: &mut Vec<u8>) {
35        let geom = self.0.value(idx).unwrap();
36        encode_geometry(&geom, out);
37    }
38}
39
40#[cfg(test)]
41mod test {
42    use geoarrow_array::cast::to_wkt;
43    use geoarrow_array::test::geometry::array;
44    use geoarrow_schema::CoordType;
45
46    use super::*;
47
48    #[test]
49    fn encode_geometry() {
50        let geom_array = array(CoordType::Separated, false);
51        let wkt_arr = to_wkt::<i32>(&geom_array).unwrap();
52        let mut encoder = GenericWktEncoder::new(wkt_arr);
53
54        let mut out = vec![];
55        encoder.encode(0, &mut out);
56        let s = String::from_utf8(out).unwrap();
57        let expected = r#"{"type":"Point","coordinates":[30,10]}"#;
58        assert_eq!(s, expected);
59    }
60}