-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
- 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 segment_id IS NULL
- AND cs.visible=1
- AND cn1.id=node_a AND cn1.visible=1
- AND cn2.id=node_b AND cn2.visible=1
- AND node_a=#{id}
- UNION
- 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 segment_id IS NULL
- AND cs.visible=1
- AND cn1.id=node_a AND cn1.visible=1
- AND cn2.id=node_b AND cn2.visible=1
- AND node_b=#{id}
- EOF
- connectlist=ActiveRecord::Base.connection.select_all sql
-
- 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
- connex=0
- point=nil
- connectlist.each { |row|
- 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
- end
- }
-
- # if only one left, then add it; otherwise return false
- if connex!=1 or point.nil? then
- return [false,[],nodesused,toreverse]
- else
- return [true,point,nodesused,toreverse]
- end
-end
-
-
-# ====================================================================
-# Support functions for remote calls
-
-def readwayquery(id)
- 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=#{id} "+
- " AND segment_id=current_segments.id "+
- " AND current_segments.visible=1 "+
- " AND n1.id=node_a and n2.id=node_b "+
- " AND n1.visible=1 AND n2.visible=1 "+
- " ORDER BY sequence_id"
-end