- }
- end
- return [presets,presetmenus,presetnames]
- end
-
- # ----- whichways(left,bottom,right,top)
- # return array of ways in current bounding box
- # at present, instead of using correct (=more complex) SQL to find
- # corner-crossing ways, it simply enlarges the bounding box by +/- 0.01
-
- def whichways(args)
- xmin = args[0].to_f-0.01
- ymin = args[1].to_f-0.01
- xmax = args[2].to_f+0.01
- ymax = args[3].to_f+0.01
-
- RAILS_DEFAULT_LOGGER.info(" Message: whichways, bbox=#{xmin},#{ymin},#{xmax},#{ymax}")
-
- waylist=WaySegment.find_by_sql("SELECT DISTINCT current_way_segments.id AS wayid"+
- " FROM current_way_segments,current_segments,current_nodes,current_ways "+
- " WHERE segment_id=current_segments.id "+
- " AND current_segments.visible=1 "+
- " AND node_a=current_nodes.id "+
- " AND current_ways.id=current_way_segments.id "+
- " AND current_ways.visible=1 "+
- " AND (latitude BETWEEN "+ymin.to_s+" AND "+ymax.to_s+") "+
- " AND (longitude BETWEEN "+xmin.to_s+" AND "+xmax.to_s+")")
-
- ways = waylist.collect {|a| a.wayid.to_i } # get an array of way id's
-
- pointlist =ActiveRecord::Base.connection.select_all("SELECT current_nodes.id,current_nodes.tags "+
- " FROM current_nodes "+
- " LEFT OUTER JOIN current_segments cs1 ON cs1.node_a=current_nodes.id "+
- " LEFT OUTER JOIN current_segments cs2 ON cs2.node_b=current_nodes.id "+
- " WHERE (latitude BETWEEN "+ymin.to_s+" AND "+ymax.to_s+") "+
- " AND (longitude BETWEEN "+xmin.to_s+" AND "+xmax.to_s+") "+
- " AND cs1.id IS NULL AND cs2.id IS NULL "+
- " AND current_nodes.visible=1")
-
- points = pointlist.collect {|a| [a['id'],tag2array(a['tags'])] } # get a list of node ids and their tags
-
- return [ways,points]
- end
-
- # ----- getway (objectname, way, baselong, basey, masterscale)
- # returns objectname, array of co-ordinates, attributes,
- # xmin,xmax,ymin,ymax
-
- def getway(args)
- objname,wayid,baselong,basey,masterscale=args
- wayid = wayid.to_i
- points = []
- lastid = -1
- xmin = ymin = 999999
- xmax = ymax = -999999
-
- RAILS_DEFAULT_LOGGER.info(" Message: getway, id=#{wayid}")
-
- readwayquery(wayid).each {|row|
- xs1=long2coord(row['long1'].to_f,baselong,masterscale); ys1=lat2coord(row['lat1'].to_f,basey,masterscale)
- xs2=long2coord(row['long2'].to_f,baselong,masterscale); ys2=lat2coord(row['lat2'].to_f,basey,masterscale)
- points << [xs1,ys1,row['id1'].to_i,0,tag2array(row['tags1']),0] if (row['id1'].to_i!=lastid)
- lastid = row['id2'].to_i
- points << [xs2,ys2,row['id2'].to_i,1,tag2array(row['tags2']),row['segment_id'].to_i]
- xmin = [xmin,row['long1'].to_f,row['long2'].to_f].min
- xmax = [xmax,row['long1'].to_f,row['long2'].to_f].max
- ymin = [ymin,row['lat1'].to_f,row['lat2'].to_f].min
- ymax = [ymax,row['lat1'].to_f,row['lat2'].to_f].max
- }
-
- attributes={}
- attrlist=ActiveRecord::Base.connection.select_all "SELECT k,v FROM current_way_tags WHERE id=#{wayid}"
- attrlist.each {|a| attributes[a['k']]=a['v'] }
-
- [objname,points,attributes,xmin,xmax,ymin,ymax]
- end
-
- # ----- putway (user token, way, array of co-ordinates, array of attributes,
- # baselong, basey, masterscale)
- # returns current way ID, new way ID, hash of renumbered nodes,
- # xmin,xmax,ymin,ymax
-
- def putway(args)
- usertoken,originalway,points,attributes,baselong,basey,masterscale=args
- uid=getuserid(usertoken)
- return if !uid
- db_uqs='uniq'+uid.to_s+originalway.to_i.abs.to_s+Time.new.to_i.to_s # temp uniquesegments table name, typically 51 chars
- db_uqn='unin'+uid.to_s+originalway.to_i.abs.to_s+Time.new.to_i.to_s # temp uniquenodes table name, typically 51 chars
- db_now='@now'+uid.to_s+originalway.to_i.abs.to_s+Time.new.to_i.to_s # 'now' variable name, typically 51 chars
- ActiveRecord::Base.connection.execute("SET #{db_now}=NOW()")
- originalway=originalway.to_i
-
- RAILS_DEFAULT_LOGGER.info(" Message: putway, id=#{originalway}")
-
- # -- 3. read original way into memory
-
- xc={}; yc={}; tagc={}; seg={}
- if originalway>0
- way=originalway
- readwayquery(way).each { |row|
- id1=row['id1'].to_i; xc[id1]=row['long1'].to_f; yc[id1]=row['lat1'].to_f; tagc[id1]=row['tags1']
- id2=row['id2'].to_i; xc[id2]=row['long2'].to_f; yc[id2]=row['lat2'].to_f; tagc[id2]=row['tags2']
- seg[row['segment_id'].to_i]=id1.to_s+'-'+id2.to_s
- }
- ActiveRecord::Base.connection.update("UPDATE current_ways SET timestamp=#{db_now},user_id=#{uid},visible=1 WHERE id=#{way}")