X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/071c3581e94552e5da08a2eed14e9a69e4f87e4f..34e3e51456774127d43408b7ab65c24f41373f62:/app/controllers/swf_controller.rb diff --git a/app/controllers/swf_controller.rb b/app/controllers/swf_controller.rb index 10ec815db..02e43a87d 100644 --- a/app/controllers/swf_controller.rb +++ b/app/controllers/swf_controller.rb @@ -10,25 +10,23 @@ class SwfController < ApplicationController # ==================================================================== # Public methods - + # ---- trackpoints compile SWF of trackpoints - def trackpoints - + def trackpoints + # - Initialise - + baselong =params['baselong'].to_f basey =params['basey'].to_f masterscale =params['masterscale'].to_f - - xmin=params['xmin'].to_f; - xmax=params['xmax'].to_f; - ymin=params['ymin'].to_f; - ymax=params['ymax'].to_f; + + bbox = BoundingBox.new(params['xmin'], params['ymin'], + params['xmax'], params['ymax']) start=params['start'].to_i; - + # - Begin movie - + bounds_left =0 bounds_right =320*20 bounds_bottom=0 @@ -40,13 +38,13 @@ class SwfController < ApplicationController absy=0 xl=yb= 9999999 xr=yt=-9999999 - + # - Send SQL for GPS tracks - + b='' lasttime=0 lasttrack=lastfile='-1' - + if params['token'] user=User.authenticate(:token => params[:token]) sql="SELECT gps_points.latitude*0.0000001 AS lat,gps_points.longitude*0.0000001 AS lon,gpx_files.id AS fileid,"+ @@ -54,7 +52,7 @@ class SwfController < ApplicationController " FROM gpx_files,gps_points "+ "WHERE gpx_files.id=gpx_id "+ " AND gpx_files.user_id=#{user.id} "+ - " AND "+OSM.sql_for_area(ymin,xmin,ymax,xmax,"gps_points.")+ + " AND "+OSM.sql_for_area(bbox,"gps_points.")+ " AND (gps_points.timestamp IS NOT NULL) "+ "ORDER BY fileid DESC,ts "+ "LIMIT 10000 OFFSET #{start}" @@ -62,15 +60,15 @@ class SwfController < ApplicationController sql="SELECT latitude*0.0000001 AS lat,longitude*0.0000001 AS lon,gpx_id AS fileid,"+ " EXTRACT(EPOCH FROM timestamp) AS ts, gps_points.trackid AS trackid "+ " FROM gps_points "+ - "WHERE "+OSM.sql_for_area(ymin,xmin,ymax,xmax,"gps_points.")+ + "WHERE "+OSM.sql_for_area(bbox,"gps_points.")+ " AND (gps_points.timestamp IS NOT NULL) "+ "ORDER BY fileid DESC,ts "+ "LIMIT 10000 OFFSET #{start}" end gpslist=ActiveRecord::Base.connection.select_all sql - + # - Draw GPS trace lines - + r=startShape() gpslist.each do |row| xs=(long2coord(row['lon'].to_f,baselong,masterscale)*20).floor @@ -90,24 +88,24 @@ class SwfController < ApplicationController r+=[b.slice!(0...80)].pack("B*") end end - + # (Unwayed segments removed) - + # - Write shape - + b+=endShape() r+=[b].pack("B*") m+=swfRecord(2,packUI16(1) + packRect(xl,xr,yb,yt) + r) m+=swfRecord(4,packUI16(1) + packUI16(1)) - + # - Create Flash header and write to browser - + m+=swfRecord(1,'') # Show frame m+=swfRecord(0,'') # End - + m=packRect(bounds_left,bounds_right,bounds_bottom,bounds_top) + 0.chr + 12.chr + packUI16(1) + m m='FWS' + 6.chr + packUI32(m.length+8) + m - + render :text => m, :content_type => "application/x-shockwave-flash" end @@ -115,7 +113,7 @@ class SwfController < ApplicationController # ======================================================================= # SWF functions - + # ----------------------------------------------------------------------- # Line-drawing @@ -127,18 +125,18 @@ class SwfController < ApplicationController s+=34.chr # 2 fill, 2 line index bits s end - + def endShape '000000' end - + def startAndMove(x,y,col) d='001001' # Line style change, moveTo l =[lengthSB(x),lengthSB(y)].max d+=sprintf("%05b%0#{l}b%0#{l}b",l,x,y) d+=col # Select line style end - + def drawTo(absx,absy,x,y) dx=x-absx dy=y-absy @@ -156,7 +154,7 @@ class SwfController < ApplicationController end d end - + def drawSection(x1,y1,x2,y2) d='11' # TypeFlag, EdgeFlag dx=x2-x1 @@ -197,33 +195,33 @@ class SwfController < ApplicationController # ----------------------------------------------------------------------- # Generic pack functions - + def packUI16(n) [n.floor].pack("v") end - + def packUI32(n) [n.floor].pack("V") end - + # Find number of bits required to store arbitrary-length binary - + def lengthSB(n) Math.frexp(n+ (n==0?1:0) )[1]+1 end - + # ==================================================================== # Co-ordinate conversion # (this is duplicated from amf_controller, should probably share) - + def lat2coord(a,basey,masterscale) -(lat2y(a)-basey)*masterscale end - + def long2coord(a,baselong,masterscale) (a-baselong)*masterscale end - + def lat2y(a) 180/Math::PI * Math.log(Math.tan(Math::PI/4+a*(Math::PI/180)/2)) end