various map API rails stuff
authorSteve Coast <steve@asklater.com>
Mon, 27 Nov 2006 15:06:34 +0000 (15:06 +0000)
committerSteve Coast <steve@asklater.com>
Mon, 27 Nov 2006 15:06:34 +0000 (15:06 +0000)
app/controllers/api_controller.rb
app/controllers/node_controller.rb
app/controllers/segment_controller.rb
app/models/node.rb
app/models/segment.rb
app/models/way.rb
config/environment.rb
config/routes.rb

index d1c48cfcec2bc6c874c6d96ffbc7f9a508523e3b..aa84194146ac205d2155a211581f16f6d128a9fe 100644 (file)
@@ -1,6 +1,7 @@
 class ApiController < ApplicationController
 
   def map
+    response.headers["Content-Type"] = 'application/xml'
     # Figure out the bbox
     bbox = params['bbox']
     unless bbox and bbox.count(',') == 3
@@ -19,11 +20,12 @@ class ApiController < ApplicationController
     nodes = Node.find(:all, :conditions => ['latitude > ? AND longitude > ? AND latitude < ? AND longitude < ? AND visible = 1', min_lat, min_lon, max_lat, max_lon])
 
     node_ids = nodes.collect {|node| node.id }
-    node_ids_sql = "(#{node_ids.join(',')})"
-
-    # get the referenced segments
-    segments = Segment.find_by_sql "select * from segments where node_a in #{node_ids_sql} or node_b in #{node_ids_sql}"
-
+    segments = Array.new
+    if node_ids.length > 0
+      node_ids_sql = "(#{node_ids.join(',')})"
+      # get the referenced segments
+      segments = Segment.find_by_sql "select * from segments where node_a in #{node_ids_sql} or node_b in #{node_ids_sql}"
+    end
     # see if we have nay missing nodes
     segments_nodes = segments.collect {|segment| segment.node_a }
     segments_nodes += segments.collect {|segment| segment.node_b }
@@ -38,10 +40,21 @@ class ApiController < ApplicationController
     doc = XML::Document.new
     doc.encoding = 'UTF-8' 
     root = XML::Node.new 'osm'
-    root['version'] = '0.4'
+    root['version'] = API_VERSION
     root['generator'] = 'OpenStreetMap server'
     doc.root = root
+
+    # get ways
+    # find which ways are needed
+    segment_ids = segments.collect {|segment| segment.id }
+    ways = Array.new
+    if segment_ids.length > 0
+      way_segments = WaySegment.find_by_segment_id(segment_ids)
+      way_ids = way_segments.collect {|way_segment| way_segment.id }
+
+      ways = Way.find(segment_ids)
+    end
+
     nodes.each do |node|
       root << node.to_xml_node()
     end
@@ -50,6 +63,10 @@ class ApiController < ApplicationController
       root << segment.to_xml_node()
     end 
 
+    ways.each do |way|
+      root << way.to_xml_node()
+    end 
+
     render :text => doc.to_s
 
   end
index 416d1794fe72b4b88e39ff88e2ec29ddc3a02feb..c1a43c8984f610dd714fea5b8e8324607af4d2ae 100644 (file)
@@ -4,6 +4,7 @@ class NodeController < ApplicationController
   before_filter :authorize
 
   def create
+    response.headers["Content-Type"] = 'application/xml'
     if request.put?
       node = nil
       begin
@@ -33,6 +34,7 @@ class NodeController < ApplicationController
   end
 
   def rest
+    response.headers["Content-Type"] = 'application/xml'
     unless Node.exists?(params[:id])
       render :nothing => true, :status => 404
       return
@@ -86,6 +88,7 @@ class NodeController < ApplicationController
   end
 
   def history
+    response.headers["Content-Type"] = 'application/xml'
     node = Node.find(params[:id])
 
     unless node
index 966ede72af52e1c310bf63af4afb98dea8d5e4c1..91b9ec7e5da084b3501d874a75e87bc1ead2f4ec 100644 (file)
@@ -4,6 +4,7 @@ class SegmentController < ApplicationController
   before_filter :authorize
 
   def create
+    response.headers["Content-Type"] = 'application/xml'
     if request.put?
       segment = Segment.from_xml(request.raw_post, true)
 
@@ -35,6 +36,7 @@ class SegmentController < ApplicationController
   end
 
   def rest
+    response.headers["Content-Type"] = 'application/xml'
     unless Segment.exists?(params[:id])
       render :nothing => true, :status => 404
       return
@@ -79,6 +81,7 @@ class SegmentController < ApplicationController
   end
 
   def history
+    response.headers["Content-Type"] = 'application/xml'
     segment = Segment.find(params[:id])
 
     unless segment
index 55ed79d4e7118549eef60353453cf1652484e25b..91f348f19c70ca73b70f10f2764f032fca7bd25c 100644 (file)
@@ -75,7 +75,7 @@ class Node < ActiveRecord::Base
     doc = XML::Document.new
     doc.encoding = 'UTF-8' 
     root = XML::Node.new 'osm'
-    root['version'] = '0.4'
+    root['version'] = API_VERSION
     root['generator'] = 'OpenStreetMap server'
     doc.root = root
     root << to_xml_node()
index 2369974dddd02ea991e1ef220494b1186a39e86b..35d6889d26964576a5bc53ae2130e9224e320e26 100644 (file)
@@ -68,7 +68,7 @@ class Segment < ActiveRecord::Base
     doc = XML::Document.new
     doc.encoding = 'UTF-8' 
     root = XML::Node.new 'osm'
-    root['version'] = '0.4'
+    root['version'] = API_VERSION
     root['generator'] = 'OpenStreetMap server'
     doc.root = root
     root << to_xml_node()
index 85b52aa88e6e8b4c8329536e4a1a3144eaec0d58..0c53e5e87c08ce090b7a05561a001ea54c9705c6 100644 (file)
@@ -50,7 +50,12 @@ class Way < ActiveRecord::Base
     root['generator'] = 'OpenStreetMap server'
 
     doc.root = root
-    
+
+    root << to_xml_node()
+    return doc
+  end
+
+  def to_xml_node
     el1 = XML::Node.new 'way'
     el1['id'] = self.id.to_s
     el1['visible'] = self.visible.to_s
@@ -68,10 +73,9 @@ class Way < ActiveRecord::Base
       e['v'] = tag.v
       el1 << e
     end
-  
-    root << el1
-    return doc
-  end
+    return el1
+  end 
+
 
   def segs
     @segs = Array.new unless @segs
index 686582d3e315e97f12762c4b52954ef264219451..76f1669a2d26d045afd6d1c6cae8b4763f8fdf49 100644 (file)
@@ -52,6 +52,7 @@ end
 
 # Include your application configuration below
 
+API_VERSION = '0.4'
 
 ActionMailer::Base.server_settings = {
   :address  => "localhost",
index 3ad3dddf41ae16c6a5d53611e8b4567032e55ec2..3dad762ffa86b129caf22eae4b161810fb61ac28 100644 (file)
@@ -1,20 +1,20 @@
 ActionController::Routing::Routes.draw do |map|
 
   # API
+  API_VERSION = '0.4' # change this in envronment.rb too
+  map.connect "api/#{API_VERSION}/node/create", :controller => 'node', :action => 'create'
+  map.connect "api/#{API_VERSION}/node/:id/history", :controller => 'node', :action => 'history', :id => nil
+  map.connect "api/#{API_VERSION}/node/:id", :controller => 'node', :action => 'rest', :id => nil
 
-  map.connect 'api/0.4/node/create', :controller => 'node', :action => 'create'
-  map.connect 'api/0.4/node/:id/history', :controller => 'node', :action => 'history', :id => nil
-  map.connect 'api/0.4/node/:id', :controller => 'node', :action => 'rest', :id => nil
+  map.connect "api/#{API_VERSION}/segment/create", :controller => 'segment', :action => 'create'
+  map.connect "api/#{API_VERSION}/segment/:id/history", :controller => 'segment', :action => 'history'
+  map.connect "api/#{API_VERSION}/segment/:id", :controller => 'segment', :action => 'rest'
 
-  map.connect 'api/0.4/segment/create', :controller => 'segment', :action => 'create'
-  map.connect 'api/0.4/segment/:id/history', :controller => 'segment', :action => 'history'
-  map.connect 'api/0.4/segment/:id', :controller => 'segment', :action => 'rest'
+  map.connect "api/#{API_VERSION}/way/create", :controller => 'way', :action => 'create'
+  map.connect "api/#{API_VERSION}/way/:id/history", :controller => 'way', :action => 'history'
+  map.connect "api/#{API_VERSION}/way/:id", :controller => 'way', :action => 'rest'
 
-  map.connect 'api/0.4/way/create', :controller => 'way', :action => 'create'
-  map.connect 'api/0.4/way/:id/history', :controller => 'way', :action => 'history'
-  map.connect 'api/0.4/way/:id', :controller => 'way', :action => 'rest'
-
-  map.connect 'api/0.4/map', :controller => 'api', :action => 'map'
+  map.connect "api/#{API_VERSION}/map", :controller => 'api', :action => 'map'
   
   # web site