+ # Figure out the bbox
+ # check boundary is sane and area within defined
+ # see /config/application.yml
+ begin
+ bbox = BoundingBox.from_bbox_params(params)
+ bbox.check_boundaries
+ bbox.check_size
+ rescue StandardError => err
+ report_error(err.message)
+ return
+ end
+
+ # get all the points
+ points = Tracepoint.bbox(bbox).offset(offset).limit(TRACEPOINTS_PER_PAGE).order("gpx_id DESC, trackid ASC, timestamp ASC")
+
+ doc = XML::Document.new
+ doc.encoding = XML::Encoding::UTF_8
+ root = XML::Node.new "gpx"
+ root["version"] = "1.0"
+ root["creator"] = "OpenStreetMap.org"
+ root["xmlns"] = "http://www.topografix.com/GPX/1/0"
+
+ doc.root = root
+
+ # 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", :display_name => gpx_file.user.display_name, :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