/* * This file is part of GPSLogger for Android. * * GPSLogger for Android is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * GPSLogger for Android is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GPSLogger for Android. If not, see <http://www.gnu.org/licenses/>. */ package com.mendhak.gpslogger.senders.opengts; import android.location.Location; import org.w3c.dom.*; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; import java.io.FileInputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; /** * GpxReader * <p/> * http://stackoverflow.com/questions/9417189/parsing-gpx-files-with-sax-parer-or-xmlpullparser * * @author Droid_Interceptor @ http://stackoverflow.com */ public class GpxReader { private static final SimpleDateFormat gpxDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); public static List<Location> getPoints(File gpxFile) throws Exception { List<Location> points; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); FileInputStream fis = new FileInputStream(gpxFile); Document dom = builder.parse(fis); Element root = dom.getDocumentElement(); NodeList items = root.getElementsByTagName("trkpt"); points = new ArrayList<Location>(); for (int j = 0; j < items.getLength(); j++) { Node item = items.item(j); NamedNodeMap attrs = item.getAttributes(); NodeList props = item.getChildNodes(); Location pt = new Location("test"); pt.setLatitude(Double.parseDouble(attrs.getNamedItem("lat").getNodeValue())); pt.setLongitude(Double.parseDouble(attrs.getNamedItem("lon").getNodeValue())); for (int k = 0; k < props.getLength(); k++) { Node item2 = props.item(k); String name = item2.getNodeName(); if (name.equalsIgnoreCase("ele")) { pt.setAltitude(Double.parseDouble(item2.getFirstChild().getNodeValue())); } if (name.equalsIgnoreCase("course")) { pt.setBearing(Float.parseFloat(item2.getFirstChild().getNodeValue())); } if (name.equalsIgnoreCase("speed")) { pt.setSpeed(Float.parseFloat(item2.getFirstChild().getNodeValue())); } if (name.equalsIgnoreCase("hdop")) { pt.setAccuracy(Float.parseFloat(item2.getFirstChild().getNodeValue()) * 5); } if (name.equalsIgnoreCase("time")) { pt.setTime((getDateFormatter().parse(item2.getFirstChild().getNodeValue())).getTime()); } } for (int y = 0; y < props.getLength(); y++) { Node item3 = props.item(y); String name = item3.getNodeName(); if (!name.equalsIgnoreCase("ele")) { continue; } pt.setAltitude(Double.parseDouble(item3.getFirstChild().getNodeValue())); } points.add(pt); } fis.close(); return points; } public static SimpleDateFormat getDateFormatter() { return (SimpleDateFormat) gpxDate.clone(); } }