Deduplicate foward/reverse geometries
Changes the internal representation of compressed geometries to be a single array shared between forward and reverse geometries that can be read in either direction. Includes a change on extractor::OriginalEdgeData to store via_geometry ids that indicate which direction to read the geometry for that edge based edge. Closes #2592
This commit is contained in:
committed by
Jake Pruitt
parent
73179641b1
commit
a75e16e26b
@@ -593,106 +593,66 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
|
||||
extractor::QueryNode *u;
|
||||
extractor::QueryNode *v;
|
||||
|
||||
// forward_packed_geometry_id is the index id for geometry, weight and duration of
|
||||
// the segments
|
||||
if (leaf_object.forward_packed_geometry_id != SPECIAL_EDGEID)
|
||||
const unsigned forward_begin =
|
||||
m_geometry_indices.at(leaf_object.packed_geometry_id);
|
||||
const auto current_segment =
|
||||
&(m_geometry_list[forward_begin + leaf_object.fwd_segment_position]);
|
||||
|
||||
u = &(internal_to_external_node_map
|
||||
[m_geometry_list[forward_begin +
|
||||
leaf_object.fwd_segment_position]
|
||||
.node_id]);
|
||||
v = &(internal_to_external_node_map
|
||||
[m_geometry_list[forward_begin + leaf_object.fwd_segment_position + 1]
|
||||
.node_id]);
|
||||
|
||||
const double segment_length = util::coordinate_calculation::greatCircleDistance(
|
||||
util::Coordinate{u->lon, u->lat}, util::Coordinate{v->lon, v->lat});
|
||||
|
||||
auto forward_speed_iter =
|
||||
find(segment_speed_lookup, Segment{u->node_id, v->node_id});
|
||||
if (forward_speed_iter != segment_speed_lookup.end())
|
||||
{
|
||||
const unsigned forward_begin =
|
||||
m_geometry_indices.at(leaf_object.forward_packed_geometry_id);
|
||||
const auto current_fwd_segment =
|
||||
&(m_geometry_list[forward_begin + leaf_object.fwd_segment_position]);
|
||||
const auto new_segment_weight = getNewWeight(forward_speed_iter,
|
||||
segment_length,
|
||||
segment_speed_filenames,
|
||||
current_segment->forward_weight,
|
||||
log_edge_updates_factor);
|
||||
|
||||
if (leaf_object.fwd_segment_position == 0)
|
||||
{
|
||||
u = &(internal_to_external_node_map[leaf_object.u]);
|
||||
v = &(
|
||||
internal_to_external_node_map[m_geometry_list[forward_begin].node_id]);
|
||||
}
|
||||
else
|
||||
{
|
||||
u = &(internal_to_external_node_map
|
||||
[m_geometry_list[forward_begin +
|
||||
leaf_object.fwd_segment_position - 1]
|
||||
.node_id]);
|
||||
v = &(internal_to_external_node_map[current_fwd_segment->node_id]);
|
||||
}
|
||||
const double segment_length = util::coordinate_calculation::greatCircleDistance(
|
||||
util::Coordinate{u->lon, u->lat}, util::Coordinate{v->lon, v->lat});
|
||||
m_geometry_list[forward_begin + 1 + leaf_object.fwd_segment_position].forward_weight =
|
||||
new_segment_weight;
|
||||
m_geometry_datasource[forward_begin + 1 + leaf_object.fwd_segment_position] =
|
||||
forward_speed_iter->speed_source.source;
|
||||
|
||||
auto forward_speed_iter =
|
||||
find(segment_speed_lookup, Segment{u->node_id, v->node_id});
|
||||
|
||||
if (forward_speed_iter != segment_speed_lookup.end())
|
||||
{
|
||||
const auto new_segment_weight = getNewWeight(forward_speed_iter,
|
||||
segment_length,
|
||||
segment_speed_filenames,
|
||||
current_fwd_segment->weight,
|
||||
log_edge_updates_factor);
|
||||
current_fwd_segment->weight = new_segment_weight;
|
||||
m_geometry_datasource[forward_begin + leaf_object.fwd_segment_position] =
|
||||
forward_speed_iter->speed_source.source;
|
||||
|
||||
// count statistics for logging
|
||||
counters[forward_speed_iter->speed_source.source] += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// count statistics for logging
|
||||
counters[LUA_SOURCE] += 1;
|
||||
}
|
||||
// count statistics for logging
|
||||
counters[forward_speed_iter->speed_source.source] += 1;
|
||||
}
|
||||
// reverse_packed_geometry_id is the index id for geometry, weight and duration of
|
||||
// the segment
|
||||
if (leaf_object.reverse_packed_geometry_id != SPECIAL_EDGEID)
|
||||
else
|
||||
{
|
||||
const unsigned reverse_begin =
|
||||
m_geometry_indices.at(leaf_object.reverse_packed_geometry_id);
|
||||
const unsigned reverse_end =
|
||||
m_geometry_indices.at(leaf_object.reverse_packed_geometry_id + 1);
|
||||
// count statistics for logging
|
||||
counters[LUA_SOURCE] += 1;
|
||||
}
|
||||
|
||||
int rev_segment_position =
|
||||
(reverse_end - reverse_begin) - leaf_object.fwd_segment_position - 1;
|
||||
const auto current_rev_segment =
|
||||
&(m_geometry_list[reverse_begin + rev_segment_position]);
|
||||
if (rev_segment_position == 0)
|
||||
{
|
||||
u = &(internal_to_external_node_map[leaf_object.v]);
|
||||
v = &(
|
||||
internal_to_external_node_map[m_geometry_list[reverse_begin].node_id]);
|
||||
}
|
||||
else
|
||||
{
|
||||
u = &(
|
||||
internal_to_external_node_map[m_geometry_list[reverse_begin +
|
||||
rev_segment_position - 1]
|
||||
.node_id]);
|
||||
v = &(internal_to_external_node_map[current_rev_segment->node_id]);
|
||||
}
|
||||
const double segment_length = util::coordinate_calculation::greatCircleDistance(
|
||||
util::Coordinate{u->lon, u->lat}, util::Coordinate{v->lon, v->lat});
|
||||
const auto reverse_speed_iter =
|
||||
find(segment_speed_lookup, Segment{v->node_id, u->node_id});
|
||||
if (reverse_speed_iter != segment_speed_lookup.end())
|
||||
{
|
||||
const auto new_segment_weight = getNewWeight(reverse_speed_iter,
|
||||
segment_length,
|
||||
segment_speed_filenames,
|
||||
current_segment->reverse_weight,
|
||||
log_edge_updates_factor);
|
||||
m_geometry_list[forward_begin + leaf_object.fwd_segment_position].reverse_weight =
|
||||
new_segment_weight;
|
||||
m_geometry_datasource[forward_begin + leaf_object.fwd_segment_position] =
|
||||
reverse_speed_iter->speed_source.source;
|
||||
|
||||
auto reverse_speed_iter =
|
||||
find(segment_speed_lookup, Segment{u->node_id, v->node_id});
|
||||
if (reverse_speed_iter != segment_speed_lookup.end())
|
||||
{
|
||||
const auto new_segment_weight = getNewWeight(reverse_speed_iter,
|
||||
segment_length,
|
||||
segment_speed_filenames,
|
||||
current_rev_segment->weight,
|
||||
log_edge_updates_factor);
|
||||
current_rev_segment->weight = new_segment_weight;
|
||||
m_geometry_datasource[reverse_begin + rev_segment_position] =
|
||||
reverse_speed_iter->speed_source.source;
|
||||
|
||||
// count statistics for logging
|
||||
counters[reverse_speed_iter->speed_source.source] += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// count statistics for logging
|
||||
counters[LUA_SOURCE] += 1;
|
||||
}
|
||||
// count statistics for logging
|
||||
counters[reverse_speed_iter->speed_source.source] += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
counters[LUA_SOURCE] += 1;
|
||||
}
|
||||
}
|
||||
}); // parallel_for_each
|
||||
@@ -824,7 +784,7 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
|
||||
{
|
||||
if (speed_iter->speed_source.speed > 0)
|
||||
{
|
||||
auto new_segment_weight = distanceAndSpeedToWeight(
|
||||
const auto new_segment_weight = distanceAndSpeedToWeight(
|
||||
segmentblocks[i].segment_length, speed_iter->speed_source.speed);
|
||||
new_weight += new_segment_weight;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user