now supporting all gpx files with both tracks and routes.
[utils] / gps / src / main / java / org / wamblee / gpx / GpxParser.java
1 /*
2  * Copyright 2006 the original author or authors.
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  * 
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.wamblee.gpx;
18
19 import java.io.InputStream;
20 import java.util.Iterator;
21 import java.util.List;
22
23 import org.dom4j.Document;
24 import org.dom4j.Element;
25 import org.wamblee.gps.track.Track;
26 import org.wamblee.gps.track.TrackPoint;
27 import org.wamblee.xml.DomUtils;
28 import org.wamblee.xml.XMLException;
29
30 /**
31  * Parser for GPX tracks.
32  * 
33  * @author Erik Brakkee
34  */
35 public class GpxParser {
36
37     private static final String SCHEMA_RESOURCE = "gpx.xsd";
38
39     public GpxParser() {
40         // Empty.
41     }
42
43     public Track parse(InputStream aIs) throws XMLException {
44         Document doc = DomUtils.convert(DomUtils.read(aIs));
45         return parse(doc);
46     }
47
48     /**
49      * @param doc
50      */
51     public Track parse(Document doc) {
52         Track result = new Track();
53         List<Element> tracks = doc.getRootElement().elements("trk");
54         if ( tracks != null ) { 
55             for (Element track: tracks) { 
56                 List<Element> segments = track.elements("trkseg");
57                 if ( segments != null ) { 
58                     for (Element segment: segments) { 
59                         parseTrackPoints(result, segment.elementIterator("trkpt"));
60                     }
61                 }
62             }
63         }
64
65         List<Element> routes = doc.getRootElement().elements("rte");
66         if ( routes != null ) { 
67             for (Element route: routes) { 
68                 parseTrackPoints(result, route.elementIterator("rtept"));
69             }
70         }
71         
72         return result;
73     }
74     
75     
76     private void parseTrackPoints(Track aTrack, Iterator<Element> aPoints) { 
77         while (aPoints.hasNext()) { 
78             Element point = aPoints.next();
79             aTrack.addPoint(parseTrackPoint(point));
80         }
81     }
82     
83
84     /**
85      * @param trkpt
86      */
87     private TrackPoint parseTrackPoint(Element trkpt) {
88         // System.out.println(trkpt.asXML() + "|\n");
89         double latitude = new Double(trkpt.attributeValue("lat"));
90         double longitude = new Double(trkpt.attributeValue("lon"));
91         Element ele = trkpt.element("ele");
92         double elevation = 0.0;
93         if (ele != null) {
94             elevation = new Double(ele.getText());
95         }
96         // System.out.println(" lat = " + lat + " lon = " + lon + " ele = " +
97         // ele);
98         return new TrackPoint(latitude, longitude, elevation);
99     }
100
101 }