From e8e3627d0115e269d91c170570c8673d80d124e8 Mon Sep 17 00:00:00 2001 From: Viktor Govako Date: Fri, 19 May 2023 00:37:56 -0300 Subject: [PATCH] [generator] Assign hwtag=nocycleway/nosidewalk types. Parse bicycle_road, cyclestreet OSM tags. Signed-off-by: Viktor Govako --- generator/generator_tests/osm_type_test.cpp | 18 ++++++++++++- generator/osm2type.cpp | 29 ++++++++++++++------- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/generator/generator_tests/osm_type_test.cpp b/generator/generator_tests/osm_type_test.cpp index 8bfbe0a70e..e28f3c0de4 100644 --- a/generator/generator_tests/osm_type_test.cpp +++ b/generator/generator_tests/osm_type_test.cpp @@ -678,9 +678,10 @@ UNIT_CLASS_TEST(TestWithClassificator, OsmType_Hwtag) auto const params = GetFeatureBuilderParams(tags); - TEST_EQUAL(params.m_types.size(), 2, (params)); + TEST_EQUAL(params.m_types.size(), 3, (params)); TEST(params.IsTypeExist(GetType({"highway", "primary"})), ()); TEST(params.IsTypeExist(GetType({"hwtag", "nofoot"})), ()); + TEST(params.IsTypeExist(GetType({"hwtag", "nocycleway"})), ()); // No cycleway doesn't mean that bicycle is not allowed. //TEST(params.IsTypeExist(GetType({"hwtag", "nobicycle"})), ()); } @@ -747,6 +748,21 @@ UNIT_CLASS_TEST(TestWithClassificator, OsmType_Hwtag) TEST(params.IsTypeExist(GetType({"hwtag", "yesfoot"})), ()); TEST(params.IsTypeExist(GetType({"hwtag", "yesbicycle"})), ()); } + + { + Tags const tags = { + {"sidewalk:both", "no"}, + {"bicycle_road", "yes"}, + {"highway", "residential"}, + }; + + auto const params = GetFeatureBuilderParams(tags); + + TEST_EQUAL(params.m_types.size(), 3, (params)); + TEST(params.IsTypeExist(GetType({"highway", "residential"})), (params)); + TEST(params.IsTypeExist(GetType({"hwtag", "nosidewalk"})), ()); + TEST(params.IsTypeExist(GetType({"hwtag", "yesbicycle"})), ()); + } } UNIT_CLASS_TEST(TestWithClassificator, OsmType_Surface) diff --git a/generator/osm2type.cpp b/generator/osm2type.cpp index 2ae35b2bc6..a349b411e6 100644 --- a/generator/osm2type.cpp +++ b/generator/osm2type.cpp @@ -247,8 +247,10 @@ public: Lit, NoFoot, YesFoot, + NoSidewalk, // no dedicated sidewalk, doesn't mean that foot is not allowed, just lower weight NoBicycle, YesBicycle, + NoCycleway, // no dedicated cycleway, doesn't mean that bicycle is not allowed, just lower weight BicycleBidir, SurfacePavedGood, SurfacePavedBad, @@ -284,8 +286,10 @@ public: {Lit, {"hwtag", "lit"}}, {NoFoot, {"hwtag", "nofoot"}}, {YesFoot, {"hwtag", "yesfoot"}}, + {NoSidewalk, {"hwtag", "nosidewalk"}}, {NoBicycle, {"hwtag", "nobicycle"}}, {YesBicycle, {"hwtag", "yesbicycle"}}, + {NoCycleway, {"hwtag", "nocycleway"}}, {BicycleBidir, {"hwtag", "bidir_bicycle"}}, {SurfacePavedGood, {"psurface", "paved_good"}}, {SurfacePavedBad, {"psurface", "paved_bad"}}, @@ -927,17 +931,23 @@ void PostprocessElement(OsmElement * p, FeatureBuilderParams & params) {"foot", "!r", [&flags] { flags[Flags::Foot] = -1; }}, {"foot", "~r", [&flags] { flags[Flags::Foot] = 1; }}, - // No sidewalk doesn't mean that foot is not allowed + {"sidewalk", "!r", [&flags] { flags[Flags::Sidewalk] = -1; }}, {"sidewalk", "~r", [&flags] { flags[Flags::Sidewalk] = 1; }}, + {"sidewalk:both", "!r", [&flags] { flags[Flags::Sidewalk] = -1; }}, + {"sidewalk:both", "~r", [&flags] { flags[Flags::Sidewalk] = 1; }}, + /// @todo Process left && right == no ? {"sidewalk:left", "~r", [&flags] { flags[Flags::Sidewalk] = 1; }}, {"sidewalk:right", "~r", [&flags] { flags[Flags::Sidewalk] = 1; }}, - {"sidewalk:both", "~r", [&flags] { flags[Flags::Sidewalk] = 1; }}, {"bicycle", "!r", [&flags] { flags[Flags::Bicycle] = -1; }}, {"bicycle", "~r", [&flags] { flags[Flags::Bicycle] = 1; }}, - // No cycleway doesn't mean that bicycle is not allowed + {"bicycle_road", "~r", [&flags] { flags[Flags::Bicycle] = 1; }}, + {"cyclestreet", "~r", [&flags] { flags[Flags::Bicycle] = 1; }}, + {"cycleway", "!r", [&flags] { flags[Flags::Cycleway] = -1; }}, {"cycleway", "~r", [&flags] { flags[Flags::Cycleway] = 1; }}, + {"cycleway:both", "!r", [&flags] { flags[Flags::Cycleway] = -1; }}, {"cycleway:both", "~r", [&flags] { flags[Flags::Cycleway] = 1; }}, + /// @todo Process left && right == no ? {"cycleway:left", "~r", [&flags] { flags[Flags::Cycleway] = 1; }}, {"cycleway:right", "~r", [&flags] { flags[Flags::Cycleway] = 1; }}, {"oneway:bicycle", "!", [&AddParam] { AddParam(CachedTypes::BicycleBidir); }}, @@ -958,16 +968,17 @@ void PostprocessElement(OsmElement * p, FeatureBuilderParams & params) if (addOneway && !noOneway) params.AddType(types.Get(CachedTypes::OneWay)); - auto const ApplyFlag = [&flags, &AddParam](Flags::Type f, CachedTypes::Type yes, CachedTypes::Type no) + auto const ApplyFlag = [&flags, &AddParam](Flags::Type f, CachedTypes::Type yes, + CachedTypes::Type no0, CachedTypes::Type no1) { if (flags[f] != 0) - AddParam(flags[f] == 1 ? yes : no); + AddParam(flags[f] == 1 ? yes : no0); else if (flags[int(f) + 1] != 0) - AddParam(flags[int(f) + 1] == 1 ? yes : no); + AddParam(flags[int(f) + 1] == 1 ? yes : no1); }; - ApplyFlag(Flags::Foot, CachedTypes::YesFoot, CachedTypes::NoFoot); - ApplyFlag(Flags::Bicycle, CachedTypes::YesBicycle, CachedTypes::NoBicycle); - ApplyFlag(Flags::MotorCar, CachedTypes::YesCar, CachedTypes::NoCar); + ApplyFlag(Flags::Foot, CachedTypes::YesFoot, CachedTypes::NoFoot, CachedTypes::NoSidewalk); + ApplyFlag(Flags::Bicycle, CachedTypes::YesBicycle, CachedTypes::NoBicycle, CachedTypes::NoCycleway); + ApplyFlag(Flags::MotorCar, CachedTypes::YesCar, CachedTypes::NoCar, CachedTypes::NoCar); highwayDone = true; }