【问题标题】:How to parse GPX files with SAXReader?如何使用 SAXReader 解析 GPX 文件?
【发布时间】:2010-10-14 22:05:23
【问题描述】:

我正在尝试解析GPX file。我用 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"));
  }
}

我打开了example file(CC-BY-SA OpenStreetMap),输出只是:

根目录:gpx
计数trk:0

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

【问题讨论】:

    标签: java xml gpx


    【解决方案1】:

    这是我的 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()]);
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        即用型、开源且功能齐全的 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( ) ) ;
        

        【讨论】:

          猜你喜欢
          • 2015-11-01
          • 2012-03-14
          • 2018-12-28
          • 2011-02-28
          • 2022-08-02
          • 2012-01-28
          • 1970-01-01
          • 2014-03-19
          • 2019-01-19
          相关资源
          最近更新 更多