首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GPX解析模式和“标准”

GPX解析模式和“标准”
EN

Stack Overflow用户
提问于 2011-11-30 08:15:43
回答 2查看 3.3K关注 0票数 3

我想从这篇文章继续讨论:GPX Schema validation problems。为了直接切入要点,我想问一下人们是如何在他们的软件中解析和处理GPX文件的,或者给我一些应该如何做的建议。

虽然有人可能会说,解析trkpt元素并在你的软件中使用它们,但对我来说事情并不是那么简单。首先,正如上面引用的帖子中所讨论的,许多gpx生产设备(软件、gps手持设备等)产生的GPX文件不符合官方的GPX模式(元素的布局顺序错误,值类型更改,元素的名称更改等)。当我开始解析gpx文件时,我最初学到的是首先检查它们是否针对GPX模式进行验证。它们中有很多包含实际的GPS数据(纬度/经度/高程值的序列),但它的表示格式(尽管被GPX后缀很好地隐藏)可能会被设计出来。因此,该文件将包含所需的数据,但不符合GPX架构。如何克服这个问题?有没有办法让软件接受通用GPX文件作为输入?

其次,我想指出的是,我对你可能有的各种建议不感兴趣(例如,首先预处理GPX文件,然后解析它,更改你的模式,等等)。关于如何解决这个问题。如果有人知道事情是如何在实践中完成的,我会更感兴趣。因此,如果任何人有或已经有在商业环境中处理GPX文件的任何经验,请分享您的想法。

我希望我已经说清楚了我的观点。

谢谢,

Petar

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-26 16:17:30

在我的应用程序中,我使用的是普通的XML解析器(例如pythons、xml.dom.minidom),我只是使用标记名来访问我需要的信息。正如在other Thread中提到的,导致验证失败的是GPX标准定义中的<xsd:sequence>。虽然GPX生产设备确实应该遵守该标准,但实际上在解析方面并不是什么大问题(至少对于我工作的GPX文件/设备而言是如此)。

如果GPX文件包含附加信息,则会将其删除(除非您选择提取未知的标记名)。

如果这种方法因为文件不是有效的XML或GPX使用不同的标记名(例如以后的信息)而失败,那么除了为这个特定的用例编写一个特殊的导入器之外,没有其他方法可以读取文件(除了被破坏的文件之外,我还没有见过这样的文件)。

票数 3
EN

Stack Overflow用户

发布于 2012-01-27 04:00:48

我刚刚做了一个简单的gpx解析器,我用它从gpx文件中抓取轨迹和路点,并保存在数据库中。我已经剥离了所有的DB代码,并留下了一个简单的例子。

代码语言:javascript
复制
<?php
include('simple_html_dom.php');

if (file_exists('5alqs3.gpx')) {
    $xml = simplexml_load_file('5alqs3.gpx');
    foreach( $xml->children() AS $child ) {
        $name = $child->getName();
        if ($name == 'wpt') {
            print_r($name.'    ');
            echo $child['lat'].' '.$child['lon'].'  ';
            $name = $child->children()->getName();
            if ($name = 'ele') {
                echo $child->children().'<br/>';
            }
        }
        if ($name == 'trk') {
            foreach( $child->children() AS $grandchild ) {
                $grandname = $grandchild->getName();
                if ($grandname == 'name') {
                    echo $grandchild.'<br/>';
                }
                if ($grandname == 'trkseg') {
                    foreach( $grandchild->children() AS $greatgrandchild ) {
                        $greatgrandname = $greatgrandchild->getName();
                        print_r($greatgrandname.'  ');
                        //echo '<br/>';
                        if ($greatgrandname == 'trkpt') {
                            echo $greatgrandchild['lat'].' '.$greatgrandchild['lon'];
                            foreach( $greatgrandchild->children() AS $elegreatgrandchild ) {
                                echo $elegreatgrandchild.'<br/>';
                            }
                        }
                        if ($greatgrandname == 'ele') {
                            print_r($greatgrandchild);
                        }   
                    }
                }
            }
        } 
    }
} else {
    exit('Failed to open 5alqs2.gpx.');
}                
?>

您可以更进一步,并从中解析kml。请查看此链接以了解有关此主题的更多信息。Creating a kml file from a mysql database with php

这段代码可以处理多个曲目。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8319556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档