Fix picture generation to avoid truncating the sides of the image for
authorTom Hughes <tom@compton.nu>
Sat, 5 Jan 2008 15:23:04 +0000 (15:23 +0000)
committerTom Hughes <tom@compton.nu>
Sat, 5 Jan 2008 15:23:04 +0000 (15:23 +0000)
a trace that is wider than it is tall.

lib/osm.rb

index b14a7f3e8ed32b03b6574123cc7ac401eb82a46c..aca4031ebb047e504a1e0c81ea77d96442d6fdc3 100644 (file)
@@ -18,33 +18,32 @@ module OSM
   class Mercator
     include Math
 
   class Mercator
     include Math
 
-    def initialize(lat, lon, degrees_per_pixel, width, height)
-      #init me with your centre lat/lon, the number of degrees per pixel and the size of your image
-      @clat = lat
-      @clon = lon
-      @degrees_per_pixel = degrees_per_pixel
-      @degrees_per_pixel = 0.0000000001 if @degrees_per_pixel < 0.0000000001
+    #init me with your bounding box and the size of your image
+
+    def initialize(min_lat, min_lon, max_lat, max_lon, width, height)
+      xsize = xsheet(max_lon) - xsheet(min_lon)
+      ysize = ysheet(max_lat) - ysheet(min_lat)
+      xscale = xsize / width
+      yscale = ysize / height
+      scale = [xscale, yscale].max
+
+      xpad = width * scale - xsize
+      ypad = height * scale - ysize
+
       @width = width
       @height = height
       @width = width
       @height = height
-      @dlon = width / 2 * @degrees_per_pixel
-      @dlat = height / 2 * @degrees_per_pixel  * cos(@clat * PI / 180)
 
 
-      @tx = xsheet(@clon - @dlon)
-      @ty = ysheet(@clat - @dlat)
-
-      @bx = xsheet(@clon + @dlon)
-      @by = ysheet(@clat + @dlat)
+      @tx = xsheet(min_lon) - xpad / 2
+      @ty = ysheet(min_lat) - ypad / 2
 
 
+      @bx = xsheet(max_lon) + xpad / 2
+      @by = ysheet(max_lat) + ypad / 2
     end
 
     #the following two functions will give you the x/y on the entire sheet
 
     end
 
     #the following two functions will give you the x/y on the entire sheet
 
-    def kilometerinpixels
-      return 40008.0  / 360.0 * @degrees_per_pixel
-    end
-
     def ysheet(lat)
     def ysheet(lat)
-      log(tan(PI / 4 +  (lat  * PI / 180 / 2)))
+      log(tan(PI / 4 + (lat * PI / 180 / 2))) / (PI / 180)
     end
 
     def xsheet(lon)
     end
 
     def xsheet(lon)
@@ -137,8 +136,7 @@ module OSM
       frames = 10
       width = 250
       height = 250
       frames = 10
       width = 250
       height = 250
-      rat= Math.cos( ((max_lat + min_lat)/2.0) /  180.0 * 3.141592)
-      proj = OSM::Mercator.new((min_lat + max_lat) / 2, (max_lon + min_lon) / 2, (max_lat - min_lat) / width / rat, width, height)
+      proj = OSM::Mercator.new(min_lat, min_lon, max_lat, max_lon, width, height)
 
       linegc = Magick::Draw.new
       linegc.stroke_linejoin('miter')
 
       linegc = Magick::Draw.new
       linegc.stroke_linejoin('miter')
@@ -213,8 +211,7 @@ module OSM
       #puts "getting icon for bbox #{min_lat},#{min_lon} - #{max_lat},#{max_lon}"
       width = 50
       height = 50
       #puts "getting icon for bbox #{min_lat},#{min_lon} - #{max_lat},#{max_lon}"
       width = 50
       height = 50
-      rat= Math.cos( ((max_lat + min_lat)/2.0) /  180.0 * 3.141592)
-      proj = OSM::Mercator.new((min_lat + max_lat) / 2, (max_lon + min_lon) / 2, (max_lat - min_lat) / width / rat, width, height)
+      proj = OSM::Mercator.new(min_lat, min_lon, max_lat, max_lon, width, height)
 
       gc = Magick::Draw.new
       gc.stroke_linejoin('miter')
 
       gc = Magick::Draw.new
       gc.stroke_linejoin('miter')