2

我正在尝试解析GPX 文件。我用 JDOM 试过,但效果不是很好。

SAXBuilder builder = new SAXBuilder();
Document document = builder.build(filename);
Element root = document.getRootElement();
System.out.println("Root:\t" + root.getName());
List<Element> listTrks = root.getChildren("trk");
System.out.println("Count trk:\t" + listTrks.size());
for (Element tmpTrk : listTrks) {
  List<Element> listTrkpts = tmpTrk.getChildren("trkpt");
  System.out.println("Count pts:\t" + listTrkpts.size());
  for (Element tmpTrkpt : listTrkpts) {
    System.out.println(tmpTrkpt.getAttributeValue("lat") + ":" + tmpTrkpt.getAttributeValue("lat"));
  }
}

我打开了示例文件(CC-BY-SA OpenStreetMap),输出只是:

根:gpx
计数 trk:0

我能做些什么?我应该使用 SAXParserFactory ( javax.xml.parsers.SAXParserFactory) 并实现 Handler 类吗?

4

3 回答 3

4

这是我的 gpx 阅读器。它忽略了一些标签,但我希望它会有所帮助。

package ch.perry.rando.geocode;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 *
 * @author perrym
 */
public class GpxReader extends DefaultHandler {
    private static final DateFormat TIME_FORMAT
            = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");

    private List<Trackpoint> track = new ArrayList<Trackpoint>();
    private StringBuffer buf = new StringBuffer();
    private double lat;
    private double lon;
    private double ele;
    private Date time;

    public static Trackpoint[] readTrack(InputStream in) throws IOException {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            factory.setValidating(true);
            SAXParser parser = factory.newSAXParser();
            GpxReader reader = new GpxReader();
            parser.parse(in, reader);
            return reader.getTrack();
        } catch (ParserConfigurationException e) {
            throw new IOException(e.getMessage());
        } catch (SAXException e) {
            throw new IOException(e.getMessage());
        }
    }

    public static Trackpoint[] readTrack(File file) throws IOException {
        InputStream in = new FileInputStream(file);
        try {
            return readTrack(in);
        } finally {
            in.close();
        }
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        buf.setLength(0);
        if (qName.equals("trkpt")) {
            lat = Double.parseDouble(attributes.getValue("lat"));
            lon = Double.parseDouble(attributes.getValue("lon"));
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if (qName.equals("trkpt")) {
            track.add(Trackpoint.fromWGS84(lat, lon, ele, time));
        } else if (qName.equals("ele")) {
            ele = Double.parseDouble(buf.toString());
        } else if (qName.equals("")) {
            try {
                time = TIME_FORMAT.parse(buf.toString());
            } catch (ParseException e) {
                throw new SAXException("Invalid time " + buf.toString());
            }
        }
    }

    @Override
    public void characters(char[] chars, int start, int length)
            throws SAXException {
        buf.append(chars, start, length);
    }

    private Trackpoint[] getTrack() {
        return track.toArray(new Trackpoint[track.size()]);
    }
}
于 2009-03-23T08:06:26.057 回答
1

要在 Java 中轻松读取 GPX 文件,请参阅:http: //sourceforge.net/p/gpsanalysis/wiki/Home/
示例:
//从 GPX 文件中获取点
final List points= GpxFileDataAccess.getPoints(new File("/path/ toGpxFile.gpx"));

于 2011-09-21T15:56:48.933 回答
1

准备好使用、开源和功能齐全的 java GpxParser(以及更多)在这里 https://sourceforge.net/projects/geokarambola/

详情在这里 https://plus.google.com/u/0/communities/110606810455751902142

使用上面的库解析 GPX 文件是一个单行:

Gpx gpx = GpxFileIo.parseIn( "SomeGeoCollection.gpx" ) ;

获得它的点、路线或轨道也很简单:

for(Point pt: gpx.getPoints( ))
  Location loc = new Location( pt.getLatitude( ), pt.getLongitude( ) ) ;
于 2016-03-27T22:10:49.543 回答