From b598ce68ef3219d1b037c9d40bd111a09d7a794d Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Sun, 22 Jul 2007 22:52:46 +0000 Subject: [PATCH] ways from unwayed segments now automatically fix segment direction --- app/controllers/amf_controller.rb | 42 ++++++++++++++++++++++++------ public/potlatch/potlatch.swf | Bin 56470 -> 56482 bytes 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index cad7a1e0f..3bcab182b 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -494,8 +494,12 @@ end # returns way made from unwayed segments def makeway(args) - x,y,baselong,basey,masterscale=args + usertoken,x,y,baselong,basey,masterscale=args + uid=getuserid(usertoken) + return if !uid + points=[] + toreverse=[] # segments to reverse nodesused={} # so we don't go over the same node twice # - find start point near x @@ -537,23 +541,41 @@ def makeway(args) points<<[xs2,ys2,row['id2'].to_i,1,{},row['segid'].to_i] # - extend at start, then end - while (a,point,nodesused=findconnect(points[0][2],nodesused,'b',baselong,basey,masterscale))[0] + while (a,point,nodesused,toreverse=findconnect(points[0][2],nodesused,'b',toreverse,baselong,basey,masterscale))[0] points[0][5]=point[5]; point[5]=0 # segment leads to next node points.unshift(point) xmin=[point[0],xmin].min; xmax=[point[0],xmax].max ymin=[point[1],ymin].min; ymax=[point[1],ymax].max end - while (a,point,nodesused=findconnect(points[-1][2],nodesused,'a',baselong,basey,masterscale))[0] + while (a,point,nodesused,toreverse=findconnect(points[-1][2],nodesused,'a',toreverse,baselong,basey,masterscale))[0] points.push(point) xmin=[point[0],xmin].min; xmax=[point[0],xmax].max ymin=[point[1],ymin].min; ymax=[point[1],ymax].max end points[0][3]=0 # start with a move + # reverse segments in toreverse + if toreverse.length>0 + sql=<<-EOF + UPDATE current_segments c1, current_segments c2 + SET c1.node_a=c2.node_b,c1.node_b=c2.node_a, + c1.timestamp=NOW(),c1.user_id=#{uid} + WHERE c1.id=c2.id + AND c1.id IN (#{toreverse.join(',')}) + EOF + ActiveRecord::Base.connection.update sql + sql=<<-EOF + INSERT INTO segments + (SELECT * FROM current_segments + WHERE id IN (#{toreverse.join(',')})) + EOF + ActiveRecord::Base.connection.insert sql + end + [points,xmin,xmax,ymin,ymax] end -def findconnect(id,nodesused,lookfor,baselong,basey,masterscale) +def findconnect(id,nodesused,lookfor,toreverse,baselong,basey,masterscale) # get all segments with 'id' as a point # (to look for both node_a and node_b, UNION is faster than node_a=id OR node_b=id)! sql=<<-EOF @@ -583,8 +605,8 @@ def findconnect(id,nodesused,lookfor,baselong,basey,masterscale) EOF connectlist=ActiveRecord::Base.connection.select_all sql - if lookfor=='b' then tocol='id1'; tolat='lat1'; tolon='lon1'; fromcol='id2' - else tocol='id2'; tolat='lat2'; tolon='lon2'; fromcol='id1' + if lookfor=='b' then tocol='id1'; tolat='lat1'; tolon='lon1'; fromcol='id2'; fromlat='lat2'; fromlon='lon2' + else tocol='id2'; tolat='lat2'; tolon='lon2'; fromcol='id1'; fromlat='lat1'; fromlon='lon1' end # eliminate those already in the hash @@ -594,9 +616,13 @@ def findconnect(id,nodesused,lookfor,baselong,basey,masterscale) tonode=row[tocol].to_i fromnode=row[fromcol].to_i if id==tonode and !nodesused.has_key?(fromnode) + # wrong way round; add, then add to 'segments to reverse' list connex+=1 nodesused[fromnode]=true + point=[long2coord(row[fromlon].to_f,baselong,masterscale),lat2coord(row[fromlat].to_f,basey,masterscale),fromnode,1,{},row['segid'].to_i] + toreverse.push(row['segid'].to_i) elsif id==fromnode and !nodesused.has_key?(tonode) + # right way round; just add connex+=1 point=[long2coord(row[tolon].to_f,baselong,masterscale),lat2coord(row[tolat].to_f,basey,masterscale),tonode,1,{},row['segid'].to_i] nodesused[tonode]=true @@ -605,9 +631,9 @@ def findconnect(id,nodesused,lookfor,baselong,basey,masterscale) # if only one left, then add it; otherwise return false if connex!=1 or point.nil? then - return [false,[],nodesused] + return [false,[],nodesused,toreverse] else - return [true,point,nodesused] + return [true,point,nodesused,toreverse] end end diff --git a/public/potlatch/potlatch.swf b/public/potlatch/potlatch.swf index f936f7321fe86ab8d1312f3adb98e5c2a22b9870..3302bda3d78f12d755922628878a93919393b8f0 100755 GIT binary patch delta 62 zcmbQXlX=ljW>&ZGV2(u_S^Y#9Uu_N%`6tR~zd2Y-l1Yk*frCY68juw9o5sw*$;Bu$ Rjf;Vkn~|MkbCr(F1^_8A4*>uG delta 50 zcmZ3qlX==sW>&ZGV2)`US^Y#9?`;kd`6tR~yg67)l8KL*fs>0-W*Qd*CpRNI`{p(s GnGFDe+YKE6 -- 2.43.2