在Android中解析本地GPX文件

8
4个回答

5

我将为GPX解析添加我的库到这些答案中:https://github.com/ticofab/android-gpx-parser。它提供了两种解析GPX文件的方法:一旦你获得/创建一个GPXParser对象(在下面的示例中为mParser),你可以直接解析你的GPX文件。

Gpx parsedGpx = null;
try {
    InputStream in = getAssets().open("test.gpx");
    parsedGpx = mParser.parse(in);
} catch (IOException | XmlPullParserException e) {
    e.printStackTrace();
}
if (parsedGpx == null) {
    // error parsing track
} else {
    // do something with the parsed track
}

或者您可以解析远程文件:

mParser.parse("http://myserver.com/track.gpx", new GpxFetchedAndParsed() {
    @Override
    public void onGpxFetchedAndParsed(Gpx gpx) {
        if (gpx == null) {
            // error parsing track
        } else {
            // do something with the parsed track
        }
    }
});

欢迎贡献。


你能告诉我如何使用你的库解析 GPx 文件中的扩展吗? - Prasad
嘿@Prasad,我看到了你在GitHub上的问题(https://github.com/ticofab/android-gpx-parser/issues/11),但是还没有时间来解决它。请随意添加功能并打开拉取请求 :) - ticofab

4
你的第一个循环中有 "Node node = nodelist_trkpt.item(i);"。 从这个节点获取子元素,并遍历这些子元素。
例如:
NodeList nList = node.getChildNodes();
for(int j=0; j<nList.getLength(); j++) {
    Node el = nList.item(j);
    if(el.getNodeName().equals("ele")) {
     System.out.println(el.getTextContent());
  }
}

1
更新:我已经添加了对“ele”元素的解析,因此此代码可以符合您的要求。
我提出了不同的方法:https://gist.github.com/kamituel/6465125
在我的方法中,我不会创建所有轨迹点的ArrayList(这在您发布的示例中完成)。这样的列表可能会消耗相当多的内存,在Android上可能会成为一个问题。
我甚至放弃使用正则表达式解析以避免分配太多对象(这会导致垃圾收集器运行)。
结果,使用16Mb堆大小运行Java,解析具有600个点的GPX文件,垃圾收集器仅运行12次。我确定可以更低,但我还没有进行过大量优化。
用法:
GpxParser parser = new GpxParser(new FileInputStream(file));
TrkPt point = null;
while ((point = parser.nextTrkPt()) != null) {
  // point.getLat()
  // point.getLon()
}

我已经成功地在Android上使用这段代码解析了约100 Mb的GPX文件。很抱歉它不在常规存储库中,我还没有计划分享它。


1

如何在工作室中使用? - Prasad
@Prasad 将jar文件添加到libs文件夹中。 - Urizev
该库将支持GPX文件中的扩展。 - Prasad
@Prasad 我不知道这是一个问题还是一个肯定语句。我假设这是一个问题。我不确定该库是否支持扩展,因为我将其从SourceForge项目移植过来,并修复了一些问题。然而,我从未使用过该库的扩展功能。如果您希望,可以在代码中查看它。 - Urizev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接