Store node ID's and weights separately in CompressedEdgeContainer
Removes CompressedEdges from the extractor and shared data format by directly serializing vectors of node ID's, forward weights and reverse weights for each node-based-edge Refs #2575
This commit is contained in:
@@ -488,7 +488,9 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
|
||||
|
||||
std::vector<extractor::QueryNode> internal_to_external_node_map;
|
||||
std::vector<unsigned> m_geometry_indices;
|
||||
std::vector<extractor::CompressedEdgeContainer::CompressedEdge> m_geometry_list;
|
||||
std::vector<NodeID> m_geometry_node_list;
|
||||
std::vector<EdgeWeight> m_geometry_fwd_weight_list;
|
||||
std::vector<EdgeWeight> m_geometry_rev_weight_list;
|
||||
|
||||
const auto maybe_load_internal_to_external_node_map = [&] {
|
||||
if (!(update_edge_weights || update_turn_penalties))
|
||||
@@ -534,13 +536,23 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
|
||||
geometry_stream.read((char *)&number_of_compressed_geometries, sizeof(unsigned));
|
||||
|
||||
BOOST_ASSERT(m_geometry_indices.back() == number_of_compressed_geometries);
|
||||
m_geometry_list.resize(number_of_compressed_geometries);
|
||||
m_geometry_node_list.resize(number_of_compressed_geometries);
|
||||
m_geometry_fwd_weight_list.resize(number_of_compressed_geometries);
|
||||
m_geometry_rev_weight_list.resize(number_of_compressed_geometries);
|
||||
|
||||
if (number_of_compressed_geometries > 0)
|
||||
{
|
||||
geometry_stream.read((char *)&(m_geometry_list[0]),
|
||||
geometry_stream.read((char *)&(m_geometry_node_list[0]),
|
||||
number_of_compressed_geometries *
|
||||
sizeof(extractor::CompressedEdgeContainer::CompressedEdge));
|
||||
sizeof(NodeID));
|
||||
|
||||
geometry_stream.read((char *)&(m_geometry_fwd_weight_list[0]),
|
||||
number_of_compressed_geometries *
|
||||
sizeof(EdgeWeight));
|
||||
|
||||
geometry_stream.read((char *)&(m_geometry_rev_weight_list[0]),
|
||||
number_of_compressed_geometries *
|
||||
sizeof(EdgeWeight));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -561,7 +573,7 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
|
||||
// CSV file that supplied the value that gets used for that segment, then
|
||||
// we write out this list so that it can be returned by the debugging
|
||||
// vector tiles later on.
|
||||
m_geometry_datasource.resize(m_geometry_list.size(), 0);
|
||||
m_geometry_datasource.resize(m_geometry_fwd_weight_list.size(), 0);
|
||||
|
||||
// Now, we iterate over all the segments stored in the StaticRTree, updating
|
||||
// the packed geometry weights in the `.geometries` file (note: we do not
|
||||
@@ -595,16 +607,14 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
|
||||
|
||||
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]);
|
||||
const auto current_fwd_weight =
|
||||
m_geometry_fwd_weight_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]);
|
||||
u = &(internal_to_external_node_map
|
||||
[m_geometry_node_list[forward_begin +
|
||||
leaf_object.fwd_segment_position]]);
|
||||
v = &(internal_to_external_node_map
|
||||
[m_geometry_list[forward_begin + leaf_object.fwd_segment_position + 1]
|
||||
.node_id]);
|
||||
[m_geometry_node_list[forward_begin + leaf_object.fwd_segment_position + 1]]);
|
||||
|
||||
const double segment_length = util::coordinate_calculation::greatCircleDistance(
|
||||
util::Coordinate{u->lon, u->lat}, util::Coordinate{v->lon, v->lat});
|
||||
@@ -616,11 +626,11 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
|
||||
const auto new_segment_weight = getNewWeight(forward_speed_iter,
|
||||
segment_length,
|
||||
segment_speed_filenames,
|
||||
current_segment->forward_weight,
|
||||
current_fwd_weight,
|
||||
log_edge_updates_factor);
|
||||
|
||||
m_geometry_list[forward_begin + 1 + leaf_object.fwd_segment_position]
|
||||
.forward_weight = new_segment_weight;
|
||||
m_geometry_fwd_weight_list[forward_begin + 1 + leaf_object.fwd_segment_position] =
|
||||
new_segment_weight;
|
||||
m_geometry_datasource[forward_begin + 1 + leaf_object.fwd_segment_position] =
|
||||
forward_speed_iter->speed_source.source;
|
||||
|
||||
@@ -633,6 +643,9 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
|
||||
counters[LUA_SOURCE] += 1;
|
||||
}
|
||||
|
||||
const auto current_rev_weight =
|
||||
m_geometry_rev_weight_list[forward_begin + leaf_object.fwd_segment_position];
|
||||
|
||||
const auto reverse_speed_iter =
|
||||
find(segment_speed_lookup, Segment{v->node_id, u->node_id});
|
||||
if (reverse_speed_iter != segment_speed_lookup.end())
|
||||
@@ -640,10 +653,10 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
|
||||
const auto new_segment_weight = getNewWeight(reverse_speed_iter,
|
||||
segment_length,
|
||||
segment_speed_filenames,
|
||||
current_segment->reverse_weight,
|
||||
current_rev_weight,
|
||||
log_edge_updates_factor);
|
||||
m_geometry_list[forward_begin + leaf_object.fwd_segment_position]
|
||||
.reverse_weight = new_segment_weight;
|
||||
m_geometry_rev_weight_list[forward_begin + leaf_object.fwd_segment_position] =
|
||||
new_segment_weight;
|
||||
m_geometry_datasource[forward_begin + leaf_object.fwd_segment_position] =
|
||||
reverse_speed_iter->speed_source.source;
|
||||
|
||||
@@ -694,15 +707,21 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
|
||||
throw util::exception("Failed to open " + geometry_filename + " for writing");
|
||||
}
|
||||
const unsigned number_of_indices = m_geometry_indices.size();
|
||||
const unsigned number_of_compressed_geometries = m_geometry_list.size();
|
||||
const unsigned number_of_compressed_geometries = m_geometry_node_list.size();
|
||||
geometry_stream.write(reinterpret_cast<const char *>(&number_of_indices), sizeof(unsigned));
|
||||
geometry_stream.write(reinterpret_cast<char *>(&(m_geometry_indices[0])),
|
||||
number_of_indices * sizeof(unsigned));
|
||||
geometry_stream.write(reinterpret_cast<const char *>(&number_of_compressed_geometries),
|
||||
sizeof(unsigned));
|
||||
geometry_stream.write(reinterpret_cast<char *>(&(m_geometry_list[0])),
|
||||
geometry_stream.write(reinterpret_cast<char *>(&(m_geometry_node_list[0])),
|
||||
number_of_compressed_geometries *
|
||||
sizeof(extractor::CompressedEdgeContainer::CompressedEdge));
|
||||
sizeof(NodeID));
|
||||
geometry_stream.write(reinterpret_cast<char *>(&(m_geometry_fwd_weight_list[0])),
|
||||
number_of_compressed_geometries *
|
||||
sizeof(EdgeWeight));
|
||||
geometry_stream.write(reinterpret_cast<char *>(&(m_geometry_rev_weight_list[0])),
|
||||
number_of_compressed_geometries *
|
||||
sizeof(EdgeWeight));
|
||||
};
|
||||
|
||||
const auto save_datasource_indexes = [&] {
|
||||
|
||||
Reference in New Issue
Block a user