bits to get map call return nodes and segments
[rails.git] / app / controllers / api_controller.rb
1 class ApiController < ApplicationController
2
3   def map
4     # Figure out the bbox
5     bbox = params['bbox']
6     unless bbox and bbox.count(',') == 3
7       render :nothing => true, :status => 400
8       return
9     end
10
11     bbox = bbox.split(',')
12
13     min_lon = bbox[0].to_f
14     min_lat = bbox[1].to_f
15     max_lon = bbox[2].to_f
16     max_lat = bbox[3].to_f
17
18     # get all the nodes
19     nodes = Node.find(:all, :conditions => ['latitude > ? AND longitude > ? AND latitude < ? AND longitude < ? AND visible = 1', min_lat, min_lon, max_lat, max_lon])
20
21     node_ids = nodes.collect {|node| node.id }
22     node_ids_sql = "(#{node_ids.join(',')})"
23
24     # get the referenced segments
25     segments = Segment.find_by_sql "select * from segments where node_a in #{node_ids_sql} or node_b in #{node_ids_sql}"
26
27     # see if we have nay missing nodes
28     segments_nodes = segments.collect {|segment| segment.node_a }
29     segments_nodes += segments.collect {|segment| segment.node_b }
30
31     segments_nodes.uniq!
32
33     missing_nodes = segments_nodes - node_ids
34
35     # get missing nodes if there are any
36     nodes += Node.find(missing_nodes) if missing_nodes.length > 0
37
38     doc = XML::Document.new
39     doc.encoding = 'UTF-8' 
40     root = XML::Node.new 'osm'
41     root['version'] = '0.4'
42     root['generator'] = 'OpenStreetMap server'
43     doc.root = root
44  
45     nodes.each do |node|
46       root << node.to_xml_node()
47     end
48
49     segments.each do |segment|
50       root << segment.to_xml_node()
51     end 
52
53     render :text => doc.to_s
54
55   end
56 end