simplify passing annotation data through OSRM pipeline using the node-based datastore

- separates node-based graph creation and compression from edge-based graph creation
 - moves usage of edge-based node data-container to pre-processing as well, unifying access to node-based data
 - single struct instead of separate vectors for annotation data in engine (single place of modification)
This commit is contained in:
Moritz Kobitzsch
2017-09-25 15:37:11 +02:00
committed by Michael Krasnyk
parent 9b044aaa42
commit 2ddd98ee6d
64 changed files with 1610 additions and 1190 deletions
+38 -33
View File
@@ -24,18 +24,19 @@ namespace guidance
{
RoundaboutHandler::RoundaboutHandler(const util::NodeBasedDynamicGraph &node_based_graph,
const EdgeBasedNodeDataContainer &node_data_container,
const std::vector<util::Coordinate> &coordinates,
const CompressedEdgeContainer &compressed_edge_container,
const util::NameTable &name_table,
const SuffixTable &street_name_suffix_table,
const ProfileProperties &profile_properties,
const IntersectionGenerator &intersection_generator)
: IntersectionHandler(node_based_graph,
node_data_container,
coordinates,
name_table,
street_name_suffix_table,
intersection_generator),
compressed_edge_container(compressed_edge_container), profile_properties(profile_properties),
compressed_edge_container(compressed_edge_container),
coordinate_extractor(node_based_graph, compressed_edge_container, coordinates)
{
}
@@ -70,22 +71,24 @@ detail::RoundaboutFlags RoundaboutHandler::getRoundaboutFlags(
const NodeID from_nid, const EdgeID via_eid, const Intersection &intersection) const
{
const auto &in_edge_data = node_based_graph.GetEdgeData(via_eid);
bool on_roundabout = in_edge_data.roundabout || in_edge_data.circular;
const auto &in_edge_class = in_edge_data.flags;
bool on_roundabout = in_edge_class.roundabout || in_edge_class.circular;
bool can_enter_roundabout = false;
bool can_exit_roundabout_separately = false;
const bool lhs = in_edge_data.is_left_hand_driving;
const bool lhs =
node_data_container.GetAnnotation(in_edge_data.annotation_data).is_left_hand_driving;
const int step = lhs ? -1 : 1;
for (std::size_t cnt = 0, idx = lhs ? intersection.size() - 1 : 0; cnt < intersection.size();
++cnt, idx += step)
{
const auto &road = intersection[idx];
const auto &edge_data = node_based_graph.GetEdgeData(road.eid);
const auto &edge = node_based_graph.GetEdgeData(road.eid);
// only check actual outgoing edges
if (edge_data.reversed || !road.entry_allowed)
if (edge.reversed || !road.entry_allowed)
continue;
if (edge_data.roundabout || edge_data.circular)
if (edge.flags.roundabout || edge.flags.circular)
{
can_enter_roundabout = true;
}
@@ -108,8 +111,8 @@ void RoundaboutHandler::invalidateExitAgainstDirection(const NodeID from_nid,
const EdgeID via_eid,
Intersection &intersection) const
{
const auto &in_edge_data = node_based_graph.GetEdgeData(via_eid);
if (in_edge_data.roundabout || in_edge_data.circular)
const auto &in_edge_class = node_based_graph.GetEdgeData(via_eid).flags;
if (in_edge_class.roundabout || in_edge_class.circular)
return;
// Find range in which exits that must be invalidated (shaded areas):
@@ -136,10 +139,10 @@ void RoundaboutHandler::invalidateExitAgainstDirection(const NodeID from_nid,
auto invalidate_from = intersection.end(), invalidate_to = intersection.end();
for (auto road = intersection.begin(); road != intersection.end(); ++road)
{
const auto &edge_data = node_based_graph.GetEdgeData(road->eid);
if (edge_data.roundabout || edge_data.circular)
const auto &edge = node_based_graph.GetEdgeData(road->eid);
if (edge.flags.roundabout || edge.flags.circular)
{
if (edge_data.reversed)
if (edge.reversed)
{
if (roundabout_entry_first)
{ // invalidate turns in range exit..end
@@ -166,8 +169,8 @@ void RoundaboutHandler::invalidateExitAgainstDirection(const NodeID from_nid,
// u-turn against the roundabout direction is invalidated.
for (; invalidate_from != invalidate_to; ++invalidate_from)
{
const auto &edge_data = node_based_graph.GetEdgeData(invalidate_from->eid);
if (!edge_data.roundabout && !edge_data.circular &&
const auto &edge = node_based_graph.GetEdgeData(invalidate_from->eid);
if (!edge.flags.roundabout && !edge.flags.circular &&
node_based_graph.GetTarget(invalidate_from->eid) != from_nid)
{
invalidate_from->entry_allowed = false;
@@ -207,8 +210,8 @@ bool RoundaboutHandler::qualifiesAsRoundaboutIntersection(
// can only contain a single further road
for (const auto edge : node_based_graph.GetAdjacentEdgeRange(node))
{
const auto edge_data = node_based_graph.GetEdgeData(edge);
if (edge_data.roundabout || edge_data.circular)
const auto &edge_data = node_based_graph.GetEdgeData(edge);
if (edge_data.flags.roundabout || edge_data.flags.circular)
continue;
// there is a single non-roundabout edge
@@ -222,7 +225,7 @@ bool RoundaboutHandler::qualifiesAsRoundaboutIntersection(
[this](const auto current_max, const auto current_eid) {
return std::max(current_max,
node_based_graph.GetEdgeData(current_eid)
.road_classification.GetNumberOfLanes());
.flags.road_classification.GetNumberOfLanes());
});
const auto next_coordinate =
@@ -279,11 +282,12 @@ RoundaboutType RoundaboutHandler::getRoundaboutType(const NodeID nid) const
const NodeID node, const bool roundabout, const bool circular) {
BOOST_ASSERT(roundabout != circular);
EdgeID continue_edge = SPECIAL_EDGEID;
for (const auto edge : node_based_graph.GetAdjacentEdgeRange(node))
for (const auto edge_id : node_based_graph.GetAdjacentEdgeRange(node))
{
const auto &edge_data = node_based_graph.GetEdgeData(edge);
if (!edge_data.reversed && (edge_data.circular == circular) &&
(edge_data.roundabout == roundabout))
const auto &edge = node_based_graph.GetEdgeData(edge_id);
const auto &edge_data = node_data_container.GetAnnotation(edge.annotation_data);
if (!edge.reversed && (edge.flags.circular == circular) &&
(edge.flags.roundabout == roundabout))
{
if (SPECIAL_EDGEID != continue_edge)
{
@@ -303,9 +307,9 @@ RoundaboutType RoundaboutHandler::getRoundaboutType(const NodeID nid) const
roundabout_name_ids.insert(edge_data.name_id);
}
continue_edge = edge;
continue_edge = edge_id;
}
else if (!edge_data.roundabout && !edge_data.circular)
else if (!edge.flags.roundabout && !edge.flags.circular)
{
// remember all connected road names
connected_names.insert(edge_data.name_id);
@@ -322,7 +326,7 @@ RoundaboutType RoundaboutHandler::getRoundaboutType(const NodeID nid) const
for (const auto edge : node_based_graph.GetAdjacentEdgeRange(at_node))
{
const auto &edge_data = node_based_graph.GetEdgeData(edge);
if (edge_data.roundabout || edge_data.circular)
if (edge_data.flags.roundabout || edge_data.flags.circular)
count++;
}
return count;
@@ -353,7 +357,7 @@ RoundaboutType RoundaboutHandler::getRoundaboutType(const NodeID nid) const
bool roundabout = false, circular = false;
for (const auto eid : node_based_graph.GetAdjacentEdgeRange(nid))
{
const auto data = node_based_graph.GetEdgeData(eid);
const auto data = node_based_graph.GetEdgeData(eid).flags;
roundabout |= data.roundabout;
circular |= data.circular;
}
@@ -435,7 +439,8 @@ Intersection RoundaboutHandler::handleRoundabouts(const RoundaboutType roundabou
NodeID node_at_center_of_intersection = node_based_graph.GetTarget(via_eid);
const auto &in_edge_data = node_based_graph.GetEdgeData(via_eid);
const bool lhs = in_edge_data.is_left_hand_driving;
const bool lhs =
node_data_container.GetAnnotation(in_edge_data.annotation_data).is_left_hand_driving;
const int step = lhs ? -1 : 1;
if (on_roundabout)
@@ -448,7 +453,8 @@ Intersection RoundaboutHandler::handleRoundabouts(const RoundaboutType roundabou
{
auto &road = intersection[idx];
auto &turn = road;
const auto &out_data = node_based_graph.GetEdgeData(road.eid);
const auto &out_data = node_based_graph.GetEdgeData(road.eid).flags;
;
if (out_data.roundabout || out_data.circular)
{
// TODO can forks happen in roundabouts? E.g. required lane changes
@@ -471,11 +477,10 @@ Intersection RoundaboutHandler::handleRoundabouts(const RoundaboutType roundabou
for (const auto eid :
node_based_graph.GetAdjacentEdgeRange(node_at_center_of_intersection))
{
const auto &data_of_leaving_edge = node_based_graph.GetEdgeData(eid);
if (!data_of_leaving_edge.reversed &&
!data_of_leaving_edge.roundabout &&
!data_of_leaving_edge.circular &&
!data_of_leaving_edge.road_classification.IsLowPriorityRoadClass())
const auto &leaving_edge = node_based_graph.GetEdgeData(eid);
if (!leaving_edge.reversed && !leaving_edge.flags.roundabout &&
!leaving_edge.flags.circular &&
!leaving_edge.flags.road_classification.IsLowPriorityRoadClass())
return true;
}
return false;
@@ -511,7 +516,7 @@ Intersection RoundaboutHandler::handleRoundabouts(const RoundaboutType roundabou
++cnt, idx += step)
{
auto &turn = intersection[idx];
const auto &out_data = node_based_graph.GetEdgeData(turn.eid);
const auto &out_data = node_based_graph.GetEdgeData(turn.eid).flags;
// A roundabout consists of exactly two roads at an intersection. by toggeling this
// flag, we can switch between roads crossing the roundabout and roads that are on the