|
|
@@ -22,6 +22,7 @@ struct Point {
|
|
|
}
|
|
|
|
|
|
struct Track {
|
|
|
+ name: String,
|
|
|
points: Vec<Point>,
|
|
|
}
|
|
|
|
|
|
@@ -52,8 +53,34 @@ impl Track {
|
|
|
|
|
|
}
|
|
|
sum
|
|
|
+ }
|
|
|
|
|
|
+ fn speed(&self) -> f64 {
|
|
|
+ self.len() / (self.time().num_seconds() as f64 / 3600.0)
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ fn parse(&mut self) {
|
|
|
+ let mut sum_time = Duration::from_std(stdDuration::new(0,0)).unwrap();
|
|
|
+ let mut sum_dist = 0.0;
|
|
|
+ let mut prev_point = &self.points[0];
|
|
|
+ let mut prev_time = &self.points[0].time;
|
|
|
+
|
|
|
+ for pt in &self.points {
|
|
|
+ let timespan = prev_time.signed_duration_since(pt.time);
|
|
|
+ sum_time = sum_time.checked_sub(×pan).unwrap();
|
|
|
+ prev_time = &pt.time;
|
|
|
+ let d = dist(prev_point, pt);
|
|
|
+ sum_dist += d;
|
|
|
+ prev_point = pt;
|
|
|
+ }
|
|
|
+
|
|
|
+ println!("{:?}", sum_time);
|
|
|
+ println!("{:?}", sum_dist);
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
fn dist(p1: &Point, p2: &Point) -> f64 {
|
|
|
@@ -72,16 +99,15 @@ fn dist(p1: &Point, p2: &Point) -> f64 {
|
|
|
}
|
|
|
|
|
|
fn main() {
|
|
|
- // let mut tracks: Vec<Track>;
|
|
|
|
|
|
|
|
|
|
|
|
- let mut points: Vec<Point> = Vec::new();
|
|
|
|
|
|
let file = File::open("data/Day1-1.gpx").unwrap();
|
|
|
let file = BufReader::new(file);
|
|
|
|
|
|
|
|
|
+ let mut trk = Track {points: Vec::new(), name: "yolo".to_string()};
|
|
|
|
|
|
|
|
|
let parser = EventReader::new(file);
|
|
|
@@ -94,7 +120,6 @@ fn main() {
|
|
|
};
|
|
|
let mut current_data = "".to_string();
|
|
|
|
|
|
-
|
|
|
for e in parser {
|
|
|
match e {
|
|
|
Ok(XmlEvent::StartElement {
|
|
|
@@ -118,17 +143,20 @@ fn main() {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
Ok(XmlEvent::Characters(text)) => {
|
|
|
- // println!("{:?}", text);
|
|
|
+ // This event is the text between tags, such as <foo>text</foo>
|
|
|
current_data = text;
|
|
|
}
|
|
|
- Ok(XmlEvent::EndElement { name, .. }) => {
|
|
|
|
|
|
+ Ok(XmlEvent::EndElement { name, .. }) => {
|
|
|
|
|
|
+ // Elevation
|
|
|
if name.local_name == "ele" {
|
|
|
current_point.ele = current_data.parse().unwrap();
|
|
|
}
|
|
|
|
|
|
+ // Parse time
|
|
|
if name.local_name == "time" {
|
|
|
match Utc.datetime_from_str(current_data.as_str(), "%FT%H:%M:%S%.3fZ") {
|
|
|
Ok(time) => current_point.time = time,
|
|
|
@@ -136,13 +164,16 @@ fn main() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // The track name
|
|
|
+ if name.local_name == "name" {
|
|
|
+ trk.name = current_data.clone();
|
|
|
+ }
|
|
|
+
|
|
|
//Track point end event
|
|
|
if name.local_name == "trkpt" {
|
|
|
- //push a copy of the point
|
|
|
- points.push(current_point.clone());
|
|
|
+ // push a copy of the point to the track
|
|
|
+ trk.points.push(current_point.clone());
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
Err(e) => {
|
|
|
println!("Error: {}", e);
|
|
|
@@ -151,17 +182,12 @@ fn main() {
|
|
|
_ => {}
|
|
|
}
|
|
|
}
|
|
|
- //XML read in
|
|
|
- // println!("{:?}", points);
|
|
|
-
|
|
|
- let trk = Track {points: points};
|
|
|
- // trk.points = Vec::new();
|
|
|
- // trk.points = points;
|
|
|
- println!("{:?}", trk.len());
|
|
|
- println!("{:?}", trk.time());
|
|
|
|
|
|
|
|
|
-
|
|
|
+ println!("Track name: {:?}", trk.name);
|
|
|
+ println!("Distance: {:?} km", trk.len());
|
|
|
+ println!("Duration: {:?} h", trk.time().num_minutes()as f32/60.0);
|
|
|
+ println!("Speed: {:?} Km/h", trk.speed());
|
|
|
|
|
|
|
|
|
}
|