Tidy up AMF controller and optimise a few rails things.
This commit is contained in:
parent
1cd26357f0
commit
66b0dd135e
1 changed files with 119 additions and 99 deletions
|
@ -110,14 +110,14 @@ class AmfController < ApplicationController
|
||||||
# in a given bounding box. Nodes are returned in full; ways and relations
|
# in a given bounding box. Nodes are returned in full; ways and relations
|
||||||
# are IDs only.
|
# are IDs only.
|
||||||
|
|
||||||
def whichways(xmin,ymin,xmax,ymax) #:doc:
|
def whichways(xmin, ymin, xmax, ymax) #:doc:
|
||||||
xmin-=0.01; ymin-=0.01
|
xmin -= 0.01; ymin -= 0.01
|
||||||
xmax+=0.01; ymax+=0.01
|
xmax += 0.01; ymax += 0.01
|
||||||
|
|
||||||
if POTLATCH_USE_SQL then
|
if POTLATCH_USE_SQL then
|
||||||
way_ids=sql_find_way_ids_in_area(xmin,ymin,xmax,ymax)
|
way_ids = sql_find_way_ids_in_area(xmin, ymin, xmax, ymax)
|
||||||
points=sql_find_pois_in_area(xmin,ymin,xmax,ymax)
|
points = sql_find_pois_in_area(xmin, ymin, xmax, ymax)
|
||||||
relation_ids=sql_find_relations_in_area_and_ways(xmin,ymin,xmax,ymax,way_ids)
|
relation_ids = sql_find_relations_in_area_and_ways(xmin, ymin, xmax, ymax, way_ids)
|
||||||
else
|
else
|
||||||
# find the way ids in an area
|
# find the way ids in an area
|
||||||
nodes_in_area = Node.find_by_area(ymin, xmin, ymax, xmax, :conditions => "current_nodes.visible = 1", :include => :ways)
|
nodes_in_area = Node.find_by_area(ymin, xmin, ymax, xmax, :conditions => "current_nodes.visible = 1", :include => :ways)
|
||||||
|
@ -129,22 +129,23 @@ class AmfController < ApplicationController
|
||||||
|
|
||||||
# find the relations used by those nodes and ways
|
# find the relations used by those nodes and ways
|
||||||
relations = nodes_in_area.collect { |node| node.containing_relations.visible }.flatten +
|
relations = nodes_in_area.collect { |node| node.containing_relations.visible }.flatten +
|
||||||
way_ids.collect { |id| Way.find(id).containing_relations.visible }.flatten
|
way_ids.collect { |id| Way.find(id).containing_relations.visible }.flatten
|
||||||
relation_ids = relations.collect { |relation| relation.id }.uniq
|
relation_ids = relations.collect { |relation| relation.id }.uniq
|
||||||
end
|
end
|
||||||
|
|
||||||
[way_ids,points,relation_ids]
|
[way_ids, points, relation_ids]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Find deleted ways in current bounding box (similar to whichways, but ways
|
# Find deleted ways in current bounding box (similar to whichways, but ways
|
||||||
# with a deleted node only - not POIs or relations).
|
# with a deleted node only - not POIs or relations).
|
||||||
|
|
||||||
def whichways_deleted(xmin,ymin,xmax,ymax) #:doc:
|
def whichways_deleted(xmin, ymin, xmax, ymax) #:doc:
|
||||||
xmin-=0.01; ymin-=0.01
|
xmin -= 0.01; ymin -= 0.01
|
||||||
xmax+=0.01; ymax+=0.01
|
xmax += 0.01; ymax += 0.01
|
||||||
|
|
||||||
nodes_in_area = Node.find_by_area(ymin, xmin, ymax,xmax, :conditions => "current_nodes.visible=0 AND current_ways.visible=0", :include => :ways_via_history )
|
nodes_in_area = Node.find_by_area(ymin, xmin, ymax, xmax, :conditions => "current_nodes.visible = 0 AND current_ways.visible = 0", :include => :ways_via_history)
|
||||||
way_ids = nodes_in_area.collect { |node| node.ways_via_history_ids }.flatten.uniq
|
way_ids = nodes_in_area.collect { |node| node.ways_via_history_ids }.flatten.uniq
|
||||||
|
|
||||||
[way_ids]
|
[way_ids]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -153,20 +154,20 @@ class AmfController < ApplicationController
|
||||||
|
|
||||||
def getway(wayid) #:doc:
|
def getway(wayid) #:doc:
|
||||||
if POTLATCH_USE_SQL then
|
if POTLATCH_USE_SQL then
|
||||||
points=sql_get_nodes_in_way(wayid)
|
points = sql_get_nodes_in_way(wayid)
|
||||||
tags=sql_get_tags_in_way(wayid)
|
tags = sql_get_tags_in_way(wayid)
|
||||||
else
|
else
|
||||||
# Ideally we would do ":include => :nodes" here but if we do that
|
# Ideally we would do ":include => :nodes" here but if we do that
|
||||||
# then rails only seems to return the first copy of a node when a
|
# then rails only seems to return the first copy of a node when a
|
||||||
# way includes a node more than once
|
# way includes a node more than once
|
||||||
points = []
|
|
||||||
way = Way.find(wayid)
|
way = Way.find(wayid)
|
||||||
way.nodes.each do |node|
|
points = way.nodes.collect do |node|
|
||||||
points << [node.lon, node.lat, node.id, nil, node.tags_as_hash]
|
[node.lon, node.lat, node.id, nil, node.tags_as_hash]
|
||||||
end
|
end
|
||||||
tags=way.tags
|
tags = way.tags
|
||||||
end
|
end
|
||||||
[wayid,points,tags]
|
|
||||||
|
[wayid, points, tags]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Get an old version of a way, and all constituent nodes.
|
# Get an old version of a way, and all constituent nodes.
|
||||||
|
@ -176,27 +177,28 @@ class AmfController < ApplicationController
|
||||||
# at the time, generating a new id if it's still visible and has been moved/
|
# at the time, generating a new id if it's still visible and has been moved/
|
||||||
# retagged.
|
# retagged.
|
||||||
|
|
||||||
def getway_old(id,version) #:doc:
|
def getway_old(id, version) #:doc:
|
||||||
if version<0
|
if version < 0
|
||||||
old_way = OldWay.find(:first, :conditions => ['visible=1 AND id=?', id], :order => 'version DESC')
|
old_way = OldWay.find(:first, :conditions => ['visible = 1 AND id = ?', id], :order => 'version DESC')
|
||||||
points = old_way.get_nodes_undelete
|
points = old_way.get_nodes_undelete
|
||||||
else
|
else
|
||||||
old_way = OldWay.find(:first, :conditions => ['id=? AND version=?', id, version])
|
old_way = OldWay.find(:first, :conditions => ['id = ? AND version = ?', id, version])
|
||||||
points = old_way.get_nodes_revert
|
points = old_way.get_nodes_revert
|
||||||
end
|
end
|
||||||
old_way.tags['history']="Retrieved from v#{old_way.version}"
|
|
||||||
[0,id,points,old_way.tags,old_way.version]
|
old_way.tags['history'] = "Retrieved from v#{old_way.version}"
|
||||||
|
|
||||||
|
[0, id, points, old_way.tags, old_way.version]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Find history of a way. Returns an array of previous versions.
|
# Find history of a way. Returns an array of previous versions.
|
||||||
|
|
||||||
def getway_history(wayid) #:doc:
|
def getway_history(wayid) #:doc:
|
||||||
history=[]
|
history = Way.find(wayid).old_ways.collect do |old_way|
|
||||||
way=Way.find(wayid)
|
user = old_way.user.data_public? ? old_way.user.display_name : 'anonymous'
|
||||||
way.old_ways.each do |old_way|
|
[old_way.version, old_way.timestamp.strftime("%d %b %Y, %H:%M"), old_way.visible ? 1 : 0, user]
|
||||||
if old_way.user.data_public then user=old_way.user.display_name else user='anonymous' end
|
|
||||||
history<<[old_way.version,old_way.timestamp.strftime("%d %b %Y, %H:%M"),old_way.visible ? 1 : 0,user]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
[history]
|
[history]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -208,7 +210,8 @@ class AmfController < ApplicationController
|
||||||
|
|
||||||
def getrelation(relid) #:doc:
|
def getrelation(relid) #:doc:
|
||||||
rel = Relation.find(relid)
|
rel = Relation.find(relid)
|
||||||
[relid,rel.tags,rel.members]
|
|
||||||
|
[relid, rel.tags, rel.members]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Save a relation.
|
# Save a relation.
|
||||||
|
@ -217,9 +220,9 @@ class AmfController < ApplicationController
|
||||||
# 1. original relation id (unchanged),
|
# 1. original relation id (unchanged),
|
||||||
# 2. new relation id.
|
# 2. new relation id.
|
||||||
|
|
||||||
def putrelation(renumberednodes, renumberedways, usertoken,relid,tags,members,visible) #:doc:
|
def putrelation(renumberednodes, renumberedways, usertoken, relid, tags, members, visible) #:doc:
|
||||||
uid=getuserid(usertoken)
|
uid = getuserid(usertoken)
|
||||||
if !uid then return -1,"You are not logged in, so the point could not be saved." end
|
if !uid then return -1,"You are not logged in, so the relation could not be saved." end
|
||||||
|
|
||||||
relid = relid.to_i
|
relid = relid.to_i
|
||||||
visible = visible.to_i
|
visible = visible.to_i
|
||||||
|
@ -261,7 +264,7 @@ class AmfController < ApplicationController
|
||||||
rel.save_with_history!
|
rel.save_with_history!
|
||||||
#end
|
#end
|
||||||
|
|
||||||
[0,relid,rel.id]
|
[0, relid, rel.id]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Save a way to the database, including all nodes. Any nodes in the previous
|
# Save a way to the database, including all nodes. Any nodes in the previous
|
||||||
|
@ -273,87 +276,94 @@ class AmfController < ApplicationController
|
||||||
# 2. new way id,
|
# 2. new way id,
|
||||||
# 3. hash of renumbered nodes (old id=>new id)
|
# 3. hash of renumbered nodes (old id=>new id)
|
||||||
|
|
||||||
def putway(renumberednodes,usertoken,originalway,points,attributes) #:doc:
|
def putway(renumberednodes, usertoken, originalway, points, attributes) #:doc:
|
||||||
|
|
||||||
# -- Initialise and carry out checks
|
# -- Initialise and carry out checks
|
||||||
|
|
||||||
uid=getuserid(usertoken)
|
uid = getuserid(usertoken)
|
||||||
if !uid then return -1,"You are not logged in, so the way could not be saved." end
|
if !uid then return -1,"You are not logged in, so the way could not be saved." end
|
||||||
originalway=originalway.to_i
|
|
||||||
|
originalway = originalway.to_i
|
||||||
|
|
||||||
points.each do |a|
|
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
|
if a[2] == 0 or a[2].nil? then return -2,"Server error - node with id 0 found in way #{originalway}." end
|
||||||
if a[1]==90 then return -2,"Server error - node with lat -90 found in way #{originalway}." end
|
if a[1] == 90 then return -2,"Server error - node with lat -90 found in way #{originalway}." end
|
||||||
end
|
end
|
||||||
|
|
||||||
if points.length<2 then return -2,"Server error - way is only #{points.length} points long." end
|
if points.length < 2 then return -2,"Server error - way is only #{points.length} points long." end
|
||||||
|
|
||||||
# -- Get unique nodes
|
# -- Get unique nodes
|
||||||
|
|
||||||
if originalway<0
|
if originalway < 0
|
||||||
way=Way.new
|
way = Way.new
|
||||||
uniques=[]
|
uniques = []
|
||||||
else
|
else
|
||||||
way=Way.find(originalway)
|
way = Way.find(originalway)
|
||||||
uniques=way.unshared_node_ids
|
uniques = way.unshared_node_ids
|
||||||
end
|
end
|
||||||
|
|
||||||
# -- Compare nodes and save changes to any that have changed
|
# -- Compare nodes and save changes to any that have changed
|
||||||
|
|
||||||
nodes=[]
|
nodes = []
|
||||||
|
|
||||||
points.each do |n|
|
points.each do |n|
|
||||||
lon=n[0].to_f
|
lon = n[0].to_f
|
||||||
lat=n[1].to_f
|
lat = n[1].to_f
|
||||||
id =n[2].to_i
|
id = n[2].to_i
|
||||||
savenode=false
|
savenode = false
|
||||||
|
|
||||||
if renumberednodes[id]
|
if renumberednodes[id]
|
||||||
id=renumberednodes[id]
|
id = renumberednodes[id]
|
||||||
elsif id<0
|
elsif id < 0
|
||||||
# Create new node
|
# Create new node
|
||||||
node=Node.new
|
node = Node.new
|
||||||
savenode=true
|
savenode = true
|
||||||
else
|
else
|
||||||
node=Node.find(id)
|
node = Node.find(id)
|
||||||
if (!fpcomp(lat,node.lat) or !fpcomp(lon,node.lon) or \
|
if !fpcomp(lat, node.lat) or !fpcomp(lon, node.lon) or
|
||||||
Tags.join(n[4])!=node.tags or node.visible==0)
|
Tags.join(n[4]) != node.tags or !node.visible?
|
||||||
savenode=true
|
savenode = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if savenode
|
if savenode
|
||||||
node.user_id=uid
|
node.user_id = uid
|
||||||
node.lat=lat; node.lon=lon
|
node.lat = lat
|
||||||
node.tags=Tags.join(n[4])
|
node.lon = lon
|
||||||
node.visible=true
|
node.tags = Tags.join(n[4])
|
||||||
|
node.visible = true
|
||||||
node.save_with_history!
|
node.save_with_history!
|
||||||
if id!=node.id
|
|
||||||
renumberednodes[id]=node.id
|
if id != node.id
|
||||||
id=node.id
|
renumberednodes[id] = node.id
|
||||||
|
id = node.id
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
uniques=uniques-[id]
|
|
||||||
|
uniques = uniques - [id]
|
||||||
nodes.push(id)
|
nodes.push(id)
|
||||||
end
|
end
|
||||||
|
|
||||||
# -- Delete any unique nodes
|
# -- Delete any unique nodes
|
||||||
|
|
||||||
uniques.each do |n|
|
uniques.each do |n|
|
||||||
deleteitemrelations(n,'node')
|
deleteitemrelations(n, 'node')
|
||||||
node=Node.find(n)
|
|
||||||
node.user_id=uid
|
node = Node.find(n)
|
||||||
node.visible=false
|
node.user_id = uid
|
||||||
|
node.visible = false
|
||||||
node.save_with_history!
|
node.save_with_history!
|
||||||
end
|
end
|
||||||
|
|
||||||
# -- Save revised way
|
# -- Save revised way
|
||||||
|
|
||||||
way.tags=attributes
|
way.tags = attributes
|
||||||
way.nds=nodes
|
way.nds = nodes
|
||||||
way.user_id=uid
|
way.user_id = uid
|
||||||
way.visible=true
|
way.visible = true
|
||||||
way.save_with_history!
|
way.save_with_history!
|
||||||
|
|
||||||
[0,originalway,way.id,renumberednodes]
|
[0, originalway, way.id, renumberednodes]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Save POI to the database.
|
# Save POI to the database.
|
||||||
|
@ -363,31 +373,32 @@ class AmfController < ApplicationController
|
||||||
# 1. original node id (unchanged),
|
# 1. original node id (unchanged),
|
||||||
# 2. new node id.
|
# 2. new node id.
|
||||||
|
|
||||||
def putpoi(usertoken,id,lon,lat,tags,visible) #:doc:
|
def putpoi(usertoken, id, lon, lat, tags, visible) #:doc:
|
||||||
uid=getuserid(usertoken)
|
uid = getuserid(usertoken)
|
||||||
if !uid then return -1,"You are not logged in, so the point could not be saved." end
|
if !uid then return -1,"You are not logged in, so the point could not be saved." end
|
||||||
|
|
||||||
id=id.to_i
|
id = id.to_i
|
||||||
visible=(visible.to_i==1)
|
visible = (visible.to_i == 1)
|
||||||
|
|
||||||
|
if id > 0 then
|
||||||
|
node = Node.find(id)
|
||||||
|
|
||||||
if (id>0) then
|
|
||||||
node=Node.find(id)
|
|
||||||
if !visible then
|
if !visible then
|
||||||
unless node.ways.empty? then return -1,"The point has since become part of a way, so you cannot save it as a POI." end
|
unless node.ways.empty? then return -1,"The point has since become part of a way, so you cannot save it as a POI." end
|
||||||
deleteitemrelations(id,'node')
|
deleteitemrelations(id, 'node')
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
node=Node.new
|
node = Node.new
|
||||||
end
|
end
|
||||||
|
|
||||||
node.user_id = uid
|
node.user_id = uid
|
||||||
node.latitude = (lat*10000000).round
|
node.lat = lat
|
||||||
node.longitude = (lon*10000000).round
|
node.lon = lon
|
||||||
node.tags = Tags.join(tags)
|
node.tags = Tags.join(tags)
|
||||||
node.visible=visible
|
node.visible = visible
|
||||||
node.save_with_history!
|
node.save_with_history!
|
||||||
newid=node.id
|
|
||||||
[0,id,newid]
|
[0, id, node.id]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Read POI from database
|
# Read POI from database
|
||||||
|
@ -397,18 +408,19 @@ class AmfController < ApplicationController
|
||||||
|
|
||||||
def getpoi(id) #:doc:
|
def getpoi(id) #:doc:
|
||||||
n = Node.find(id)
|
n = Node.find(id)
|
||||||
|
|
||||||
if n
|
if n
|
||||||
return [n.id, n.lon, n.lat, n.tags_as_hash]
|
return [n.id, n.lon, n.lat, n.tags_as_hash]
|
||||||
else
|
else
|
||||||
return [nil,nil,nil,'']
|
return [nil, nil, nil, '']
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Delete way and all constituent nodes. Also removes from any relations.
|
# Delete way and all constituent nodes. Also removes from any relations.
|
||||||
# Returns 0 (success), unchanged way id.
|
# Returns 0 (success), unchanged way id.
|
||||||
|
|
||||||
def deleteway(usertoken,way_id) #:doc:
|
def deleteway(usertoken, way_id) #:doc:
|
||||||
uid=getuserid(usertoken)
|
uid = getuserid(usertoken)
|
||||||
if !uid then return -1,"You are not logged in, so the way could not be deleted." end
|
if !uid then return -1,"You are not logged in, so the way could not be deleted." end
|
||||||
|
|
||||||
# FIXME: would be good not to make two history entries when removing
|
# FIXME: would be good not to make two history entries when removing
|
||||||
|
@ -416,11 +428,12 @@ class AmfController < ApplicationController
|
||||||
user = User.find(uid)
|
user = User.find(uid)
|
||||||
way = Way.find(way_id)
|
way = Way.find(way_id)
|
||||||
way.unshared_node_ids.each do |n|
|
way.unshared_node_ids.each do |n|
|
||||||
deleteitemrelations(n,'node')
|
deleteitemrelations(n, 'node')
|
||||||
end
|
end
|
||||||
|
|
||||||
way.delete_with_relations_and_nodes_and_history(user)
|
way.delete_with_relations_and_nodes_and_history(user)
|
||||||
return [0,way_id]
|
|
||||||
|
[0, way_id]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -429,11 +442,13 @@ class AmfController < ApplicationController
|
||||||
|
|
||||||
# Remove a node or way from all relations
|
# Remove a node or way from all relations
|
||||||
|
|
||||||
def deleteitemrelations(objid,type) #:doc:
|
def deleteitemrelations(objid, type) #:doc:
|
||||||
relationids = RelationMember.find(:all, :conditions => ['member_type=? and member_id=?', type, objid]).collect { |ws| ws.id }.uniq
|
relations = RelationMember.find(:all,
|
||||||
relationids.each do |relid|
|
:conditions => ['member_type = ? and member_id = ?', type, objid],
|
||||||
rel=Relation.find(relid)
|
:include => :relation).collect { |rm| rm.relation }.uniq
|
||||||
rel.members.delete_if {|x| x[0]==type and x[1]==objid}
|
|
||||||
|
relations.each do |rel|
|
||||||
|
rel.members.delete_if { |x| x[0] == type and x[1] == objid }
|
||||||
rel.save_with_history!
|
rel.save_with_history!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -545,3 +560,8 @@ class AmfController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# indent-tabs-mode: t
|
||||||
|
# tab-width: 4
|
||||||
|
# End:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue