X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/30ac98deefac506932b546d7711df79effdc55c7..6d07f5661a4530b334ab752044536e8bdb201b02:/app/controllers/amf_controller.rb?ds=sidebyside diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index b318e3eef..d30043e59 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -1,6 +1,9 @@ class AmfController < ApplicationController require 'stringio' + session :off + before_filter :check_availability + # to log: # RAILS_DEFAULT_LOGGER.error("Args: #{args[0]}, #{args[1]}, #{args[2]}, #{args[3]}") @@ -120,6 +123,15 @@ preserved railway: railway=preserved disused railway tracks: railway=disused course of old railway: railway=abandoned +way/natural +forest: natural=wood,landuse=forest +woodland: natural=wood,landuse= +reservoir: natural=water,landuse=reservoir +lake: natural=water,landuse= +marsh: natural=marsh +beach: natural=beach +coastline: natural=coastline + point/road mini roundabout: highway=mini_roundabout traffic lights: highway=traffic_signals @@ -144,6 +156,9 @@ point/railway station: railway=station viaduct: railway=viaduct level crossing: railway=crossing + +point/natural +peak: natural=peak EOF StringIO.open(txt) do |file| @@ -180,12 +195,12 @@ EOF 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 "+ + waylist=WayNode.find_by_sql("SELECT DISTINCT current_way_nodes.id AS wayid"+ + " FROM current_way_nodes,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.id=current_way_nodes.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+")") @@ -295,10 +310,14 @@ EOF # 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 + if renumberednodes[node.to_s].nil? + 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 + else + points[i][2]=renumberednodes[node.to_s].to_i + end elsif xc.has_key?(node) # old node from original way - update @@ -384,7 +403,7 @@ EOF ActiveRecord::Base.connection.execute("DROP TABLE #{db_uqs}") ActiveRecord::Base.connection.execute("DROP TABLE #{db_uqn}") - # insert new version of route into way_segments + # insert new version of route into way_nodes insertsql ='' currentsql='' @@ -398,9 +417,9 @@ EOF 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}"); + ActiveRecord::Base.connection.execute("DELETE FROM current_way_nodes WHERE id=#{way}"); + ActiveRecord::Base.connection.insert("INSERT INTO way_nodes (id,segment_id,version ) VALUES #{insertsql}"); + ActiveRecord::Base.connection.insert("INSERT INTO current_way_nodes (id,segment_id,sequence_id) VALUES #{currentsql}"); # -- 7. insert new way tags @@ -484,7 +503,7 @@ EOF ActiveRecord::Base.connection.insert("INSERT INTO ways (id,user_id,timestamp,visible) VALUES (#{way},#{uid},#{db_now},0)") ActiveRecord::Base.connection.update("UPDATE current_ways SET user_id=#{uid},timestamp=#{db_now},visible=0 WHERE id=#{way}") - ActiveRecord::Base.connection.execute("DELETE FROM current_way_segments WHERE id=#{way}") + ActiveRecord::Base.connection.execute("DELETE FROM current_way_nodes WHERE id=#{way}") ActiveRecord::Base.connection.execute("DELETE FROM current_way_tags WHERE id=#{way}") way @@ -494,14 +513,21 @@ 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 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 @@ -511,13 +537,14 @@ def makeway(args) FROM current_nodes AS cn1, current_nodes AS cn2, current_segments AS cs - LEFT OUTER JOIN current_way_segments ON segment_id=cs.id + LEFT OUTER JOIN current_way_nodes 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 cs.visible=1 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)+ + ORDER BY SQRT(POW(cn1.longitude-#{xc},2)+ POW(cn1.latitude -#{yc},2)) LIMIT 1 EOF @@ -533,23 +560,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 @@ -558,8 +603,9 @@ def findconnect(id,nodesused,lookfor,baselong,basey,masterscale) FROM current_nodes AS cn1, current_nodes AS cn2, current_segments AS cs - LEFT OUTER JOIN current_way_segments ON segment_id=cs.id + LEFT OUTER JOIN current_way_nodes 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} @@ -569,16 +615,17 @@ def findconnect(id,nodesused,lookfor,baselong,basey,masterscale) FROM current_nodes AS cn1, current_nodes AS cn2, current_segments AS cs - LEFT OUTER JOIN current_way_segments ON segment_id=cs.id + LEFT OUTER JOIN current_way_nodes 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' - 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 @@ -588,9 +635,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 @@ -599,9 +650,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 @@ -612,8 +663,8 @@ end 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} "+ + " FROM current_way_nodes,current_segments,current_nodes AS n1,current_nodes AS n2 "+ + " WHERE current_way_nodes.id=#{id} "+ " AND segment_id=current_segments.id "+ " AND current_segments.visible=1 "+ " AND n1.id=node_a and n2.id=node_b "+ @@ -626,9 +677,9 @@ def createuniquesegments(way,uqs_name,seglist) sql=<<-EOF CREATE TEMPORARY TABLE #{uqs_name} SELECT a.segment_id - FROM (SELECT DISTINCT segment_id FROM current_way_segments + FROM (SELECT DISTINCT segment_id FROM current_way_nodes WHERE id = #{way}) a - LEFT JOIN current_way_segments b + LEFT JOIN current_way_nodes b ON b.segment_id = a.segment_id AND b.id != #{way} WHERE b.segment_id IS NULL @@ -685,12 +736,13 @@ def array2tag(a) end def getuserid(token) - token=sqlescape(token) - if (token=~/^(.+)\+(.+)$/) then - return ActiveRecord::Base.connection.select_value("SELECT id FROM users WHERE active=1 AND email='#{$1}' AND pass_crypt=MD5('#{$2}')") + if (token =~ /^(.+)\+(.+)$/) then + user = User.authenticate(:username => $1, :password => $2) else - return ActiveRecord::Base.connection.select_value("SELECT id FROM users WHERE active=1 AND token='#{token}'") + user = User.authenticate(:token => token) end + + return user ? user.id : nil; end