Johann Woelper 8 年之前
父節點
當前提交
32e93c8a1f
共有 1 個文件被更改,包括 44 次插入18 次删除
  1. 44 18
      src/main.rs

+ 44 - 18
src/main.rs

@@ -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(&timespan).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());
 
 
 }