class OSMTileGrabber
Public Class Methods
new(lat1, lon1, lat2, lon2, zoom)
click to toggle source
# File lib/osm_tile_grabber/osm_tile_grabber.rb, line 8 def initialize(lat1, lon1, lat2, lon2, zoom) @lat1 = lat1 @lon1 = lon1 @lat2 = lat2 @lon2 = lon2 @zoom = zoom end
Public Instance Methods
create_image(output_path)
click to toggle source
# File lib/osm_tile_grabber/osm_tile_grabber.rb, line 16 def create_image(output_path) self.montage(self.download_tiles, output_path) end
download_tiles()
click to toggle source
# File lib/osm_tile_grabber/osm_tile_grabber.rb, line 58 def download_tiles tile_files = [] tile_numbers_needed.each do |row| row.each do |tn| tile_file = Tempfile.new(["tile-#{@zoom}-#{tn[:x]}-#{tn[:y]}", ".png"]) open(link_from_tile_number(tn[:x], tn[:y]), "rb") do |read_file| tile_file.write(read_file.read) end tile_files << tile_file end end return tile_files end
get_tile_number(lat_as_deg, lon_as_deg)
click to toggle source
# File lib/osm_tile_grabber/osm_tile_grabber.rb, line 44 def get_tile_number(lat_as_deg, lon_as_deg) lat_as_rad = lat_as_deg/180 * Math::PI n = 2.0 ** @zoom x = ((lon_as_deg + 180.0) / 360.0 * n).to_i y = ((1.0 - Math::log(Math::tan(lat_as_rad) + (1 / Math::cos(lat_as_rad))) / Math::PI) / 2.0 * n).to_i return {:x => x, :y =>y} end
image_dimensions()
click to toggle source
# File lib/osm_tile_grabber/osm_tile_grabber.rb, line 35 def image_dimensions top_left_tile = get_tile_number(@lat1, @lon1) bottom_right_tile = get_tile_number(@lat2, @lon2) x = bottom_right_tile[:x] - top_left_tile[:x] y = bottom_right_tile[:y] - top_left_tile[:y] return {x: x + 1, y: y + 1} end
link_from_tile_number(x,y)
click to toggle source
# File lib/osm_tile_grabber/osm_tile_grabber.rb, line 53 def link_from_tile_number(x,y) # TODO: Allow picking own tileserver "https://a.tile.openstreetmap.org/#{@zoom}/#{x}/#{y}.png" end
montage(tiles, output_path)
click to toggle source
# File lib/osm_tile_grabber/osm_tile_grabber.rb, line 72 def montage(tiles, output_path) image_list = ImageList.new *tiles.map{|t| t.path} tile_string = "#{image_dimensions[:x]}x#{image_dimensions[:y]}" tiled_montage = image_list.montage do self.geometry = "+0+0" self.tile = tile_string end tiled_montage.write(output_path) return output_path end
tile_numbers_needed()
click to toggle source
# File lib/osm_tile_grabber/osm_tile_grabber.rb, line 20 def tile_numbers_needed top_left_tile = get_tile_number(@lat1, @lon1) bottom_right_tile = get_tile_number(@lat2, @lon2) tile_matrix = [] (top_left_tile[:y]..bottom_right_tile[:y]).each do |y| row = [] (top_left_tile[:x]..bottom_right_tile[:x]).each do |x| row << {x: x, y: y} end tile_matrix << row end return tile_matrix end