- def whichways(args)
- waylist=WaySegment.find_by_sql("SELECT DISTINCT current_way_segments.id AS wayid"+
- " FROM current_way_segments,current_segments,current_nodes "+
- " WHERE segment_id=current_segments.id "+
- " AND node_a=current_nodes.id "+
- " AND (latitude BETWEEN "+(args[1].to_f-0.01).to_s+" AND "+(args[3].to_f+0.01).to_s+") "+
- " AND (longitude BETWEEN "+(args[0].to_f-0.01).to_s+" AND "+(args[2].to_f+0.01).to_s+")")
- ways=[]
- waylist.each {|a|
- ways<<a.wayid.to_i
-RAILS_DEFAULT_LOGGER.error("Found #{a.wayid.to_i}")
- }
- ways
- end
-
- def getway(args)
- objname,wayid,$baselong,$basey,$masterscale=args
- wayid=wayid.to_i
- points=[]
- lastid=-1
- xmin=999999; xmax=-999999
- ymin=999999; ymax=-999999
-
-RAILS_DEFAULT_LOGGER.error("Looking for way #{wayid}")
- nodelist=ActiveRecord::Base.connection.select_all "SELECT n1.latitude AS lat1,n1.longitude AS long1,n1.id AS id1,n1.tags as tags1, "+
- " n2.latitude AS lat2,n2.longitude AS long2,n2.id AS id2,n2.tags as tags2,segment_id "+
- " FROM current_way_segments,current_segments,current_nodes AS n1,current_nodes AS n2 "+
- " WHERE current_way_segments.id=#{wayid} "+
- " AND segment_id=current_segments.id "+
- " AND n1.id=node_a and n2.id=node_b "+
- " ORDER BY sequence_id"
- nodelist.each {|row|
- xs1=long2coord(row['long1'].to_f); ys1=lat2coord(row['lat1'].to_f)
- xs2=long2coord(row['long2'].to_f); ys2=lat2coord(row['lat2'].to_f)
- if (row['id1'].to_i!=lastid)
- points<<[xs1,ys1,row['id1'].to_i,0,tag2array(row['tags1']),0]
- end
- 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'] }
-
-RAILS_DEFAULT_LOGGER.error("Way #{wayid} #{xmin},#{xmax},#{ymin},#{ymax}")
- [objname,points,attributes,xmin,xmax,ymin,ymax]
- end
-
- def putway(args)
- # to do
- end
-
- def deleteway(args)
- # to do
- end
+ 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}")
+ end
+ else
+ # old node, created in another way and now added to this way
+ end
+
+ end
+
+
+ # -- 6.i compare segments
+
+ numberedsegments={}
+ seglist='' # list of existing segments that we want to keep
+ for i in (0..(points.length-2))
+ if (points[i+1][3].to_i==0) then next end
+ segid=points[i+1][5].to_i
+ from =points[i ][2].to_i
+ to =points[i+1][2].to_i
+ if seg.has_key?(segid)
+ # if segment exists, check it still refers to the same nodes
+ if seg[segid]=="#{from}-#{to}" then
+ if (seglist!='') then seglist+=',' end; seglist+=segid.to_s
+ next
+ end
+ elsif segid>0
+ # not in previous version of way, but supplied, so assume
+ # that it's come from makeway (i.e. unwayed segments)
+ if (seglist!='') then seglist+=',' end; seglist+=segid.to_s
+ next
+ end
+ segid=ActiveRecord::Base.connection.insert("INSERT INTO current_segments ( node_a,node_b,timestamp,user_id,visible,tags) VALUES ( #{from},#{to},#{db_now},#{uid},1,'')")
+ ActiveRecord::Base.connection.insert("INSERT INTO segments (id,node_a,node_b,timestamp,user_id,visible,tags) VALUES (#{segid},#{from},#{to},#{db_now},#{uid},1,'')")
+ points[i+1][5]=segid
+ numberedsegments[(i+1).to_s]=segid.to_s
+ end
+
+
+ # -- 6.ii insert new way segments
+
+ createuniquesegments(way,db_uqs,seglist) # segments which appear in this way but no other
+
+ # delete segments from uniquesegments (and not in modified way)
+
+ sql=<<-EOF
+ INSERT INTO segments (id,node_a,node_b,timestamp,user_id,visible)
+ SELECT DISTINCT segment_id,node_a,node_b,#{db_now},#{uid},0
+ FROM current_segments AS cs, #{db_uqs} AS us
+ WHERE cs.id=us.segment_id AND cs.visible=1
+ EOF
+ ActiveRecord::Base.connection.insert(sql)
+
+ sql=<<-EOF
+ UPDATE current_segments AS cs, #{db_uqs} AS us
+ SET cs.timestamp=#{db_now},cs.visible=0,cs.user_id=#{uid}
+ WHERE cs.id=us.segment_id AND cs.visible=1
+ EOF
+ ActiveRecord::Base.connection.update(sql)
+
+ # delete nodes not in modified way or any other segments
+
+ createuniquenodes(db_uqs,db_uqn) # nodes which appear in this way but no other
+
+ sql=<<-EOF
+ INSERT INTO nodes (id,latitude,longitude,timestamp,user_id,visible)
+ SELECT DISTINCT cn.id,cn.latitude,cn.longitude,#{db_now},#{uid},0
+ FROM current_nodes AS cn,#{db_uqn}
+ WHERE cn.id=node_id
+ EOF
+ ActiveRecord::Base.connection.insert(sql)
+
+ sql=<<-EOF
+ UPDATE current_nodes AS cn, #{db_uqn}
+ SET cn.timestamp=#{db_now},cn.visible=0,cn.user_id=#{uid}
+ WHERE cn.id=node_id
+ EOF
+ ActiveRecord::Base.connection.update(sql)
+
+ ActiveRecord::Base.connection.execute("DROP TABLE #{db_uqs}")
+ ActiveRecord::Base.connection.execute("DROP TABLE #{db_uqn}")
+
+ # insert new version of route into way_segments
+
+ insertsql =''
+ currentsql=''
+ sequence =1
+ for i in (0..(points.length-2))
+ if (points[i+1][3].to_i==0) then next end
+ if insertsql !='' then insertsql +=',' end
+ if currentsql!='' then currentsql+=',' end
+ insertsql +="(#{way},#{points[i+1][5]},#{version})"
+ currentsql+="(#{way},#{points[i+1][5]},#{sequence})"
+ sequence +=1
+ end
+
+ ActiveRecord::Base.connection.execute("DELETE FROM current_way_segments WHERE id=#{way}");
+ ActiveRecord::Base.connection.insert("INSERT INTO way_segments (id,segment_id,version ) VALUES #{insertsql}");
+ ActiveRecord::Base.connection.insert("INSERT INTO current_way_segments (id,segment_id,sequence_id) VALUES #{currentsql}");
+
+ # -- 7. insert new way tags
+
+ insertsql =''
+ currentsql=''
+ attributes.each do |k,v|
+ if v=='' or v.nil? then next end
+ if v[0,6]=='(type ' then next end
+ if insertsql !='' then insertsql +=',' end
+ if currentsql!='' then currentsql+=',' end
+ k=k.gsub(/[\000-\037]/,"")
+ v=v.gsub(/[\000-\037]/,"")
+ insertsql +="(#{way},'"+sqlescape(k)+"','"+sqlescape(v)+"',#{version})"
+ currentsql+="(#{way},'"+sqlescape(k)+"','"+sqlescape(v)+"')"
+ end
+
+ ActiveRecord::Base.connection.execute("DELETE FROM current_way_tags WHERE id=#{way}")
+ if (insertsql !='') then ActiveRecord::Base.connection.insert("INSERT INTO way_tags (id,k,v,version) VALUES #{insertsql}" ) end
+ if (currentsql!='') then ActiveRecord::Base.connection.insert("INSERT INTO current_way_tags (id,k,v) VALUES #{currentsql}") end
+
+ [originalway,way,renumberednodes,numberedsegments,xmin,xmax,ymin,ymax]
+ end
+
+ # ----- putpoi (user token, id, x,y,tag array,visible,baselong,basey,masterscale)
+ # returns current id, new id
+ # if new: add new row to current_nodes and nodes
+ # if old: add new row to nodes, update current_nodes
+
+ def putpoi(args)
+ usertoken,id,x,y,tags,visible,baselong,basey,masterscale=args
+ uid=getuserid(usertoken)
+ return if !uid
+ db_now='@now'+uid.to_s+id.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()")
+
+ id=id.to_i
+ visible=visible.to_i
+ x=coord2long(x.to_f,masterscale,baselong)
+ y=coord2lat(y.to_f,masterscale,basey)
+ tagsql="'"+sqlescape(array2tag(tags))+"'"