From 423a4ef326ebc206f8b7ffc64d295ce250b52cf0 Mon Sep 17 00:00:00 2001 From: Denis Koronchik Date: Thu, 20 Jul 2017 19:30:10 +0300 Subject: [PATCH] Add maxheight/maxwidth support into profiles --- profiles/lib/measure.lua | 78 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 profiles/lib/measure.lua diff --git a/profiles/lib/measure.lua b/profiles/lib/measure.lua new file mode 100644 index 000000000..ac1d3d898 --- /dev/null +++ b/profiles/lib/measure.lua @@ -0,0 +1,78 @@ +local Sequence = require('lib/sequence') + +Measure = {} + +-- measurements conversion constants +local inch_to_meters = 0.0254 +local feet_to_inches = 12 + +--- 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 +} + +local feet_parse_patterns = Sequence { + "%d+\'%d+\'", +} + +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 + + return +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') + 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') + if raw_value then + print(way:id(), raw_value) + return Measure.parse_value_meters(raw_value) + end +end + + +return Measure; \ No newline at end of file