now supporting all gpx files with both tracks and routes.
[utils] / gps / src / main / java / org / wamblee / gpx / GpxParser.java
index 043794146a12335665a232414417d4ce31300910..9f544a9a48c8fcb0bf98fd9bfdc2b32253c4eb78 100644 (file)
@@ -34,49 +34,68 @@ import org.wamblee.xml.XMLException;
  */
 public class GpxParser {
 
-       private static final String SCHEMA_RESOURCE = "gpx.xsd";
+    private static final String SCHEMA_RESOURCE = "gpx.xsd";
 
-       public GpxParser() {
-               // Empty.
-       }
+    public GpxParser() {
+        // Empty.
+    }
 
-       public Track parse(InputStream aIs) throws XMLException {
-               Document doc = DomUtils.convert(DomUtils.read(aIs));
-               return parse(doc);
-       }
+    public Track parse(InputStream aIs) throws XMLException {
+        Document doc = DomUtils.convert(DomUtils.read(aIs));
+        return parse(doc);
+    }
 
-       /**
-        * @param doc
-        */
-       public Track parse(Document doc) {
-               Track track = new Track();
-               List<Element> segments = doc.getRootElement().element("trk").elements(
-                               "trkseg");
+    /**
+     * @param doc
+     */
+    public Track parse(Document doc) {
+        Track result = new Track();
+        List<Element> tracks = doc.getRootElement().elements("trk");
+        if ( tracks != null ) { 
+            for (Element track: tracks) { 
+                List<Element> segments = track.elements("trkseg");
+                if ( segments != null ) { 
+                    for (Element segment: segments) { 
+                        parseTrackPoints(result, segment.elementIterator("trkpt"));
+                    }
+                }
+            }
+        }
 
-               for (Element segment : segments) {
-                       for (Iterator i = segment.elementIterator("trkpt"); i.hasNext();) {
-                               Element trkpt = (Element) i.next();
-                               track.addPoint(parseTrackPoint(trkpt));
-                       }
-               }
-               return track;
-       }
+        List<Element> routes = doc.getRootElement().elements("rte");
+        if ( routes != null ) { 
+            for (Element route: routes) { 
+                parseTrackPoints(result, route.elementIterator("rtept"));
+            }
+        }
+        
+        return result;
+    }
+    
+    
+    private void parseTrackPoints(Track aTrack, Iterator<Element> aPoints) { 
+        while (aPoints.hasNext()) { 
+            Element point = aPoints.next();
+            aTrack.addPoint(parseTrackPoint(point));
+        }
+    }
+    
 
-       /**
-        * @param trkpt
-        */
-       private TrackPoint parseTrackPoint(Element trkpt) {
-               // System.out.println(trkpt.asXML() + "|\n");
-               double latitude = new Double(trkpt.attributeValue("lat"));
-               double longitude = new Double(trkpt.attributeValue("lon"));
-               Element ele = trkpt.element("ele");
-               double elevation = 0.0;
-               if (ele != null) {
-                       elevation = new Double(ele.getText());
-               }
-               // System.out.println(" lat = " + lat + " lon = " + lon + " ele = " +
-               // ele);
-               return new TrackPoint(latitude, longitude, elevation);
-       }
+    /**
+     * @param trkpt
+     */
+    private TrackPoint parseTrackPoint(Element trkpt) {
+        // System.out.println(trkpt.asXML() + "|\n");
+        double latitude = new Double(trkpt.attributeValue("lat"));
+        double longitude = new Double(trkpt.attributeValue("lon"));
+        Element ele = trkpt.element("ele");
+        double elevation = 0.0;
+        if (ele != null) {
+            elevation = new Double(ele.getText());
+        }
+        // System.out.println(" lat = " + lat + " lon = " + lon + " ele = " +
+        // ele);
+        return new TrackPoint(latitude, longitude, elevation);
+    }
 
 }