-# ----- makeway(x,y,baselong,basey,masterscale)
-# returns way made from unwayed segments
-
-def makeway(args)
- x,y,baselong,basey,masterscale=args
- points=[]
- nodesused={} # so we don't go over the same node twice
-
- # - find start point near x
-
- xc=coord2long(x,masterscale,baselong)
- yc=coord2lat(y,masterscale,basey)
-
- RAILS_DEFAULT_LOGGER.info(" Message: makeway, xc=#{xc}, y=#{yc}")
-
- xs1=xc-0.001; xs2=xc+0.001
- ys1=yc-0.001; ys2=yc+0.001
-
- sql=<<-EOF
- SELECT cn1.latitude AS lat1,cn1.longitude AS lon1,cn1.id AS id1,
- cn2.latitude AS lat2,cn2.longitude AS lon2,cn2.id AS id2, cs.id AS segid
- FROM current_nodes AS cn1,
- current_nodes AS cn2,
- current_segments AS cs
- LEFT OUTER JOIN current_way_segments ON segment_id=cs.id
- WHERE (cn1.longitude BETWEEN #{xs1} AND #{xs2})
- AND (cn1.latitude BETWEEN #{ys1} AND #{ys2})
- AND segment_id IS NULL
- AND cn1.id=node_a AND cn1.visible=1
- AND cn2.id=node_b AND cn2.visible=1
- ORDER BY SQRT(POW(cn1.longitude-#{xc},2)+
- POW(cn1.latitude -#{yc},2))
- LIMIT 1
- EOF
- row=ActiveRecord::Base.connection.select_one sql
- if row.nil? then return [0,0,0,0,0] end
- xs1=long2coord(row['lon1'].to_f,baselong,masterscale); ys1=lat2coord(row['lat1'].to_f,basey,masterscale)
- xs2=long2coord(row['lon2'].to_f,baselong,masterscale); ys2=lat2coord(row['lat2'].to_f,basey,masterscale)
- xmin=[xs1,xs2].min; xmax=[xs1,xs2].max
- ymin=[ys1,ys2].min; ymax=[ys1,ys2].max
- nodesused[row['id1'].to_i]=true
- nodesused[row['id2'].to_i]=true
- points<<[xs1,ys1,row['id1'].to_i,1,{},0]
- 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]
- 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]
- 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
-
- [points,xmin,xmax,ymin,ymax]
-end
+ # assign new contents
+ new_relation.members = typedmembers
+ new_relation.tags = tags
+ new_relation.visible = visible
+ new_relation.changeset_id = changeset_id
+ new_relation.version = version
+
+ if relid <= 0
+ # We're creating the relation
+ new_relation.create_with_history(user)
+ elsif visible
+ # We're updating the relation
+ new_relation.id = relid
+ relation.update_from(new_relation, user)
+ else
+ # We're deleting the relation
+ new_relation.id = relid
+ relation.delete_with_history!(new_relation, user)
+ end
+ end # transaction