| 9 | { |
| 10 | |
| 11 | std::pair<util::guidance::EntryClass, util::guidance::BearingClass> |
| 12 | classifyIntersection(Intersection intersection, const osrm::util::Coordinate &location) |
| 13 | { |
| 14 | if (intersection.empty()) |
| 15 | return {}; |
| 16 | |
| 17 | std::sort(intersection.begin(), |
| 18 | intersection.end(), |
| 19 | [](const ConnectedRoad &left, const ConnectedRoad &right) |
| 20 | { return left.perceived_bearing < right.perceived_bearing; }); |
| 21 | |
| 22 | util::guidance::EntryClass entry_class; |
| 23 | util::guidance::BearingClass bearing_class; |
| 24 | |
| 25 | const bool canBeDiscretized = [&]() |
| 26 | { |
| 27 | if (intersection.size() <= 1) |
| 28 | return true; |
| 29 | |
| 30 | DiscreteBearing last_discrete_bearing = util::guidance::BearingClass::getDiscreteBearing( |
| 31 | std::round(intersection.back().perceived_bearing)); |
| 32 | for (const auto &road : intersection) |
| 33 | { |
| 34 | const DiscreteBearing discrete_bearing = |
| 35 | util::guidance::BearingClass::getDiscreteBearing( |
| 36 | std::round(road.perceived_bearing)); |
| 37 | if (discrete_bearing == last_discrete_bearing) |
| 38 | return false; |
| 39 | last_discrete_bearing = discrete_bearing; |
| 40 | } |
| 41 | return true; |
| 42 | }(); |
| 43 | |
| 44 | // finally transfer data to the entry/bearing classes |
| 45 | std::size_t number = 0; |
| 46 | if (canBeDiscretized) |
| 47 | { |
| 48 | if (util::guidance::BearingClass::getDiscreteBearing( |
| 49 | intersection.back().perceived_bearing) < |
| 50 | util::guidance::BearingClass::getDiscreteBearing( |
| 51 | intersection.front().perceived_bearing)) |
| 52 | { |
| 53 | intersection.insert(intersection.begin(), intersection.back()); |
| 54 | intersection.pop_back(); |
| 55 | } |
| 56 | for (const auto &road : intersection) |
| 57 | { |
| 58 | if (road.entry_allowed) |
| 59 | { |
| 60 | if (!entry_class.activate(number)) |
| 61 | { |
| 62 | util::Log(logWARNING) << "Road " << number << " was not activated at " |
| 63 | << util::toOSMLink(location); |
| 64 | } |
| 65 | } |
| 66 | |
| 67 | auto discrete_bearing_class = util::guidance::BearingClass::getDiscreteBearing( |
| 68 | std::round(road.perceived_bearing)); |