- }
- 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}")
- else
- way=ActiveRecord::Base.connection.insert("INSERT INTO current_ways (user_id,timestamp,visible) VALUES (#{uid},#{db_now},1)")
- end
-
- # -- 4. get version by inserting new row into ways
-
- version=ActiveRecord::Base.connection.insert("INSERT INTO ways (id,user_id,timestamp,visible) VALUES (#{way},#{uid},#{db_now},1)")
-
- # -- 5. compare nodes and update xmin,xmax,ymin,ymax
-
- xmin = ymin = 999999
- xmax = ymax = -999999
- insertsql = ''
- renumberednodes={}
-
- points.each_index do |i|
- xs=coord2long(points[i][0],masterscale,baselong)
- ys=coord2lat(points[i][1],masterscale,basey)
- xmin=[xs,xmin].min; xmax=[xs,xmax].max
- ymin=[ys,ymin].min; ymax=[ys,ymax].max
- node=points[i][2].to_i
- tagstr=array2tag(points[i][4])
- tagsql="'"+sqlescape(tagstr)+"'"
-
- # compare node
- if node<0
- # new node - create
- newnode=ActiveRecord::Base.connection.insert("INSERT INTO current_nodes ( latitude,longitude,timestamp,user_id,visible,tags) VALUES ( #{ys},#{xs},#{db_now},#{uid},1,#{tagsql})")
- ActiveRecord::Base.connection.insert("INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible,tags) VALUES (#{newnode},#{ys},#{xs},#{db_now},#{uid},1,#{tagsql})")
- points[i][2]=newnode
- renumberednodes[node.to_s]=newnode.to_s
-
- elsif xc.has_key?(node)
- # old node from original way - update
- if (xs!=xc[node] or (ys/0.0000001).round!=(yc[node]/0.0000001).round or tagstr!=tagc[node])
- ActiveRecord::Base.connection.insert("INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible,tags) VALUES (#{node},#{ys},#{xs},#{db_now},#{uid},1,#{tagsql})")
- ActiveRecord::Base.connection.update("UPDATE current_nodes SET latitude=#{ys},longitude=#{xs},timestamp=#{db_now},user_id=#{uid},tags=#{tagsql},visible=1 WHERE id=#{node}")