replace whichways with rails-friendly code
authorSteve Coast <steve@asklater.com>
Tue, 22 Jan 2008 16:44:17 +0000 (16:44 +0000)
committerSteve Coast <steve@asklater.com>
Tue, 22 Jan 2008 16:44:17 +0000 (16:44 +0000)
app/controllers/amf_controller.rb
app/models/api.rb [deleted file]
app/models/node.rb

index 5a8952b0f854e72ce540b041d522b3ad9106932a..4a5d3346c609d438f1f24ad83562d552d3242ac1 100644 (file)
@@ -157,21 +157,16 @@ class AmfController < ApplicationController
     [presets,presetmenus,presetnames,colours,casing,areas,autotags]
   end
 
-  # ----- whichways
-  #              return array of ways in current bounding box
-
-  #              in:   [0] xmin, [1] ymin, [2] xmax, [3] ymax (bbox in degrees)
-  #                            [4] baselong (longitude of SWF map origin),
-  #                            [5] basey (projected latitude of SWF map origin),
-  #                            [6] masterscale (SWF map scale)
-  #              does: finds all ways and POI nodes in bounding box
-  #                            at present, instead of using correct (=more complex) SQL to find
-  #                            corner-crossing ways, it simply enlarges the bounding box
-  #              out:  [0] array of way ids,
-  #                            [1] array of POIs
-  #                            (where each POI is an array containing:
-  #                             [0] id, [1] projected long, [2] projected lat, [3] hash of tags)
-
+  # Find all the way ids and nodes (including tags and projected lat/lng) which aren't part of those ways in an are
+  # 
+  # The argument is an array containing the following, in order:
+  # 0. minimun longitude
+  # 1. minimum latitude
+  # 2. maximum longitude
+  # 3. maximum latitude
+  # 4. baselong ??
+  # 5. basey ??
+  # 6. masterscale ??
   def whichways(args)
     xmin = args[0].to_f-0.01
     ymin = args[1].to_f-0.01
@@ -183,35 +178,26 @@ class AmfController < ApplicationController
 
     RAILS_DEFAULT_LOGGER.info("  Message: whichways, bbox=#{xmin},#{ymin},#{xmax},#{ymax}")
 
-    waylist = ActiveRecord::Base.connection.select_all("SELECT DISTINCT current_way_nodes.id AS wayid"+
-       "  FROM current_way_nodes,current_nodes,current_ways "+
-       " WHERE current_nodes.id=current_way_nodes.node_id "+
-       "   AND current_nodes.visible=1 "+
-       "   AND current_ways.id=current_way_nodes.id "+
-       "   AND current_ways.visible=1 "+
-       "   AND "+OSM.sql_for_area(ymin, xmin, ymax, xmax, "current_nodes."))
-
-    ways = waylist.collect {|a| a['wayid'].to_i } # get an array of way IDs
+    # find the way id's in an area
+    nodes_in_area = Node.find_by_area(ymin, xmin, ymax, xmax,:conditions => "visible = 1", :include => :way_nodes)
+    waynodes_in_area = nodes_in_area.collect {|node| node.way_nodes }.flatten
+    ways = waynodes_in_area.collect {|way_node| way_node.id[0]}.uniq
 
-    pointlist = ActiveRecord::Base.connection.select_all("SELECT current_nodes.id,current_nodes.latitude*0.0000001 AS lat,current_nodes.longitude*0.0000001 AS lng,current_nodes.tags "+
-       "  FROM current_nodes "+
-       "  LEFT OUTER JOIN current_way_nodes cwn ON cwn.node_id=current_nodes.id "+
-       " WHERE "+OSM.sql_for_area(ymin, xmin, ymax, xmax, "current_nodes.")+
-       "   AND cwn.id IS NULL "+
-       "   AND current_nodes.visible=1")
-
-    points = pointlist.collect {|a| [a['id'],long2coord(a['lng'].to_f,baselong,masterscale),lat2coord(a['lat'].to_f,basey,masterscale),tag2array(a['tags'])]   } # get a list of node ids and their tags
+    # find the node ids in an area that aren't part of ways
+    node_ids_in_area = nodes_in_area.collect {|node| node.id}.uniq
+    node_ids_used_in_ways = waynodes_in_area.collect {|way_node| way_node.node_id}.uniq
+    node_ids_not_used_in_area = node_ids_in_area - node_ids_used_in_ways
+    nodes_not_used_in_area = Node.find(node_ids_not_used_in_area)
+    points = nodes_not_used_in_area.collect {|n| [n.id, n.lon_potlatch(baselong,masterscale), n.lat_potlatch(basey,masterscale), n.tags_as_hash] }
 
     [ways,points]
   end
 
   # ----- whichways_deleted
   #              return array of deleted ways in current bounding box
-
   #              in:   as whichways
   #              does: finds all deleted ways with a deleted node in bounding box
   #              out:  [0] array of way ids
-
   def whichways_deleted(args)
     xmin = args[0].to_f-0.01
     ymin = args[1].to_f-0.01
@@ -263,8 +249,8 @@ class AmfController < ApplicationController
       node = way_node.node # get the node record
       projected_longitude = node.lon_potlatch(baselong,masterscale) # do projection for potlatch
       projected_latitude = node.lat_potlatch(basey,masterscale)
-      id = node.id # node ide
-      tags_hash = node.tags_as_hash # hash of tags
+      id = node.id
+      tags_hash = node.tags_as_hash
       
       points << [projected_longitude, projected_latitude, id, nil, tags_hash] # FIXME remove the nil in potlatch. performance matters y'know!
       long_array << projected_longitude
diff --git a/app/models/api.rb b/app/models/api.rb
deleted file mode 100644 (file)
index ce56602..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-class Api < ActiveRecord::Base
-
-
-
-end
index 69ce5d6821618929062a58d338f9d29d54cf5a03..08a675b430960d81dc0276584fa75eea0c18de99 100644 (file)
@@ -9,6 +9,7 @@ class Node < GeoRecord
   validate :validate_position
 
   has_many :old_nodes, :foreign_key => :id
+  has_many :way_nodes
   belongs_to :user
  
   def validate_position