Add an API call to find the map tiles which have changed in a given period.

This commit is contained in:
Tom Hughes 2007-10-09 23:41:26 +00:00
parent a485b23738
commit d29a319ab0
2 changed files with 47 additions and 0 deletions

View file

@ -240,6 +240,51 @@ class ApiController < ApplicationController
end
end
def changes
zoom = (params[:zoom] || '12').to_i
if params.include?(:start) and params.include?(:end)
starttime = Time.parse(params[:start])
endtime = Time.parse(params[:end])
else
hours = (params[:hours] || '1').to_i.hours
endtime = Time.now
starttime = endtime - hours
end
if zoom >= 1 and zoom <= 16 and
endtime >= starttime and endtime - starttime <= 24.hours
mask = (1 << zoom) - 1
tiles = Node.count(:conditions => ["timestamp BETWEEN ? AND ?", starttime, endtime],
:group => "maptile_for_point(latitude, longitude, #{zoom})")
doc = OSM::API.new.get_xml_doc
changes = XML::Node.new 'changes'
changes["starttime"] = starttime.xmlschema
changes["endtime"] = endtime.xmlschema
tiles.each do |tile, count|
x = (tile.to_i >> zoom) & mask
y = tile.to_i & mask
t = XML::Node.new 'tile'
t["x"] = x.to_s
t["y"] = y.to_s
t["z"] = zoom.to_s
t["changes"] = count.to_s
changes << t
end
doc.root << changes
render :text => doc.to_s, :content_type => "text/xml"
else
render :nothing => true, :status => :bad_request
end
end
def capabilities
doc = OSM::API.new.get_xml_doc

View file

@ -32,6 +32,8 @@ ActionController::Routing::Routes.draw do |map|
map.connect "api/#{API_VERSION}/map", :controller => 'api', :action => 'map'
map.connect "api/#{API_VERSION}/trackpoints", :controller => 'api', :action => 'trackpoints'
map.connect "api/#{API_VERSION}/changes", :controller => 'api', :action => 'changes'
map.connect "api/#{API_VERSION}/search", :controller => 'search', :action => 'search_all'
map.connect "api/#{API_VERSION}/ways/search", :controller => 'search', :action => 'search_ways'