Use a multi-pass approach to parsing GPX files to keep memory usage down.
This commit is contained in:
parent
b383517d2b
commit
b3d6d4291e
1 changed files with 8 additions and 9 deletions
17
lib/osm.rb
17
lib/osm.rb
|
@ -69,13 +69,13 @@ module OSM
|
||||||
attr_reader :tracksegs
|
attr_reader :tracksegs
|
||||||
|
|
||||||
def initialize(filename)
|
def initialize(filename)
|
||||||
|
@filename = filename
|
||||||
|
end
|
||||||
|
|
||||||
|
def points
|
||||||
@possible_points = 0
|
@possible_points = 0
|
||||||
@actual_points = 0
|
@actual_points = 0
|
||||||
@tracksegs = 0
|
@tracksegs = 0
|
||||||
@points = []
|
|
||||||
|
|
||||||
file = File.new(filename)
|
|
||||||
parser = REXML::Parsers::SAX2Parser.new( file )
|
|
||||||
|
|
||||||
lat = -1
|
lat = -1
|
||||||
lon = -1
|
lon = -1
|
||||||
|
@ -85,6 +85,8 @@ module OSM
|
||||||
gotele = false
|
gotele = false
|
||||||
gotdate = false
|
gotdate = false
|
||||||
|
|
||||||
|
parser = REXML::Parsers::SAX2Parser.new(File.new(@filename))
|
||||||
|
|
||||||
parser.listen( :start_element, %w{ trkpt }) do |uri,localname,qname,attributes|
|
parser.listen( :start_element, %w{ trkpt }) do |uri,localname,qname,attributes|
|
||||||
lat = attributes['lat'].to_f
|
lat = attributes['lat'].to_f
|
||||||
lon = attributes['lon'].to_f
|
lon = attributes['lon'].to_f
|
||||||
|
@ -113,18 +115,15 @@ module OSM
|
||||||
ele = '0' unless gotele
|
ele = '0' unless gotele
|
||||||
if lat < 90 && lat > -90 && lon > -180 && lon < 180
|
if lat < 90 && lat > -90 && lon > -180 && lon < 180
|
||||||
@actual_points += 1
|
@actual_points += 1
|
||||||
@points.push(Hash['latitude' => lat,'longitude' => lon,'timestamp' => date,'altitude' => ele,'segment' => @tracksegs])
|
yield Hash['latitude' => lat, 'longitude' => lon, 'timestamp' => date, 'altitude' => ele, 'segment' => @tracksegs]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
gotlatlon = false
|
gotlatlon = false
|
||||||
gotele = false
|
gotele = false
|
||||||
gotdate = false
|
gotdate = false
|
||||||
end
|
end
|
||||||
parser.parse
|
|
||||||
end
|
|
||||||
|
|
||||||
def points
|
parser.parse
|
||||||
@points.each { |p| yield p }
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_picture(min_lat, min_lon, max_lat, max_lon, num_points)
|
def get_picture(min_lat, min_lon, max_lat, max_lon, num_points)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue