end
# get all the points
- points = Tracepoint.bbox(bbox).offset(offset).limit(TRACEPOINTS_PER_PAGE).order("gpx_id DESC, trackid ASC, timestamp ASC")
+ ordered_points = Tracepoint.bbox(bbox).joins(:trace).where(:gpx_files => { :visibility => %w[trackable identifiable] }).order("gpx_id DESC, trackid ASC, timestamp ASC")
+ unordered_points = Tracepoint.bbox(bbox).joins(:trace).where(:gpx_files => { :visibility => %w[public private] }).order("gps_points.latitude", "gps_points.longitude", "gps_points.timestamp")
+ points = ordered_points.union_all(unordered_points).offset(offset).limit(TRACEPOINTS_PER_PAGE)
doc = XML::Document.new
doc.encoding = XML::Encoding::UTF_8
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))
+ track << (XML::Node.new("url") << url_for(:controller => "traces", :action => "show", :display_name => gpx_file.user.display_name, :id => gpx_file.id))
end
else
# use the anonymous track segment if the user hasn't allowed
response.headers["Content-Disposition"] = "attachment; filename=\"tracks.gpx\""
- render :text => doc.to_s, :content_type => "text/xml"
+ render :xml => doc.to_s
end
# This is probably the most common call of all. It is used for getting the
return
end
- @nodes = Node.bbox(bbox).where(:visible => true).includes(:node_tags).limit(MAX_NUMBER_OF_NODES + 1)
+ nodes = Node.bbox(bbox).where(:visible => true).includes(:node_tags).limit(MAX_NUMBER_OF_NODES + 1)
- node_ids = @nodes.collect(&:id)
+ node_ids = nodes.collect(&:id)
if node_ids.length > MAX_NUMBER_OF_NODES
report_error("You requested too many nodes (limit is #{MAX_NUMBER_OF_NODES}). Either request a smaller area, or use planet.osm")
return
end
- if node_ids.length == 0
- render :text => "<osm version='#{API_VERSION}' generator='#{GENERATOR}'></osm>", :content_type => "text/xml"
- return
- end
doc = OSM::API.new.get_xml_doc
# add bounds
- doc.root << bbox.add_bounds_to(XML::Node.new "bounds")
+ doc.root << bbox.add_bounds_to(XML::Node.new("bounds"))
# get ways
# find which ways are needed
ways = []
- if node_ids.length > 0
+ if node_ids.empty?
+ list_of_way_nodes = []
+ else
way_nodes = WayNode.where(:node_id => node_ids)
way_ids = way_nodes.collect { |way_node| way_node.id[0] }
ways = Way.preload(:way_nodes, :way_tags).find(way_ids)
way.way_nodes.collect(&:node_id)
end
list_of_way_nodes.flatten!
-
- else
- list_of_way_nodes = []
end
# - [0] in case some thing links to node 0 which doesn't exist. Shouldn't actually ever happen but it does. FIXME: file a ticket for this
nodes_to_fetch = (list_of_way_nodes.uniq - node_ids) - [0]
- if nodes_to_fetch.length > 0
- @nodes += Node.includes(:node_tags).find(nodes_to_fetch)
- end
+ nodes += Node.includes(:node_tags).find(nodes_to_fetch) unless nodes_to_fetch.empty?
visible_nodes = {}
changeset_cache = {}
user_display_name_cache = {}
- @nodes.each do |node|
+ nodes.each do |node|
if node.visible?
doc.root << node.to_xml_node(changeset_cache, user_display_name_cache)
visible_nodes[node.id] = node
# this "uniq" may be slightly inefficient; it may be better to first collect and output
# all node-related relations, then find the *not yet covered* way-related ones etc.
relations.uniq.each do |relation|
- doc.root << relation.to_xml_node(nil, changeset_cache, user_display_name_cache)
+ doc.root << relation.to_xml_node(changeset_cache, user_display_name_cache)
end
response.headers["Content-Disposition"] = "attachment; filename=\"map.osm\""
- render :text => doc.to_s, :content_type => "text/xml"
+ render :xml => doc.to_s
end
# Get a list of the tiles that have changed within a specified time
doc.root << changes
- render :text => doc.to_s, :content_type => "text/xml"
+ render :xml => doc.to_s
else
- render :text => "Requested zoom is invalid, or the supplied start is after the end time, or the start duration is more than 24 hours", :status => :bad_request
+ render :plain => "Requested zoom is invalid, or the supplied start is after the end time, or the start duration is more than 24 hours", :status => :bad_request
end
end
# * maximum area that can be requested in a bbox request in square degrees
# * number of tracepoints that are returned in each tracepoints page
def capabilities
- doc = OSM::API.new.get_xml_doc
-
- api = XML::Node.new "api"
- version = XML::Node.new "version"
- version["minimum"] = "#{API_VERSION}"
- version["maximum"] = "#{API_VERSION}"
- api << version
- area = XML::Node.new "area"
- area["maximum"] = MAX_REQUEST_AREA.to_s
- api << area
- tracepoints = XML::Node.new "tracepoints"
- tracepoints["per_page"] = TRACEPOINTS_PER_PAGE.to_s
- api << tracepoints
- waynodes = XML::Node.new "waynodes"
- waynodes["maximum"] = MAX_NUMBER_OF_WAY_NODES.to_s
- api << waynodes
- changesets = XML::Node.new "changesets"
- changesets["maximum_elements"] = Changeset::MAX_ELEMENTS.to_s
- api << changesets
- timeout = XML::Node.new "timeout"
- timeout["seconds"] = API_TIMEOUT.to_s
- api << timeout
- status = XML::Node.new "status"
- status["database"] = database_status.to_s
- status["api"] = api_status.to_s
- status["gpx"] = gpx_status.to_s
- api << status
- doc.root << api
- policy = XML::Node.new "policy"
- blacklist = XML::Node.new "imagery"
- IMAGERY_BLACKLIST.each do |url_regex|
- xnd = XML::Node.new "blacklist"
- xnd["regex"] = url_regex.to_s
- blacklist << xnd
- end
- policy << blacklist
- doc.root << policy
-
- render :text => doc.to_s, :content_type => "text/xml"
+ @database_status = database_status
+ @api_status = api_status
+ @gpx_status = gpx_status
end
# External apps that use the api are able to query which permissions
# * if authenticated via basic auth all permissions are granted, so the list will contain all permissions.
# * unauthenticated users have no permissions, so the list will be empty.
def permissions
- @permissions = case
- when current_token.present?
+ @permissions = if current_token.present?
ClientApplication.all_permissions.select { |p| current_token.read_attribute(p) }
- when @user
+ elsif current_user
ClientApplication.all_permissions
else
[]