Feature/speed unit (#67)
* Update tags.lua To get speed unit * Update way_handlers.lua Adjust speed by speed unit * Create test_speed_unit.lua To test speed unit parser * Take speed unit as input in speed parser
This commit is contained in:
parent
85a8cc645f
commit
562226b582
@ -263,9 +263,10 @@ function handle_bicycle_tags(profile,way,result,data)
|
|||||||
|
|
||||||
-- other tags
|
-- other tags
|
||||||
data.junction = way:get_value_by_key("junction")
|
data.junction = way:get_value_by_key("junction")
|
||||||
data.maxspeed = Measure.get_max_speed(way:get_value_by_key ("maxspeed")) or 0
|
data.maxspeed = Measure.get_max_speed(way:get_value_by_key("maxspeed"), way:get_value_by_key("speed_unit")) or 0
|
||||||
data.maxspeed_forward = Measure.get_max_speed(way:get_value_by_key("maxspeed:forward")) or 0
|
data.maxspeed_forward = Measure.get_max_speed(way:get_value_by_key("maxspeed:forward"), way:get_value_by_key("speed_unit")) or 0
|
||||||
data.maxspeed_backward = Measure.get_max_speed(way:get_value_by_key("maxspeed:backward")) or 0
|
data.maxspeed_backward = Measure.get_max_speed(way:get_value_by_key("maxspeed:backward"), way:get_value_by_key("speed_unit")) or 0
|
||||||
|
|
||||||
data.barrier = way:get_value_by_key("barrier")
|
data.barrier = way:get_value_by_key("barrier")
|
||||||
data.oneway = way:get_value_by_key("oneway")
|
data.oneway = way:get_value_by_key("oneway")
|
||||||
data.oneway_bicycle = way:get_value_by_key("oneway:bicycle")
|
data.oneway_bicycle = way:get_value_by_key("oneway:bicycle")
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
local Sequence = require('lib/sequence')
|
local Sequence = require('lib/sequence')
|
||||||
|
local Sequence = require('lib/set')
|
||||||
|
|
||||||
Measure = {}
|
Measure = {}
|
||||||
|
|
||||||
@ -9,12 +10,15 @@ local pound_to_kilograms = 0.45359237
|
|||||||
local miles_to_kilometers = 1.609
|
local miles_to_kilometers = 1.609
|
||||||
|
|
||||||
-- Parse speed value as kilometers by hours.
|
-- Parse speed value as kilometers by hours.
|
||||||
function Measure.parse_value_speed(source)
|
function Measure.parse_value_speed(source, speed_unit)
|
||||||
local n = tonumber(source:match("%d*"))
|
local n = tonumber(source:match("%d*"))
|
||||||
if n then
|
if n then
|
||||||
if string.match(source, "mph") or string.match(source, "mp/h") then
|
if string.match(source, "mph") or string.match(source, "mp/h") then
|
||||||
n = n * miles_to_kilometers
|
n = n * miles_to_kilometers
|
||||||
|
elseif speed_unit and speed_unit == "M" then
|
||||||
|
n = n * miles_to_kilometers
|
||||||
end
|
end
|
||||||
|
|
||||||
return n
|
return n
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -55,9 +59,9 @@ function Measure.parse_value_kilograms(value)
|
|||||||
end
|
end
|
||||||
|
|
||||||
--- Get maxspeed of specified way in kilometers by hours.
|
--- Get maxspeed of specified way in kilometers by hours.
|
||||||
function Measure.get_max_speed(raw_value)
|
function Measure.get_max_speed(raw_value, speed_unit)
|
||||||
if raw_value then
|
if raw_value then
|
||||||
return Measure.parse_value_speed(raw_value)
|
return Measure.parse_value_speed(raw_value, speed_unit)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,15 @@
|
|||||||
|
|
||||||
local Tags = {}
|
local Tags = {}
|
||||||
|
|
||||||
|
-- return speed unit values for a specific tag.
|
||||||
|
|
||||||
|
function Tags.get_speed_unit_by_key(way, key)
|
||||||
|
local speed_unit = way:get_value_by_key(key)
|
||||||
|
|
||||||
|
return speed_unit
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
-- return [forward,backward] values for a specific tag.
|
-- return [forward,backward] values for a specific tag.
|
||||||
-- e.g. for maxspeed search forward:
|
-- e.g. for maxspeed search forward:
|
||||||
-- maxspeed:forward
|
-- maxspeed:forward
|
||||||
|
|||||||
@ -434,8 +434,13 @@ end
|
|||||||
function WayHandlers.maxspeed(profile,way,result,data)
|
function WayHandlers.maxspeed(profile,way,result,data)
|
||||||
local keys = Sequence { 'maxspeed:advisory', 'maxspeed', 'source:maxspeed', 'maxspeed:type' }
|
local keys = Sequence { 'maxspeed:advisory', 'maxspeed', 'source:maxspeed', 'maxspeed:type' }
|
||||||
local forward, backward = Tags.get_forward_backward_by_set(way,data,keys)
|
local forward, backward = Tags.get_forward_backward_by_set(way,data,keys)
|
||||||
forward = WayHandlers.parse_maxspeed(forward,profile)
|
|
||||||
backward = WayHandlers.parse_maxspeed(backward,profile)
|
-- If speed_unit == 'M', then it's mile per hour
|
||||||
|
-- If speed_unit == 'K', then it's kilometer per hour
|
||||||
|
local speed_unit = Tags.get_speed_unit_by_key(way, 'speed_unit')
|
||||||
|
|
||||||
|
forward = WayHandlers.parse_maxspeed(forward, profile, speed_unit)
|
||||||
|
backward = WayHandlers.parse_maxspeed(backward, profile, speed_unit)
|
||||||
|
|
||||||
if forward and forward > 0 then
|
if forward and forward > 0 then
|
||||||
result.forward_speed = forward * profile.speed_reduction
|
result.forward_speed = forward * profile.speed_reduction
|
||||||
@ -446,12 +451,12 @@ function WayHandlers.maxspeed(profile,way,result,data)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function WayHandlers.parse_maxspeed(source,profile)
|
function WayHandlers.parse_maxspeed(source, profile, speed_unit)
|
||||||
if not source then
|
if not source then
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
|
|
||||||
local n = Measure.get_max_speed(source)
|
local n = Measure.get_max_speed(source, speed_unit)
|
||||||
if not n then
|
if not n then
|
||||||
-- parse maxspeed like FR:urban
|
-- parse maxspeed like FR:urban
|
||||||
source = string.lower(source)
|
source = string.lower(source)
|
||||||
|
|||||||
58
profiles/test_speed_unit.lua
Normal file
58
profiles/test_speed_unit.lua
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
|
||||||
|
local tags = require('lib/tags')
|
||||||
|
local Measure = require('lib/measure')
|
||||||
|
|
||||||
|
-- Test get speed uint by key
|
||||||
|
local way = {
|
||||||
|
speed_unit = 'M'
|
||||||
|
}
|
||||||
|
|
||||||
|
function way:get_value_by_key(k)
|
||||||
|
return self[k]
|
||||||
|
end
|
||||||
|
|
||||||
|
local speed_unit = tags.get_speed_unit_by_key(way, 'speed_unit')
|
||||||
|
print(speed_unit)
|
||||||
|
|
||||||
|
-- Test cases:
|
||||||
|
-- 1. speed without unit + speed unit in mile per hour
|
||||||
|
local source = "50"
|
||||||
|
speed_unit = "M"
|
||||||
|
|
||||||
|
local n = Measure.get_max_speed(source, speed_unit)
|
||||||
|
print(n)
|
||||||
|
|
||||||
|
-- 2. speed without unit + speed unit in kilometer per hour
|
||||||
|
source = "50"
|
||||||
|
speed_unit = "K"
|
||||||
|
|
||||||
|
n = Measure.get_max_speed(source, speed_unit)
|
||||||
|
print(n)
|
||||||
|
|
||||||
|
-- 3. speed with unit + speed unit in mile per hour
|
||||||
|
source = "50 mph"
|
||||||
|
speed_unit = "M"
|
||||||
|
|
||||||
|
n = Measure.get_max_speed(source, speed_unit)
|
||||||
|
print(n)
|
||||||
|
|
||||||
|
-- 4. speed with unit + speed unit in kilometer per hour
|
||||||
|
source = "50 mph"
|
||||||
|
speed_unit = "K"
|
||||||
|
|
||||||
|
n = Measure.get_max_speed(source, speed_unit)
|
||||||
|
print(n)
|
||||||
|
|
||||||
|
-- 5. speed with unit + speed unit in kilometer per hour
|
||||||
|
source = "50 kph"
|
||||||
|
speed_unit = "K"
|
||||||
|
|
||||||
|
n = Measure.get_max_speed(source, speed_unit)
|
||||||
|
print(n)
|
||||||
|
|
||||||
|
-- 6. speed with unit + speed unit in mile per hour
|
||||||
|
source = "50 kph"
|
||||||
|
speed_unit = "M"
|
||||||
|
|
||||||
|
n = Measure.get_max_speed(source, speed_unit)
|
||||||
|
print(n)
|
||||||
Loading…
Reference in New Issue
Block a user