(no commit message)
[utils] / trunk / gps / src / main / java / org / wamblee / gpx / GpxParser.java
index fe675ce670abd5092259baceba2ab79b2f26a86c..9f544a9a48c8fcb0bf98fd9bfdc2b32253c4eb78 100644 (file)
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- */ 
+ */
 
 package org.wamblee.gpx;
 
 import java.io.InputStream;
 import java.util.Iterator;
+import java.util.List;
 
 import org.dom4j.Document;
 import org.dom4j.Element;
@@ -27,47 +28,73 @@ import org.wamblee.xml.DomUtils;
 import org.wamblee.xml.XMLException;
 
 /**
- * Parser for GPX tracks.  
+ * Parser for GPX tracks.
+ * 
+ * @author Erik Brakkee
  */
 public class GpxParser {
-    
+
     private static final String SCHEMA_RESOURCE = "gpx.xsd";
-    
-    public GpxParser() { 
+
+    public GpxParser() {
         // Empty.
     }
-    
-    public Track parse(InputStream aIs) throws XMLException { 
+
+    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(); 
-        Element root = doc.getRootElement().element("trk").element("trkseg");
-        for ( Iterator i =root.elementIterator("trkpt"); i.hasNext(); ) {
-            Element trkpt = (Element)i.next();
-            track.addPoint(parseTrackPoint(trkpt));
+        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"));
+                    }
+                }
+            }
+        }
+
+        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));
         }
-        return track;
     }
+    
 
     /**
      * @param trkpt
      */
     private TrackPoint parseTrackPoint(Element trkpt) {
-        //System.out.println(trkpt.asXML() + "|\n"); 
+        // 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 ) { 
+        if (ele != null) {
             elevation = new Double(ele.getText());
         }
-        //System.out.println("  lat = " + lat + " lon = " + lon + " ele = " + ele);
+        // System.out.println(" lat = " + lat + " lon = " + lon + " ele = " +
+        // ele);
         return new TrackPoint(latitude, longitude, elevation);
     }