GPX解析模式和“标准”

3
我希望能够继续讨论这篇文章:GPX Schema validation problems。直接来点,我想问问人们如何解析和处理他们的软件中的GPX文件,或者给我一些建议,告诉我应该怎样做。
虽然有人可能会说,只需解析trkpt元素并在软件中使用它们,对我来说事情并不那么简单。首先,正如上面引用的帖子中所讨论的那样,很多产生GPX文件的设备(软件,GPS手持设备等)生成的GPX文件并不符合官方GPX模式(元素排列顺序错误,值类型更改,元素名称更改等)。当我开始解析gpx文件时,我的初步想法是首先检查它们是否符合GPX模式。有很多文件包含实际的GPS数据(纬度/经度/高程值的序列),但它们呈现的格式(尽管被GPX后缀巧妙地隐藏)可能是任意设计的。因此,文件将包含所需的数据,但不符合GPX模式。如何解决这个问题?有没有办法使软件接受通用GPX文件作为输入?
其次,我想指出我不感兴趣你可能有的各种建议(例如,先预处理GPX文件,然后解析它,更改你的模式等)来解决问题。我更感兴趣的是,如果有人在(可能)商业环境中处理GPX文件方面有任何经验,请分享您的想法。
希望我的观点清楚明了。
谢谢,
Petar

可能是GPX模式验证问题的重复。 - Daniel Haley
我不认为这是重复的。在验证问题的帖子中,我正在讨论为什么那些gpx文件不符合gpx模式。而在这里,我正在讨论如何处理它们。谢谢。 - Petar
2个回答

3
在我的应用程序中,我使用普通的XML解析器(例如Python的xml.dom.minidom),我只是使用标记名称来访问所需的信息。正如其他线程中提到的那样,导致验证失败的是GPX标准定义中的<xsd:sequence>。虽然GPX生成设备应该遵守标准,但在解析方面实际上并不是很重要(至少对于我使用的GPX文件/设备而言)。如果GPX文件包含其他信息,则将被删除(除非您选择提取未知的标记名称)。如果此方法失败,因为文件不是有效的XML或GPX对例如lat lon信息使用不同的标记名称,则读取文件的唯一方法是为此特定用例编写特殊的导入程序(我没有看到过这样的文件,除了受损的文件)。

2

我刚刚开发了一个简单的GPX解析器,用于从GPX文件中获取轨迹和航点,并将其保存到数据库中。我已经删除了所有的数据库代码,留下了一个基本的示例。

<?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。查看此链接以获取更多信息:使用PHP从MySQL数据库创建kml文件
此代码适用于多个轨迹。

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