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)
attr_reader :actual_points
attr_reader :tracksegs
- def initialize(filename)
- @filename = filename
+ def initialize(file)
+ @file = file
end
def points
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
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')
#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')
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