- # ====================================================================
- # Remote calls
-
- # ----- getpresets
- # return presets,presetmenus and presetnames arrays
-
- def getpresets
- presets={}
- presetmenus={}; presetmenus['point']=[]; presetmenus['way']=[]; presetmenus['POI']=[]
- presetnames={}; presetnames['point']={}; presetnames['way']={}; presetnames['POI']={}
- presettype=''
- presetcategory=''
-
- RAILS_DEFAULT_LOGGER.info(" Message: getpresets")
-
- # File.open("config/potlatch/presets.txt") do |file|
-
- # Temporary patch to get around filepath problem
- # To remove this patch and make the code nice again:
- # 1. uncomment above line
- # 2. fix the path in the above line
- # 3. delete this here document, and the following line (StringIO....)
-
- txt=<<-EOF
-way/road
-motorway: highway=motorway,ref=(type road number)
-trunk road: highway=trunk,ref=(type road number),name=(type road name)
-primary road: highway=primary,ref=(type road number),name=(type road name)
-secondary road: highway=secondary,ref=(type road number),name=(type road name)
-residential road: highway=residential,name=(type road name)
-unclassified road: highway=unclassified,name=(type road name)
-
-way/footway
-footpath: highway=footway,foot=yes
-bridleway: highway=bridleway,foot=yes
-byway: highway=unsurfaced,foot=yes
-permissive path: highway=footway,foot=permissive
-
-way/cycleway
-cycle lane: highway=cycleway,cycleway=lane,ncn_ref=
-cycle track: highway=cycleway,cycleway=track,ncn_ref=
-cycle lane (NCN): highway=cycleway,cycleway=lane,name=(type name here),ncn_ref=(type route number)
-cycle track (NCN): highway=cycleway,cycleway=track,name=(type name here),ncn_ref=(type route number)
-
-way/waterway
-canal: waterway=canal,name=(type name here)
-navigable river: waterway=river,boat=yes,name=(type name here)
-navigable drain: waterway=drain,boat=yes,name=(type name here)
-derelict canal: waterway=derelict_canal,name=(type name here)
-unnavigable river: waterway=river,boat=no,name=(type name here)
-unnavigable drain: waterway=drain,boat=no,name=(type name here)
-
-way/railway
-railway: railway=rail
-tramway: railway=tram
-light railway: railway=light_rail
-preserved railway: railway=preserved
-disused railway tracks: railway=disused
-course of old railway: railway=abandoned
-
-way/natural
-lake: landuse=water
-forest: landuse=forest
-
-point/road
-mini roundabout: highway=mini_roundabout
-traffic lights: highway=traffic_signals
-
-point/footway
-bridge: highway=bridge
-gate: highway=gate
-stile: highway=stile
-cattle grid: highway=cattle_grid
-
-point/cycleway
-gate: highway=gate
-
-point/waterway
-lock gate: waterway=lock_gate
-weir: waterway=weir
-aqueduct: waterway=aqueduct
-winding hole: waterway=turning_point
-mooring: waterway=mooring
-
-point/railway
-station: railway=station
-viaduct: railway=viaduct
-level crossing: railway=crossing
-
-point/natural
-peak: point=peak
-
-POI/road
-car park: amenity=parking
-petrol station: amenity=fuel
-
-POI/cycleway
-bike park: amenity=bicycle_parking
-
-POI/place
-city: place=city,name=(type name here),is_in=(type region or county)
-town: place=town,name=(type name here),is_in=(type region or county)
-suburb: place=suburb,name=(type name here),is_in=(type region or county)
-village: place=village,name=(type name here),is_in=(type region or county)
-hamlet: place=hamlet,name=(type name here),is_in=(type region or county)
-
-POI/tourism
-attraction: tourism=attraction,amenity=,religion=,denomination=
-church: tourism=,amenity=place_of_worship,name=(type name here),religion=christian,denomination=(type denomination here)
-hotel: tourism=hotel,amenity=,religion=,denomination=
-other religious: tourism=,amenity=place_of_worship,name=(type name here),religion=(type religion),denomination=
-post box: amenity=post_box,tourism=,name=,religion=,denomination=
-post office: amenity=post_office,tourism=,name=,religion=,denomination=
-pub: tourism=,amenity=pub,name=(type name here),religion=,denomination=
-
-POI/natural
-peak: point=peak
-EOF
-
- StringIO.open(txt) do |file|
- file.each_line {|line|
- t=line.chomp
- if (t=~/(\w+)\/(\w+)/) then
- presettype=$1
- presetcategory=$2
- presetmenus[presettype].push(presetcategory)
- presetnames[presettype][presetcategory]=["(no preset)"]
- elsif (t=~/^(.+):\s?(.+)$/) then
- pre=$1; kv=$2
- presetnames[presettype][presetcategory].push(pre)
- presets[pre]={}
- kv.split(',').each {|a|
- if (a=~/^(.+)=(.*)$/) then presets[pre][$1]=$2 end
- }
- end
- }
- end
- return [presets,presetmenus,presetnames]
- end
-
- # ----- whichways(left,bottom,right,top)
- # return array of ways in current bounding box
- # at present, instead of using correct (=more complex) SQL to find
- # corner-crossing ways, it simply enlarges the bounding box by +/- 0.01
-
- def whichways(args)
- xmin = args[0].to_f-0.01
- ymin = args[1].to_f-0.01
- xmax = args[2].to_f+0.01
- ymax = args[3].to_f+0.01
- baselong = args[4]
- basey = args[5]
- masterscale = args[6]
-
- RAILS_DEFAULT_LOGGER.info(" Message: whichways, bbox=#{xmin},#{ymin},#{xmax},#{ymax}")
-
- 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_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+")")
-
- ways = waylist.collect {|a| a.wayid.to_i } # get an array of way id's
-
- pointlist =ActiveRecord::Base.connection.select_all("SELECT current_nodes.id,latitude,longitude,current_nodes.tags "+
- " FROM current_nodes "+
- " LEFT OUTER JOIN current_segments cs1 ON cs1.node_a=current_nodes.id "+
- " LEFT OUTER JOIN current_segments cs2 ON cs2.node_b=current_nodes.id "+
- " WHERE (latitude BETWEEN "+ymin.to_s+" AND "+ymax.to_s+") "+
- " AND (longitude BETWEEN "+xmin.to_s+" AND "+xmax.to_s+") "+
- " AND cs1.id IS NULL AND cs2.id IS NULL "+
- " AND current_nodes.visible=1")
-
- points = pointlist.collect {|a| [a['id'],long2coord(a['longitude'].to_f,baselong,masterscale),lat2coord(a['latitude'].to_f,basey,masterscale),tag2array(a['tags'])] } # get a list of node ids and their tags
-
- return [ways,points]
- end
-
- # ----- getway (objectname, way, baselong, basey, masterscale)
- # returns objectname, array of co-ordinates, attributes,
- # xmin,xmax,ymin,ymax
-
- def getway(args)
- objname,wayid,baselong,basey,masterscale=args
- wayid = wayid.to_i
- points = []
- lastid = -1
- xmin = ymin = 999999
- xmax = ymax = -999999
-
- RAILS_DEFAULT_LOGGER.info(" Message: getway, id=#{wayid}")
-
- readwayquery(wayid).each {|row|
- xs1=long2coord(row['long1'].to_f,baselong,masterscale); ys1=lat2coord(row['lat1'].to_f,basey,masterscale)
- xs2=long2coord(row['long2'].to_f,baselong,masterscale); ys2=lat2coord(row['lat2'].to_f,basey,masterscale)
- points << [xs1,ys1,row['id1'].to_i,0,tag2array(row['tags1']),0] if (row['id1'].to_i!=lastid)
- 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'] }
-
- [objname,points,attributes,xmin,xmax,ymin,ymax]
- end
-
- # ----- putway (user token, way, array of co-ordinates, array of attributes,
- # baselong, basey, masterscale)
- # returns current way ID, new way ID, hash of renumbered nodes,
- # xmin,xmax,ymin,ymax
-
- def putway(args)
- usertoken,originalway,points,attributes,baselong,basey,masterscale=args
- uid=getuserid(usertoken)
- return if !uid
- db_uqs='uniq'+uid.to_s+originalway.to_i.abs.to_s+Time.new.to_i.to_s # temp uniquesegments table name, typically 51 chars
- db_uqn='unin'+uid.to_s+originalway.to_i.abs.to_s+Time.new.to_i.to_s # temp uniquenodes table name, typically 51 chars
- db_now='@now'+uid.to_s+originalway.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()")
- originalway=originalway.to_i
-
- RAILS_DEFAULT_LOGGER.info(" Message: putway, id=#{originalway}")
-
- # -- 3. read original way into memory
-
- xc={}; yc={}; tagc={}; seg={}
- if originalway>0
- way=originalway
- readwayquery(way).each { |row|
- id1=row['id1'].to_i; xc[id1]=row['long1'].to_f; yc[id1]=row['lat1'].to_f; tagc[id1]=row['tags1']
- id2=row['id2'].to_i; xc[id2]=row['long2'].to_f; yc[id2]=row['lat2'].to_f; tagc[id2]=row['tags2']
- seg[row['segment_id'].to_i]=id1.to_s+'-'+id2.to_s
- }
- ActiveRecord::Base.connection.update("UPDATE current_ways SET timestamp=#{db_now},user_id=#{uid},visible=1 WHERE id=#{way}")
- else
- way=ActiveRecord::Base.connection.insert("INSERT INTO current_ways (user_id,timestamp,visible) VALUES (#{uid},#{db_now},1)")
- end