From: Tom Hughes Date: Wed, 12 Sep 2007 12:14:45 +0000 (+0000) Subject: Use QuadTiling in GPS point queries. X-Git-Tag: live~8123 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/042388418411da6facdfe6ae590df6c17f85e88c Use QuadTiling in GPS point queries. --- diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb index 407f6872a..66b56ce93 100644 --- a/app/controllers/api_controller.rb +++ b/app/controllers/api_controller.rb @@ -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' diff --git a/app/controllers/swf_controller.rb b/app/controllers/swf_controller.rb index b8208050c..b576aae5c 100644 --- a/app/controllers/swf_controller.rb +++ b/app/controllers/swf_controller.rb @@ -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" diff --git a/app/models/tracepoint.rb b/app/models/tracepoint.rb index 70d0f99e8..a8212d482 100644 --- a/app/models/tracepoint.rb +++ b/app/models/tracepoint.rb @@ -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