X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=gps%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fgpx%2FGpxParser.java;h=686c8d0843684aa461c69a4358bd81c19d48734c;hb=2207a1e695ce23e79678c232cff2ceb84ebaa801;hp=30ced035712445f7e7cbeaafe02136db2a263d4e;hpb=532f7219273021ef3652e0abe1326b7aeed1f30a;p=utils diff --git a/gps/src/main/java/org/wamblee/gpx/GpxParser.java b/gps/src/main/java/org/wamblee/gpx/GpxParser.java index 30ced035..686c8d08 100644 --- a/gps/src/main/java/org/wamblee/gpx/GpxParser.java +++ b/gps/src/main/java/org/wamblee/gpx/GpxParser.java @@ -12,64 +12,98 @@ * 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; import org.wamblee.gps.track.Track; +import org.wamblee.gps.track.TrackImpl; import org.wamblee.gps.track.TrackPoint; +import org.wamblee.gps.track.TrackSegment; +import org.wamblee.gps.track.TrackSegmentImpl; 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(String aDescription, InputStream aIs) throws XMLException { Document doc = DomUtils.convert(DomUtils.read(aIs)); - return parse(doc); + return parse(aDescription, 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)); + public Track parse(String aDescription, Document doc) { + TrackImpl result = new TrackImpl(aDescription); + List tracks = doc.getRootElement().elements("trk"); + if ( tracks != null ) { + for (Element track: tracks) { + String trackName = track.elementText("name"); + TrackSegmentImpl trackSegment = new TrackSegmentImpl(trackName); + result.addSegment(trackSegment); + List segments = track.elements("trkseg"); + if ( segments != null ) { + for (Element segment: segments) { + parseTrackPoints(trackSegment, segment.elementIterator("trkpt")); + } + } + } + } + + List routes = doc.getRootElement().elements("rte"); + if ( routes != null ) { + for (Element route: routes) { + String routeName = route.elementText("desc"); + TrackSegmentImpl trackSegment = new TrackSegmentImpl(routeName); + result.addSegment(trackSegment); + parseTrackPoints(trackSegment, route.elementIterator("rtept")); + } + } + + return result; + } + + + private void parseTrackPoints(TrackSegmentImpl aTrack, Iterator 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); }