2011-11-30 65 views
2

我想繼續從這篇文章的討論:GPX Schema validation problems。爲了直接說明問題,我想問問人們在他們的軟件中如何解析和處理GPX文件,或者給出關於如何執行該操作的建議。GPX解析模式和「標準」

雖然有人會說,只是解析trkpt元素並在軟件中使用它們,但事情並非如此簡單。首先,正如上面引用的文章中所討論的,許多gpx生產設備(軟件,gps-handheld-devices等)生成不符合官方GPX模式的gpx文件(元素佈局在錯誤順序,值類型更改,元素名稱更改等)。我在開始解析gpx文件時首先會講解,首先檢查它們是否針對GPX模式進行驗證。它們中有很多包含實際的GPS數據(經度/緯度/高程值序列),但它們的顯示格式(儘管可以很好地被GPX後綴隱藏)可以以任何方式進行設計。因此該文件將包含所需的數據,但不符合GPX模式。這個問題如何克服?有沒有辦法讓軟件接受通用的GPX文件作爲輸入?其次,我想指出,我對你可能有的各種建議不感興趣(例如,首先預處理GPX文件,然後解析它,更改模式等),以瞭解如何解決問題。如果有人知道如何在實踐中完成任務,我更感興趣。因此,如果任何人有(或可能)在商業環境中處理GPX文件的經驗,請分享您的想法。

我希望我明確我的觀點。

感謝,

斯托

+0

[GPX模式驗證問題]的可能重複(http://stackoverflow.com/questions/8313110/gpx-schema-validation-problems) –

+0

我不認爲它是重複的。在驗證問題線程中,我正在討論爲什麼gpx文件不符合gpx模式。在這裏,我正在探討如何與他們合作。謝謝 – Petar

回答

3

在我的應用我使用的是正常的XML解析器(如蟒蛇xml.dom.minidom),我只是使用標籤名稱來訪問我需要的信息。 正如other Thread中提到的那樣,驗證失敗的事情是GPX標準定義中的<xsd:sequence>。雖然確實GPX生產設備應該遵守標準,但實際上在解析方面並沒有那麼重要(至少在我使用過的GPX文件/設備上)。

如果GPX文件包含附加信息,那麼它將被刪除(除非您選擇提取未知的標記名)。

如果此方法因文件不是vaild XML而失敗,或者GPX使用不同的標記名稱(例如,緯度信息沒有其他讀取文件的方式比爲這個特定用例寫入特殊導入程序(我還沒有看到這種文件,除了已損壞的文件,在野外)

2

我剛剛制定了一個簡單的gpx解析器,用於從gpx文件中抓取軌道和航點並保存在數據庫中。我已經剝離了所有的DB代碼並留下了一個準系統的例子。

<?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

此代碼使用多個音軌。

+1

謝謝,這非常有用。 – Petar