From 9f9e2cf97079b219424660531af26eb5d07bd3ab Mon Sep 17 00:00:00 2001 From: Tobias Date: Mon, 6 May 2024 17:45:55 +0200 Subject: [PATCH 1/3] Introduce SanitizeTrafficSign - Rename from osm_traffic_sign to traffic_sign - Only allow clean data - Cleanup some of the unclean data --- .../topics/bicycleParking/bicycleParking.lua | 4 +- .../topics/helper/SanitizeTrafficSign.lua | 62 ++++++++++++++++ .../__tests__/SanitizeTrafficSign.test.lua | 73 +++++++++++++++++++ .../roads_bikelanes/bikelanes/Bikelanes.lua | 10 +-- .../roads_bikelanes/bikelanes/categories.lua | 33 ++++++--- .../roads/RoadClassification.lua | 9 +-- .../roads_bikelanes/roads_bikelanes.lua | 2 +- 7 files changed, 170 insertions(+), 23 deletions(-) create mode 100644 processing/topics/helper/SanitizeTrafficSign.lua create mode 100644 processing/topics/helper/__tests__/SanitizeTrafficSign.test.lua diff --git a/processing/topics/bicycleParking/bicycleParking.lua b/processing/topics/bicycleParking/bicycleParking.lua index c9fd144f..801ebeba 100644 --- a/processing/topics/bicycleParking/bicycleParking.lua +++ b/processing/topics/bicycleParking/bicycleParking.lua @@ -4,6 +4,7 @@ require("Metadata") require("Set") require("Sanitize") require("DefaultId") +require("SanitizeTrafficSign") local nodeTable = osm2pgsql.define_table({ name = 'bicycleParking_points', @@ -87,12 +88,13 @@ local function processTags(tags) local tags_cc = { "area", "operator:type", "covered", "indoor", "access", "cargo_bike", "capacity", "capacity:cargo_bike", "fee", "lit", "surface", "bicycle_parking", "maxstay", "surveillance", - "bicycle_parking:count", "bicycle_parking:position", "traffic_sign", "description", + "bicycle_parking:count", "bicycle_parking:position", "description", "mapillary", "description", } CopyTags(results, tags, allowed_tags) CopyTags(results, tags, tags_cc, "osm_") + results.traffic_sign = SanitizeTrafficSign(tags.traffic_sign) results.age = AgeInDays(ParseCheckDate(tags["check_date"])) return results diff --git a/processing/topics/helper/SanitizeTrafficSign.lua b/processing/topics/helper/SanitizeTrafficSign.lua new file mode 100644 index 00000000..91876319 --- /dev/null +++ b/processing/topics/helper/SanitizeTrafficSign.lua @@ -0,0 +1,62 @@ +require("IsTermInString") + +-- Cleanup spaces where none should be +local function CleanupSpaces(string) + local cleaned = string + if IsTermInString(', ', cleaned) then + cleaned = cleaned.gsub(cleaned, ', ', ',') + end + if IsTermInString('; ', cleaned) then + cleaned = cleaned.gsub(cleaned, '; ', ';') + end + return cleaned +end + +-- * @desc Cleanup the `traffic_sign=*` tag +-- * @returns string +function SanitizeTrafficSign(traffic_sign_value) + if traffic_sign_value == nil then + return nil + end + + -- Rename + -- Docs: gsub with "^" targets beginning of string + if traffic_sign_value == "no" then + return "none" + end + if osm2pgsql.has_prefix(traffic_sign_value, 'DE: ') then + return CleanupSpaces(string.gsub(traffic_sign_value, '^DE: ', 'DE:')) + end + if osm2pgsql.has_prefix(traffic_sign_value, 'DE2') then + return CleanupSpaces(string.gsub(traffic_sign_value, '^DE2', 'DE:2')) + end + if osm2pgsql.has_prefix(traffic_sign_value, 'DE1') then + return CleanupSpaces(string.gsub(traffic_sign_value, '^DE1', 'DE:1')) + end + if osm2pgsql.has_prefix(traffic_sign_value, 'D:') then + return CleanupSpaces(string.gsub(traffic_sign_value, '^D:', 'DE:')) + end + if osm2pgsql.has_prefix(traffic_sign_value, 'de:') then + return CleanupSpaces(string.gsub(traffic_sign_value, '^de:', 'DE:')) + end + if osm2pgsql.has_prefix(traffic_sign_value, 'DE.') then + return CleanupSpaces(string.gsub(traffic_sign_value, '^DE.', 'DE:')) + end + if osm2pgsql.has_prefix(traffic_sign_value, '2') then + return CleanupSpaces(string.gsub(traffic_sign_value, '^2', 'DE:2')) + end + if osm2pgsql.has_prefix(traffic_sign_value, '10') then + return CleanupSpaces(string.gsub(traffic_sign_value, '^10', 'DE:10')) + end + + -- Allows + if osm2pgsql.has_prefix(traffic_sign_value, 'DE:') then + return CleanupSpaces(traffic_sign_value) + end + if traffic_sign_value == "none" then + return traffic_sign_value + end + + -- Disallow everything else + return nil +end diff --git a/processing/topics/helper/__tests__/SanitizeTrafficSign.test.lua b/processing/topics/helper/__tests__/SanitizeTrafficSign.test.lua new file mode 100644 index 00000000..ba25aa17 --- /dev/null +++ b/processing/topics/helper/__tests__/SanitizeTrafficSign.test.lua @@ -0,0 +1,73 @@ +require("osm2pgsql") + +describe("SanitizeTrafficSign", function() + package.path = package.path .. ";/processing/topics/helper/?.lua" + require("SanitizeTrafficSign") + + -- Cleanup + it('renames `no` to `none`', function() + assert.are.same(SanitizeTrafficSign("no"), "none") + end) + + it('renames `DE:SPACE` to `DE:`', function() + assert.are.same(SanitizeTrafficSign("DE: 123"), "DE:123") + end) + + it('renames `DE234` to `DE:234`', function() + assert.are.same(SanitizeTrafficSign("DE234"), "DE:234") + end) + + it('renames `DE1010` to `DE:1010`', function() + assert.are.same(SanitizeTrafficSign("DE1010"), "DE:1010") + end) + + it('renames `D:234` to `DE:234`', function() + assert.are.same(SanitizeTrafficSign("D:234"), "DE:234") + end) + + it('renames `de:234` to `DE:234`', function() + assert.are.same(SanitizeTrafficSign("de:234"), "DE:234") + end) + + it('renames `234` to `DE:234`', function() + assert.are.same(SanitizeTrafficSign("234"), "DE:234") + end) + + it('renames `1010` to `DE:1010`', function() + assert.are.same(SanitizeTrafficSign("1010"), "DE:1010") + end) + + it('renames `DE.234` to `DE:234`', function() + assert.are.same(SanitizeTrafficSign("DE.234"), "DE:234") + end) + + it('cleans spaces `DE:123, 1010; 234` to `DE:123,1010;234`', function() + assert.are.same(SanitizeTrafficSign("DE:123, 1010; 234"), "DE:123,1010;234") + end) + + -- Allow + it('allows `DE:234`', function() + assert.are.same(SanitizeTrafficSign("DE:234"), "DE:234") + end) + + it('allows `DE:1010`', function() + assert.are.same(SanitizeTrafficSign("DE:1010"), "DE:1010") + end) + + it('allows `none` as value', function() + assert.are.same(SanitizeTrafficSign("none"), "none") + end) + + -- Disallow + it('handles nil', function() + assert.are.same(SanitizeTrafficSign(nil), nil) + end) + it('disallows everything else', function() + assert.are.same(SanitizeTrafficSign("foobar"), nil) + assert.are.same(SanitizeTrafficSign("yes"), nil) + assert.are.same(SanitizeTrafficSign("unkown"), nil) + assert.are.same(SanitizeTrafficSign("AT:foobar"), nil) + assert.are.same(SanitizeTrafficSign("pictogram"), nil) + assert.are.same(SanitizeTrafficSign("(comment)"), nil) + end) +end) diff --git a/processing/topics/roads_bikelanes/bikelanes/Bikelanes.lua b/processing/topics/roads_bikelanes/bikelanes/Bikelanes.lua index 6a60bd40..abbe380a 100644 --- a/processing/topics/roads_bikelanes/bikelanes/Bikelanes.lua +++ b/processing/topics/roads_bikelanes/bikelanes/Bikelanes.lua @@ -19,9 +19,6 @@ local tags_copied = { } local tags_prefixed = { 'surface:colour', - 'traffic_sign', - 'traffic_sign:forward', - 'traffic_sign:backward', 'separation', 'separation:left', 'separation:right', @@ -79,8 +76,11 @@ function Bikelanes(object) oneway = DeriveOneway(transformedTags, category), bridge = Sanitize(tags.bridge, { "yes" }), tunnel = Sanitize(tags.tunnel, { "yes" }), + traffic_sign = SanitizeTrafficSign(tags.traffic_sign) or SanitizeTrafficSign(tags['traffic_sign:both']), + ['traffic_sign:forward'] = SanitizeTrafficSign(tags['traffic_sign:forward']), + ['traffic_sign:backward'] = SanitizeTrafficSign(tags['traffic_sign:backward']) } - + MergeTable(result_tags, DeriveSmoothness(transformedTags)) MergeTable(result_tags, DeriveSurface(transformedTags)) CopyTags(result_tags, transformedTags, tags_prefixed, 'osm_') @@ -88,7 +88,7 @@ function Bikelanes(object) -- copy original tags CopyTags(result_tags, tags, tags_copied) - -- these keys are different for projected geometries + -- these keys are different for projected geometries if transformedTags._side ~= "self" then result_tags._id = DefaultId(object) .. '/' .. transformedTags._prefix .. '/' .. transformedTags._side result_tags._parent_highway = transformedTags._parent_highway diff --git a/processing/topics/roads_bikelanes/bikelanes/categories.lua b/processing/topics/roads_bikelanes/bikelanes/categories.lua index fe93b07a..dce33c27 100644 --- a/processing/topics/roads_bikelanes/bikelanes/categories.lua +++ b/processing/topics/roads_bikelanes/bikelanes/categories.lua @@ -1,7 +1,9 @@ package.path = package.path .. ";/processing/topics/roads_bikelanes/bikelanes/categories/?.lua" +package.path = package.path .. ";/processing/topics/helper/?.lua" require("IsTermInString") require("IsSidepath") require("AddAdjoiningOrIsolated") +require("SanitizeTrafficSign") -- this category is for the explicit absence of bike infrastrucute local function dataNo(tags) @@ -60,11 +62,12 @@ end -- https://wiki.openstreetmap.org/wiki/DE:Key:bicycle%20road -- traffic_sign=DE:244, https://wiki.openstreetmap.org/wiki/DE:Tag:traffic_sign%3DDE:244 local function bicycleRoad(tags) + local trafficSign = SanitizeTrafficSign(tags.traffic_sign) if tags.bicycle_road == "yes" - or osm2pgsql.has_prefix(tags.traffic_sign, 'DE:244') then + or osm2pgsql.has_prefix(trafficSign, 'DE:244') then -- Subcategory when bicycle road allows vehicle traffic - if tags.traffic_sign == 'DE:244.1,1020-30' - or tags.traffic_sign == 'DE:244,1020-30' + if trafficSign == 'DE:244.1,1020-30' + or trafficSign == 'DE:244,1020-30' or tags.vehicle == 'destination' or tags.motor_vehicle == 'destination' then return "bicycleRoad_vehicleDestination" @@ -78,8 +81,9 @@ end -- traffic_sign=DE:240, https://wiki.openstreetmap.org/wiki/DE:Tag:traffic_sign%3DDE:240 local function footAndCyclewaySharedCases(tags) if tags.area == "yes" then return end + local trafficSign = SanitizeTrafficSign(tags.traffic_sign) local taggedWithAccessTagging = tags.bicycle == "designated" and tags.foot == "designated" and tags.segregated == "no" - local taggedWithTrafficsign = osm2pgsql.has_prefix(tags.traffic_sign, "DE:240") + local taggedWithTrafficsign = osm2pgsql.has_prefix(trafficSign, "DE:240") if taggedWithAccessTagging or taggedWithTrafficsign then -- isolated: -- Eg https://www.openstreetmap.org/way/440072364 highway=service @@ -92,8 +96,9 @@ end -- traffic_sign=DE:241-31, https://wiki.openstreetmap.org/wiki/DE:Tag:traffic_sign%3DDE:241-31 local function footAndCyclewaySegregatedCases(tags) if tags.area == "yes" then return end + local trafficSign = SanitizeTrafficSign(tags.traffic_sign) local taggedWithAccessTagging = tags.bicycle == "designated" and tags.foot == "designated" and tags.segregated == "yes" - local taggedWithTrafficsign = osm2pgsql.has_prefix(tags.traffic_sign, "DE:241") + local taggedWithTrafficsign = osm2pgsql.has_prefix(trafficSign, "DE:241") if taggedWithAccessTagging or taggedWithTrafficsign then return AddAdjoiningOrIsolated("footAndCyclewaySegregated", tags) end @@ -102,6 +107,8 @@ end -- Case: "Gehweg, Fahrrad frei" -- traffic_sign=DE:1022-10 "Fahrrad frei", https://wiki.openstreetmap.org/wiki/DE:Tag:traffic_sign%3DDE:239 local function footwayBicycleYesCases(tags) + local trafficSign = SanitizeTrafficSign(tags.traffic_sign) + -- mtb:scale=* is a strong indicator for path' that we do not want to show, so we skip them; -- This will likely need a better solution in the future. -- Eg https://www.openstreetmap.org/way/23366687 @@ -110,7 +117,7 @@ local function footwayBicycleYesCases(tags) if tags.highway == "footway" or tags.highway == "path" then local taggedWithAccessTagging = tags.bicycle == "yes" - local taggedWithTrafficsign = IsTermInString("1022-10", tags.traffic_sign) + local taggedWithTrafficsign = IsTermInString("1022-10", trafficSign) if taggedWithAccessTagging or taggedWithTrafficsign then return AddAdjoiningOrIsolated("footwayBicycleYes", tags) end @@ -121,6 +128,8 @@ end -- The sub-tagging specifies if the cycleway is part of a road or a separate way. -- This part relies heavly on the `is_sidepath` tagging. local function cyclewaySeparatedCases(tags) + local trafficSign = SanitizeTrafficSign(tags.traffic_sign) + -- Case "Hochbordradwege" -- Detailled tagging to separate this case from `footAndCyclewaySegregatedCases` if tags.highway == "path" @@ -128,7 +137,7 @@ local function cyclewaySeparatedCases(tags) and (tags.bicycle == "yes" or tags.bicycle == "designated") and tags.segregated == "yes" and tags.is_sidepath == "yes" - and not IsTermInString("241", tags.traffic_sign) then + and not IsTermInString("241", trafficSign) then return "cycleway_adjoining" end @@ -138,7 +147,7 @@ local function cyclewaySeparatedCases(tags) local taggedWithAccessTagging = tags.highway == "cycleway" and (tags.cycleway == "track" or tags.cycleway == "opposite_track" or tags.is_sidepath) -- Testcase: The "not 'lane'" part is needed for places like https://www.openstreetmap.org/way/964589554 which have the traffic sign but are not separated. - local taggedWithTrafficsign = osm2pgsql.has_prefix(tags.traffic_sign, "DE:237") and not tags.cycleway == "lane" + local taggedWithTrafficsign = osm2pgsql.has_prefix(trafficSign, "DE:237") and not tags.cycleway == "lane" if taggedWithAccessTagging or taggedWithTrafficsign then -- adjoining: -- This could be PBLs "Protected Bike Lanes" @@ -223,10 +232,11 @@ end -- "Fahrrad & Mofa frei" traffic_sign=DE:245,1022-14 -- (History: Until 2023-03-2: cyclewayAlone) local function sharedBusLaneBusWithBike(tags) + local trafficSign = SanitizeTrafficSign(tags.traffic_sign) local taggedWithAccessTagging = tags.highway == "cycleway" and (tags.cycleway == "share_busway" or tags.cycleway == "opposite_share_busway") - local taggedWithTrafficsign = osm2pgsql.has_prefix(tags.traffic_sign, "DE:245") and - (IsTermInString("1022-10", tags.traffic_sign) or IsTermInString("1022-14", tags.traffic_sign)) + local taggedWithTrafficsign = osm2pgsql.has_prefix(trafficSign, "DE:245") and + (IsTermInString("1022-10", trafficSign) or IsTermInString("1022-14", trafficSign)) if taggedWithAccessTagging or taggedWithTrafficsign then -- Note: Was `sharedBusLane` until 2024-05-02 when we introduced `sharedBusLaneBikeWithBus` return "sharedBusLaneBusWithBike" @@ -242,9 +252,10 @@ end -- - 87 overall https://taginfo.openstreetmap.org/tags/cycleway%3Aright%3Alane=share_busway#overview -- - 1 overall for left https://taginfo.openstreetmap.org/tags/cycleway%3Aleft%3Alane=share_busway#overview local function sharedBusLaneBikeWithBus(tags) + local trafficSign = SanitizeTrafficSign(tags.traffic_sign) local taggedWithAccessTagging = tags.highway == "cycleway" and tags.lane == "share_busway" local taggedWithTrafficsign = - osm2pgsql.has_prefix(tags.traffic_sign, "DE:237") and IsTermInString("1024-14", tags.traffic_sign) + osm2pgsql.has_prefix(trafficSign, "DE:237") and IsTermInString("1024-14", trafficSign) if taggedWithAccessTagging or taggedWithTrafficsign then return "sharedBusLaneBikeWithBus" end diff --git a/processing/topics/roads_bikelanes/roads/RoadClassification.lua b/processing/topics/roads_bikelanes/roads/RoadClassification.lua index 70724df5..b6493ed9 100644 --- a/processing/topics/roads_bikelanes/roads/RoadClassification.lua +++ b/processing/topics/roads_bikelanes/roads/RoadClassification.lua @@ -7,11 +7,7 @@ local tags_copied = { "mapillary", "description", } -local tags_prefixed = { - 'traffic_sign', - 'traffic_sign:forward', - 'traffic_sign:backward', -} +local tags_prefixed = {} function RoadClassification(object) @@ -104,6 +100,9 @@ function RoadClassification(object) result_tags.oneway = Sanitize(tags.oneway, { "yes", "no" }) result_tags.bridge = Sanitize(tags.bridge, { "yes" }) result_tags.tunnel = Sanitize(tags.tunnel, { "yes" }) + result_tags.traffic_sign = SanitizeTrafficSign(tags.traffic_sign) or SanitizeTrafficSign(tags['traffic_sign:both']) + result_tags['traffic_sign:left'] = SanitizeTrafficSign(tags['traffic_sign:left']) + result_tags['traffic_sign:right'] = SanitizeTrafficSign(tags['traffic_sign:left']) return result_tags end diff --git a/processing/topics/roads_bikelanes/roads_bikelanes.lua b/processing/topics/roads_bikelanes/roads_bikelanes.lua index c88e9bed..e4622918 100644 --- a/processing/topics/roads_bikelanes/roads_bikelanes.lua +++ b/processing/topics/roads_bikelanes/roads_bikelanes.lua @@ -121,7 +121,7 @@ function osm2pgsql.process_way(object) publicTags.road = results.road publicTags._parent_highway = cycleway._parent_highway - cycleway.segregated = nil -- no idea why that is present in the inspector frontend for way 9717355 + cycleway.segregated = nil -- no idea why that is present in the inspector frontend for way 9717355 bikelanesTable:insert({ id = cycleway._id, tags = publicTags, From 51a5928b71fd3d4efa559dd01ac9227d99087539 Mon Sep 17 00:00:00 2001 From: Laurenz Rasche Date: Tue, 7 May 2024 17:27:24 +0200 Subject: [PATCH 2/3] refactor: iterate over substitutions --- .../topics/helper/SanitizeTrafficSign.lua | 90 +++++++++---------- 1 file changed, 40 insertions(+), 50 deletions(-) diff --git a/processing/topics/helper/SanitizeTrafficSign.lua b/processing/topics/helper/SanitizeTrafficSign.lua index 91876319..dd6d9d74 100644 --- a/processing/topics/helper/SanitizeTrafficSign.lua +++ b/processing/topics/helper/SanitizeTrafficSign.lua @@ -1,62 +1,52 @@ -require("IsTermInString") - --- Cleanup spaces where none should be -local function CleanupSpaces(string) - local cleaned = string - if IsTermInString(', ', cleaned) then - cleaned = cleaned.gsub(cleaned, ', ', ',') - end - if IsTermInString('; ', cleaned) then - cleaned = cleaned.gsub(cleaned, '; ', ';') - end - return cleaned +-- Remove all whitespaces after delimeters +local function stripWhitespaces(traffic_sign) + local stripped = string.gsub(traffic_sign, ', ', ',') + stripped = string.gsub(stripped, '; ', ';') + return stripped end --- * @desc Cleanup the `traffic_sign=*` tag --- * @returns string -function SanitizeTrafficSign(traffic_sign_value) - if traffic_sign_value == nil then +--- Cleanup the `traffic_sign=*` tag +--- @param traffic_sign string +--- @returns string +function SanitizeTrafficSign(traffic_sign) + if traffic_sign == nil then return nil end - - -- Rename - -- Docs: gsub with "^" targets beginning of string - if traffic_sign_value == "no" then + if traffic_sign == "no" or traffic_sign == 'none' then return "none" end - if osm2pgsql.has_prefix(traffic_sign_value, 'DE: ') then - return CleanupSpaces(string.gsub(traffic_sign_value, '^DE: ', 'DE:')) - end - if osm2pgsql.has_prefix(traffic_sign_value, 'DE2') then - return CleanupSpaces(string.gsub(traffic_sign_value, '^DE2', 'DE:2')) - end - if osm2pgsql.has_prefix(traffic_sign_value, 'DE1') then - return CleanupSpaces(string.gsub(traffic_sign_value, '^DE1', 'DE:1')) - end - if osm2pgsql.has_prefix(traffic_sign_value, 'D:') then - return CleanupSpaces(string.gsub(traffic_sign_value, '^D:', 'DE:')) - end - if osm2pgsql.has_prefix(traffic_sign_value, 'de:') then - return CleanupSpaces(string.gsub(traffic_sign_value, '^de:', 'DE:')) - end - if osm2pgsql.has_prefix(traffic_sign_value, 'DE.') then - return CleanupSpaces(string.gsub(traffic_sign_value, '^DE.', 'DE:')) - end - if osm2pgsql.has_prefix(traffic_sign_value, '2') then - return CleanupSpaces(string.gsub(traffic_sign_value, '^2', 'DE:2')) - end - if osm2pgsql.has_prefix(traffic_sign_value, '10') then - return CleanupSpaces(string.gsub(traffic_sign_value, '^10', 'DE:10')) - end - -- Allows - if osm2pgsql.has_prefix(traffic_sign_value, 'DE:') then - return CleanupSpaces(traffic_sign_value) + -- Docs: patterns with "^" target beginning of string + + -- This is the correct tagging, all traffic signs should start with DE: + if string.find(traffic_sign, '^DE:%S') then + return stripWhitespaces(traffic_sign) end - if traffic_sign_value == "none" then - return traffic_sign_value + + local substitutions = { + ['^DE: '] = 'DE:', + ['^DE.'] = 'DE:', + ['^D:'] = 'DE:', + ['^D%.'] = 'DE:', + ['^de:'] = 'DE:', + ['^DE1'] = 'DE:1', + ['^DE2'] = 'DE:2', + ['^2'] = 'DE:2', + ['^1'] = 'DE:1', + -- These patterns could handle all the above in a more generalized way + -- ['^DE?[:.]%s?'] = 'DE:', + -- ['^de?[:.]%s?'] = 'DE:' + -- ['^DE(%d)'] = 'DE:%1' + -- ['^(%d)'] = 'DE:%1' + } + for pattern, substitude in pairs(substitutions) do + local val, n = string.gsub(traffic_sign, pattern, substitude) + if n > 0 then + -- TODO: add to todo list + return stripWhitespaces(val) + end end - -- Disallow everything else + -- Discard everything else return nil end From 15b904b205386b47406557c466e7016619e8abe4 Mon Sep 17 00:00:00 2001 From: Laurenz Rasche Date: Tue, 7 May 2024 17:48:32 +0200 Subject: [PATCH 3/3] extract into `DeriveTrafficSigns()` --- processing/topics/helper/DeriveTrafficSigns.lua | 12 ++++++++++++ .../topics/roads_bikelanes/bikelanes/Bikelanes.lua | 5 ++--- .../roads_bikelanes/roads/RoadClassification.lua | 5 ++--- 3 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 processing/topics/helper/DeriveTrafficSigns.lua diff --git a/processing/topics/helper/DeriveTrafficSigns.lua b/processing/topics/helper/DeriveTrafficSigns.lua new file mode 100644 index 00000000..90c05dd6 --- /dev/null +++ b/processing/topics/helper/DeriveTrafficSigns.lua @@ -0,0 +1,12 @@ +package.path = package.path .. ";/processing/topics/helper/?.lua" + +require("SanitizeTrafficSign") + +function DeriveTrafficSigns(tags) + local results = { + ['traffic_sign'] = SanitizeTrafficSign(tags.traffic_sign) or SanitizeTrafficSign(tags['traffic_sign:both']), + ['traffic_sign:forward'] = SanitizeTrafficSign(tags['traffic_sign:forward']), + ['traffic_sign:backward'] = SanitizeTrafficSign(tags['traffic_sign:backward']) + } + return results +end diff --git a/processing/topics/roads_bikelanes/bikelanes/Bikelanes.lua b/processing/topics/roads_bikelanes/bikelanes/Bikelanes.lua index abbe380a..c2f700d3 100644 --- a/processing/topics/roads_bikelanes/bikelanes/Bikelanes.lua +++ b/processing/topics/roads_bikelanes/bikelanes/Bikelanes.lua @@ -12,6 +12,7 @@ require("BikelanesTodos") require("Sanitize") require("DeriveOneway") require("DefaultId") +require("DeriveTrafficSigns") local tags_copied = { "mapillary", @@ -76,11 +77,9 @@ function Bikelanes(object) oneway = DeriveOneway(transformedTags, category), bridge = Sanitize(tags.bridge, { "yes" }), tunnel = Sanitize(tags.tunnel, { "yes" }), - traffic_sign = SanitizeTrafficSign(tags.traffic_sign) or SanitizeTrafficSign(tags['traffic_sign:both']), - ['traffic_sign:forward'] = SanitizeTrafficSign(tags['traffic_sign:forward']), - ['traffic_sign:backward'] = SanitizeTrafficSign(tags['traffic_sign:backward']) } + MergeTable(result_tags, DeriveTrafficSigns(transformedTags)) MergeTable(result_tags, DeriveSmoothness(transformedTags)) MergeTable(result_tags, DeriveSurface(transformedTags)) CopyTags(result_tags, transformedTags, tags_prefixed, 'osm_') diff --git a/processing/topics/roads_bikelanes/roads/RoadClassification.lua b/processing/topics/roads_bikelanes/roads/RoadClassification.lua index b6493ed9..bb405bd1 100644 --- a/processing/topics/roads_bikelanes/roads/RoadClassification.lua +++ b/processing/topics/roads_bikelanes/roads/RoadClassification.lua @@ -2,6 +2,7 @@ package.path = package.path .. ";/processing/topics/helper/?.lua" require("Set") require("CopyTags") require("Sanitize") +require("DeriveTrafficSigns") local tags_copied = { "mapillary", @@ -100,9 +101,7 @@ function RoadClassification(object) result_tags.oneway = Sanitize(tags.oneway, { "yes", "no" }) result_tags.bridge = Sanitize(tags.bridge, { "yes" }) result_tags.tunnel = Sanitize(tags.tunnel, { "yes" }) - result_tags.traffic_sign = SanitizeTrafficSign(tags.traffic_sign) or SanitizeTrafficSign(tags['traffic_sign:both']) - result_tags['traffic_sign:left'] = SanitizeTrafficSign(tags['traffic_sign:left']) - result_tags['traffic_sign:right'] = SanitizeTrafficSign(tags['traffic_sign:left']) + MergeTable(result_tags, DeriveTrafficSigns(tags)) return result_tags end