]> git.openstreetmap.org Git - rails.git/blobdiff - lib/osm.rb
Some node documentation
[rails.git] / lib / osm.rb
index 916cf4d6a4ed757d3b2e436685ab4d19b959d23e..6e9346bb4f0076df8361c9a52b52348a8a426747 100644 (file)
@@ -18,33 +18,32 @@ module OSM
   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
-      @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
 
-    def kilometerinpixels
-      return 40008.0  / 360.0 * @degrees_per_pixel
-    end
-
     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)
@@ -69,8 +68,8 @@ module OSM
     attr_reader :actual_points
     attr_reader :tracksegs
 
-    def initialize(filename)
-      @filename = filename
+    def initialize(file)
+      @file = file
     end
 
     def points
@@ -86,12 +85,16 @@ module OSM
       gotele = false
       gotdate = false
 
-      parser = REXML::Parsers::SAX2Parser.new(File.new(@filename))
+      @file.rewind
+
+      parser = REXML::Parsers::SAX2Parser.new(@file)
 
       parser.listen( :start_element,  %w{ trkpt }) do |uri,localname,qname,attributes| 
         lat = attributes['lat'].to_f
         lon = attributes['lon'].to_f
         gotlatlon = true
+        gotele = false
+        gotdate = false
         @possible_points += 1
       end
 
@@ -135,8 +138,7 @@ module OSM
       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')
@@ -211,8 +213,7 @@ module OSM
       #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')
@@ -423,4 +424,73 @@ module OSM
 
     return "#{tilesql} AND #{prefix}latitude BETWEEN #{minlat} AND #{maxlat} AND #{prefix}longitude BETWEEN #{minlon} AND #{maxlon}"
   end
+
+  class Potlatch # crazy shit
+
+    # ----- getpresets
+    #            in:   none
+    #            does: reads tag preset menus, colours, and autocomplete config files
+    #        out:  [0] presets, [1] presetmenus, [2] presetnames,
+    #                          [3] colours, [4] casing, [5] areas, [6] autotags
+    #                          (all hashes)
+    def self.get_presets
+      RAILS_DEFAULT_LOGGER.info("  Message: getpresets")
+
+      # Read preset menus
+      presets={}
+      presetmenus={}; presetmenus['point']=[]; presetmenus['way']=[]; presetmenus['POI']=[]
+      presetnames={}; presetnames['point']={}; presetnames['way']={}; presetnames['POI']={}
+      presettype=''
+      presetcategory=''
+      #        StringIO.open(txt) do |file|
+      File.open("#{RAILS_ROOT}/config/potlatch/presets.txt") do |file|
+        file.each_line {|line|
+          t=line.chomp
+          if (t=~/(\w+)\/(\w+)/) then
+            presettype=$1
+            presetcategory=$2
+            presetmenus[presettype].push(presetcategory)
+            presetnames[presettype][presetcategory]=["(no preset)"]
+          elsif (t=~/^(.+):\s?(.+)$/) then
+            pre=$1; kv=$2
+            presetnames[presettype][presetcategory].push(pre)
+            presets[pre]={}
+            kv.split(',').each {|a|
+              if (a=~/^(.+)=(.*)$/) then presets[pre][$1]=$2 end
+            }
+          end
+        }
+      end
+
+      # Read colours/styling
+      colours={}; casing={}; areas={}
+      File.open("#{RAILS_ROOT}/config/potlatch/colours.txt") do |file|
+        file.each_line {|line|
+          t=line.chomp
+          if (t=~/(\w+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)/) then
+            tag=$1
+            if ($2!='-') then colours[tag]=$2.hex end
+            if ($3!='-') then casing[tag]=$3.hex end
+            if ($4!='-') then areas[tag]=$4.hex end
+          end
+        }
+      end
+
+      # Read auto-complete
+      autotags={}; autotags['point']={}; autotags['way']={}; autotags['POI']={};
+      File.open("#{RAILS_ROOT}/config/potlatch/autocomplete.txt") do |file|
+        file.each_line {|line|
+          t=line.chomp
+          if (t=~/^(\w+)\/(\w+)\s+(.+)$/) then
+            tag=$1; type=$2; values=$3
+            if values=='-' then autotags[type][tag]=[]
+            else autotags[type][tag]=values.split(',').sort.reverse end
+          end
+        }
+      end
+
+      [presets,presetmenus,presetnames,colours,casing,areas,autotags]
+    end
+  end
+
 end