From: Tom Hughes Date: Tue, 9 Oct 2007 23:41:26 +0000 (+0000) Subject: Add an API call to find the map tiles which have changed in a given period. X-Git-Tag: live~8106 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/d29a319ab0c9d692eb8a24f2d243282386d41346 Add an API call to find the map tiles which have changed in a given period. --- diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb index cec8cf2bf..a17e630c2 100644 --- a/app/controllers/api_controller.rb +++ b/app/controllers/api_controller.rb @@ -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 diff --git a/config/routes.rb b/config/routes.rb index 81bcb52a6..758bd6492 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -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'