diff --git a/include/extractor/guidance/intersection_handler.hpp b/include/extractor/guidance/intersection_handler.hpp index 6a91a205a..d58d8f786 100644 --- a/include/extractor/guidance/intersection_handler.hpp +++ b/include/extractor/guidance/intersection_handler.hpp @@ -578,7 +578,7 @@ std::size_t IntersectionHandler::findObviousTurn(const EdgeID via_edge, if (node_based_graph.GetTarget(parameters.edge) == node_at_intersection) return {}; - return intersection::getConnectedRoads(node_based_graph, + return intersection::getConnectedRoads(node_based_graph, node_data_container, node_coordinates, compressed_geometries, diff --git a/include/extractor/guidance/node_based_graph_walker.hpp b/include/extractor/guidance/node_based_graph_walker.hpp index 708fd841f..4ceb0001b 100644 --- a/include/extractor/guidance/node_based_graph_walker.hpp +++ b/include/extractor/guidance/node_based_graph_walker.hpp @@ -222,7 +222,7 @@ NodeBasedGraphWalker::TraverseRoad(NodeID current_node_id, // look at the next intersection const auto next_intersection = - intersection::getConnectedRoads(node_based_graph, + intersection::getConnectedRoads(node_based_graph, node_data_container, node_coordinates, compressed_geometries, diff --git a/include/extractor/intersection/intersection_analysis.hpp b/include/extractor/intersection/intersection_analysis.hpp index 1f86f1eca..852fa6652 100644 --- a/include/extractor/intersection/intersection_analysis.hpp +++ b/include/extractor/intersection/intersection_analysis.hpp @@ -60,6 +60,7 @@ convertToIntersectionView(const util::NodeBasedDynamicGraph &graph, // Check for restrictions/barriers and generate a list of valid and invalid turns present at // the node reached from `incoming_edge`. The resulting candidates have to be analyzed // for their actual instructions later on. +template guidance::IntersectionView getConnectedRoads(const util::NodeBasedDynamicGraph &graph, const EdgeBasedNodeDataContainer &node_data_container, diff --git a/src/extractor/guidance/intersection_handler.cpp b/src/extractor/guidance/intersection_handler.cpp index eb187c2ac..110aae170 100644 --- a/src/extractor/guidance/intersection_handler.cpp +++ b/src/extractor/guidance/intersection_handler.cpp @@ -482,7 +482,7 @@ IntersectionHandler::getNextIntersection(const NodeID at, const EdgeID via) cons return boost::none; } - auto intersection = intersection::getConnectedRoads(node_based_graph, + auto intersection = intersection::getConnectedRoads(node_based_graph, node_data_container, node_coordinates, compressed_geometries, diff --git a/src/extractor/guidance/mergable_road_detector.cpp b/src/extractor/guidance/mergable_road_detector.cpp index e0861122c..ff9b3295d 100644 --- a/src/extractor/guidance/mergable_road_detector.cpp +++ b/src/extractor/guidance/mergable_road_detector.cpp @@ -558,7 +558,7 @@ bool MergableRoadDetector::IsLinkRoad(const NodeID intersection_node, const auto next_intersection_parameters = intersection::skipDegreeTwoNodes(node_based_graph, {intersection_node, road.eid}); const auto next_intersection_along_road = - intersection::getConnectedRoads(node_based_graph, + intersection::getConnectedRoads(node_based_graph, node_data_container, node_coordinates, compressed_geometries, diff --git a/src/extractor/guidance/node_based_graph_walker.cpp b/src/extractor/guidance/node_based_graph_walker.cpp index 529070271..f475ae100 100644 --- a/src/extractor/guidance/node_based_graph_walker.cpp +++ b/src/extractor/guidance/node_based_graph_walker.cpp @@ -279,7 +279,7 @@ void IntersectionFinderAccumulator::update(const NodeID from_node, nid = from_node; via_edge_id = via_edge; - intersection = intersection::getConnectedRoads(node_based_graph, + intersection = intersection::getConnectedRoads(node_based_graph, node_data_container, node_coordinates, compressed_geometries, diff --git a/src/extractor/guidance/sliproad_handler.cpp b/src/extractor/guidance/sliproad_handler.cpp index e5c9dcc0c..bac792051 100644 --- a/src/extractor/guidance/sliproad_handler.cpp +++ b/src/extractor/guidance/sliproad_handler.cpp @@ -558,7 +558,7 @@ operator()(const NodeID /*nid*/, const EdgeID source_edge_id, Intersection inter } else { - const auto skip_traffic_light_intersection = intersection::getConnectedRoads( + const auto skip_traffic_light_intersection = intersection::getConnectedRoads( node_based_graph, node_data_container, node_coordinates, diff --git a/src/extractor/guidance/turn_discovery.cpp b/src/extractor/guidance/turn_discovery.cpp index 6af5ebe7d..eb0606191 100644 --- a/src/extractor/guidance/turn_discovery.cpp +++ b/src/extractor/guidance/turn_discovery.cpp @@ -75,7 +75,7 @@ bool findPreviousIntersection(const NodeID node_v, return false; const auto node_v_reverse_intersection = - intersection::getConnectedRoads(node_based_graph, + intersection::getConnectedRoads(node_based_graph, node_data_container, node_coordinates, compressed_geometries, @@ -95,7 +95,7 @@ bool findPreviousIntersection(const NodeID node_v, const auto node_u = node_based_graph.GetTarget(straightmost_at_v_in_reverse->eid); const auto node_u_reverse_intersection = - intersection::getConnectedRoads(node_based_graph, + intersection::getConnectedRoads(node_based_graph, node_data_container, node_coordinates, compressed_geometries, @@ -120,7 +120,7 @@ bool findPreviousIntersection(const NodeID node_v, return false; } - result_intersection = intersection::getConnectedRoads(node_based_graph, + result_intersection = intersection::getConnectedRoads(node_based_graph, node_data_container, node_coordinates, compressed_geometries, diff --git a/src/extractor/guidance/turn_lane_handler.cpp b/src/extractor/guidance/turn_lane_handler.cpp index b04b51293..084d5ce5d 100644 --- a/src/extractor/guidance/turn_lane_handler.cpp +++ b/src/extractor/guidance/turn_lane_handler.cpp @@ -575,7 +575,7 @@ std::pair TurnLaneHandler::partitionLaneData( const auto next_intersection = turn_analysis.AssignTurnTypes(at, straightmost->eid, - intersection::getConnectedRoads(node_based_graph, + intersection::getConnectedRoads(node_based_graph, node_data_container, node_coordinates, compressed_geometries, diff --git a/src/extractor/intersection/intersection_analysis.cpp b/src/extractor/intersection/intersection_analysis.cpp index b159b7e0b..6d7238243 100644 --- a/src/extractor/intersection/intersection_analysis.cpp +++ b/src/extractor/intersection/intersection_analysis.cpp @@ -202,6 +202,7 @@ auto getIntersectionLanes(const util::NodeBasedDynamicGraph &graph, const NodeID return max_lanes_intersection; } +template IntersectionEdgeGeometries getIntersectionOutgoingGeometries(const util::NodeBasedDynamicGraph &graph, const extractor::CompressedEdgeContainer &compressed_geometries, @@ -232,7 +233,7 @@ getIntersectionOutgoingGeometries(const util::NodeBasedDynamicGraph &graph, util::coordinate_calculation::bearing(geometry[0], close_coordinate); const auto representative_coordinate = - graph.GetOutDegree(intersection_node) <= 2 + USE_CLOSE_BEARINGS || graph.GetOutDegree(intersection_node) <= 2 ? coordinate_extractor.GetCoordinateCloseToTurn( intersection_node, outgoing_edge, false, remote_node) : coordinate_extractor.ExtractRepresentativeCoordinate(intersection_node, @@ -265,7 +266,7 @@ getIntersectionGeometries(const util::NodeBasedDynamicGraph &graph, const guidance::MergableRoadDetector &detector, const NodeID intersection_node) { - IntersectionEdgeGeometries edge_geometries = getIntersectionOutgoingGeometries( + IntersectionEdgeGeometries edge_geometries = getIntersectionOutgoingGeometries( graph, compressed_geometries, node_coordinates, intersection_node); const auto edges_number = edge_geometries.size(); @@ -318,7 +319,7 @@ getIntersectionGeometries(const util::NodeBasedDynamicGraph &graph, const auto neighbor_intersection_node = graph.GetTarget(edge_geometry.edge); - const auto neighbor_geometries = getIntersectionOutgoingGeometries( + const auto neighbor_geometries = getIntersectionOutgoingGeometries( graph, compressed_geometries, node_coordinates, neighbor_intersection_node); const auto neighbor_edges = neighbor_geometries.size(); @@ -755,6 +756,7 @@ convertToIntersectionView(const util::NodeBasedDynamicGraph &graph, // That means we not only get (from_node, turn_node, c) in the above example // but also (from_node, turn_node, a), (from_node, turn_node, b). These turns are // marked as invalid and only needed for intersection classification. +template guidance::IntersectionView getConnectedRoads(const util::NodeBasedDynamicGraph &graph, const EdgeBasedNodeDataContainer &node_data_container, @@ -767,7 +769,7 @@ getConnectedRoads(const util::NodeBasedDynamicGraph &graph, { const auto intersection_node = graph.GetTarget(incoming_edge.edge); const auto &outgoing_edges = intersection::getOutgoingEdges(graph, intersection_node); - auto edge_geometries = getIntersectionOutgoingGeometries( + auto edge_geometries = getIntersectionOutgoingGeometries( graph, compressed_geometries, node_coordinates, intersection_node); // Add incoming edges with reversed bearings @@ -798,6 +800,29 @@ getConnectedRoads(const util::NodeBasedDynamicGraph &graph, std::unordered_set()); } +template +guidance::IntersectionView +getConnectedRoads(const util::NodeBasedDynamicGraph &graph, + const EdgeBasedNodeDataContainer &node_data_container, + const std::vector &node_coordinates, + const extractor::CompressedEdgeContainer &compressed_geometries, + const RestrictionMap &node_restriction_map, + const std::unordered_set &barrier_nodes, + const guidance::TurnLanesIndexedArray &turn_lanes_data, + const IntersectionEdge &incoming_edge); + +template +guidance::IntersectionView +getConnectedRoads(const util::NodeBasedDynamicGraph &graph, + const EdgeBasedNodeDataContainer &node_data_container, + const std::vector &node_coordinates, + const extractor::CompressedEdgeContainer &compressed_geometries, + const RestrictionMap &node_restriction_map, + const std::unordered_set &barrier_nodes, + const guidance::TurnLanesIndexedArray &turn_lanes_data, + const IntersectionEdge &incoming_edge); + + IntersectionEdge skipDegreeTwoNodes(const util::NodeBasedDynamicGraph &graph, IntersectionEdge road) { std::unordered_set visited_nodes;