Use QuadTiling in GPS point queries.
authorTom Hughes <tom@compton.nu>
Wed, 12 Sep 2007 12:14:45 +0000 (12:14 +0000)
committerTom Hughes <tom@compton.nu>
Wed, 12 Sep 2007 12:14:45 +0000 (12:14 +0000)
app/controllers/api_controller.rb
app/controllers/swf_controller.rb
app/models/tracepoint.rb

index 407f687..66b56ce 100644 (file)
@@ -63,13 +63,8 @@ class ApiController < ApplicationController
       return
     end
 
-    # integerise
-    min_lat = min_lat * 1000000
-    max_lat = max_lat * 1000000
-    min_lon = min_lon * 1000000
-    max_lon = max_lon * 1000000
     # get all the points
-    points = Tracepoint.find(:all, :conditions => ['latitude BETWEEN ? AND ? AND longitude BETWEEN ? AND ?', min_lat.to_i, max_lat.to_i, min_lon.to_i, max_lon.to_i], :select => "DISTINCT *", :offset => offset, :limit => TRACEPOINTS_PER_PAGE, :order => "timestamp DESC" )
+    points = Tracepoint.find_by_area(min_lat, min_lon, max_lat, max_lon, :select => "DISTINCT *", :offset => offset, :limit => TRACEPOINTS_PER_PAGE, :order => "timestamp DESC" )
 
     doc = XML::Document.new
     doc.encoding = 'UTF-8'
index b820805..b576aae 100644 (file)
@@ -20,10 +20,10 @@ class SwfController < ApplicationController
                basey           =params['basey'].to_f
                masterscale     =params['masterscale'].to_f
        
-               xmin=params['xmin'].to_f; xminr=xmin/0.000001
-               xmax=params['xmax'].to_f; xmaxr=xmax/0.000001
-               ymin=params['ymin'].to_f; yminr=ymin/0.000001
-               ymax=params['ymax'].to_f; ymaxr=ymax/0.000001
+               xmin=params['xmin'].to_f;
+               xmax=params['xmax'].to_f;
+               ymin=params['ymin'].to_f;
+               ymax=params['ymax'].to_f;
        
                # -     Begin movie
        
@@ -51,16 +51,14 @@ class SwfController < ApplicationController
                                 " FROM gpx_files,gps_points "+
                                 "WHERE gpx_files.id=gpx_id "+
                                 "  AND gpx_files.user_id=#{user.id} "+
-                                "  AND (gps_points.longitude BETWEEN #{xminr} AND #{xmaxr}) "+
-                                "  AND (gps_points.latitude BETWEEN #{yminr} AND #{ymaxr}) "+
+                                "  AND "+OSM.sql_for_area(ymin,xmin,ymax,xmax)+
                                 "  AND (gps_points.timestamp IS NOT NULL) "+
                                 "ORDER BY fileid DESC,ts "+
                                 "LIMIT 10000"
                else
                        sql="SELECT latitude*0.000001 AS lat,longitude*0.000001 AS lon,gpx_id AS fileid,UNIX_TIMESTAMP(timestamp) AS ts "+
                                 " FROM gps_points "+
-                                "WHERE (longitude BETWEEN #{xminr} AND #{xmaxr}) "+
-                                "  AND (latitude  BETWEEN #{yminr} AND #{ymaxr}) "+
+                                "WHERE "+OSM.sql_for_area(ymin,xmin,ymax,xmax)+
                                 "  AND (gps_points.timestamp IS NOT NULL) "+
                                 "ORDER BY fileid DESC,ts "+
                                 "LIMIT 10000"
index 70d0f99..a8212d4 100644 (file)
@@ -1,11 +1,17 @@
 class Tracepoint < ActiveRecord::Base
-set_table_name 'gps_points'
+  set_table_name 'gps_points'
 
 #  validates_numericality_of :latitude
 #  validates_numericality_of :longitude
 
   belongs_to :user
   belongs_to :trace, :foreign_key => 'gpx_id'
+  def self.find_by_area(minlat, minlon, maxlat, maxlon, options)
+    self.with_scope(:find => {:conditions => OSM.sql_for_area(minlat, minlon, maxlat, maxlon)}) do
+      return self.find(:all, options)
+    end
+  end
 
   def lat=(l)
     self.latitude = l * 1000000
@@ -29,5 +35,4 @@ set_table_name 'gps_points'
     el1['lon'] = self.lon.to_s
     return el1
   end
-
 end