geoserde 0.5.2

Adapter between geographic features and GIS files
Documentation
#![cfg(feature = "geozero")]

use flatgeobuf::{
    geozero::ToGeo, FallibleStreamingIterator, FeatureProperties, FgbReader, FgbWriter,
    FgbWriterOptions, GeometryType,
};
use geo_types::LineString;
use geoserde::FeatureSerializer;
use serde::Serialize;
use std::io::Cursor;

#[test]
fn serialize_to_fgb() -> anyhow::Result<()> {
    let mut buf = vec![];
    let layer = [
        Feature {
            shape: vec![(11., 21.)].into(),
            rank: 1,
        },
        Feature {
            shape: vec![(12., 22.)].into(),
            rank: 2,
        },
    ];
    let option = FgbWriterOptions {
        promote_to_multi: false,
        ..Default::default()
    };
    let mut fgb = FgbWriter::create_with_options("my_layer", GeometryType::Unknown, option)?;
    let mut sut = FeatureSerializer::new(&mut fgb);
    layer.serialize(&mut sut)?;
    assert_eq!(sut.len(), 2);

    fgb.write(&mut buf)?;
    let cursor = Cursor::new(buf);
    let mut fgb_iter = FgbReader::open(cursor)?.select_all()?;
    assert_eq!(Some(2), fgb_iter.features_count());
    assert_eq!(1, fgb_iter.header().columns().unwrap().len());

    let mut fgb_layer = Vec::new();
    while let Some(fgb_feat) = fgb_iter.next()? {
        fgb_layer.push(Feature {
            shape: fgb_feat.to_geo()?.try_into()?,
            rank: fgb_feat.property::<i32>("rank")?,
        });
    }
    assert!(fgb_layer.contains(&layer[0]));
    assert!(fgb_layer.contains(&layer[1]));
    Ok(())
}

#[derive(Serialize, PartialEq)]
struct Feature {
    shape: LineString,
    rank: i32,
}