[generator] Assign hwtag=nocycleway/nosidewalk types. Parse bicycle_road, cyclestreet OSM tags.

Signed-off-by: Viktor Govako <viktor.govako@gmail.com>
This commit is contained in:
Viktor Govako 2023-05-19 00:37:56 -03:00
parent 3cb8571564
commit e8e3627d01
2 changed files with 37 additions and 10 deletions

View file

@ -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)

View file

@ -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;
}