From ddf11cc2cc16de7a1ba39864aa346fd25cab665b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Rodrigo?= Date: Mon, 9 Oct 2017 18:34:21 +0200 Subject: [PATCH] Profile: stronger unit parsing --- profiles/lib/measure.lua | 82 ++++++++++++---------------------------- 1 file changed, 24 insertions(+), 58 deletions(-) diff --git a/profiles/lib/measure.lua b/profiles/lib/measure.lua index 075c8aebd..d47ff3dd9 100644 --- a/profiles/lib/measure.lua +++ b/profiles/lib/measure.lua @@ -6,66 +6,38 @@ Measure = {} local inch_to_meters = 0.0254 local feet_to_inches = 12 +--- Parse string as a height in meters. --- according to http://wiki.openstreetmap.org/wiki/Key:maxheight -local meters_parse_patterns = Sequence { - "%d+", - "%d+.%d+", - "%d+.%d+ m", - "%d+,%d+ m", -- wrong - "%d+.%d+m", -- wrong - "%d+,%d+m", -- wrong -} +function Measure.parse_value_meters(value) + local n = tonumber(value:gsub(",", "."):match("%d+%.?%d*")) + if n then + inches = value:match("'.*") + if inches then -- Imperial unit to metric + -- try to parse feets/inch + n = n * feet_to_inches + local m = tonumber(inches:match("%d+")) + if m then + n = n + m + end + n = n * inch_to_meters + end + return n + end -local feet_parse_patterns = Sequence { - "%d+\'%d+\'", -} + print("Can't parse value: ", value) +end --- according to http://wiki.openstreetmap.org/wiki/Map_Features/Units#Explicit_specifications local tonns_parse_patterns = Sequence { "%d+", "%d+.%d+", - "%d+.%d+ t" + "%d+.%d+ ?t" } local kg_parse_patterns = Sequence { - "%d+ kg" + "%d+ ?kg" } -function Measure.convert_feet_to_inches(feet) - return feet * feet_to_inches -end - -function Measure.convert_inches_to_meters(inches) - return inches * inch_to_meters -end - ---- Parse string as a height in meters. -function Measure.parse_value_meters(value) - -- try to parse meters - for i, templ in ipairs(meters_parse_patterns) do - m = string.match(value, templ) - if m then - return tonumber(m) - end - end - - -- try to parse feets/inch - for i, templ in ipairs(feet_parse_patterns) do - m = string.match(value, templ) - if m then - feet, inch = m - feet = tonumber(feet) - inch = tonumber(inch) - - inch = inch + feet * feet_to_inches - return Measure.convert_inches_to_meters(inch) - end - end - - print("Can't parse value: ", value) - return -end - --- Parse weight value in kilograms function Measure.parse_value_kilograms(value) -- try to parse kilograms @@ -91,31 +63,25 @@ end --- Get maxheight of specified way in meters. If there are no --- max height, then return nil -function Measure.get_max_height(way) - raw_value = way:get_value_by_key('maxheight') +function Measure.get_max_height(raw_value) if raw_value then return Measure.parse_value_meters(raw_value) end - - -- TODO: parse another tags end --- Get maxwidth of specified way in meters. -function Measure.get_max_width(way) - raw_value = way:get_value_by_key('maxwidth') +function Measure.get_max_width(raw_value) if raw_value then return Measure.parse_value_meters(raw_value) end end --- Get maxweight of specified way in kilogramms -function Measure.get_max_weight(way) - raw_value = way:get_value_by_key('maxweight') +function Measure.get_max_weight(raw_value) if raw_value then - -- print(way:id(), raw_value) return Measure.parse_value_kilograms(raw_value) end end -return Measure; \ No newline at end of file +return Measure;