]> git.openstreetmap.org Git - rails.git/blobdiff - lib/quad_tile.rb
Add a C implementation of QuadTile.iterate_tiles_for_area
[rails.git] / lib / quad_tile.rb
index cb1b5a06e1ee7886ce4ce23e7a8019ee399f9e11..70012597b65298b9b9bfeb6c0027145c62865775 100644 (file)
@@ -3,8 +3,8 @@ module QuadTile
     require "quad_tile/quad_tile_so"
   rescue MissingSourceFile
     def self.tile_for_point(lat, lon)
-      x = ((lon + 180) * 65535 / 360).round
-      y = ((lat + 90) * 65535 / 180).round
+      x = ((lon.to_f + 180) * 65535 / 360).round
+      y = ((lat.to_f + 90) * 65535 / 180).round
 
       return tile_for_xy(x, y)
     end
@@ -39,9 +39,28 @@ module QuadTile
 
       return t
     end
+
+    def self.iterate_tiles_for_area(minlat, minlon, maxlat, maxlon)
+      tiles = tiles_for_area(minlat, minlon, maxlat, maxlon)
+      first = last = nil
+
+      tiles.sort.each do |tile|
+        if last.nil?
+          first = last = tile
+        elsif tile == last + 1
+          last = tile
+        else
+          yield first, last
+
+          first = last = tile
+        end
+      end
+
+      yield first, last unless last.nil?
+    end
   end
 
-  def self.sql_for_area(minlat, minlon, maxlat, maxlon)
+  def self.sql_for_area(minlat, minlon, maxlat, maxlon, prefix)
     sql = Array.new
     single = Array.new
 
@@ -49,33 +68,14 @@ module QuadTile
       if first == last
         single.push(first)
       else
-        sql.push("tile BETWEEN #{first} AND #{last}")
+        sql.push("#{prefix}tile BETWEEN #{first} AND #{last}")
       end
     end
 
-    sql.push("tile IN (#{single.join(',')})") if single.size > 0
+    sql.push("#{prefix}tile IN (#{single.join(',')})") if single.size > 0
 
     return "( " + sql.join(" OR ") + " )"
   end
 
-  def self.iterate_tiles_for_area(minlat, minlon, maxlat, maxlon)
-    tiles = tiles_for_area(minlat, minlon, maxlat, maxlon)
-    first = last = nil
-
-    tiles.sort.each do |tile|
-      if last.nil?
-        first = last = tile
-      elsif tile == last + 1
-        last = tile
-      else
-        yield first, last
-
-        first = last = tile
-      end
-    end
-
-    yield first, last unless last.nil?
-  end
-
   private_class_method :tile_for_xy, :iterate_tiles_for_area
 end