From 9daf57cf7bc0b62bb76bfe1915bdb04fb9102b2d Mon Sep 17 00:00:00 2001 From: Denis Levchenko Date: Thu, 15 Oct 2020 12:34:28 +0500 Subject: [PATCH] [generator] Ignore access=destination for top highway classes --- generator/road_access_generator.cpp | 26 +++++++++++++++++++++++++- generator/road_access_generator.hpp | 2 ++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/generator/road_access_generator.cpp b/generator/road_access_generator.cpp index 24142f8cf12..abc81cd34cf 100644 --- a/generator/road_access_generator.cpp +++ b/generator/road_access_generator.cpp @@ -162,6 +162,15 @@ set const kHighwaysWhereIgnoreBarriersWithoutAccess = { {OsmElement::Tag("highway", "trunk_link")} }; +set const kHighwaysWhereIgnoreAccessDestination = { + {OsmElement::Tag("highway", "motorway")}, + {OsmElement::Tag("highway", "motorway_link")}, + {OsmElement::Tag("highway", "primary")}, + {OsmElement::Tag("highway", "primary_link")}, + {OsmElement::Tag("highway", "trunk")}, + {OsmElement::Tag("highway", "trunk_link")} +}; + bool ParseRoadAccess(string const & roadAccessPath, OsmIdToFeatureIds const & osmIdToFeatureIds, RoadAccessCollector::RoadAccessByVehicleType & roadAccessByVehicleType) { @@ -379,7 +388,7 @@ string GetVehicleTypeForAccessConditional(string const & accessConditionalTag) { auto const pos = accessConditionalTag.find(":"); CHECK_NOT_EQUAL(pos, string::npos, (accessConditionalTag)); - + string result(accessConditionalTag.begin(), accessConditionalTag.begin() + pos); return result; } @@ -429,6 +438,18 @@ RoadAccessTagProcessor::RoadAccessTagProcessor(VehicleType vehicleType) } } +bool RoadAccessTagProcessor::IgnoreRoadAccessType(OsmElement const & elem, RoadAccess::Type accessType) { + if (accessType == RoadAccess::Type::Destination) + { + for (auto const & tag : elem.m_tags) + { + if (kHighwaysWhereIgnoreAccessDestination.count(tag)) + return true; + } + } + return false; +} + void RoadAccessTagProcessor::Process(OsmElement const & elem) { auto const getAccessType = [&](vector const & mapping) @@ -448,6 +469,9 @@ void RoadAccessTagProcessor::Process(OsmElement const & elem) if (*op == RoadAccess::Type::Yes) return; + if (IgnoreRoadAccessType(elem, *op)) + return; + switch (elem.m_type) { case OsmElement::EntityType::Node: m_barriersWithAccessTag.emplace(elem.m_id, *op); return; diff --git a/generator/road_access_generator.hpp b/generator/road_access_generator.hpp index d78b226fb36..ce324ca5954 100644 --- a/generator/road_access_generator.hpp +++ b/generator/road_access_generator.hpp @@ -70,6 +70,8 @@ class RoadAccessTagProcessor bool ignoreBarrierWithoutAccess); void Merge(RoadAccessTagProcessor const & roadAccessTagProcessor); + bool IgnoreRoadAccessType(OsmElement const & elem, RoadAccess::Type accessType); + private: VehicleType m_vehicleType;