3 # This piece of magic reads a GPX with SAX and spits out
6 # This would print every latitude value:
8 # gpx = OSM:GPXImporter.new('somefile.gpx')
9 # gpx.points {|p| puts p['latitude']}
12 require 'rexml/parsers/sax2parser'
16 attr_reader :possible_points
17 attr_reader :tracksegs
19 def initialize(filename)
26 file = File.new(@filename)
27 parser = REXML::Parsers::SAX2Parser.new( file )
37 parser.listen( :start_element, %w{ trkpt }) do |uri,localname,qname,attributes|
38 lat = attributes['lat'].to_f
39 lon = attributes['lon'].to_f
44 parser.listen( :characters, %w{ ele } ) do |text|
49 parser.listen( :characters, %w{ time } ) do |text|
51 date = Time.parse(text)
56 parser.listen( :end_element, %w{ trkseg } ) do |uri, localname, qname|
60 parser.listen( :end_element, %w{ trkpt } ) do |uri,localname,qname|
61 if gotlatlon && gotdate
62 ele = '0' unless gotele
63 if lat < 90 && lat > -90 && lon > -180 && lon < 180
64 yield Hash['latitude' => lat,'longitude' => lon,'timestamp' => date,'altitude' => ele,'segment' => @tracksegs]