- readwayquery_old(wayid,version,historic).each { |row|
- points<<[long2coord(row['longitude'].to_f,baselong,masterscale),lat2coord(row['latitude'].to_f,basey,masterscale),row['id'].to_i,row['visible'].to_i,tag2array(row['tags'].to_s)]
- xmin=[xmin,row['longitude'].to_f].min
- xmax=[xmax,row['longitude'].to_f].max
- ymin=[ymin,row['latitude' ].to_f].min
- ymax=[ymax,row['latitude' ].to_f].max
- }
-
- # get tags from this version
- attributes={}
- attrlist=ActiveRecord::Base.connection.select_all "SELECT k,v FROM way_tags WHERE id=#{wayid} AND version=#{version}"
- attrlist.each {|a| attributes[a['k'].gsub(':','|')]=a['v'] }
- attributes['history']="Retrieved from v"+version.to_s
-
- [0,wayid,points,attributes,xmin,xmax,ymin,ymax,version]
- end
-
- # ----- getway_history
- # find history of a way
- # in: [0] way id
- # does: finds history of a way
- # out: [0] array of previous versions (where each is
- # [0] version, [1] db timestamp (string),
- # [2] visible 0 or 1,
- # [3] username or 'anonymous' (string))
- def getway_history(args) #:doc:
- wayid=args[0]
- history=[]
- sql=<<-EOF
- SELECT version,timestamp,visible,display_name,data_public
- FROM ways,users
- WHERE ways.id=#{wayid}
- AND ways.user_id=users.id
- AND ways.visible=1
- ORDER BY version DESC
- EOF
- histlist=ActiveRecord::Base.connection.select_all(sql)
- histlist.each { |row|
- if row['data_public'].to_i==1 then user=row['display_name'] else user='anonymous' end
- history<<[row['version'],row['timestamp'],row['visible'],user]
- }
- [history]
- end
-
- # ----- putway
- # saves a way to the database
- # in: [0] user token (string),
- # [1] original way id (may be negative),
- # [2] array of points (as getway/getway_old),
- # [3] hash of way tags,
- # [4] original way version (0 if not a reverted/undeleted way),
- # [5] baselong, [6] basey, [7] masterscale
- # does: saves way to the database
- # all constituent nodes are created/updated as necessary
- # (or deleted if they were in the old version and are otherwise unused)
- # out: [0] 0 (code for success), [1] original way id (unchanged),
- # [2] new way id, [3] hash of renumbered nodes (old id=>new id),
- # [4] xmin, [5] xmax, [6] ymin, [7] ymax (unprojected bbox)
- def putway(args,renumberednodes) #:doc:
- RAILS_DEFAULT_LOGGER.info(" putway started")
- usertoken,originalway,points,attributes,oldversion,baselong,basey,masterscale=args
- uid=getuserid(usertoken)
- if !uid then return -1,"You are not logged in, so the way could not be saved." end
-
- RAILS_DEFAULT_LOGGER.info(" putway authenticated happily")
- db_uqn='unin'+(rand*100).to_i.to_s+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'+(rand*100).to_i.to_s+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
- oldversion=oldversion.to_i
-
- RAILS_DEFAULT_LOGGER.info(" Message: putway, id=#{originalway}")
-
- # -- Check for null IDs or short ways
-
- points.each do |a|
- if a[2]==0 or a[2].nil? then return -2,"Server error - node with id 0 found in way #{originalway}." end
+ end
+
+ ##
+ # Find all the ways, POI nodes (i.e. not part of ways), and relations
+ # in a given bounding box. Nodes are returned in full; ways and relations
+ # are IDs only.
+ #
+ # return is of the form:
+ # [success_code, success_message,
+ # [[way_id, way_version], ...],
+ # [[node_id, lat, lon, [tags, ...], node_version], ...],
+ # [[rel_id, rel_version], ...]]
+ # where the ways are any visible ways which refer to any visible
+ # nodes in the bbox, nodes are any visible nodes in the bbox but not
+ # used in any way, rel is any relation which refers to either a way
+ # or node that we're returning.
+ def whichways(xmin, ymin, xmax, ymax)
+ amf_handle_error_with_timeout("'whichways'", nil, nil) do
+ enlarge = [(xmax - xmin) / 8, 0.01].min
+ xmin -= enlarge
+ ymin -= enlarge
+ xmax += enlarge
+ ymax += enlarge
+
+ # check boundary is sane and area within defined
+ # see /config/application.yml
+ bbox = BoundingBox.new(xmin, ymin, xmax, ymax)
+ bbox.check_boundaries
+ bbox.check_size
+
+ if POTLATCH_USE_SQL
+ ways = sql_find_ways_in_area(bbox)
+ points = sql_find_pois_in_area(bbox)
+ relations = sql_find_relations_in_area_and_ways(bbox, ways.collect { |x| x[0] })
+ else
+ # find the way ids in an area
+ nodes_in_area = Node.bbox(bbox).visible.includes(:ways)
+ ways = nodes_in_area.inject([]) do |sum, node|
+ visible_ways = node.ways.select(&:visible?)
+ sum + visible_ways.collect { |w| [w.id, w.version] }
+ end.uniq
+ ways.delete([])
+
+ # find the node ids in an area that aren't part of ways
+ nodes_not_used_in_area = nodes_in_area.select { |node| node.ways.empty? }
+ points = nodes_not_used_in_area.collect { |n| [n.id, n.lon, n.lat, n.tags, n.version] }.uniq
+
+ # find the relations used by those nodes and ways
+ relations = Relation.nodes(nodes_in_area.collect(&:id)).visible +
+ Relation.ways(ways.collect { |w| w[0] }).visible
+ relations = relations.collect { |relation| [relation.id, relation.version] }.uniq
+ end
+
+ [0, "", ways, points, relations]