(no commit message)
[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.TrackImpl;
27 import org.wamblee.gps.track.TrackPoint;
28 import org.wamblee.gps.track.TrackSegment;
29 import org.wamblee.gps.track.TrackSegmentImpl;
30 import org.wamblee.xml.DomUtils;
31 import org.wamblee.xml.XMLException;
32
33 /**
34  * Parser for GPX tracks.
35  * 
36  * @author Erik Brakkee
37  */
38 public class GpxParser {
39
40     private static final String SCHEMA_RESOURCE = "gpx.xsd";
41
42     public GpxParser() {
43         // Empty.
44     }
45
46     public Track parse(String aDescription, InputStream aIs) throws XMLException {
47         Document doc = DomUtils.convert(DomUtils.read(aIs));
48         return parse(aDescription, doc);
49     }
50
51     /**
52      * @param doc
53      */
54     public Track parse(String aDescription, Document doc) {
55         TrackImpl result = new TrackImpl(aDescription);
56         List<Element> tracks = doc.getRootElement().elements("trk");
57         if ( tracks != null ) { 
58             for (Element track: tracks) {
59                 String trackName = track.elementText("name");
60                 TrackSegmentImpl trackSegment = new TrackSegmentImpl(trackName);
61                 result.addSegment(trackSegment);
62                 List<Element> segments = track.elements("trkseg");
63                 if ( segments != null ) { 
64                     for (Element segment: segments) {           
65                         parseTrackPoints(trackSegment, segment.elementIterator("trkpt"));
66                     }
67                 }
68             }
69         }
70
71         List<Element> routes = doc.getRootElement().elements("rte");
72         if ( routes != null ) {
73             for (Element route: routes) {
74                 String routeName = route.elementText("desc");
75                 TrackSegmentImpl trackSegment = new TrackSegmentImpl(routeName);
76                 result.addSegment(trackSegment);
77                 parseTrackPoints(trackSegment, route.elementIterator("rtept"));
78             }
79         }
80         
81         return result;
82     }
83     
84     
85     private void parseTrackPoints(TrackSegmentImpl aTrack, Iterator<Element> aPoints) { 
86         while (aPoints.hasNext()) { 
87             Element point = aPoints.next();
88             aTrack.addPoint(parseTrackPoint(point));
89         }
90     }
91     
92
93     /**
94      * @param trkpt
95      */
96     private TrackPoint parseTrackPoint(Element trkpt) {
97         // System.out.println(trkpt.asXML() + "|\n");
98         double latitude = new Double(trkpt.attributeValue("lat"));
99         double longitude = new Double(trkpt.attributeValue("lon"));
100         Element ele = trkpt.element("ele");
101         double elevation = 0.0;
102         if (ele != null) {
103             elevation = new Double(ele.getText());
104         }
105         // System.out.println(" lat = " + lat + " lon = " + lon + " ele = " +
106         // ele);
107         return new TrackPoint(latitude, longitude, elevation);
108     }
109
110 }