Implement route relation parse in car.lua
This commit is contained in:
parent
fa1a4e8bf6
commit
7078ebd2cb
@ -1,10 +1,11 @@
|
||||
-- Car profile
|
||||
|
||||
api_version = 2
|
||||
api_version = 3
|
||||
|
||||
Set = require('lib/set')
|
||||
Sequence = require('lib/sequence')
|
||||
Handlers = require("lib/way_handlers")
|
||||
Relations = require("lib/relations")
|
||||
find_access_tag = require("lib/access").find_access_tag
|
||||
limit = require("lib/maxspeed").limit
|
||||
|
||||
@ -279,7 +280,7 @@ function setup()
|
||||
}
|
||||
end
|
||||
|
||||
function process_node(profile, node, result)
|
||||
function process_node(profile, node, result, relations)
|
||||
-- parse access and barrier tags
|
||||
local access = find_access_tag(node, profile.access_tags_hierarchy)
|
||||
if access then
|
||||
@ -306,7 +307,7 @@ function process_node(profile, node, result)
|
||||
end
|
||||
end
|
||||
|
||||
function process_way(profile, way, result)
|
||||
function process_way(profile, way, result, relations)
|
||||
-- the intial filtering of ways based on presence of tags
|
||||
-- affects processing times significantly, because all ways
|
||||
-- have to be checked.
|
||||
@ -390,6 +391,51 @@ function process_way(profile, way, result)
|
||||
}
|
||||
|
||||
WayHandlers.run(profile,way,result,data,handlers)
|
||||
|
||||
-- now process relations data
|
||||
local data = Relations.Merge(relations)
|
||||
local direction = data["route_direction"]
|
||||
if direction then
|
||||
if result.ref then
|
||||
if result.ref:len() > 0 then
|
||||
result.ref = result.ref .. ' ' .. direction
|
||||
else
|
||||
result.ref = direction
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function process_relation(profile, relation, result)
|
||||
local t = relation:get_value_by_key("type")
|
||||
|
||||
if t == "route" then
|
||||
local route = relation:get_value_by_key("route")
|
||||
if route == "road" then
|
||||
for _, m in ipairs(relation:members()) do
|
||||
-- process case, where directions set as role
|
||||
local role = string.lower(m:role())
|
||||
if role == "north" or role == "south" or role == "west" or role == "east" then
|
||||
result[m]["route_direction"] = role
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local direction = relation:get_value_by_key("direction")
|
||||
if direction then
|
||||
direction = string.lower(direction)
|
||||
if direction == "north" or direction == "south" or direction == "west" or direction == "east" then
|
||||
for _, m in ipairs(relation:members()) do
|
||||
if m:role() == "forward" then
|
||||
result[m]["route_direction"] = direction
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
end
|
||||
|
||||
function process_turn(profile, turn)
|
||||
@ -434,5 +480,6 @@ return {
|
||||
setup = setup,
|
||||
process_way = process_way,
|
||||
process_node = process_node,
|
||||
process_relation = process_relation,
|
||||
process_turn = process_turn
|
||||
}
|
||||
|
20
profiles/lib/relations.lua
Normal file
20
profiles/lib/relations.lua
Normal file
@ -0,0 +1,20 @@
|
||||
-- Profile functions dealing with various aspects of relation parsing
|
||||
--
|
||||
-- You can run a selection you find useful in your profile,
|
||||
-- or do you own processing if/when required.
|
||||
|
||||
Relations = {}
|
||||
|
||||
function Relations.Merge(relations)
|
||||
local result = {}
|
||||
|
||||
for _, r in ipairs(relations) do
|
||||
for k, v in pairs(r) do
|
||||
result[k] = v
|
||||
end
|
||||
end
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
return Relations
|
Loading…
Reference in New Issue
Block a user