std::vector<TurnOperation> TurnAnalysis::getTurns(const NodeID from_nid, const EdgeID via_eid) const { auto intersection = intersection_generator(from_nid, via_eid); // Roundabouts are a main priority. If there is a roundabout instruction present, we process the // turn as a roundabout if (roundabout_handler.canProcess(from_nid, via_eid, intersection)) { intersection = roundabout_handler(from_nid, via_eid, std::move(intersection)); } else { // set initial defaults for normal turns and modifier based on angle intersection = setTurnTypes(from_nid, via_eid, std::move(intersection)); if (motorway_handler.canProcess(from_nid, via_eid, intersection)) { intersection = motorway_handler(from_nid, via_eid, std::move(intersection)); } else { BOOST_ASSERT(turn_handler.canProcess(from_nid, via_eid, intersection)); intersection = turn_handler(from_nid, via_eid, std::move(intersection)); } } std::vector<TurnOperation> turns; for (auto road : intersection) if (road.entry_allowed) turns.emplace_back(road.turn); return turns; }
std::vector<TurnOperation> TurnAnalysis::getTurns(const NodeID from_nid, const EdgeID via_eid) const { auto intersection = intersection_generator(from_nid, via_eid); // Roundabouts are a main priority. If there is a roundabout instruction present, we process the // turn as a roundabout if (roundabout_handler.canProcess(from_nid, via_eid, intersection)) { intersection = roundabout_handler(from_nid, via_eid, std::move(intersection)); } else { // set initial defaults for normal turns and modifier based on angle intersection = setTurnTypes(from_nid, via_eid, std::move(intersection)); if (motorway_handler.canProcess(from_nid, via_eid, intersection)) { intersection = motorway_handler(from_nid, via_eid, std::move(intersection)); } else { BOOST_ASSERT(turn_handler.canProcess(from_nid, via_eid, intersection)); intersection = turn_handler(from_nid, via_eid, std::move(intersection)); } } // Handle sliproads intersection = handleSliproads(via_eid, std::move(intersection)); // Turn On Ramps Into Off Ramps, if we come from a motorway-like road if (isMotorwayClass(node_based_graph.GetEdgeData(via_eid).road_classification.road_class)) { std::for_each(intersection.begin(), intersection.end(), [](ConnectedRoad &road) { if (road.turn.instruction.type == TurnType::OnRamp) road.turn.instruction.type = TurnType::OffRamp; }); } std::vector<TurnOperation> turns; for (auto road : intersection) if (road.entry_allowed) turns.emplace_back(road.turn); return turns; }
Intersection TurnAnalysis::assignTurnTypes(const NodeID from_nid, const EdgeID via_eid, Intersection intersection) const { // Roundabouts are a main priority. If there is a roundabout instruction present, we process the // turn as a roundabout if (roundabout_handler.canProcess(from_nid, via_eid, intersection)) { intersection = roundabout_handler(from_nid, via_eid, std::move(intersection)); } else { // set initial defaults for normal turns and modifier based on angle intersection = setTurnTypes(from_nid, via_eid, std::move(intersection)); if (motorway_handler.canProcess(from_nid, via_eid, intersection)) { intersection = motorway_handler(from_nid, via_eid, std::move(intersection)); } else { BOOST_ASSERT(turn_handler.canProcess(from_nid, via_eid, intersection)); intersection = turn_handler(from_nid, via_eid, std::move(intersection)); } } // Handle sliproads intersection = sliproad_handler(from_nid, via_eid, std::move(intersection)); // Turn On Ramps Into Off Ramps, if we come from a motorway-like road if (node_based_graph.GetEdgeData(via_eid).road_classification.IsMotorwayClass()) { std::for_each(intersection.begin(), intersection.end(), [](ConnectedRoad &road) { if (road.turn.instruction.type == TurnType::OnRamp) road.turn.instruction.type = TurnType::OffRamp; }); } return intersection; }