gpx
gpx is a library for reading and writing GPX (GPS Exchange Format) files. It uses the
primitives provided by geo-types to allow for storage
of GPS data.
Examples
Read a GPX file
extern crate gpx;
use std::io::BufReader;
use std::fs::File;
use gpx::read;
use gpx::{Gpx, Track, TrackSegment};
fn main() {
let file = File::open("tests/fixtures/wikipedia_example.gpx").unwrap();
let reader = BufReader::new(file);
let gpx: Gpx = read(reader).unwrap();
let track: &Track = &gpx.tracks[0];
assert_eq!(track.name, Some(String::from("Example GPX Document")));
let segment: &TrackSegment = &track.segments[0];
assert_eq!(segment.points[0].elevation, Some(4.46));
assert_eq!(segment.points[1].elevation, Some(4.94));
assert_eq!(segment.points[2].elevation, Some(6.87));
}
Generate a new GPX file
This example only generates tracks. You can add waypoints and routes as well by instantiating new Waypoint
s and Route
s.
use geo_types::{coord, Point};
use gpx::{Gpx, GpxVersion, Track, TrackSegment, Waypoint};
use std::{error::Error, fs::File, io::BufWriter, path::Path};
pub fn to_gpx<P: AsRef<Path>>(out_path: P) -> Result<(), Box<dyn Error>> {
let track_segment = TrackSegment {
points: vec![]
};
let track = Track {
name: Some("Track 1".to_string()),
comment: None,
description: None,
source: None,
links: vec![],
type_: None,
number: None,
segments: vec![track_segment],
};
let mut gpx = Gpx {
version: GpxVersion::Gpx11,
creator: None,
metadata: None,
waypoints: vec![],
tracks: vec![track],
routes: vec![],
};
let gpx_file = File::create(out_path)?;
let buf = BufWriter::new(gpx_file);
let geo_coord = coord! { x: -121.1, y: 38.82 };
let geo_point: Point = geo_coord.into();
gpx.tracks[0].segments[0].points.push(Waypoint::new(geo_point));
gpx::write(&gpx, buf)?;
Ok(())
}
Write to string
write
will write the GPX output to anything that implements std::io::Write
. To save the output to a string, write it to a u8
vector, and then convert the vector to a string.
let mut vec = Vec::new();
gpx::write(&gpx, &mut vec)?;
let string = String::from_utf8(vec)?;
Current Status
rust-gpx currently supports reading and writing both GPX 1.1 and 1.0.
GPX extensions are not yet supported.
Contributing
All contributions are welcome! Please open an issue if you find a bug / have any
questions, and pull requests are always appreciated.
License
rust-gpx is licensed under the MIT license.