- # check the bbox is sane
- unless min_lon <= max_lon
- report_error("The minimum longitude must be less than the maximum longitude, but it wasn't")
- return
+ # initialise these variables outside of the loop so that they
+ # stay in scope and don't get free'd up by the GC during the
+ # loop.
+ gpx_id = -1
+ trackid = -1
+ track = nil
+ trkseg = nil
+ anon_track = nil
+ anon_trkseg = nil
+ gpx_file = nil
+ timestamps = false
+
+ points.each do |point|
+ if gpx_id != point.gpx_id
+ gpx_id = point.gpx_id
+ trackid = -1
+ gpx_file = Trace.find(gpx_id)
+
+ if gpx_file.trackable?
+ track = XML::Node.new 'trk'
+ doc.root << track
+ timestamps = true
+
+ if gpx_file.identifiable?
+ track << (XML::Node.new("name") << gpx_file.name)
+ track << (XML::Node.new("desc") << gpx_file.description)
+ track << (XML::Node.new("url") << url_for(:controller => 'trace', :action => 'view', :id => gpx_file.id))
+ end
+ else
+ # use the anonymous track segment if the user hasn't allowed
+ # their GPX points to be tracked.
+ timestamps = false
+ if anon_track.nil?
+ anon_track = XML::Node.new 'trk'
+ doc.root << anon_track
+ end
+ track = anon_track
+ end
+ end
+
+ if trackid != point.trackid
+ if gpx_file.trackable?
+ trkseg = XML::Node.new 'trkseg'
+ track << trkseg
+ trackid = point.trackid
+ else
+ if anon_trkseg.nil?
+ anon_trkseg = XML::Node.new 'trkseg'
+ anon_track << anon_trkseg
+ end
+ trkseg = anon_trkseg
+ end
+ end
+
+ trkseg << point.to_xml_node(timestamps)