use wbvector::feature::{FieldDef, FieldType, Layer};
use wbvector::geometry::{Coord, Geometry, GeometryType};
use wbvector::{gpx, Result};
use std::path::PathBuf;
fn data_dir() -> PathBuf {
let dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("data")
.join("gpx_io");
std::fs::create_dir_all(&dir).unwrap();
dir
}
fn main() -> Result<()> {
let mut layer = Layer::new("tracks")
.with_geom_type(GeometryType::LineString)
.with_epsg(4326);
layer.add_field(FieldDef::new("gpx_type", FieldType::Text));
layer.add_field(FieldDef::new("name", FieldType::Text));
layer.add_field(FieldDef::new("time", FieldType::DateTime));
layer.add_feature(
Some(Geometry::line_string(vec![
Coord::xy(-79.40, 43.70),
Coord::xy(-79.39, 43.71),
Coord::xy(-79.38, 43.72),
])),
&[
("gpx_type", "trk".into()),
("name", "Morning Run".into()),
("time", "2026-03-12T07:30:00Z".into()),
],
)?;
let dir = data_dir();
let path = dir.join("tracks.gpx");
gpx::write(&layer, &path)?;
let back = gpx::read(&path)?;
println!("Wrote {} feature(s) to {}", layer.len(), path.display());
println!("Read back {} feature(s), {} field(s)", back.len(), back.schema.len());
Ok(())
}