Take stop signs into account during routing
This commit is contained in:
		
							parent
							
								
									4432756de1
								
							
						
					
					
						commit
						350862d177
					
				
							
								
								
									
										39
									
								
								features/car/give_way_sign_penalties.feature
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								features/car/give_way_sign_penalties.feature
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					@routing @car @give_way_sign
 | 
				
			||||||
 | 
					Feature: Car - Handle give way signs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Background:
 | 
				
			||||||
 | 
					        Given the profile "car"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Scenario: Car - Encounters a give way sign
 | 
				
			||||||
 | 
					        Given the node map
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					            a-1-b-2-c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            d-3-e-4-f
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            g-h-i   k-l-m
 | 
				
			||||||
 | 
					              |       |
 | 
				
			||||||
 | 
					              j       n
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        And the ways
 | 
				
			||||||
 | 
					            | nodes | highway |
 | 
				
			||||||
 | 
					            | abc   | primary |
 | 
				
			||||||
 | 
					            | def   | primary |
 | 
				
			||||||
 | 
					            | ghi   | primary |
 | 
				
			||||||
 | 
					            | klm   | primary |
 | 
				
			||||||
 | 
					            | hj    | primary |
 | 
				
			||||||
 | 
					            | ln    | primary |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        And the nodes
 | 
				
			||||||
 | 
					            | node | highway         |
 | 
				
			||||||
 | 
					            | e    | give_way        |
 | 
				
			||||||
 | 
					            | l    | give_way        |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        When I route I should get
 | 
				
			||||||
 | 
					            | from | to | time   | # |
 | 
				
			||||||
 | 
					            | 1    | 2  |  11.1s | no turn with no stop sign |
 | 
				
			||||||
 | 
					            | 3    | 4  |  13.1s | no turn with stop sign    |
 | 
				
			||||||
 | 
					            | g    | j  |  18.7s | turn with no stop sign    |
 | 
				
			||||||
 | 
					            | k    | n  |  20.7s | turn with stop sign       |
 | 
				
			||||||
@ -71,6 +71,7 @@ class EdgeBasedGraphFactory
 | 
				
			|||||||
                                   const std::unordered_set<NodeID> &barrier_nodes,
 | 
					                                   const std::unordered_set<NodeID> &barrier_nodes,
 | 
				
			||||||
                                   const TrafficFlowControlNodes &traffic_signals,
 | 
					                                   const TrafficFlowControlNodes &traffic_signals,
 | 
				
			||||||
                                   const TrafficFlowControlNodes &stop_signs,
 | 
					                                   const TrafficFlowControlNodes &stop_signs,
 | 
				
			||||||
 | 
					                                   const TrafficFlowControlNodes &give_way_signs,
 | 
				
			||||||
                                   const std::vector<util::Coordinate> &coordinates,
 | 
					                                   const std::vector<util::Coordinate> &coordinates,
 | 
				
			||||||
                                   const NameTable &name_table,
 | 
					                                   const NameTable &name_table,
 | 
				
			||||||
                                   const std::unordered_set<EdgeID> &segregated_edges,
 | 
					                                   const std::unordered_set<EdgeID> &segregated_edges,
 | 
				
			||||||
@ -138,6 +139,7 @@ class EdgeBasedGraphFactory
 | 
				
			|||||||
    const std::unordered_set<NodeID> &m_barrier_nodes;
 | 
					    const std::unordered_set<NodeID> &m_barrier_nodes;
 | 
				
			||||||
    const TrafficFlowControlNodes &m_traffic_signals;
 | 
					    const TrafficFlowControlNodes &m_traffic_signals;
 | 
				
			||||||
    const TrafficFlowControlNodes &m_stop_signs;
 | 
					    const TrafficFlowControlNodes &m_stop_signs;
 | 
				
			||||||
 | 
					    const TrafficFlowControlNodes &m_give_way_signs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const CompressedEdgeContainer &m_compressed_edge_container;
 | 
					    const CompressedEdgeContainer &m_compressed_edge_container;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -40,7 +40,7 @@ class ExtractionContainers
 | 
				
			|||||||
    ReferencedWays IdentifyManeuverOverrideWays();
 | 
					    ReferencedWays IdentifyManeuverOverrideWays();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ReferencedTrafficFlowControlNodes IdentifyTrafficFlowControlNodes(
 | 
					    ReferencedTrafficFlowControlNodes IdentifyTrafficFlowControlNodes(
 | 
				
			||||||
        const std::vector<InputTrafficFlowControlNode> &external_stop_signs);
 | 
					        const std::vector<InputTrafficFlowControlNode> &external_traffic_control_nodes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void PrepareNodes();
 | 
					    void PrepareNodes();
 | 
				
			||||||
    void PrepareManeuverOverrides(const ReferencedWays &maneuver_override_ways);
 | 
					    void PrepareManeuverOverrides(const ReferencedWays &maneuver_override_ways);
 | 
				
			||||||
@ -83,7 +83,7 @@ class ExtractionContainers
 | 
				
			|||||||
    TrafficFlowControlNodes internal_stop_signs;
 | 
					    TrafficFlowControlNodes internal_stop_signs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    std::vector<InputTrafficFlowControlNode> external_give_ways;
 | 
					    std::vector<InputTrafficFlowControlNode> external_give_ways;
 | 
				
			||||||
    TrafficFlowControlNodes internal_give_ways;
 | 
					    TrafficFlowControlNodes internal_give_way_signs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    std::vector<NodeBasedEdge> used_edges;
 | 
					    std::vector<NodeBasedEdge> used_edges;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -52,6 +52,7 @@ struct ExtractionTurn
 | 
				
			|||||||
                   bool is_u_turn,
 | 
					                   bool is_u_turn,
 | 
				
			||||||
                   bool has_traffic_light,
 | 
					                   bool has_traffic_light,
 | 
				
			||||||
                   bool has_stop_sign,
 | 
					                   bool has_stop_sign,
 | 
				
			||||||
 | 
					                   bool has_give_way_sign,
 | 
				
			||||||
                   bool is_left_hand_driving,
 | 
					                   bool is_left_hand_driving,
 | 
				
			||||||
                   bool source_restricted,
 | 
					                   bool source_restricted,
 | 
				
			||||||
                   TravelMode source_mode,
 | 
					                   TravelMode source_mode,
 | 
				
			||||||
@ -76,7 +77,7 @@ struct ExtractionTurn
 | 
				
			|||||||
                   const std::vector<ExtractionTurnLeg> &roads_on_the_right,
 | 
					                   const std::vector<ExtractionTurnLeg> &roads_on_the_right,
 | 
				
			||||||
                   const std::vector<ExtractionTurnLeg> &roads_on_the_left)
 | 
					                   const std::vector<ExtractionTurnLeg> &roads_on_the_left)
 | 
				
			||||||
        : angle(180. - angle), number_of_roads(number_of_roads), is_u_turn(is_u_turn),
 | 
					        : angle(180. - angle), number_of_roads(number_of_roads), is_u_turn(is_u_turn),
 | 
				
			||||||
          has_traffic_light(has_traffic_light), has_stop_sign(has_stop_sign),
 | 
					          has_traffic_light(has_traffic_light), has_stop_sign(has_stop_sign), has_give_way_sign(has_give_way_sign),
 | 
				
			||||||
          is_left_hand_driving(is_left_hand_driving),
 | 
					          is_left_hand_driving(is_left_hand_driving),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          source_restricted(source_restricted), source_mode(source_mode),
 | 
					          source_restricted(source_restricted), source_mode(source_mode),
 | 
				
			||||||
@ -103,6 +104,7 @@ struct ExtractionTurn
 | 
				
			|||||||
    const bool is_u_turn;
 | 
					    const bool is_u_turn;
 | 
				
			||||||
    const bool has_traffic_light;
 | 
					    const bool has_traffic_light;
 | 
				
			||||||
    const bool has_stop_sign;
 | 
					    const bool has_stop_sign;
 | 
				
			||||||
 | 
					    const bool has_give_way_sign;
 | 
				
			||||||
    const bool is_left_hand_driving;
 | 
					    const bool is_left_hand_driving;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // source info
 | 
					    // source info
 | 
				
			||||||
 | 
				
			|||||||
@ -68,6 +68,7 @@ class Extractor
 | 
				
			|||||||
        std::vector<UnresolvedManeuverOverride> unresolved_maneuver_overrides;
 | 
					        std::vector<UnresolvedManeuverOverride> unresolved_maneuver_overrides;
 | 
				
			||||||
        TrafficFlowControlNodes traffic_signals;
 | 
					        TrafficFlowControlNodes traffic_signals;
 | 
				
			||||||
        TrafficFlowControlNodes stop_signs;
 | 
					        TrafficFlowControlNodes stop_signs;
 | 
				
			||||||
 | 
					        TrafficFlowControlNodes give_way_signs;
 | 
				
			||||||
        std::unordered_set<NodeID> barriers;
 | 
					        std::unordered_set<NodeID> barriers;
 | 
				
			||||||
        std::vector<util::Coordinate> osm_coordinates;
 | 
					        std::vector<util::Coordinate> osm_coordinates;
 | 
				
			||||||
        extractor::PackedOSMIDs osm_node_ids;
 | 
					        extractor::PackedOSMIDs osm_node_ids;
 | 
				
			||||||
@ -89,6 +90,7 @@ class Extractor
 | 
				
			|||||||
        const std::unordered_set<NodeID> &barrier_nodes,
 | 
					        const std::unordered_set<NodeID> &barrier_nodes,
 | 
				
			||||||
        const TrafficFlowControlNodes &traffic_signals,
 | 
					        const TrafficFlowControlNodes &traffic_signals,
 | 
				
			||||||
        const TrafficFlowControlNodes &stop_signs,
 | 
					        const TrafficFlowControlNodes &stop_signs,
 | 
				
			||||||
 | 
					        const TrafficFlowControlNodes &give_way_signs,
 | 
				
			||||||
        const RestrictionGraph &restriction_graph,
 | 
					        const RestrictionGraph &restriction_graph,
 | 
				
			||||||
        const std::unordered_set<EdgeID> &segregated_edges,
 | 
					        const std::unordered_set<EdgeID> &segregated_edges,
 | 
				
			||||||
        const NameTable &name_table,
 | 
					        const NameTable &name_table,
 | 
				
			||||||
 | 
				
			|||||||
@ -28,6 +28,7 @@ class GraphCompressor
 | 
				
			|||||||
    void Compress(const std::unordered_set<NodeID> &barrier_nodes,
 | 
					    void Compress(const std::unordered_set<NodeID> &barrier_nodes,
 | 
				
			||||||
                  const TrafficFlowControlNodes &traffic_signals,
 | 
					                  const TrafficFlowControlNodes &traffic_signals,
 | 
				
			||||||
                  const TrafficFlowControlNodes &stop_signs,
 | 
					                  const TrafficFlowControlNodes &stop_signs,
 | 
				
			||||||
 | 
					                  const TrafficFlowControlNodes &give_way_signs,
 | 
				
			||||||
                  ScriptingEnvironment &scripting_environment,
 | 
					                  ScriptingEnvironment &scripting_environment,
 | 
				
			||||||
                  std::vector<TurnRestriction> &turn_restrictions,
 | 
					                  std::vector<TurnRestriction> &turn_restrictions,
 | 
				
			||||||
                  std::vector<UnresolvedManeuverOverride> &maneuver_overrides,
 | 
					                  std::vector<UnresolvedManeuverOverride> &maneuver_overrides,
 | 
				
			||||||
 | 
				
			|||||||
@ -43,7 +43,7 @@ class NodeBasedGraphFactory
 | 
				
			|||||||
                          std::vector<UnresolvedManeuverOverride> &maneuver_overrides,
 | 
					                          std::vector<UnresolvedManeuverOverride> &maneuver_overrides,
 | 
				
			||||||
                          const TrafficFlowControlNodes &traffic_signals,
 | 
					                          const TrafficFlowControlNodes &traffic_signals,
 | 
				
			||||||
                          const TrafficFlowControlNodes &stop_signs,
 | 
					                          const TrafficFlowControlNodes &stop_signs,
 | 
				
			||||||
 | 
					                          const TrafficFlowControlNodes &give_way_signs,
 | 
				
			||||||
                          std::unordered_set<NodeID> &&barriers,
 | 
					                          std::unordered_set<NodeID> &&barriers,
 | 
				
			||||||
                          std::vector<util::Coordinate> &&coordinates,
 | 
					                          std::vector<util::Coordinate> &&coordinates,
 | 
				
			||||||
                          extractor::PackedOSMIDs &&osm_node_ids,
 | 
					                          extractor::PackedOSMIDs &&osm_node_ids,
 | 
				
			||||||
@ -76,7 +76,8 @@ class NodeBasedGraphFactory
 | 
				
			|||||||
                  std::vector<TurnRestriction> &turn_restrictions,
 | 
					                  std::vector<TurnRestriction> &turn_restrictions,
 | 
				
			||||||
                  std::vector<UnresolvedManeuverOverride> &maneuver_overrides,
 | 
					                  std::vector<UnresolvedManeuverOverride> &maneuver_overrides,
 | 
				
			||||||
                  const TrafficFlowControlNodes &traffic_signals,
 | 
					                  const TrafficFlowControlNodes &traffic_signals,
 | 
				
			||||||
                  const TrafficFlowControlNodes &stop_signs);
 | 
					                  const TrafficFlowControlNodes &stop_signs,
 | 
				
			||||||
 | 
					                  const TrafficFlowControlNodes &give_way_signs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Most ways are bidirectional, making the geometry in forward and backward direction the same,
 | 
					    // Most ways are bidirectional, making the geometry in forward and backward direction the same,
 | 
				
			||||||
    // except for reversal. We make use of this fact by keeping only one representation of the
 | 
					    // except for reversal. We make use of this fact by keeping only one representation of the
 | 
				
			||||||
 | 
				
			|||||||
@ -30,7 +30,8 @@ function setup()
 | 
				
			|||||||
      use_turn_restrictions          = true,
 | 
					      use_turn_restrictions          = true,
 | 
				
			||||||
      left_hand_driving              = false,
 | 
					      left_hand_driving              = false,
 | 
				
			||||||
      traffic_light_penalty          = 2,
 | 
					      traffic_light_penalty          = 2,
 | 
				
			||||||
      stop_sign_penalty              = 2
 | 
					      stop_sign_penalty              = 2,
 | 
				
			||||||
 | 
					      give_way_sign_penalty          = 2
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    default_mode              = mode.driving,
 | 
					    default_mode              = mode.driving,
 | 
				
			||||||
@ -480,9 +481,11 @@ function process_turn(profile, turn)
 | 
				
			|||||||
  local turn_bias = turn.is_left_hand_driving and 1. / profile.turn_bias or profile.turn_bias
 | 
					  local turn_bias = turn.is_left_hand_driving and 1. / profile.turn_bias or profile.turn_bias
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if turn.has_traffic_light then
 | 
					  if turn.has_traffic_light then
 | 
				
			||||||
      turn.duration = profile.properties.traffic_light_penalty
 | 
					    turn.duration = profile.properties.traffic_light_penalty
 | 
				
			||||||
  elseif turn.has_stop_sign then
 | 
					  elseif turn.has_stop_sign then
 | 
				
			||||||
    turn.duration = profile.properties.stop_sign_penalty
 | 
					    turn.duration = profile.properties.stop_sign_penalty
 | 
				
			||||||
 | 
					  elseif turn.has_give_way_sign then
 | 
				
			||||||
 | 
					    turn.duration = profile.properties.give_way_sign_penalty
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -61,6 +61,7 @@ EdgeBasedGraphFactory::EdgeBasedGraphFactory(
 | 
				
			|||||||
    const std::unordered_set<NodeID> &barrier_nodes,
 | 
					    const std::unordered_set<NodeID> &barrier_nodes,
 | 
				
			||||||
    const TrafficFlowControlNodes &traffic_signals,
 | 
					    const TrafficFlowControlNodes &traffic_signals,
 | 
				
			||||||
    const TrafficFlowControlNodes &stop_signs,
 | 
					    const TrafficFlowControlNodes &stop_signs,
 | 
				
			||||||
 | 
					    const TrafficFlowControlNodes &give_way_signs,
 | 
				
			||||||
    const std::vector<util::Coordinate> &coordinates,
 | 
					    const std::vector<util::Coordinate> &coordinates,
 | 
				
			||||||
    const NameTable &name_table,
 | 
					    const NameTable &name_table,
 | 
				
			||||||
    const std::unordered_set<EdgeID> &segregated_edges,
 | 
					    const std::unordered_set<EdgeID> &segregated_edges,
 | 
				
			||||||
@ -68,7 +69,7 @@ EdgeBasedGraphFactory::EdgeBasedGraphFactory(
 | 
				
			|||||||
    : m_edge_based_node_container(node_data_container), m_connectivity_checksum(0),
 | 
					    : m_edge_based_node_container(node_data_container), m_connectivity_checksum(0),
 | 
				
			||||||
      m_number_of_edge_based_nodes(0), m_coordinates(coordinates),
 | 
					      m_number_of_edge_based_nodes(0), m_coordinates(coordinates),
 | 
				
			||||||
      m_node_based_graph(node_based_graph), m_barrier_nodes(barrier_nodes),
 | 
					      m_node_based_graph(node_based_graph), m_barrier_nodes(barrier_nodes),
 | 
				
			||||||
      m_traffic_signals(traffic_signals), m_stop_signs(stop_signs),
 | 
					      m_traffic_signals(traffic_signals), m_stop_signs(stop_signs), m_give_way_signs(give_way_signs),
 | 
				
			||||||
      m_compressed_edge_container(compressed_edge_container), name_table(name_table),
 | 
					      m_compressed_edge_container(compressed_edge_container), name_table(name_table),
 | 
				
			||||||
      segregated_edges(segregated_edges), lane_description_map(lane_description_map)
 | 
					      segregated_edges(segregated_edges), lane_description_map(lane_description_map)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -645,7 +646,8 @@ void EdgeBasedGraphFactory::GenerateEdgeExpandedEdges(
 | 
				
			|||||||
            // node But we'll check anyway.
 | 
					            // node But we'll check anyway.
 | 
				
			||||||
            const auto is_traffic_light = m_traffic_signals.Has(from_node, intersection_node);
 | 
					            const auto is_traffic_light = m_traffic_signals.Has(from_node, intersection_node);
 | 
				
			||||||
            const auto is_stop_sign = m_stop_signs.Has(from_node, intersection_node);
 | 
					            const auto is_stop_sign = m_stop_signs.Has(from_node, intersection_node);
 | 
				
			||||||
            std::cerr << "IS STOP SIGN " << is_stop_sign << std::endl;
 | 
					            const auto is_give_way_sign = m_give_way_signs.Has(from_node, intersection_node);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
            const auto is_uturn =
 | 
					            const auto is_uturn =
 | 
				
			||||||
                guidance::getTurnDirection(turn_angle) == guidance::DirectionModifier::UTurn;
 | 
					                guidance::getTurnDirection(turn_angle) == guidance::DirectionModifier::UTurn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -656,6 +658,7 @@ void EdgeBasedGraphFactory::GenerateEdgeExpandedEdges(
 | 
				
			|||||||
                is_uturn,
 | 
					                is_uturn,
 | 
				
			||||||
                is_traffic_light,
 | 
					                is_traffic_light,
 | 
				
			||||||
                is_stop_sign,
 | 
					                is_stop_sign,
 | 
				
			||||||
 | 
					                is_give_way_sign,
 | 
				
			||||||
                m_edge_based_node_container.GetAnnotation(edge_data1.annotation_data)
 | 
					                m_edge_based_node_container.GetAnnotation(edge_data1.annotation_data)
 | 
				
			||||||
                    .is_left_hand_driving,
 | 
					                    .is_left_hand_driving,
 | 
				
			||||||
                // source info
 | 
					                // source info
 | 
				
			||||||
 | 
				
			|||||||
@ -415,12 +415,14 @@ void ExtractionContainers::PrepareData(ScriptingEnvironment &scripting_environme
 | 
				
			|||||||
    const auto maneuver_override_ways = IdentifyManeuverOverrideWays();
 | 
					    const auto maneuver_override_ways = IdentifyManeuverOverrideWays();
 | 
				
			||||||
    const auto traffic_signals = IdentifyTrafficFlowControlNodes(external_traffic_signals);
 | 
					    const auto traffic_signals = IdentifyTrafficFlowControlNodes(external_traffic_signals);
 | 
				
			||||||
    const auto stop_signs = IdentifyTrafficFlowControlNodes(external_stop_signs);
 | 
					    const auto stop_signs = IdentifyTrafficFlowControlNodes(external_stop_signs);
 | 
				
			||||||
 | 
					    const auto give_ways = IdentifyTrafficFlowControlNodes(external_give_ways);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    PrepareNodes();
 | 
					    PrepareNodes();
 | 
				
			||||||
    PrepareEdges(scripting_environment);
 | 
					    PrepareEdges(scripting_environment);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    PrepareTrafficFlowControlNodes(traffic_signals, internal_traffic_signals);
 | 
					    PrepareTrafficFlowControlNodes(traffic_signals, internal_traffic_signals);
 | 
				
			||||||
    PrepareTrafficFlowControlNodes(stop_signs, internal_stop_signs);
 | 
					    PrepareTrafficFlowControlNodes(stop_signs, internal_stop_signs);
 | 
				
			||||||
 | 
					    PrepareTrafficFlowControlNodes(give_ways, internal_give_way_signs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    PrepareManeuverOverrides(maneuver_override_ways);
 | 
					    PrepareManeuverOverrides(maneuver_override_ways);
 | 
				
			||||||
    PrepareRestrictions(restriction_ways);
 | 
					    PrepareRestrictions(restriction_ways);
 | 
				
			||||||
 | 
				
			|||||||
@ -227,7 +227,7 @@ int Extractor::run(ScriptingEnvironment &scripting_environment)
 | 
				
			|||||||
                                                   parsed_osm_data.unresolved_maneuver_overrides,
 | 
					                                                   parsed_osm_data.unresolved_maneuver_overrides,
 | 
				
			||||||
                                                   parsed_osm_data.traffic_signals,
 | 
					                                                   parsed_osm_data.traffic_signals,
 | 
				
			||||||
                                                   parsed_osm_data.stop_signs,
 | 
					                                                   parsed_osm_data.stop_signs,
 | 
				
			||||||
 | 
					                                                   parsed_osm_data.give_way_signs,
 | 
				
			||||||
                                                   std::move(parsed_osm_data.barriers),
 | 
					                                                   std::move(parsed_osm_data.barriers),
 | 
				
			||||||
                                                   std::move(parsed_osm_data.osm_coordinates),
 | 
					                                                   std::move(parsed_osm_data.osm_coordinates),
 | 
				
			||||||
                                                   std::move(parsed_osm_data.osm_node_ids),
 | 
					                                                   std::move(parsed_osm_data.osm_node_ids),
 | 
				
			||||||
@ -286,6 +286,7 @@ int Extractor::run(ScriptingEnvironment &scripting_environment)
 | 
				
			|||||||
                               barrier_nodes,
 | 
					                               barrier_nodes,
 | 
				
			||||||
                               parsed_osm_data.traffic_signals,
 | 
					                               parsed_osm_data.traffic_signals,
 | 
				
			||||||
                               parsed_osm_data.stop_signs,
 | 
					                               parsed_osm_data.stop_signs,
 | 
				
			||||||
 | 
					                               parsed_osm_data.give_way_signs,
 | 
				
			||||||
                               restriction_graph,
 | 
					                               restriction_graph,
 | 
				
			||||||
                               segregated_edges,
 | 
					                               segregated_edges,
 | 
				
			||||||
                               name_table,
 | 
					                               name_table,
 | 
				
			||||||
@ -653,6 +654,7 @@ Extractor::ParsedOSMData Extractor::ParseOSMData(ScriptingEnvironment &scripting
 | 
				
			|||||||
                         std::move(extraction_containers.internal_maneuver_overrides),
 | 
					                         std::move(extraction_containers.internal_maneuver_overrides),
 | 
				
			||||||
                         std::move(extraction_containers.internal_traffic_signals),
 | 
					                         std::move(extraction_containers.internal_traffic_signals),
 | 
				
			||||||
                         std::move(extraction_containers.internal_stop_signs),
 | 
					                         std::move(extraction_containers.internal_stop_signs),
 | 
				
			||||||
 | 
					                         std::move(extraction_containers.internal_give_way_signs),
 | 
				
			||||||
                         std::move(extraction_containers.used_barrier_nodes),
 | 
					                         std::move(extraction_containers.used_barrier_nodes),
 | 
				
			||||||
                         std::move(osm_coordinates),
 | 
					                         std::move(osm_coordinates),
 | 
				
			||||||
                         std::move(osm_node_ids),
 | 
					                         std::move(osm_node_ids),
 | 
				
			||||||
@ -730,6 +732,7 @@ EdgeID Extractor::BuildEdgeExpandedGraph(
 | 
				
			|||||||
    const std::unordered_set<NodeID> &barrier_nodes,
 | 
					    const std::unordered_set<NodeID> &barrier_nodes,
 | 
				
			||||||
    const TrafficFlowControlNodes &traffic_signals,
 | 
					    const TrafficFlowControlNodes &traffic_signals,
 | 
				
			||||||
    const TrafficFlowControlNodes &stop_signs,
 | 
					    const TrafficFlowControlNodes &stop_signs,
 | 
				
			||||||
 | 
					    const TrafficFlowControlNodes &give_way_signs,
 | 
				
			||||||
    const RestrictionGraph &restriction_graph,
 | 
					    const RestrictionGraph &restriction_graph,
 | 
				
			||||||
    const std::unordered_set<EdgeID> &segregated_edges,
 | 
					    const std::unordered_set<EdgeID> &segregated_edges,
 | 
				
			||||||
    const NameTable &name_table,
 | 
					    const NameTable &name_table,
 | 
				
			||||||
@ -752,6 +755,7 @@ EdgeID Extractor::BuildEdgeExpandedGraph(
 | 
				
			|||||||
                                                   barrier_nodes,
 | 
					                                                   barrier_nodes,
 | 
				
			||||||
                                                   traffic_signals,
 | 
					                                                   traffic_signals,
 | 
				
			||||||
                                                   stop_signs,
 | 
					                                                   stop_signs,
 | 
				
			||||||
 | 
					                                                   give_way_signs,
 | 
				
			||||||
                                                   coordinates,
 | 
					                                                   coordinates,
 | 
				
			||||||
                                                   name_table,
 | 
					                                                   name_table,
 | 
				
			||||||
                                                   segregated_edges,
 | 
					                                                   segregated_edges,
 | 
				
			||||||
 | 
				
			|||||||
@ -82,13 +82,12 @@ void ExtractorCallbacks::ProcessNode(const osmium::Node &input_node,
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        external_memory.external_traffic_signals.push_back({id, result_node.traffic_lights});
 | 
					        external_memory.external_traffic_signals.push_back({id, result_node.traffic_lights});
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // if (result_node.give_way != GiveWay::Direction::NONE)
 | 
					    if (result_node.give_way != TrafficFlowControlNodeDirection::NONE)
 | 
				
			||||||
    // {
 | 
					    {
 | 
				
			||||||
    //     external_memory.external_give_ways.push_back({id, result_node.give_way});
 | 
					        external_memory.external_give_ways.push_back({id, result_node.give_way});
 | 
				
			||||||
    // }
 | 
					    }
 | 
				
			||||||
    if (result_node.stop_sign != TrafficFlowControlNodeDirection::NONE)
 | 
					    if (result_node.stop_sign != TrafficFlowControlNodeDirection::NONE)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        std::cerr << "FOUND STOP SIGN\n";
 | 
					 | 
				
			||||||
        external_memory.external_stop_signs.push_back({id, result_node.stop_sign});
 | 
					        external_memory.external_stop_signs.push_back({id, result_node.stop_sign});
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -24,6 +24,7 @@ static constexpr int SECOND_TO_DECISECOND = 10;
 | 
				
			|||||||
void GraphCompressor::Compress(const std::unordered_set<NodeID> &barrier_nodes,
 | 
					void GraphCompressor::Compress(const std::unordered_set<NodeID> &barrier_nodes,
 | 
				
			||||||
                               const TrafficFlowControlNodes &traffic_signals,
 | 
					                               const TrafficFlowControlNodes &traffic_signals,
 | 
				
			||||||
                               const TrafficFlowControlNodes &stop_signs,
 | 
					                               const TrafficFlowControlNodes &stop_signs,
 | 
				
			||||||
 | 
					                               const TrafficFlowControlNodes &give_way_signs,
 | 
				
			||||||
                               ScriptingEnvironment &scripting_environment,
 | 
					                               ScriptingEnvironment &scripting_environment,
 | 
				
			||||||
                               std::vector<TurnRestriction> &turn_restrictions,
 | 
					                               std::vector<TurnRestriction> &turn_restrictions,
 | 
				
			||||||
                               std::vector<UnresolvedManeuverOverride> &maneuver_overrides,
 | 
					                               std::vector<UnresolvedManeuverOverride> &maneuver_overrides,
 | 
				
			||||||
@ -223,11 +224,25 @@ void GraphCompressor::Compress(const std::unordered_set<NodeID> &barrier_nodes,
 | 
				
			|||||||
                                          << " has both a traffic signal and a stop sign";
 | 
					                                          << " has both a traffic signal and a stop sign";
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (has_reverse_stop_sign && has_reverse_signal) {
 | 
					                if (has_reverse_stop_sign && has_reverse_signal) {
 | 
				
			||||||
                    has_forward_stop_sign = false;
 | 
					                    has_reverse_stop_sign = false;
 | 
				
			||||||
                    util::Log(logWARNING) << "Node " << node_v
 | 
					                    util::Log(logWARNING) << "Node " << node_v
 | 
				
			||||||
                                          << " has both a traffic signal and a stop sign";
 | 
					                                          << " has both a traffic signal and a stop sign";
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                bool has_forward_give_way_sign = give_way_signs.Has(node_u, node_v);
 | 
				
			||||||
 | 
					                bool has_reverse_give_way_sign = give_way_signs.Has(node_w, node_v);
 | 
				
			||||||
 | 
					                                // we apply penalty for only one of the control flow nodes
 | 
				
			||||||
 | 
					                if (has_forward_give_way_sign && (has_forward_signal || has_forward_stop_sign)) {
 | 
				
			||||||
 | 
					                    has_forward_give_way_sign = false;
 | 
				
			||||||
 | 
					                    util::Log(logWARNING) << "Node " << node_v
 | 
				
			||||||
 | 
					                                          << " has both a give way sign and a stop sign or traffic signal";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (has_reverse_stop_sign && (has_reverse_signal || has_reverse_stop_sign)) {
 | 
				
			||||||
 | 
					                    has_reverse_give_way_sign = false;
 | 
				
			||||||
 | 
					                    util::Log(logWARNING) << "Node " << node_v
 | 
				
			||||||
 | 
					                                          << " has both a give way sign and a stop sign or traffic signal";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                EdgeDuration forward_node_duration_penalty = MAXIMAL_EDGE_DURATION;
 | 
					                EdgeDuration forward_node_duration_penalty = MAXIMAL_EDGE_DURATION;
 | 
				
			||||||
                EdgeWeight forward_node_weight_penalty = INVALID_EDGE_WEIGHT;
 | 
					                EdgeWeight forward_node_weight_penalty = INVALID_EDGE_WEIGHT;
 | 
				
			||||||
@ -248,6 +263,7 @@ void GraphCompressor::Compress(const std::unordered_set<NodeID> &barrier_nodes,
 | 
				
			|||||||
                                                   false,
 | 
					                                                   false,
 | 
				
			||||||
                                                   has_forward_signal || has_reverse_signal,
 | 
					                                                   has_forward_signal || has_reverse_signal,
 | 
				
			||||||
                                                   has_forward_stop_sign || has_reverse_stop_sign,
 | 
					                                                   has_forward_stop_sign || has_reverse_stop_sign,
 | 
				
			||||||
 | 
					                                                   has_forward_give_way_sign || has_reverse_give_way_sign,
 | 
				
			||||||
                                                   false,
 | 
					                                                   false,
 | 
				
			||||||
                                                   false,
 | 
					                                                   false,
 | 
				
			||||||
                                                   TRAVEL_MODE_DRIVING,
 | 
					                                                   TRAVEL_MODE_DRIVING,
 | 
				
			||||||
@ -294,6 +310,12 @@ void GraphCompressor::Compress(const std::unordered_set<NodeID> &barrier_nodes,
 | 
				
			|||||||
                    update_direction_penalty(has_reverse_stop_sign,
 | 
					                    update_direction_penalty(has_reverse_stop_sign,
 | 
				
			||||||
                                             reverse_node_duration_penalty,
 | 
					                                             reverse_node_duration_penalty,
 | 
				
			||||||
                                             reverse_node_weight_penalty);
 | 
					                                             reverse_node_weight_penalty);
 | 
				
			||||||
 | 
					                    update_direction_penalty(has_forward_give_way_sign,
 | 
				
			||||||
 | 
					                                             forward_node_duration_penalty,
 | 
				
			||||||
 | 
					                                             forward_node_weight_penalty);
 | 
				
			||||||
 | 
					                    update_direction_penalty(has_reverse_give_way_sign,
 | 
				
			||||||
 | 
					                                             reverse_node_duration_penalty,
 | 
				
			||||||
 | 
					                                             reverse_node_weight_penalty);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // Get weights before graph is modified
 | 
					                // Get weights before graph is modified
 | 
				
			||||||
 | 
				
			|||||||
@ -22,6 +22,7 @@ NodeBasedGraphFactory::NodeBasedGraphFactory(
 | 
				
			|||||||
    std::vector<UnresolvedManeuverOverride> &maneuver_overrides,
 | 
					    std::vector<UnresolvedManeuverOverride> &maneuver_overrides,
 | 
				
			||||||
    const TrafficFlowControlNodes &traffic_signals,
 | 
					    const TrafficFlowControlNodes &traffic_signals,
 | 
				
			||||||
    const TrafficFlowControlNodes &stop_signs,
 | 
					    const TrafficFlowControlNodes &stop_signs,
 | 
				
			||||||
 | 
					    const TrafficFlowControlNodes &give_way_signs,
 | 
				
			||||||
    std::unordered_set<NodeID> &&barriers,
 | 
					    std::unordered_set<NodeID> &&barriers,
 | 
				
			||||||
    std::vector<util::Coordinate> &&coordinates,
 | 
					    std::vector<util::Coordinate> &&coordinates,
 | 
				
			||||||
    extractor::PackedOSMIDs &&osm_node_ids,
 | 
					    extractor::PackedOSMIDs &&osm_node_ids,
 | 
				
			||||||
@ -32,7 +33,7 @@ NodeBasedGraphFactory::NodeBasedGraphFactory(
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    BuildCompressedOutputGraph(edge_list);
 | 
					    BuildCompressedOutputGraph(edge_list);
 | 
				
			||||||
    Compress(
 | 
					    Compress(
 | 
				
			||||||
        scripting_environment, turn_restrictions, maneuver_overrides, traffic_signals, stop_signs);
 | 
					        scripting_environment, turn_restrictions, maneuver_overrides, traffic_signals, stop_signs, give_way_signs);
 | 
				
			||||||
    CompressGeometry();
 | 
					    CompressGeometry();
 | 
				
			||||||
    CompressAnnotationData();
 | 
					    CompressAnnotationData();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -78,12 +79,14 @@ void NodeBasedGraphFactory::Compress(ScriptingEnvironment &scripting_environment
 | 
				
			|||||||
                                     std::vector<TurnRestriction> &turn_restrictions,
 | 
					                                     std::vector<TurnRestriction> &turn_restrictions,
 | 
				
			||||||
                                     std::vector<UnresolvedManeuverOverride> &maneuver_overrides,
 | 
					                                     std::vector<UnresolvedManeuverOverride> &maneuver_overrides,
 | 
				
			||||||
                                     const TrafficFlowControlNodes &traffic_signals,
 | 
					                                     const TrafficFlowControlNodes &traffic_signals,
 | 
				
			||||||
                                     const TrafficFlowControlNodes &stop_signs)
 | 
					                                     const TrafficFlowControlNodes &stop_signs,
 | 
				
			||||||
 | 
					                                     const TrafficFlowControlNodes &give_way_signs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GraphCompressor graph_compressor;
 | 
					    GraphCompressor graph_compressor;
 | 
				
			||||||
    graph_compressor.Compress(barriers,
 | 
					    graph_compressor.Compress(barriers,
 | 
				
			||||||
                              traffic_signals,
 | 
					                              traffic_signals,
 | 
				
			||||||
                              stop_signs,
 | 
					                              stop_signs,
 | 
				
			||||||
 | 
					                              give_way_signs,
 | 
				
			||||||
                              scripting_environment,
 | 
					                              scripting_environment,
 | 
				
			||||||
                              turn_restrictions,
 | 
					                              turn_restrictions,
 | 
				
			||||||
                              maneuver_overrides,
 | 
					                              maneuver_overrides,
 | 
				
			||||||
 | 
				
			|||||||
@ -786,6 +786,8 @@ void Sol2ScriptingEnvironment::InitContext(LuaScriptingContext &context)
 | 
				
			|||||||
            &ExtractionTurn::has_traffic_light,
 | 
					            &ExtractionTurn::has_traffic_light,
 | 
				
			||||||
            "has_stop_sign",
 | 
					            "has_stop_sign",
 | 
				
			||||||
            &ExtractionTurn::has_stop_sign,
 | 
					            &ExtractionTurn::has_stop_sign,
 | 
				
			||||||
 | 
					            "has_give_way_sign",
 | 
				
			||||||
 | 
					            &ExtractionTurn::has_give_way_sign,
 | 
				
			||||||
            "is_left_hand_driving",
 | 
					            "is_left_hand_driving",
 | 
				
			||||||
            &ExtractionTurn::is_left_hand_driving,
 | 
					            &ExtractionTurn::is_left_hand_driving,
 | 
				
			||||||
            "source_restricted",
 | 
					            "source_restricted",
 | 
				
			||||||
@ -1198,7 +1200,7 @@ void Sol2ScriptingEnvironment::ProcessTurn(ExtractionTurn &turn)
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Add traffic light penalty, back-compatibility of api_version=0
 | 
					        // Add traffic light penalty, back-compatibility of api_version=0
 | 
				
			||||||
        if (turn.has_traffic_light || turn.has_stop_sign)
 | 
					        if (turn.has_traffic_light)
 | 
				
			||||||
            turn.duration += context.properties.GetTrafficSignalPenalty();
 | 
					            turn.duration += context.properties.GetTrafficSignalPenalty();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Turn weight falls back to the duration value in deciseconds
 | 
					        // Turn weight falls back to the duration value in deciseconds
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user