2012-11-23 5 views
1

Nokogiri 또는 ReXML을 사용하여 GPX 파일을 구문 분석하려고 시도했지만 쉽게 작동하지 않는 것만으로는 작동하지 않습니다. 나는 항상 빈 배열이나 nil 또는 "Undefined"출력을 얻었을 때 확신 할 수있다. 나는 머리카락을 꺼내고있다. 누군가가 어떻게 할 수 있는지 보여줄 수 있습니까? lat, lonele 값을 가진 포인트를 멋진 깨끗한 해시 배열로 추출하고 싶습니다. 여기 GPX 파일을 Rails에 저장 하시겠습니까?

는 (은 더 많은 포인트를 가지고) XML입니다 :

<?xml version="1.0"?> 
<gpx creator="GPS Visualizer http://www.gpsvisualizer.com/" version="1.0" xmlns="http://www.topografix.com/GPX/1/0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd"> 
<trk> 
    <name>20090426-144136</name> 
    <trkseg> 
    <trkpt lat="54.0663350" lon="-2.0050000"> 
     <ele>171.1</ele> 
    </trkpt> 
    <trkpt lat="54.0663400" lon="-2.0050000"> 
     <ele>172.8</ele> 
    </trkpt> 
    <trkpt lat="54.0663380" lon="-2.0049970"> 
     <ele>172</ele> 
    </trkpt> 
    </trkseg> 
</trk> 
</gpx> 

그리고 이것은 내가 좀하고 싶습니다 것입니다 :

:route => [{ :lat => 54.0663350, :lon => -2.0050000, :ele => 171.1 }, 
{ :lat => 54.0663400, :lon => -2.0050000, :ele => 172.8 }, ...] 

또는 이와 유사한 (더 나은 제안이있는 경우).

결국 JSON으로 데이터가 전송되어 JavaScript Google지도에 경로가 표시됩니다. 그러나, 나는 또한 데이터베이스에 직렬화 된 해시로 저장하여 단일 점을 쿼리 할 수 ​​있기를 원합니다.

1.9.3p194 :179 > doc = Nokogiri::XML(File.open("gpx/short.gpx")) 
=> #<Nokogiri::XML::Document:0x816dbe34 name="document" children=[#<Nokogiri::XML::Element:0x816dba38 name="gpx" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> attributes=[#<Nokogiri::XML::Attr:0x816db948 name="creator" value="GPS Visualizer http://www.gpsvisualizer.com/">, #<Nokogiri::XML::Attr:0x816db934 name="version" value="1.0">, #<Nokogiri::XML::Attr:0x816db920 name="schemaLocation" namespace=#<Nokogiri::XML::Namespace:0x816dad40 prefix="xsi" href="http://www.w3.org/2001/XMLSchema-instance"> value="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">] children=[#<Nokogiri::XML::Text:0x816da3f4 "\n">, #<Nokogiri::XML::Element:0x816da278 name="trk" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> children=[#<Nokogiri::XML::Text:0x816d9da0 "\n ">, #<Nokogiri::XML::Element:0x816d9c60 name="name" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> children=[#<Nokogiri::XML::Text:0x816d95a8 "20090426-144136">]>, #<Nokogiri::XML::Text:0x816d9148 "\n ">, #<Nokogiri::XML::Element:0x816d901c name="trkseg" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> children=[#<Nokogiri::XML::Text:0x816d8a7c "\n ">, #<Nokogiri::XML::Element:0x816d898c name="trkpt" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> attributes=[#<Nokogiri::XML::Attr:0x816d8928 name="lat" value="54.0663350">, #<Nokogiri::XML::Attr:0x816d8914 name="lon" value="-2.0050000">] children=[#<Nokogiri::XML::Text:0x816d7a3c "\n  ">, #<Nokogiri::XML::Element:0x816d7938 name="ele" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> children=[#<Nokogiri::XML::Text:0x816d7370 "171.1">]>, #<Nokogiri::XML::Text:0x816d712c "\n ">]>, #<Nokogiri::XML::Text:0x816d6e0c "\n ">, #<Nokogiri::XML::Element:0x816d6ccc name="trkpt" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> attributes=[#<Nokogiri::XML::Attr:0x816d6c54 name="lat" value="54.0663400">, #<Nokogiri::XML::Attr:0x816d6bf0 name="lon" value="-2.0050000">] children=[#<Nokogiri::XML::Text:0x816d5db8 "\n  ">, #<Nokogiri::XML::Element:0x816d5cb4 name="ele" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> children=[#<Nokogiri::XML::Text:0x816d57c8 "172.8">]>, #<Nokogiri::XML::Text:0x816d5430 "\n ">]>, #<Nokogiri::XML::Text:0x816d500c "\n ">, #<Nokogiri::XML::Element:0x816d4eb8 name="trkpt" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> attributes=[#<Nokogiri::XML::Attr:0x816d4e54 name="lat" value="54.0663380">, #<Nokogiri::XML::Attr:0x816d4e40 name="lon" value="-2.0049970">] children=[#<Nokogiri::XML::Text:0x816d41e8 "\n  ">, #<Nokogiri::XML::Element:0x816d40a8 name="ele" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> children=[#<Nokogiri::XML::Text:0x816bafe0 "172">]>, #<Nokogiri::XML::Text:0x816bacd4 "\n ">]>, #<Nokogiri::XML::Text:0x816ba9c8 "\n ">]>, #<Nokogiri::XML::Text:0x816ba734 "\n">]>, #<Nokogiri::XML::Text:0x816ba4c8 "\n">]>]> 
1.9.3p194 :205 > doc.xpath("*") 
=> [#<Nokogiri::XML::Element:0x816dba38 name="gpx" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> attributes=[#<Nokogiri::XML::Attr:0x816db948 name="creator" value="GPS Visualizer http://www.gpsvisualizer.com/">, #<Nokogiri::XML::Attr:0x816db934 name="version" value="1.0">, #<Nokogiri::XML::Attr:0x816db920 name="schemaLocation" namespace=#<Nokogiri::XML::Namespace:0x816dad40 prefix="xsi" href="http://www.w3.org/2001/XMLSchema-instance"> value="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">] children=[#<Nokogiri::XML::Text:0x816da3f4 "\n">, #<Nokogiri::XML::Element:0x816da278 name="trk" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> children=[#<Nokogiri::XML::Text:0x816d9da0 "\n ">, #<Nokogiri::XML::Element:0x816d9c60 name="name" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> children=[#<Nokogiri::XML::Text:0x816d95a8 "20090426-144136">]>, #<Nokogiri::XML::Text:0x816d9148 "\n ">, #<Nokogiri::XML::Element:0x816d901c name="trkseg" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> children=[#<Nokogiri::XML::Text:0x816d8a7c "\n ">, #<Nokogiri::XML::Element:0x816d898c name="trkpt" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> attributes=[#<Nokogiri::XML::Attr:0x816d8928 name="lat" value="54.0663350">, #<Nokogiri::XML::Attr:0x816d8914 name="lon" value="-2.0050000">] children=[#<Nokogiri::XML::Text:0x816d7a3c "\n  ">, #<Nokogiri::XML::Element:0x816d7938 name="ele" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> children=[#<Nokogiri::XML::Text:0x816d7370 "171.1">]>, #<Nokogiri::XML::Text:0x816d712c "\n ">]>, #<Nokogiri::XML::Text:0x816d6e0c "\n ">, #<Nokogiri::XML::Element:0x816d6ccc name="trkpt" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> attributes=[#<Nokogiri::XML::Attr:0x816d6c54 name="lat" value="54.0663400">, #<Nokogiri::XML::Attr:0x816d6bf0 name="lon" value="-2.0050000">] children=[#<Nokogiri::XML::Text:0x816d5db8 "\n  ">, #<Nokogiri::XML::Element:0x816d5cb4 name="ele" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> children=[#<Nokogiri::XML::Text:0x816d57c8 "172.8">]>, #<Nokogiri::XML::Text:0x816d5430 "\n ">]>, #<Nokogiri::XML::Text:0x816d500c "\n ">, #<Nokogiri::XML::Element:0x816d4eb8 name="trkpt" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> attributes=[#<Nokogiri::XML::Attr:0x816d4e54 name="lat" value="54.0663380">, #<Nokogiri::XML::Attr:0x816d4e40 name="lon" value="-2.0049970">] children=[#<Nokogiri::XML::Text:0x816d41e8 "\n  ">, #<Nokogiri::XML::Element:0x816d40a8 name="ele" namespace=#<Nokogiri::XML::Namespace:0x816db970 href="http://www.topografix.com/GPX/1/0"> children=[#<Nokogiri::XML::Text:0x816bafe0 "172">]>, #<Nokogiri::XML::Text:0x816bacd4 "\n ">]>, #<Nokogiri::XML::Text:0x816ba9c8 "\n ">]>, #<Nokogiri::XML::Text:0x816ba734 "\n">]>, #<Nokogiri::XML::Text:0x816ba4c8 "\n">]>] 
1.9.3p194 :206 > doc.xpath("*/trk") 
=> [] 
1.9.3p194 :207 > doc.xpath("//trk") 
=> [] 
1.9.3p194 :208 > doc.xpath("trk") 
=> [] 
1.9.3p194 :209 > doc.xpath("//trkpt") 
=> [] 
1.9.3p194 :210 > doc.xpath("*/gpx") 
=> [] 
1.9.3p194 :211 > doc.xpath("*/gpx/trk") 
=> [] 

내가 잘못 뭐하는 거지 : 여기

는 노코 기리 내 머리를 긁적 순간 중 하나입니다?

답변

1

"Ruby GPX file parser"의 도움으로 문제를 발견했습니다. doc.xpath('//trkpt') 대신 doc.xpath('//xmlns:trkpt') XML 태그의 네임 스페이스를 선언해야했습니다.

1.9.3p194 :329 > Route::parse_gpx("gpx/short.gpx") 
=> [{:lat=>54.066335, :lon=>-2.005, :ele=>171.1}, {:lat=>54.06634, :lon=>-2.005, :ele=>172.8}, {:lat=>54.066338, :lon=>-2.004997, :ele=>172.0}] 
: 이것은 내 출력

def self.parse_gpx(filename) 
    file = File.open(filename) 
    doc = Nokogiri::XML(file) 
    trackpoints = doc.xpath('//xmlns:trkpt') 
    route = Array.new 
    trackpoints.each do |trkpt| 
    lat = trkpt.xpath('@lat').to_s.to_f 
    lon = trkpt.xpath('@lon').to_s.to_f 
    ele = trkpt.text.strip.to_f 
    route << {lat: lat, lon: lon, ele: ele} 
    end 
    route 
end 

: 여기

내 레일 모델에서 내 방법입니다
관련 문제