From 6b7374727128c95168d4fa6f6503a0e7d1bae729 Mon Sep 17 00:00:00 2001 From: Steve Coast Date: Mon, 27 Nov 2006 14:14:43 +0000 Subject: [PATCH] bits to get map call return nodes and segments --- app/controllers/api_controller.rb | 48 +++++++++++++++++++------------ app/models/node.rb | 8 ++++-- app/models/segment.rb | 8 ++++-- 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb index 9e3839697..d1c48cfce 100644 --- a/app/controllers/api_controller.rb +++ b/app/controllers/api_controller.rb @@ -1,6 +1,7 @@ class ApiController < ApplicationController def map + # Figure out the bbox bbox = params['bbox'] unless bbox and bbox.count(',') == 3 render :nothing => true, :status => 400 @@ -9,18 +10,30 @@ class ApiController < ApplicationController bbox = bbox.split(',') - min_lat = bbox[0].to_f - min_lon = bbox[1].to_f - max_lat = bbox[2].to_f - max_lon = bbox[3].to_f + min_lon = bbox[0].to_f + min_lat = bbox[1].to_f + max_lon = bbox[2].to_f + max_lat = bbox[3].to_f + # get all the nodes 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 = nodes.collect {|node| node.id } + node_ids_sql = "(#{node_ids.join(',')})" - segments = Segment.find(:all, :condtions => ['node_a in ? or node_b in ?', node_ids, node_ids]) - render :text => node_ids.join(',') - return + # 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}" + + # see if we have nay missing nodes + segments_nodes = segments.collect {|segment| segment.node_a } + segments_nodes += segments.collect {|segment| segment.node_b } + + segments_nodes.uniq! + + missing_nodes = segments_nodes - node_ids + + # get missing nodes if there are any + nodes += Node.find(missing_nodes) if missing_nodes.length > 0 doc = XML::Document.new doc.encoding = 'UTF-8' @@ -28,17 +41,16 @@ class ApiController < ApplicationController root['version'] = '0.4' root['generator'] = 'OpenStreetMap server' doc.root = root + + nodes.each do |node| + root << node.to_xml_node() + end + + segments.each do |segment| + root << segment.to_xml_node() + end render :text => doc.to_s - - #el1 = XML::Node.new 'node' - #el1['id'] = self.id.to_s - #el1['lat'] = self.latitude.to_s - #el1['lon'] = self.longitude.to_s - #Node.split_tags(el1, self.tags) - #el1['visible'] = self.visible.to_s - #el1['timestamp'] = self.timestamp.xmlschema - #root << el1 - end + end end diff --git a/app/models/node.rb b/app/models/node.rb index f184a6ae9..55ed79d4e 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -78,6 +78,11 @@ class Node < ActiveRecord::Base root['version'] = '0.4' root['generator'] = 'OpenStreetMap server' doc.root = root + root << to_xml_node() + return doc + end + + def to_xml_node el1 = XML::Node.new 'node' el1['id'] = self.id.to_s el1['lat'] = self.latitude.to_s @@ -85,8 +90,7 @@ class Node < ActiveRecord::Base Node.split_tags(el1, self.tags) el1['visible'] = self.visible.to_s el1['timestamp'] = self.timestamp.xmlschema - root << el1 - return doc + return el1 end def self.split_tags(el, tags) diff --git a/app/models/segment.rb b/app/models/segment.rb index 70ce6a4ec..2369974dd 100644 --- a/app/models/segment.rb +++ b/app/models/segment.rb @@ -71,6 +71,11 @@ class Segment < ActiveRecord::Base root['version'] = '0.4' root['generator'] = 'OpenStreetMap server' doc.root = root + root << to_xml_node() + return doc + end + + def to_xml_node el1 = XML::Node.new 'segment' el1['id'] = self.id.to_s el1['from'] = self.node_a.to_s @@ -78,8 +83,7 @@ class Segment < ActiveRecord::Base Segment.split_tags(el1, self.tags) el1['visible'] = self.visible.to_s el1['timestamp'] = self.timestamp.xmlschema - root << el1 - return doc + return el1 end def self.split_tags(el, tags) -- 2.43.2