Format with clang-format 3.8
This commit is contained in:
parent
21c47514da
commit
6e16eab6ec
@ -1,20 +1,20 @@
|
|||||||
|
#include "osrm/match_parameters.hpp"
|
||||||
|
#include "osrm/nearest_parameters.hpp"
|
||||||
#include "osrm/route_parameters.hpp"
|
#include "osrm/route_parameters.hpp"
|
||||||
#include "osrm/table_parameters.hpp"
|
#include "osrm/table_parameters.hpp"
|
||||||
#include "osrm/nearest_parameters.hpp"
|
|
||||||
#include "osrm/trip_parameters.hpp"
|
#include "osrm/trip_parameters.hpp"
|
||||||
#include "osrm/match_parameters.hpp"
|
|
||||||
|
|
||||||
#include "osrm/coordinate.hpp"
|
#include "osrm/coordinate.hpp"
|
||||||
#include "osrm/engine_config.hpp"
|
#include "osrm/engine_config.hpp"
|
||||||
#include "osrm/json_container.hpp"
|
#include "osrm/json_container.hpp"
|
||||||
|
|
||||||
#include "osrm/status.hpp"
|
|
||||||
#include "osrm/osrm.hpp"
|
#include "osrm/osrm.hpp"
|
||||||
|
#include "osrm/status.hpp"
|
||||||
|
|
||||||
|
#include <exception>
|
||||||
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <iostream>
|
|
||||||
#include <exception>
|
|
||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|
||||||
|
@ -32,11 +32,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "contractor/query_edge.hpp"
|
#include "contractor/query_edge.hpp"
|
||||||
#include "extractor/edge_based_edge.hpp"
|
#include "extractor/edge_based_edge.hpp"
|
||||||
#include "extractor/edge_based_node.hpp"
|
#include "extractor/edge_based_node.hpp"
|
||||||
#include "util/typedefs.hpp"
|
|
||||||
#include "util/deallocating_vector.hpp"
|
#include "util/deallocating_vector.hpp"
|
||||||
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
#ifndef GRAPH_CONTRACTOR_HPP
|
#ifndef GRAPH_CONTRACTOR_HPP
|
||||||
#define GRAPH_CONTRACTOR_HPP
|
#define GRAPH_CONTRACTOR_HPP
|
||||||
|
|
||||||
|
#include "contractor/query_edge.hpp"
|
||||||
#include "util/binary_heap.hpp"
|
#include "util/binary_heap.hpp"
|
||||||
#include "util/deallocating_vector.hpp"
|
#include "util/deallocating_vector.hpp"
|
||||||
#include "util/dynamic_graph.hpp"
|
#include "util/dynamic_graph.hpp"
|
||||||
#include "util/percent.hpp"
|
|
||||||
#include "contractor/query_edge.hpp"
|
|
||||||
#include "util/xor_fast_hash.hpp"
|
|
||||||
#include "util/xor_fast_hash_storage.hpp"
|
|
||||||
#include "util/integer_range.hpp"
|
#include "util/integer_range.hpp"
|
||||||
|
#include "util/percent.hpp"
|
||||||
#include "util/simple_logger.hpp"
|
#include "util/simple_logger.hpp"
|
||||||
#include "util/timing_util.hpp"
|
#include "util/timing_util.hpp"
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
#include "util/xor_fast_hash.hpp"
|
||||||
|
#include "util/xor_fast_hash_storage.hpp"
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
|
|
||||||
@ -165,14 +165,22 @@ class GraphContractor
|
|||||||
<< static_cast<unsigned int>(diter->target);
|
<< static_cast<unsigned int>(diter->target);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
edges.emplace_back(diter->source, diter->target,
|
edges.emplace_back(diter->source,
|
||||||
static_cast<unsigned int>(std::max(diter->weight, 1)), 1,
|
diter->target,
|
||||||
diter->edge_id, false, diter->forward ? true : false,
|
static_cast<unsigned int>(std::max(diter->weight, 1)),
|
||||||
|
1,
|
||||||
|
diter->edge_id,
|
||||||
|
false,
|
||||||
|
diter->forward ? true : false,
|
||||||
diter->backward ? true : false);
|
diter->backward ? true : false);
|
||||||
|
|
||||||
edges.emplace_back(diter->target, diter->source,
|
edges.emplace_back(diter->target,
|
||||||
static_cast<unsigned int>(std::max(diter->weight, 1)), 1,
|
diter->source,
|
||||||
diter->edge_id, false, diter->backward ? true : false,
|
static_cast<unsigned int>(std::max(diter->weight, 1)),
|
||||||
|
1,
|
||||||
|
diter->edge_id,
|
||||||
|
false,
|
||||||
|
diter->backward ? true : false,
|
||||||
diter->forward ? true : false);
|
diter->forward ? true : false);
|
||||||
}
|
}
|
||||||
// clear input vector
|
// clear input vector
|
||||||
@ -276,8 +284,7 @@ class GraphContractor
|
|||||||
std::vector<RemainingNodeData> remaining_nodes(number_of_nodes);
|
std::vector<RemainingNodeData> remaining_nodes(number_of_nodes);
|
||||||
// initialize priorities in parallel
|
// initialize priorities in parallel
|
||||||
tbb::parallel_for(tbb::blocked_range<int>(0, number_of_nodes, InitGrainSize),
|
tbb::parallel_for(tbb::blocked_range<int>(0, number_of_nodes, InitGrainSize),
|
||||||
[this, &remaining_nodes](const tbb::blocked_range<int> &range)
|
[this, &remaining_nodes](const tbb::blocked_range<int> &range) {
|
||||||
{
|
|
||||||
for (int x = range.begin(), end = range.end(); x != end; ++x)
|
for (int x = range.begin(), end = range.end(); x != end; ++x)
|
||||||
{
|
{
|
||||||
remaining_nodes[x].id = x;
|
remaining_nodes[x].id = x;
|
||||||
@ -299,9 +306,8 @@ class GraphContractor
|
|||||||
|
|
||||||
std::cout << "initializing elimination PQ ..." << std::flush;
|
std::cout << "initializing elimination PQ ..." << std::flush;
|
||||||
tbb::parallel_for(tbb::blocked_range<int>(0, number_of_nodes, PQGrainSize),
|
tbb::parallel_for(tbb::blocked_range<int>(0, number_of_nodes, PQGrainSize),
|
||||||
[this, &node_priorities, &node_depth,
|
[this, &node_priorities, &node_depth, &thread_data_list](
|
||||||
&thread_data_list](const tbb::blocked_range<int> &range)
|
const tbb::blocked_range<int> &range) {
|
||||||
{
|
|
||||||
ContractorThreadData *data = thread_data_list.GetThreadData();
|
ContractorThreadData *data = thread_data_list.GetThreadData();
|
||||||
for (int x = range.begin(), end = range.end(); x != end; ++x)
|
for (int x = range.begin(), end = range.end(); x != end; ++x)
|
||||||
{
|
{
|
||||||
@ -342,7 +348,8 @@ class GraphContractor
|
|||||||
// remaining graph
|
// remaining graph
|
||||||
std::vector<NodeID> new_node_id_from_orig_id_map(number_of_nodes, SPECIAL_NODEID);
|
std::vector<NodeID> new_node_id_from_orig_id_map(number_of_nodes, SPECIAL_NODEID);
|
||||||
|
|
||||||
for (const auto new_node_id : util::irange<std::size_t>(0UL, remaining_nodes.size()))
|
for (const auto new_node_id :
|
||||||
|
util::irange<std::size_t>(0UL, remaining_nodes.size()))
|
||||||
{
|
{
|
||||||
auto &node = remaining_nodes[new_node_id];
|
auto &node = remaining_nodes[new_node_id];
|
||||||
BOOST_ASSERT(node_priorities.size() > node.id);
|
BOOST_ASSERT(node_priorities.size() > node.id);
|
||||||
@ -352,7 +359,8 @@ class GraphContractor
|
|||||||
}
|
}
|
||||||
|
|
||||||
// build forward and backward renumbering map and remap ids in remaining_nodes
|
// build forward and backward renumbering map and remap ids in remaining_nodes
|
||||||
for (const auto new_node_id : util::irange<std::size_t>(0UL, remaining_nodes.size()))
|
for (const auto new_node_id :
|
||||||
|
util::irange<std::size_t>(0UL, remaining_nodes.size()))
|
||||||
{
|
{
|
||||||
auto &node = remaining_nodes[new_node_id];
|
auto &node = remaining_nodes[new_node_id];
|
||||||
// create renumbering maps in both directions
|
// create renumbering maps in both directions
|
||||||
@ -378,7 +386,8 @@ class GraphContractor
|
|||||||
// node is not yet contracted.
|
// node is not yet contracted.
|
||||||
// add (renumbered) outgoing edges to new util::DynamicGraph.
|
// add (renumbered) outgoing edges to new util::DynamicGraph.
|
||||||
ContractorEdge new_edge = {new_node_id_from_orig_id_map[source],
|
ContractorEdge new_edge = {new_node_id_from_orig_id_map[source],
|
||||||
new_node_id_from_orig_id_map[target], data};
|
new_node_id_from_orig_id_map[target],
|
||||||
|
data};
|
||||||
|
|
||||||
new_edge.data.is_original_via_node_ID = true;
|
new_edge.data.is_original_via_node_ID = true;
|
||||||
BOOST_ASSERT_MSG(SPECIAL_NODEID != new_node_id_from_orig_id_map[source],
|
BOOST_ASSERT_MSG(SPECIAL_NODEID != new_node_id_from_orig_id_map[source],
|
||||||
@ -421,9 +430,8 @@ class GraphContractor
|
|||||||
|
|
||||||
tbb::parallel_for(
|
tbb::parallel_for(
|
||||||
tbb::blocked_range<std::size_t>(0, remaining_nodes.size(), IndependentGrainSize),
|
tbb::blocked_range<std::size_t>(0, remaining_nodes.size(), IndependentGrainSize),
|
||||||
[this, &node_priorities, &remaining_nodes,
|
[this, &node_priorities, &remaining_nodes, &thread_data_list](
|
||||||
&thread_data_list](const tbb::blocked_range<std::size_t> &range)
|
const tbb::blocked_range<std::size_t> &range) {
|
||||||
{
|
|
||||||
ContractorThreadData *data = thread_data_list.GetThreadData();
|
ContractorThreadData *data = thread_data_list.GetThreadData();
|
||||||
// determine independent node set
|
// determine independent node set
|
||||||
for (auto i = range.begin(), end = range.end(); i != end; ++i)
|
for (auto i = range.begin(), end = range.end(); i != end; ++i)
|
||||||
@ -436,8 +444,7 @@ class GraphContractor
|
|||||||
|
|
||||||
// sort all remaining nodes to the beginning of the sequence
|
// sort all remaining nodes to the beginning of the sequence
|
||||||
const auto begin_independent_nodes = stable_partition(
|
const auto begin_independent_nodes = stable_partition(
|
||||||
remaining_nodes.begin(), remaining_nodes.end(), [](RemainingNodeData node_data)
|
remaining_nodes.begin(), remaining_nodes.end(), [](RemainingNodeData node_data) {
|
||||||
{
|
|
||||||
return !node_data.is_independent;
|
return !node_data.is_independent;
|
||||||
});
|
});
|
||||||
auto begin_independent_nodes_idx =
|
auto begin_independent_nodes_idx =
|
||||||
@ -448,11 +455,10 @@ class GraphContractor
|
|||||||
{
|
{
|
||||||
// write out contraction level
|
// write out contraction level
|
||||||
tbb::parallel_for(
|
tbb::parallel_for(
|
||||||
tbb::blocked_range<std::size_t>(begin_independent_nodes_idx,
|
tbb::blocked_range<std::size_t>(
|
||||||
end_independent_nodes_idx, ContractGrainSize),
|
begin_independent_nodes_idx, end_independent_nodes_idx, ContractGrainSize),
|
||||||
[this, remaining_nodes, flushed_contractor,
|
[this, remaining_nodes, flushed_contractor, current_level](
|
||||||
current_level](const tbb::blocked_range<std::size_t> &range)
|
const tbb::blocked_range<std::size_t> &range) {
|
||||||
{
|
|
||||||
if (flushed_contractor)
|
if (flushed_contractor)
|
||||||
{
|
{
|
||||||
for (int position = range.begin(), end = range.end(); position != end;
|
for (int position = range.begin(), end = range.end(); position != end;
|
||||||
@ -475,15 +481,14 @@ class GraphContractor
|
|||||||
}
|
}
|
||||||
|
|
||||||
// contract independent nodes
|
// contract independent nodes
|
||||||
tbb::parallel_for(tbb::blocked_range<std::size_t>(begin_independent_nodes_idx,
|
tbb::parallel_for(
|
||||||
end_independent_nodes_idx,
|
tbb::blocked_range<std::size_t>(
|
||||||
ContractGrainSize),
|
begin_independent_nodes_idx, end_independent_nodes_idx, ContractGrainSize),
|
||||||
[this, &remaining_nodes,
|
[this, &remaining_nodes, &thread_data_list](
|
||||||
&thread_data_list](const tbb::blocked_range<std::size_t> &range)
|
const tbb::blocked_range<std::size_t> &range) {
|
||||||
{
|
|
||||||
ContractorThreadData *data = thread_data_list.GetThreadData();
|
ContractorThreadData *data = thread_data_list.GetThreadData();
|
||||||
for (int position = range.begin(), end = range.end();
|
for (int position = range.begin(), end = range.end(); position != end;
|
||||||
position != end; ++position)
|
++position)
|
||||||
{
|
{
|
||||||
const NodeID x = remaining_nodes[position].id;
|
const NodeID x = remaining_nodes[position].id;
|
||||||
this->ContractNode<false>(data, x);
|
this->ContractNode<false>(data, x);
|
||||||
@ -491,10 +496,9 @@ class GraphContractor
|
|||||||
});
|
});
|
||||||
|
|
||||||
tbb::parallel_for(
|
tbb::parallel_for(
|
||||||
tbb::blocked_range<int>(begin_independent_nodes_idx, end_independent_nodes_idx,
|
tbb::blocked_range<int>(
|
||||||
DeleteGrainSize),
|
begin_independent_nodes_idx, end_independent_nodes_idx, DeleteGrainSize),
|
||||||
[this, &remaining_nodes, &thread_data_list](const tbb::blocked_range<int> &range)
|
[this, &remaining_nodes, &thread_data_list](const tbb::blocked_range<int> &range) {
|
||||||
{
|
|
||||||
ContractorThreadData *data = thread_data_list.GetThreadData();
|
ContractorThreadData *data = thread_data_list.GetThreadData();
|
||||||
for (int position = range.begin(), end = range.end(); position != end;
|
for (int position = range.begin(), end = range.end(); position != end;
|
||||||
++position)
|
++position)
|
||||||
@ -507,8 +511,7 @@ class GraphContractor
|
|||||||
// make sure we really sort each block
|
// make sure we really sort each block
|
||||||
tbb::parallel_for(
|
tbb::parallel_for(
|
||||||
thread_data_list.data.range(),
|
thread_data_list.data.range(),
|
||||||
[&](const ThreadDataContainer::EnumerableThreadData::range_type &range)
|
[&](const ThreadDataContainer::EnumerableThreadData::range_type &range) {
|
||||||
{
|
|
||||||
for (auto &data : range)
|
for (auto &data : range)
|
||||||
tbb::parallel_sort(data->inserted_edges.begin(),
|
tbb::parallel_sort(data->inserted_edges.begin(),
|
||||||
data->inserted_edges.end());
|
data->inserted_edges.end());
|
||||||
@ -542,11 +545,11 @@ class GraphContractor
|
|||||||
if (!use_cached_node_priorities)
|
if (!use_cached_node_priorities)
|
||||||
{
|
{
|
||||||
tbb::parallel_for(
|
tbb::parallel_for(
|
||||||
tbb::blocked_range<int>(begin_independent_nodes_idx, end_independent_nodes_idx,
|
tbb::blocked_range<int>(begin_independent_nodes_idx,
|
||||||
|
end_independent_nodes_idx,
|
||||||
NeighboursGrainSize),
|
NeighboursGrainSize),
|
||||||
[this, &node_priorities, &remaining_nodes, &node_depth,
|
[this, &node_priorities, &remaining_nodes, &node_depth, &thread_data_list](
|
||||||
&thread_data_list](const tbb::blocked_range<int> &range)
|
const tbb::blocked_range<int> &range) {
|
||||||
{
|
|
||||||
ContractorThreadData *data = thread_data_list.GetThreadData();
|
ContractorThreadData *data = thread_data_list.GetThreadData();
|
||||||
for (int position = range.begin(), end = range.end(); position != end;
|
for (int position = range.begin(), end = range.end(); position != end;
|
||||||
++position)
|
++position)
|
||||||
@ -570,8 +573,7 @@ class GraphContractor
|
|||||||
if (orig_node_id_from_new_node_id_map.size() > 0)
|
if (orig_node_id_from_new_node_id_map.size() > 0)
|
||||||
{
|
{
|
||||||
tbb::parallel_for(tbb::blocked_range<int>(0, remaining_nodes.size(), InitGrainSize),
|
tbb::parallel_for(tbb::blocked_range<int>(0, remaining_nodes.size(), InitGrainSize),
|
||||||
[this, &remaining_nodes](const tbb::blocked_range<int> &range)
|
[this, &remaining_nodes](const tbb::blocked_range<int> &range) {
|
||||||
{
|
|
||||||
for (int x = range.begin(), end = range.end(); x != end; ++x)
|
for (int x = range.begin(), end = range.end(); x != end; ++x)
|
||||||
{
|
{
|
||||||
const auto orig_id = remaining_nodes[x].id;
|
const auto orig_id = remaining_nodes[x].id;
|
||||||
@ -583,8 +585,7 @@ class GraphContractor
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
tbb::parallel_for(tbb::blocked_range<int>(0, remaining_nodes.size(), InitGrainSize),
|
tbb::parallel_for(tbb::blocked_range<int>(0, remaining_nodes.size(), InitGrainSize),
|
||||||
[this, &remaining_nodes](const tbb::blocked_range<int> &range)
|
[this, &remaining_nodes](const tbb::blocked_range<int> &range) {
|
||||||
{
|
|
||||||
for (int x = range.begin(), end = range.end(); x != end; ++x)
|
for (int x = range.begin(), end = range.end(); x != end; ++x)
|
||||||
{
|
{
|
||||||
const auto orig_id = remaining_nodes[x].id;
|
const auto orig_id = remaining_nodes[x].id;
|
||||||
@ -843,15 +844,25 @@ class GraphContractor
|
|||||||
// guarantees that source is not connected to another node that is
|
// guarantees that source is not connected to another node that is
|
||||||
// contracted
|
// contracted
|
||||||
node_weights[source] = path_distance; // make sure to prune better
|
node_weights[source] = path_distance; // make sure to prune better
|
||||||
inserted_edges.emplace_back(
|
inserted_edges.emplace_back(source,
|
||||||
source, target, path_distance,
|
target,
|
||||||
out_data.originalEdges + in_data.originalEdges, node, SHORTCUT_ARC,
|
path_distance,
|
||||||
FORWARD_DIRECTION_ENABLED, REVERSE_DIRECTION_DISABLED);
|
out_data.originalEdges +
|
||||||
|
in_data.originalEdges,
|
||||||
|
node,
|
||||||
|
SHORTCUT_ARC,
|
||||||
|
FORWARD_DIRECTION_ENABLED,
|
||||||
|
REVERSE_DIRECTION_DISABLED);
|
||||||
|
|
||||||
inserted_edges.emplace_back(
|
inserted_edges.emplace_back(target,
|
||||||
target, source, path_distance,
|
source,
|
||||||
out_data.originalEdges + in_data.originalEdges, node, SHORTCUT_ARC,
|
path_distance,
|
||||||
FORWARD_DIRECTION_DISABLED, REVERSE_DIRECTION_ENABLED);
|
out_data.originalEdges +
|
||||||
|
in_data.originalEdges,
|
||||||
|
node,
|
||||||
|
SHORTCUT_ARC,
|
||||||
|
FORWARD_DIRECTION_DISABLED,
|
||||||
|
REVERSE_DIRECTION_ENABLED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
@ -867,8 +878,8 @@ class GraphContractor
|
|||||||
if (RUNSIMULATION)
|
if (RUNSIMULATION)
|
||||||
{
|
{
|
||||||
const int constexpr SIMULATION_SEARCH_SPACE_SIZE = 1000;
|
const int constexpr SIMULATION_SEARCH_SPACE_SIZE = 1000;
|
||||||
Dijkstra(max_distance, number_of_targets, SIMULATION_SEARCH_SPACE_SIZE, *data,
|
Dijkstra(
|
||||||
node);
|
max_distance, number_of_targets, SIMULATION_SEARCH_SPACE_SIZE, *data, node);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -898,14 +909,22 @@ class GraphContractor
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
inserted_edges.emplace_back(source, target, path_distance,
|
inserted_edges.emplace_back(source,
|
||||||
|
target,
|
||||||
|
path_distance,
|
||||||
out_data.originalEdges + in_data.originalEdges,
|
out_data.originalEdges + in_data.originalEdges,
|
||||||
node, SHORTCUT_ARC, FORWARD_DIRECTION_ENABLED,
|
node,
|
||||||
|
SHORTCUT_ARC,
|
||||||
|
FORWARD_DIRECTION_ENABLED,
|
||||||
REVERSE_DIRECTION_DISABLED);
|
REVERSE_DIRECTION_DISABLED);
|
||||||
|
|
||||||
inserted_edges.emplace_back(target, source, path_distance,
|
inserted_edges.emplace_back(target,
|
||||||
|
source,
|
||||||
|
path_distance,
|
||||||
out_data.originalEdges + in_data.originalEdges,
|
out_data.originalEdges + in_data.originalEdges,
|
||||||
node, SHORTCUT_ARC, FORWARD_DIRECTION_DISABLED,
|
node,
|
||||||
|
SHORTCUT_ARC,
|
||||||
|
FORWARD_DIRECTION_DISABLED,
|
||||||
REVERSE_DIRECTION_ENABLED);
|
REVERSE_DIRECTION_ENABLED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,9 +37,8 @@ class BaseAPI
|
|||||||
waypoints.values[0] = MakeWaypoint(segment_end_coordinates.front().source_phantom);
|
waypoints.values[0] = MakeWaypoint(segment_end_coordinates.front().source_phantom);
|
||||||
|
|
||||||
auto out_iter = std::next(waypoints.values.begin());
|
auto out_iter = std::next(waypoints.values.begin());
|
||||||
boost::range::transform(segment_end_coordinates, out_iter,
|
boost::range::transform(
|
||||||
[this](const PhantomNodes &phantom_pair)
|
segment_end_coordinates, out_iter, [this](const PhantomNodes &phantom_pair) {
|
||||||
{
|
|
||||||
return MakeWaypoint(phantom_pair.target_phantom);
|
return MakeWaypoint(phantom_pair.target_phantom);
|
||||||
});
|
});
|
||||||
return waypoints;
|
return waypoints;
|
||||||
@ -49,7 +48,8 @@ class BaseAPI
|
|||||||
// protected:
|
// protected:
|
||||||
util::json::Object MakeWaypoint(const PhantomNode &phantom) const
|
util::json::Object MakeWaypoint(const PhantomNode &phantom) const
|
||||||
{
|
{
|
||||||
return json::makeWaypoint(phantom.location, facade.GetNameForID(phantom.name_id),
|
return json::makeWaypoint(phantom.location,
|
||||||
|
facade.GetNameForID(phantom.name_id),
|
||||||
Hint{phantom, facade.GetCheckSum()});
|
Hint{phantom, facade.GetCheckSum()});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,14 +28,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#ifndef ENGINE_API_BASE_PARAMETERS_HPP
|
#ifndef ENGINE_API_BASE_PARAMETERS_HPP
|
||||||
#define ENGINE_API_BASE_PARAMETERS_HPP
|
#define ENGINE_API_BASE_PARAMETERS_HPP
|
||||||
|
|
||||||
#include "engine/hint.hpp"
|
|
||||||
#include "engine/bearing.hpp"
|
#include "engine/bearing.hpp"
|
||||||
|
#include "engine/hint.hpp"
|
||||||
#include "util/coordinate.hpp"
|
#include "util/coordinate.hpp"
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
@ -72,9 +72,9 @@ struct BaseParameters
|
|||||||
return (hints.empty() || hints.size() == coordinates.size()) &&
|
return (hints.empty() || hints.size() == coordinates.size()) &&
|
||||||
(bearings.empty() || bearings.size() == coordinates.size()) &&
|
(bearings.empty() || bearings.size() == coordinates.size()) &&
|
||||||
(radiuses.empty() || radiuses.size() == coordinates.size()) &&
|
(radiuses.empty() || radiuses.size() == coordinates.size()) &&
|
||||||
std::all_of(bearings.begin(), bearings.end(),
|
std::all_of(bearings.begin(),
|
||||||
[](const boost::optional<Bearing> bearing_and_range)
|
bearings.end(),
|
||||||
{
|
[](const boost::optional<Bearing> bearing_and_range) {
|
||||||
if (bearing_and_range)
|
if (bearing_and_range)
|
||||||
{
|
{
|
||||||
return bearing_and_range->IsValid();
|
return bearing_and_range->IsValid();
|
||||||
|
@ -3,12 +3,12 @@
|
|||||||
|
|
||||||
#include "extractor/guidance/turn_instruction.hpp"
|
#include "extractor/guidance/turn_instruction.hpp"
|
||||||
#include "extractor/travel_mode.hpp"
|
#include "extractor/travel_mode.hpp"
|
||||||
#include "engine/polyline_compressor.hpp"
|
#include "engine/guidance/leg_geometry.hpp"
|
||||||
|
#include "engine/guidance/route.hpp"
|
||||||
|
#include "engine/guidance/route_leg.hpp"
|
||||||
#include "engine/guidance/route_step.hpp"
|
#include "engine/guidance/route_step.hpp"
|
||||||
#include "engine/guidance/step_maneuver.hpp"
|
#include "engine/guidance/step_maneuver.hpp"
|
||||||
#include "engine/guidance/route_leg.hpp"
|
#include "engine/polyline_compressor.hpp"
|
||||||
#include "engine/guidance/route.hpp"
|
|
||||||
#include "engine/guidance/leg_geometry.hpp"
|
|
||||||
#include "util/coordinate.hpp"
|
#include "util/coordinate.hpp"
|
||||||
#include "util/json_container.hpp"
|
#include "util/json_container.hpp"
|
||||||
|
|
||||||
@ -57,7 +57,8 @@ util::json::Object makeGeoJSONGeometry(ForwardIter begin, ForwardIter end)
|
|||||||
{
|
{
|
||||||
geojson.values["type"] = "LineString";
|
geojson.values["type"] = "LineString";
|
||||||
util::json::Array coordinates;
|
util::json::Array coordinates;
|
||||||
std::transform(begin, end, std::back_inserter(coordinates.values), &detail::coordinateToLonLat);
|
std::transform(
|
||||||
|
begin, end, std::back_inserter(coordinates.values), &detail::coordinateToLonLat);
|
||||||
geojson.values["coordinates"] = std::move(coordinates);
|
geojson.values["coordinates"] = std::move(coordinates);
|
||||||
}
|
}
|
||||||
else if (num_coordinates > 0)
|
else if (num_coordinates > 0)
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef ENGINE_API_MATCH_HPP
|
#ifndef ENGINE_API_MATCH_HPP
|
||||||
#define ENGINE_API_MATCH_HPP
|
#define ENGINE_API_MATCH_HPP
|
||||||
|
|
||||||
#include "engine/api/route_api.hpp"
|
|
||||||
#include "engine/api/match_parameters.hpp"
|
#include "engine/api/match_parameters.hpp"
|
||||||
|
#include "engine/api/route_api.hpp"
|
||||||
|
|
||||||
#include "engine/datafacade/datafacade_base.hpp"
|
#include "engine/datafacade/datafacade_base.hpp"
|
||||||
|
|
||||||
|
@ -34,10 +34,10 @@ class NearestAPI final : public BaseAPI
|
|||||||
|
|
||||||
util::json::Array waypoints;
|
util::json::Array waypoints;
|
||||||
waypoints.values.resize(phantom_nodes.front().size());
|
waypoints.values.resize(phantom_nodes.front().size());
|
||||||
std::transform(phantom_nodes.front().begin(), phantom_nodes.front().end(),
|
std::transform(phantom_nodes.front().begin(),
|
||||||
|
phantom_nodes.front().end(),
|
||||||
waypoints.values.begin(),
|
waypoints.values.begin(),
|
||||||
[this](const PhantomNodeWithDistance &phantom_with_distance)
|
[this](const PhantomNodeWithDistance &phantom_with_distance) {
|
||||||
{
|
|
||||||
auto waypoint = MakeWaypoint(phantom_with_distance.phantom_node);
|
auto waypoint = MakeWaypoint(phantom_with_distance.phantom_node);
|
||||||
waypoint.values["distance"] = phantom_with_distance.distance;
|
waypoint.values["distance"] = phantom_with_distance.distance;
|
||||||
return waypoint;
|
return waypoint;
|
||||||
|
@ -42,14 +42,16 @@ class RouteAPI : public BaseAPI
|
|||||||
auto number_of_routes = raw_route.has_alternative() ? 2UL : 1UL;
|
auto number_of_routes = raw_route.has_alternative() ? 2UL : 1UL;
|
||||||
util::json::Array routes;
|
util::json::Array routes;
|
||||||
routes.values.resize(number_of_routes);
|
routes.values.resize(number_of_routes);
|
||||||
routes.values[0] =
|
routes.values[0] = MakeRoute(raw_route.segment_end_coordinates,
|
||||||
MakeRoute(raw_route.segment_end_coordinates, raw_route.unpacked_path_segments,
|
raw_route.unpacked_path_segments,
|
||||||
raw_route.source_traversed_in_reverse, raw_route.target_traversed_in_reverse);
|
raw_route.source_traversed_in_reverse,
|
||||||
|
raw_route.target_traversed_in_reverse);
|
||||||
if (raw_route.has_alternative())
|
if (raw_route.has_alternative())
|
||||||
{
|
{
|
||||||
std::vector<std::vector<PathData>> wrapped_leg(1);
|
std::vector<std::vector<PathData>> wrapped_leg(1);
|
||||||
wrapped_leg.front() = std::move(raw_route.unpacked_alternative);
|
wrapped_leg.front() = std::move(raw_route.unpacked_alternative);
|
||||||
routes.values[1] = MakeRoute(raw_route.segment_end_coordinates, wrapped_leg,
|
routes.values[1] = MakeRoute(raw_route.segment_end_coordinates,
|
||||||
|
wrapped_leg,
|
||||||
raw_route.alt_source_traversed_in_reverse,
|
raw_route.alt_source_traversed_in_reverse,
|
||||||
raw_route.alt_target_traversed_in_reverse);
|
raw_route.alt_target_traversed_in_reverse);
|
||||||
}
|
}
|
||||||
@ -93,14 +95,23 @@ class RouteAPI : public BaseAPI
|
|||||||
|
|
||||||
auto leg_geometry = guidance::assembleGeometry(
|
auto leg_geometry = guidance::assembleGeometry(
|
||||||
BaseAPI::facade, path_data, phantoms.source_phantom, phantoms.target_phantom);
|
BaseAPI::facade, path_data, phantoms.source_phantom, phantoms.target_phantom);
|
||||||
auto leg = guidance::assembleLeg(facade, path_data, leg_geometry, phantoms.source_phantom,
|
auto leg = guidance::assembleLeg(facade,
|
||||||
phantoms.target_phantom, reversed_target, parameters.steps);
|
path_data,
|
||||||
|
leg_geometry,
|
||||||
|
phantoms.source_phantom,
|
||||||
|
phantoms.target_phantom,
|
||||||
|
reversed_target,
|
||||||
|
parameters.steps);
|
||||||
|
|
||||||
if (parameters.steps)
|
if (parameters.steps)
|
||||||
{
|
{
|
||||||
auto steps = guidance::assembleSteps(
|
auto steps = guidance::assembleSteps(BaseAPI::facade,
|
||||||
BaseAPI::facade, path_data, leg_geometry, phantoms.source_phantom,
|
path_data,
|
||||||
phantoms.target_phantom, reversed_source, reversed_target);
|
leg_geometry,
|
||||||
|
phantoms.source_phantom,
|
||||||
|
phantoms.target_phantom,
|
||||||
|
reversed_source,
|
||||||
|
reversed_target);
|
||||||
|
|
||||||
/* Perform step-based post-processing.
|
/* Perform step-based post-processing.
|
||||||
*
|
*
|
||||||
@ -133,7 +144,8 @@ class RouteAPI : public BaseAPI
|
|||||||
guidance::trimShortSegments(steps, leg_geometry);
|
guidance::trimShortSegments(steps, leg_geometry);
|
||||||
leg.steps = guidance::postProcess(std::move(steps));
|
leg.steps = guidance::postProcess(std::move(steps));
|
||||||
leg.steps = guidance::collapseTurns(std::move(leg.steps));
|
leg.steps = guidance::collapseTurns(std::move(leg.steps));
|
||||||
leg.steps = guidance::assignRelativeLocations(std::move(leg.steps), leg_geometry,
|
leg.steps = guidance::assignRelativeLocations(std::move(leg.steps),
|
||||||
|
leg_geometry,
|
||||||
phantoms.source_phantom,
|
phantoms.source_phantom,
|
||||||
phantoms.target_phantom);
|
phantoms.target_phantom);
|
||||||
leg_geometry = guidance::resyncGeometry(std::move(leg_geometry), leg.steps);
|
leg_geometry = guidance::resyncGeometry(std::move(leg_geometry), leg.steps);
|
||||||
@ -161,7 +173,9 @@ class RouteAPI : public BaseAPI
|
|||||||
{
|
{
|
||||||
auto &leg_geometry = leg_geometries[idx];
|
auto &leg_geometry = leg_geometries[idx];
|
||||||
std::transform(
|
std::transform(
|
||||||
legs[idx].steps.begin(), legs[idx].steps.end(), std::back_inserter(step_geometries),
|
legs[idx].steps.begin(),
|
||||||
|
legs[idx].steps.end(),
|
||||||
|
std::back_inserter(step_geometries),
|
||||||
[this, &leg_geometry](const guidance::RouteStep &step) {
|
[this, &leg_geometry](const guidance::RouteStep &step) {
|
||||||
if (parameters.geometries == RouteParameters::GeometriesType::Polyline)
|
if (parameters.geometries == RouteParameters::GeometriesType::Polyline)
|
||||||
{
|
{
|
||||||
@ -185,7 +199,8 @@ class RouteAPI : public BaseAPI
|
|||||||
util::json::Array durations;
|
util::json::Array durations;
|
||||||
util::json::Array distances;
|
util::json::Array distances;
|
||||||
auto &leg_geometry = leg_geometries[idx];
|
auto &leg_geometry = leg_geometries[idx];
|
||||||
std::for_each(leg_geometry.annotations.begin(),
|
std::for_each(
|
||||||
|
leg_geometry.annotations.begin(),
|
||||||
leg_geometry.annotations.end(),
|
leg_geometry.annotations.end(),
|
||||||
[this, &durations, &distances](const guidance::LegGeometry::Annotation &step) {
|
[this, &durations, &distances](const guidance::LegGeometry::Annotation &step) {
|
||||||
durations.values.push_back(step.duration);
|
durations.values.push_back(step.duration);
|
||||||
@ -196,11 +211,12 @@ class RouteAPI : public BaseAPI
|
|||||||
annotation.values["duration"] = std::move(durations);
|
annotation.values["duration"] = std::move(durations);
|
||||||
annotations.push_back(std::move(annotation));
|
annotations.push_back(std::move(annotation));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto result = json::makeRoute(route,
|
auto result = json::makeRoute(route,
|
||||||
json::makeRouteLegs(std::move(legs), std::move(step_geometries), std::move(annotations)),
|
json::makeRouteLegs(std::move(legs),
|
||||||
|
std::move(step_geometries),
|
||||||
|
std::move(annotations)),
|
||||||
std::move(json_overview));
|
std::move(json_overview));
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -2,15 +2,15 @@
|
|||||||
#define ENGINE_API_TABLE_HPP
|
#define ENGINE_API_TABLE_HPP
|
||||||
|
|
||||||
#include "engine/api/base_api.hpp"
|
#include "engine/api/base_api.hpp"
|
||||||
#include "engine/api/table_parameters.hpp"
|
|
||||||
#include "engine/api/json_factory.hpp"
|
#include "engine/api/json_factory.hpp"
|
||||||
|
#include "engine/api/table_parameters.hpp"
|
||||||
|
|
||||||
#include "engine/datafacade/datafacade_base.hpp"
|
#include "engine/datafacade/datafacade_base.hpp"
|
||||||
|
|
||||||
#include "engine/guidance/assemble_leg.hpp"
|
|
||||||
#include "engine/guidance/assemble_route.hpp"
|
|
||||||
#include "engine/guidance/assemble_geometry.hpp"
|
#include "engine/guidance/assemble_geometry.hpp"
|
||||||
|
#include "engine/guidance/assemble_leg.hpp"
|
||||||
#include "engine/guidance/assemble_overview.hpp"
|
#include "engine/guidance/assemble_overview.hpp"
|
||||||
|
#include "engine/guidance/assemble_route.hpp"
|
||||||
#include "engine/guidance/assemble_steps.hpp"
|
#include "engine/guidance/assemble_steps.hpp"
|
||||||
|
|
||||||
#include "engine/internal_route_result.hpp"
|
#include "engine/internal_route_result.hpp"
|
||||||
@ -78,11 +78,10 @@ class TableAPI final : public BaseAPI
|
|||||||
json_waypoints.values.reserve(phantoms.size());
|
json_waypoints.values.reserve(phantoms.size());
|
||||||
BOOST_ASSERT(phantoms.size() == parameters.coordinates.size());
|
BOOST_ASSERT(phantoms.size() == parameters.coordinates.size());
|
||||||
|
|
||||||
boost::range::transform(phantoms, std::back_inserter(json_waypoints.values),
|
boost::range::transform(
|
||||||
[this](const PhantomNode &phantom)
|
phantoms,
|
||||||
{
|
std::back_inserter(json_waypoints.values),
|
||||||
return BaseAPI::MakeWaypoint(phantom);
|
[this](const PhantomNode &phantom) { return BaseAPI::MakeWaypoint(phantom); });
|
||||||
});
|
|
||||||
return json_waypoints;
|
return json_waypoints;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,9 +90,9 @@ class TableAPI final : public BaseAPI
|
|||||||
{
|
{
|
||||||
util::json::Array json_waypoints;
|
util::json::Array json_waypoints;
|
||||||
json_waypoints.values.reserve(indices.size());
|
json_waypoints.values.reserve(indices.size());
|
||||||
boost::range::transform(indices, std::back_inserter(json_waypoints.values),
|
boost::range::transform(indices,
|
||||||
[this, phantoms](const std::size_t idx)
|
std::back_inserter(json_waypoints.values),
|
||||||
{
|
[this, phantoms](const std::size_t idx) {
|
||||||
BOOST_ASSERT(idx < phantoms.size());
|
BOOST_ASSERT(idx < phantoms.size());
|
||||||
return BaseAPI::MakeWaypoint(phantoms[idx]);
|
return BaseAPI::MakeWaypoint(phantoms[idx]);
|
||||||
});
|
});
|
||||||
@ -111,9 +110,10 @@ class TableAPI final : public BaseAPI
|
|||||||
auto row_begin_iterator = values.begin() + (row * number_of_columns);
|
auto row_begin_iterator = values.begin() + (row * number_of_columns);
|
||||||
auto row_end_iterator = values.begin() + ((row + 1) * number_of_columns);
|
auto row_end_iterator = values.begin() + ((row + 1) * number_of_columns);
|
||||||
json_row.values.resize(number_of_columns);
|
json_row.values.resize(number_of_columns);
|
||||||
std::transform(row_begin_iterator, row_end_iterator, json_row.values.begin(),
|
std::transform(row_begin_iterator,
|
||||||
[](const EdgeWeight duration)
|
row_end_iterator,
|
||||||
{
|
json_row.values.begin(),
|
||||||
|
[](const EdgeWeight duration) {
|
||||||
if (duration == INVALID_EDGE_WEIGHT)
|
if (duration == INVALID_EDGE_WEIGHT)
|
||||||
{
|
{
|
||||||
return util::json::Value(util::json::Null());
|
return util::json::Value(util::json::Null());
|
||||||
|
@ -89,10 +89,7 @@ struct TableParameters : public BaseParameters
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// 3/ 0 <= index < len(locations)
|
// 3/ 0 <= index < len(locations)
|
||||||
const auto not_in_range = [this](const std::size_t x)
|
const auto not_in_range = [this](const std::size_t x) { return x >= coordinates.size(); };
|
||||||
{
|
|
||||||
return x >= coordinates.size();
|
|
||||||
};
|
|
||||||
|
|
||||||
if (std::any_of(begin(sources), end(sources), not_in_range))
|
if (std::any_of(begin(sources), end(sources), not_in_range))
|
||||||
return false;
|
return false;
|
||||||
|
@ -79,8 +79,7 @@ class TripAPI final : public RouteAPI
|
|||||||
std::vector<TripIndex> input_idx_to_trip_idx(parameters.coordinates.size());
|
std::vector<TripIndex> input_idx_to_trip_idx(parameters.coordinates.size());
|
||||||
for (auto sub_trip_index : util::irange<unsigned>(0u, sub_trips.size()))
|
for (auto sub_trip_index : util::irange<unsigned>(0u, sub_trips.size()))
|
||||||
{
|
{
|
||||||
for (auto point_index :
|
for (auto point_index : util::irange<unsigned>(0u, sub_trips[sub_trip_index].size()))
|
||||||
util::irange<unsigned>(0u, sub_trips[sub_trip_index].size()))
|
|
||||||
{
|
{
|
||||||
input_idx_to_trip_idx[sub_trips[sub_trip_index][point_index]] =
|
input_idx_to_trip_idx[sub_trips[sub_trip_index][point_index]] =
|
||||||
TripIndex{sub_trip_index, point_index};
|
TripIndex{sub_trip_index, point_index};
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
#ifndef OSRM_BASE64_HPP
|
#ifndef OSRM_BASE64_HPP
|
||||||
#define OSRM_BASE64_HPP
|
#define OSRM_BASE64_HPP
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <string>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include <cstddef>
|
|
||||||
#include <climits>
|
#include <climits>
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
#include <boost/archive/iterators/binary_from_base64.hpp>
|
|
||||||
#include <boost/archive/iterators/base64_from_binary.hpp>
|
|
||||||
#include <boost/archive/iterators/transform_width.hpp>
|
|
||||||
#include <boost/algorithm/string/trim.hpp>
|
#include <boost/algorithm/string/trim.hpp>
|
||||||
|
#include <boost/archive/iterators/base64_from_binary.hpp>
|
||||||
|
#include <boost/archive/iterators/binary_from_base64.hpp>
|
||||||
|
#include <boost/archive/iterators/transform_width.hpp>
|
||||||
#include <boost/range/algorithm/copy.hpp>
|
#include <boost/range/algorithm/copy.hpp>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
// Exposes all data access interfaces to the algorithms via base class ptr
|
// Exposes all data access interfaces to the algorithms via base class ptr
|
||||||
|
|
||||||
#include "contractor/query_edge.hpp"
|
#include "contractor/query_edge.hpp"
|
||||||
#include "engine/phantom_node.hpp"
|
|
||||||
#include "extractor/edge_based_node.hpp"
|
#include "extractor/edge_based_node.hpp"
|
||||||
#include "extractor/external_memory_node.hpp"
|
#include "extractor/external_memory_node.hpp"
|
||||||
#include "extractor/guidance/turn_instruction.hpp"
|
#include "extractor/guidance/turn_instruction.hpp"
|
||||||
|
#include "engine/phantom_node.hpp"
|
||||||
#include "util/exception.hpp"
|
#include "util/exception.hpp"
|
||||||
#include "util/guidance/bearing_class.hpp"
|
#include "util/guidance/bearing_class.hpp"
|
||||||
#include "util/guidance/entry_class.hpp"
|
#include "util/guidance/entry_class.hpp"
|
||||||
@ -115,14 +115,15 @@ class BaseDataFacade
|
|||||||
const int bearing,
|
const int bearing,
|
||||||
const int bearing_range) const = 0;
|
const int bearing_range) const = 0;
|
||||||
virtual std::vector<PhantomNodeWithDistance>
|
virtual std::vector<PhantomNodeWithDistance>
|
||||||
NearestPhantomNodes(const util::Coordinate input_coordinate, const unsigned max_results) const = 0;
|
NearestPhantomNodes(const util::Coordinate input_coordinate,
|
||||||
|
const unsigned max_results) const = 0;
|
||||||
virtual std::vector<PhantomNodeWithDistance>
|
virtual std::vector<PhantomNodeWithDistance>
|
||||||
NearestPhantomNodes(const util::Coordinate input_coordinate,
|
NearestPhantomNodes(const util::Coordinate input_coordinate,
|
||||||
const unsigned max_results,
|
const unsigned max_results,
|
||||||
const double max_distance) const = 0;
|
const double max_distance) const = 0;
|
||||||
|
|
||||||
virtual std::pair<PhantomNode, PhantomNode>
|
virtual std::pair<PhantomNode, PhantomNode> NearestPhantomNodeWithAlternativeFromBigComponent(
|
||||||
NearestPhantomNodeWithAlternativeFromBigComponent(const util::Coordinate input_coordinate) const = 0;
|
const util::Coordinate input_coordinate) const = 0;
|
||||||
virtual std::pair<PhantomNode, PhantomNode>
|
virtual std::pair<PhantomNode, PhantomNode>
|
||||||
NearestPhantomNodeWithAlternativeFromBigComponent(const util::Coordinate input_coordinate,
|
NearestPhantomNodeWithAlternativeFromBigComponent(const util::Coordinate input_coordinate,
|
||||||
const double max_distance) const = 0;
|
const double max_distance) const = 0;
|
||||||
@ -131,8 +132,10 @@ class BaseDataFacade
|
|||||||
const double max_distance,
|
const double max_distance,
|
||||||
const int bearing,
|
const int bearing,
|
||||||
const int bearing_range) const = 0;
|
const int bearing_range) const = 0;
|
||||||
virtual std::pair<PhantomNode, PhantomNode> NearestPhantomNodeWithAlternativeFromBigComponent(
|
virtual std::pair<PhantomNode, PhantomNode>
|
||||||
const util::Coordinate input_coordinate, const int bearing, const int bearing_range) const = 0;
|
NearestPhantomNodeWithAlternativeFromBigComponent(const util::Coordinate input_coordinate,
|
||||||
|
const int bearing,
|
||||||
|
const int bearing_range) const = 0;
|
||||||
|
|
||||||
virtual unsigned GetCheckSum() const = 0;
|
virtual unsigned GetCheckSum() const = 0;
|
||||||
|
|
||||||
|
@ -9,12 +9,12 @@
|
|||||||
#include "util/guidance/bearing_class.hpp"
|
#include "util/guidance/bearing_class.hpp"
|
||||||
#include "util/guidance/entry_class.hpp"
|
#include "util/guidance/entry_class.hpp"
|
||||||
|
|
||||||
#include "engine/geospatial_query.hpp"
|
|
||||||
#include "extractor/compressed_edge_container.hpp"
|
#include "extractor/compressed_edge_container.hpp"
|
||||||
#include "extractor/original_edge_data.hpp"
|
#include "extractor/original_edge_data.hpp"
|
||||||
#include "extractor/profile_properties.hpp"
|
#include "extractor/profile_properties.hpp"
|
||||||
#include "extractor/query_node.hpp"
|
#include "extractor/query_node.hpp"
|
||||||
#include "storage/storage_config.hpp"
|
#include "storage/storage_config.hpp"
|
||||||
|
#include "engine/geospatial_query.hpp"
|
||||||
#include "util/graph_loader.hpp"
|
#include "util/graph_loader.hpp"
|
||||||
#include "util/io.hpp"
|
#include "util/io.hpp"
|
||||||
#include "util/range_table.hpp"
|
#include "util/range_table.hpp"
|
||||||
@ -312,11 +312,12 @@ class InternalDataFacade final : public BaseDataFacade
|
|||||||
util::SimpleLogger().Write(logINFO) << "Loading Bearing Class IDs";
|
util::SimpleLogger().Write(logINFO) << "Loading Bearing Class IDs";
|
||||||
std::vector<BearingClassID> bearing_class_id;
|
std::vector<BearingClassID> bearing_class_id;
|
||||||
if (!util::deserializeVector(intersection_stream, bearing_class_id))
|
if (!util::deserializeVector(intersection_stream, bearing_class_id))
|
||||||
throw util::exception("Reading from " + intersection_class_file.string() + " failed.");
|
throw util::exception("Reading from " + intersection_class_file.string() +
|
||||||
|
" failed.");
|
||||||
|
|
||||||
m_bearing_class_id_table.resize(bearing_class_id.size());
|
m_bearing_class_id_table.resize(bearing_class_id.size());
|
||||||
std::copy(bearing_class_id.begin(), bearing_class_id.end(),
|
std::copy(
|
||||||
&m_bearing_class_id_table[0]);
|
bearing_class_id.begin(), bearing_class_id.end(), &m_bearing_class_id_table[0]);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
util::SimpleLogger().Write(logINFO) << "Loading Bearing Classes";
|
util::SimpleLogger().Write(logINFO) << "Loading Bearing Classes";
|
||||||
@ -330,13 +331,15 @@ class InternalDataFacade final : public BaseDataFacade
|
|||||||
intersection_stream.read(reinterpret_cast<char *>(&m_bearing_values_table[0]),
|
intersection_stream.read(reinterpret_cast<char *>(&m_bearing_values_table[0]),
|
||||||
sizeof(m_bearing_values_table[0]) * num_bearings);
|
sizeof(m_bearing_values_table[0]) * num_bearings);
|
||||||
if (!static_cast<bool>(intersection_stream))
|
if (!static_cast<bool>(intersection_stream))
|
||||||
throw util::exception("Reading from " + intersection_class_file.string() + " failed.");
|
throw util::exception("Reading from " + intersection_class_file.string() +
|
||||||
|
" failed.");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
util::SimpleLogger().Write(logINFO) << "Loading Entry Classes";
|
util::SimpleLogger().Write(logINFO) << "Loading Entry Classes";
|
||||||
std::vector<util::guidance::EntryClass> entry_classes;
|
std::vector<util::guidance::EntryClass> entry_classes;
|
||||||
if (!util::deserializeVector(intersection_stream, entry_classes))
|
if (!util::deserializeVector(intersection_stream, entry_classes))
|
||||||
throw util::exception("Reading from " + intersection_class_file.string() + " failed.");
|
throw util::exception("Reading from " + intersection_class_file.string() +
|
||||||
|
" failed.");
|
||||||
|
|
||||||
m_entry_class_table.resize(entry_classes.size());
|
m_entry_class_table.resize(entry_classes.size());
|
||||||
std::copy(entry_classes.begin(), entry_classes.end(), &m_entry_class_table[0]);
|
std::copy(entry_classes.begin(), entry_classes.end(), &m_entry_class_table[0]);
|
||||||
@ -450,8 +453,8 @@ class InternalDataFacade final : public BaseDataFacade
|
|||||||
const util::Coordinate north_east) const override final
|
const util::Coordinate north_east) const override final
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(m_geospatial_query.get());
|
BOOST_ASSERT(m_geospatial_query.get());
|
||||||
const util::RectangleInt2D bbox{south_west.lon, north_east.lon, south_west.lat,
|
const util::RectangleInt2D bbox{
|
||||||
north_east.lat};
|
south_west.lon, north_east.lon, south_west.lat, north_east.lat};
|
||||||
return m_geospatial_query->Search(bbox);
|
return m_geospatial_query->Search(bbox);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -472,8 +475,8 @@ class InternalDataFacade final : public BaseDataFacade
|
|||||||
{
|
{
|
||||||
BOOST_ASSERT(m_geospatial_query.get());
|
BOOST_ASSERT(m_geospatial_query.get());
|
||||||
|
|
||||||
return m_geospatial_query->NearestPhantomNodesInRange(input_coordinate, max_distance,
|
return m_geospatial_query->NearestPhantomNodesInRange(
|
||||||
bearing, bearing_range);
|
input_coordinate, max_distance, bearing, bearing_range);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<PhantomNodeWithDistance>
|
std::vector<PhantomNodeWithDistance>
|
||||||
@ -503,8 +506,8 @@ class InternalDataFacade final : public BaseDataFacade
|
|||||||
{
|
{
|
||||||
BOOST_ASSERT(m_geospatial_query.get());
|
BOOST_ASSERT(m_geospatial_query.get());
|
||||||
|
|
||||||
return m_geospatial_query->NearestPhantomNodes(input_coordinate, max_results, bearing,
|
return m_geospatial_query->NearestPhantomNodes(
|
||||||
bearing_range);
|
input_coordinate, max_results, bearing, bearing_range);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<PhantomNodeWithDistance>
|
std::vector<PhantomNodeWithDistance>
|
||||||
@ -516,8 +519,8 @@ class InternalDataFacade final : public BaseDataFacade
|
|||||||
{
|
{
|
||||||
BOOST_ASSERT(m_geospatial_query.get());
|
BOOST_ASSERT(m_geospatial_query.get());
|
||||||
|
|
||||||
return m_geospatial_query->NearestPhantomNodes(input_coordinate, max_results, max_distance,
|
return m_geospatial_query->NearestPhantomNodes(
|
||||||
bearing, bearing_range);
|
input_coordinate, max_results, max_distance, bearing, bearing_range);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<PhantomNode, PhantomNode> NearestPhantomNodeWithAlternativeFromBigComponent(
|
std::pair<PhantomNode, PhantomNode> NearestPhantomNodeWithAlternativeFromBigComponent(
|
||||||
@ -582,7 +585,8 @@ class InternalDataFacade final : public BaseDataFacade
|
|||||||
{
|
{
|
||||||
result.resize(range.back() - range.front() + 1);
|
result.resize(range.back() - range.front() + 1);
|
||||||
std::copy(m_names_char_list.begin() + range.front(),
|
std::copy(m_names_char_list.begin() + range.front(),
|
||||||
m_names_char_list.begin() + range.back() + 1, result.begin());
|
m_names_char_list.begin() + range.back() + 1,
|
||||||
|
result.begin());
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -614,7 +618,8 @@ class InternalDataFacade final : public BaseDataFacade
|
|||||||
|
|
||||||
result_nodes.clear();
|
result_nodes.clear();
|
||||||
result_nodes.reserve(end - begin);
|
result_nodes.reserve(end - begin);
|
||||||
std::for_each(m_geometry_list.begin() + begin, m_geometry_list.begin() + end,
|
std::for_each(m_geometry_list.begin() + begin,
|
||||||
|
m_geometry_list.begin() + end,
|
||||||
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
||||||
result_nodes.emplace_back(edge.node_id);
|
result_nodes.emplace_back(edge.node_id);
|
||||||
});
|
});
|
||||||
@ -629,7 +634,8 @@ class InternalDataFacade final : public BaseDataFacade
|
|||||||
|
|
||||||
result_weights.clear();
|
result_weights.clear();
|
||||||
result_weights.reserve(end - begin);
|
result_weights.reserve(end - begin);
|
||||||
std::for_each(m_geometry_list.begin() + begin, m_geometry_list.begin() + end,
|
std::for_each(m_geometry_list.begin() + begin,
|
||||||
|
m_geometry_list.begin() + end,
|
||||||
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
||||||
result_weights.emplace_back(edge.weight);
|
result_weights.emplace_back(edge.weight);
|
||||||
});
|
});
|
||||||
@ -658,7 +664,8 @@ class InternalDataFacade final : public BaseDataFacade
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::for_each(
|
std::for_each(
|
||||||
m_datasource_list.begin() + begin, m_datasource_list.begin() + end,
|
m_datasource_list.begin() + begin,
|
||||||
|
m_datasource_list.begin() + end,
|
||||||
[&](const uint8_t &datasource_id) { result_datasources.push_back(datasource_id); });
|
[&](const uint8_t &datasource_id) { result_datasources.push_back(datasource_id); });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -691,7 +698,8 @@ class InternalDataFacade final : public BaseDataFacade
|
|||||||
util::guidance::BearingClass result;
|
util::guidance::BearingClass result;
|
||||||
|
|
||||||
for (auto itr = m_bearing_values_table.begin() + range.front();
|
for (auto itr = m_bearing_values_table.begin() + range.front();
|
||||||
itr != m_bearing_values_table.begin() + range.back() + 1; ++itr)
|
itr != m_bearing_values_table.begin() + range.back() + 1;
|
||||||
|
++itr)
|
||||||
result.add(*itr);
|
result.add(*itr);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
|
|
||||||
// implements all data storage when shared memory _IS_ used
|
// implements all data storage when shared memory _IS_ used
|
||||||
|
|
||||||
#include "engine/datafacade/datafacade_base.hpp"
|
|
||||||
#include "storage/shared_datatype.hpp"
|
#include "storage/shared_datatype.hpp"
|
||||||
#include "storage/shared_memory.hpp"
|
#include "storage/shared_memory.hpp"
|
||||||
|
#include "engine/datafacade/datafacade_base.hpp"
|
||||||
|
|
||||||
#include "extractor/compressed_edge_container.hpp"
|
#include "extractor/compressed_edge_container.hpp"
|
||||||
#include "extractor/guidance/turn_instruction.hpp"
|
#include "extractor/guidance/turn_instruction.hpp"
|
||||||
@ -138,9 +138,11 @@ class SharedDataFacade final : public BaseDataFacade
|
|||||||
|
|
||||||
auto tree_ptr = data_layout->GetBlockPtr<RTreeNode>(
|
auto tree_ptr = data_layout->GetBlockPtr<RTreeNode>(
|
||||||
shared_memory, storage::SharedDataLayout::R_SEARCH_TREE);
|
shared_memory, storage::SharedDataLayout::R_SEARCH_TREE);
|
||||||
m_static_rtree.reset(new SharedRTree(
|
m_static_rtree.reset(
|
||||||
tree_ptr, data_layout->num_entries[storage::SharedDataLayout::R_SEARCH_TREE],
|
new SharedRTree(tree_ptr,
|
||||||
file_index_path, m_coordinate_list));
|
data_layout->num_entries[storage::SharedDataLayout::R_SEARCH_TREE],
|
||||||
|
file_index_path,
|
||||||
|
m_coordinate_list));
|
||||||
m_geospatial_query.reset(
|
m_geospatial_query.reset(
|
||||||
new SharedGeospatialQuery(*m_static_rtree, m_coordinate_list, *this));
|
new SharedGeospatialQuery(*m_static_rtree, m_coordinate_list, *this));
|
||||||
}
|
}
|
||||||
@ -164,7 +166,8 @@ class SharedDataFacade final : public BaseDataFacade
|
|||||||
{
|
{
|
||||||
auto coordinate_list_ptr = data_layout->GetBlockPtr<util::Coordinate>(
|
auto coordinate_list_ptr = data_layout->GetBlockPtr<util::Coordinate>(
|
||||||
shared_memory, storage::SharedDataLayout::COORDINATE_LIST);
|
shared_memory, storage::SharedDataLayout::COORDINATE_LIST);
|
||||||
m_coordinate_list.reset(coordinate_list_ptr,
|
m_coordinate_list.reset(
|
||||||
|
coordinate_list_ptr,
|
||||||
data_layout->num_entries[storage::SharedDataLayout::COORDINATE_LIST]);
|
data_layout->num_entries[storage::SharedDataLayout::COORDINATE_LIST]);
|
||||||
|
|
||||||
auto travel_mode_list_ptr = data_layout->GetBlockPtr<extractor::TravelMode>(
|
auto travel_mode_list_ptr = data_layout->GetBlockPtr<extractor::TravelMode>(
|
||||||
@ -332,8 +335,8 @@ class SharedDataFacade final : public BaseDataFacade
|
|||||||
"No shared memory blocks found, have you forgotten to run osrm-datastore?");
|
"No shared memory blocks found, have you forgotten to run osrm-datastore?");
|
||||||
}
|
}
|
||||||
data_timestamp_ptr = static_cast<storage::SharedDataTimestamp *>(
|
data_timestamp_ptr = static_cast<storage::SharedDataTimestamp *>(
|
||||||
storage::makeSharedMemory(storage::CURRENT_REGIONS,
|
storage::makeSharedMemory(
|
||||||
sizeof(storage::SharedDataTimestamp), false, false)
|
storage::CURRENT_REGIONS, sizeof(storage::SharedDataTimestamp), false, false)
|
||||||
->Ptr());
|
->Ptr());
|
||||||
CURRENT_LAYOUT = storage::LAYOUT_NONE;
|
CURRENT_LAYOUT = storage::LAYOUT_NONE;
|
||||||
CURRENT_DATA = storage::DATA_NONE;
|
CURRENT_DATA = storage::DATA_NONE;
|
||||||
@ -476,7 +479,8 @@ class SharedDataFacade final : public BaseDataFacade
|
|||||||
|
|
||||||
result_nodes.clear();
|
result_nodes.clear();
|
||||||
result_nodes.reserve(end - begin);
|
result_nodes.reserve(end - begin);
|
||||||
std::for_each(m_geometry_list.begin() + begin, m_geometry_list.begin() + end,
|
std::for_each(m_geometry_list.begin() + begin,
|
||||||
|
m_geometry_list.begin() + end,
|
||||||
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
||||||
result_nodes.emplace_back(edge.node_id);
|
result_nodes.emplace_back(edge.node_id);
|
||||||
});
|
});
|
||||||
@ -491,7 +495,8 @@ class SharedDataFacade final : public BaseDataFacade
|
|||||||
|
|
||||||
result_weights.clear();
|
result_weights.clear();
|
||||||
result_weights.reserve(end - begin);
|
result_weights.reserve(end - begin);
|
||||||
std::for_each(m_geometry_list.begin() + begin, m_geometry_list.begin() + end,
|
std::for_each(m_geometry_list.begin() + begin,
|
||||||
|
m_geometry_list.begin() + end,
|
||||||
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
[&](const osrm::extractor::CompressedEdgeContainer::CompressedEdge &edge) {
|
||||||
result_weights.emplace_back(edge.weight);
|
result_weights.emplace_back(edge.weight);
|
||||||
});
|
});
|
||||||
@ -517,8 +522,8 @@ class SharedDataFacade final : public BaseDataFacade
|
|||||||
const util::Coordinate north_east) const override final
|
const util::Coordinate north_east) const override final
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(m_geospatial_query.get());
|
BOOST_ASSERT(m_geospatial_query.get());
|
||||||
const util::RectangleInt2D bbox{south_west.lon, north_east.lon, south_west.lat,
|
const util::RectangleInt2D bbox{
|
||||||
north_east.lat};
|
south_west.lon, north_east.lon, south_west.lat, north_east.lat};
|
||||||
return m_geospatial_query->Search(bbox);
|
return m_geospatial_query->Search(bbox);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -539,8 +544,8 @@ class SharedDataFacade final : public BaseDataFacade
|
|||||||
{
|
{
|
||||||
BOOST_ASSERT(m_geospatial_query.get());
|
BOOST_ASSERT(m_geospatial_query.get());
|
||||||
|
|
||||||
return m_geospatial_query->NearestPhantomNodesInRange(input_coordinate, max_distance,
|
return m_geospatial_query->NearestPhantomNodesInRange(
|
||||||
bearing, bearing_range);
|
input_coordinate, max_distance, bearing, bearing_range);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<PhantomNodeWithDistance>
|
std::vector<PhantomNodeWithDistance>
|
||||||
@ -570,8 +575,8 @@ class SharedDataFacade final : public BaseDataFacade
|
|||||||
{
|
{
|
||||||
BOOST_ASSERT(m_geospatial_query.get());
|
BOOST_ASSERT(m_geospatial_query.get());
|
||||||
|
|
||||||
return m_geospatial_query->NearestPhantomNodes(input_coordinate, max_results, bearing,
|
return m_geospatial_query->NearestPhantomNodes(
|
||||||
bearing_range);
|
input_coordinate, max_results, bearing, bearing_range);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<PhantomNodeWithDistance>
|
std::vector<PhantomNodeWithDistance>
|
||||||
@ -583,8 +588,8 @@ class SharedDataFacade final : public BaseDataFacade
|
|||||||
{
|
{
|
||||||
BOOST_ASSERT(m_geospatial_query.get());
|
BOOST_ASSERT(m_geospatial_query.get());
|
||||||
|
|
||||||
return m_geospatial_query->NearestPhantomNodes(input_coordinate, max_results, max_distance,
|
return m_geospatial_query->NearestPhantomNodes(
|
||||||
bearing, bearing_range);
|
input_coordinate, max_results, max_distance, bearing, bearing_range);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<PhantomNode, PhantomNode> NearestPhantomNodeWithAlternativeFromBigComponent(
|
std::pair<PhantomNode, PhantomNode> NearestPhantomNodeWithAlternativeFromBigComponent(
|
||||||
@ -596,9 +601,8 @@ class SharedDataFacade final : public BaseDataFacade
|
|||||||
input_coordinate);
|
input_coordinate);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<PhantomNode, PhantomNode>
|
std::pair<PhantomNode, PhantomNode> NearestPhantomNodeWithAlternativeFromBigComponent(
|
||||||
NearestPhantomNodeWithAlternativeFromBigComponent(const util::Coordinate input_coordinate,
|
const util::Coordinate input_coordinate, const double max_distance) const override final
|
||||||
const double max_distance) const override final
|
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(m_geospatial_query.get());
|
BOOST_ASSERT(m_geospatial_query.get());
|
||||||
|
|
||||||
@ -650,7 +654,8 @@ class SharedDataFacade final : public BaseDataFacade
|
|||||||
{
|
{
|
||||||
result.resize(range.back() - range.front() + 1);
|
result.resize(range.back() - range.front() + 1);
|
||||||
std::copy(m_names_char_list.begin() + range.front(),
|
std::copy(m_names_char_list.begin() + range.front(),
|
||||||
m_names_char_list.begin() + range.back() + 1, result.begin());
|
m_names_char_list.begin() + range.back() + 1,
|
||||||
|
result.begin());
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -690,7 +695,8 @@ class SharedDataFacade final : public BaseDataFacade
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::for_each(
|
std::for_each(
|
||||||
m_datasource_list.begin() + begin, m_datasource_list.begin() + end,
|
m_datasource_list.begin() + begin,
|
||||||
|
m_datasource_list.begin() + end,
|
||||||
[&](const uint8_t &datasource_id) { result_datasources.push_back(datasource_id); });
|
[&](const uint8_t &datasource_id) { result_datasources.push_back(datasource_id); });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -729,7 +735,8 @@ class SharedDataFacade final : public BaseDataFacade
|
|||||||
auto range = m_bearing_ranges_table->GetRange(bearing_class_id);
|
auto range = m_bearing_ranges_table->GetRange(bearing_class_id);
|
||||||
util::guidance::BearingClass result;
|
util::guidance::BearingClass result;
|
||||||
for (auto itr = m_bearing_values_table.begin() + range.front();
|
for (auto itr = m_bearing_values_table.begin() + range.front();
|
||||||
itr != m_bearing_values_table.begin() + range.back() + 1; ++itr)
|
itr != m_bearing_values_table.begin() + range.back() + 1;
|
||||||
|
++itr)
|
||||||
result.add(*itr);
|
result.add(*itr);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
|
|
||||||
#include "util/coordinate.hpp"
|
#include "util/coordinate.hpp"
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
#ifndef ENGINE_HPP
|
#ifndef ENGINE_HPP
|
||||||
#define ENGINE_HPP
|
#define ENGINE_HPP
|
||||||
|
|
||||||
#include "engine/status.hpp"
|
|
||||||
#include "storage/shared_barriers.hpp"
|
#include "storage/shared_barriers.hpp"
|
||||||
|
#include "engine/status.hpp"
|
||||||
#include "util/json_container.hpp"
|
#include "util/json_container.hpp"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <unordered_map>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
#ifndef GEOSPATIAL_QUERY_HPP
|
#ifndef GEOSPATIAL_QUERY_HPP
|
||||||
#define GEOSPATIAL_QUERY_HPP
|
#define GEOSPATIAL_QUERY_HPP
|
||||||
|
|
||||||
#include "util/coordinate_calculation.hpp"
|
|
||||||
#include "util/typedefs.hpp"
|
|
||||||
#include "engine/phantom_node.hpp"
|
#include "engine/phantom_node.hpp"
|
||||||
#include "util/bearing.hpp"
|
#include "util/bearing.hpp"
|
||||||
|
#include "util/coordinate_calculation.hpp"
|
||||||
#include "util/rectangle.hpp"
|
#include "util/rectangle.hpp"
|
||||||
|
#include "util/typedefs.hpp"
|
||||||
#include "util/web_mercator.hpp"
|
#include "util/web_mercator.hpp"
|
||||||
|
|
||||||
#include "osrm/coordinate.hpp"
|
#include "osrm/coordinate.hpp"
|
||||||
@ -30,9 +30,7 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
using CandidateSegment = typename RTreeT::CandidateSegment;
|
using CandidateSegment = typename RTreeT::CandidateSegment;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GeospatialQuery(RTreeT &rtree_,
|
GeospatialQuery(RTreeT &rtree_, const CoordinateList &coordinates_, DataFacadeT &datafacade_)
|
||||||
const CoordinateList &coordinates_,
|
|
||||||
DataFacadeT &datafacade_)
|
|
||||||
: rtree(rtree_), coordinates(coordinates_), datafacade(datafacade_)
|
: rtree(rtree_), coordinates(coordinates_), datafacade(datafacade_)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -45,17 +43,14 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
// Returns nearest PhantomNodes in the given bearing range within max_distance.
|
// Returns nearest PhantomNodes in the given bearing range within max_distance.
|
||||||
// Does not filter by small/big component!
|
// Does not filter by small/big component!
|
||||||
std::vector<PhantomNodeWithDistance>
|
std::vector<PhantomNodeWithDistance>
|
||||||
NearestPhantomNodesInRange(const util::Coordinate input_coordinate, const double max_distance) const
|
NearestPhantomNodesInRange(const util::Coordinate input_coordinate,
|
||||||
|
const double max_distance) const
|
||||||
{
|
{
|
||||||
auto results =
|
auto results =
|
||||||
rtree.Nearest(input_coordinate,
|
rtree.Nearest(input_coordinate,
|
||||||
[](const CandidateSegment &)
|
[](const CandidateSegment &) { return std::make_pair(true, true); },
|
||||||
{
|
|
||||||
return std::make_pair(true, true);
|
|
||||||
},
|
|
||||||
[this, max_distance, input_coordinate](const std::size_t,
|
[this, max_distance, input_coordinate](const std::size_t,
|
||||||
const CandidateSegment &segment)
|
const CandidateSegment &segment) {
|
||||||
{
|
|
||||||
return CheckSegmentDistance(input_coordinate, segment, max_distance);
|
return CheckSegmentDistance(input_coordinate, segment, max_distance);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -72,13 +67,11 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
{
|
{
|
||||||
auto results = rtree.Nearest(
|
auto results = rtree.Nearest(
|
||||||
input_coordinate,
|
input_coordinate,
|
||||||
[this, bearing, bearing_range, max_distance](const CandidateSegment &segment)
|
[this, bearing, bearing_range, max_distance](const CandidateSegment &segment) {
|
||||||
{
|
|
||||||
return CheckSegmentBearing(segment, bearing, bearing_range);
|
return CheckSegmentBearing(segment, bearing, bearing_range);
|
||||||
},
|
},
|
||||||
[this, max_distance, input_coordinate](const std::size_t,
|
[this, max_distance, input_coordinate](const std::size_t,
|
||||||
const CandidateSegment &segment)
|
const CandidateSegment &segment) {
|
||||||
{
|
|
||||||
return CheckSegmentDistance(input_coordinate, segment, max_distance);
|
return CheckSegmentDistance(input_coordinate, segment, max_distance);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -95,12 +88,10 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
{
|
{
|
||||||
auto results =
|
auto results =
|
||||||
rtree.Nearest(input_coordinate,
|
rtree.Nearest(input_coordinate,
|
||||||
[this, bearing, bearing_range](const CandidateSegment &segment)
|
[this, bearing, bearing_range](const CandidateSegment &segment) {
|
||||||
{
|
|
||||||
return CheckSegmentBearing(segment, bearing, bearing_range);
|
return CheckSegmentBearing(segment, bearing, bearing_range);
|
||||||
},
|
},
|
||||||
[max_results](const std::size_t num_results, const CandidateSegment &)
|
[max_results](const std::size_t num_results, const CandidateSegment &) {
|
||||||
{
|
|
||||||
return num_results >= max_results;
|
return num_results >= max_results;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -119,13 +110,11 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
{
|
{
|
||||||
auto results =
|
auto results =
|
||||||
rtree.Nearest(input_coordinate,
|
rtree.Nearest(input_coordinate,
|
||||||
[this, bearing, bearing_range](const CandidateSegment &segment)
|
[this, bearing, bearing_range](const CandidateSegment &segment) {
|
||||||
{
|
|
||||||
return CheckSegmentBearing(segment, bearing, bearing_range);
|
return CheckSegmentBearing(segment, bearing, bearing_range);
|
||||||
},
|
},
|
||||||
[this, max_distance, max_results, input_coordinate](
|
[this, max_distance, max_results, input_coordinate](
|
||||||
const std::size_t num_results, const CandidateSegment &segment)
|
const std::size_t num_results, const CandidateSegment &segment) {
|
||||||
{
|
|
||||||
return num_results >= max_results ||
|
return num_results >= max_results ||
|
||||||
CheckSegmentDistance(input_coordinate, segment, max_distance);
|
CheckSegmentDistance(input_coordinate, segment, max_distance);
|
||||||
});
|
});
|
||||||
@ -140,12 +129,8 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
{
|
{
|
||||||
auto results =
|
auto results =
|
||||||
rtree.Nearest(input_coordinate,
|
rtree.Nearest(input_coordinate,
|
||||||
[](const CandidateSegment &)
|
[](const CandidateSegment &) { return std::make_pair(true, true); },
|
||||||
{
|
[max_results](const std::size_t num_results, const CandidateSegment &) {
|
||||||
return std::make_pair(true, true);
|
|
||||||
},
|
|
||||||
[max_results](const std::size_t num_results, const CandidateSegment &)
|
|
||||||
{
|
|
||||||
return num_results >= max_results;
|
return num_results >= max_results;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -161,13 +146,9 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
{
|
{
|
||||||
auto results =
|
auto results =
|
||||||
rtree.Nearest(input_coordinate,
|
rtree.Nearest(input_coordinate,
|
||||||
[](const CandidateSegment &)
|
[](const CandidateSegment &) { return std::make_pair(true, true); },
|
||||||
{
|
|
||||||
return std::make_pair(true, true);
|
|
||||||
},
|
|
||||||
[this, max_distance, max_results, input_coordinate](
|
[this, max_distance, max_results, input_coordinate](
|
||||||
const std::size_t num_results, const CandidateSegment &segment)
|
const std::size_t num_results, const CandidateSegment &segment) {
|
||||||
{
|
|
||||||
return num_results >= max_results ||
|
return num_results >= max_results ||
|
||||||
CheckSegmentDistance(input_coordinate, segment, max_distance);
|
CheckSegmentDistance(input_coordinate, segment, max_distance);
|
||||||
});
|
});
|
||||||
@ -185,8 +166,7 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
bool has_big_component = false;
|
bool has_big_component = false;
|
||||||
auto results = rtree.Nearest(
|
auto results = rtree.Nearest(
|
||||||
input_coordinate,
|
input_coordinate,
|
||||||
[&has_big_component, &has_small_component](const CandidateSegment &segment)
|
[&has_big_component, &has_small_component](const CandidateSegment &segment) {
|
||||||
{
|
|
||||||
auto use_segment = (!has_small_component ||
|
auto use_segment = (!has_small_component ||
|
||||||
(!has_big_component && !segment.data.component.is_tiny));
|
(!has_big_component && !segment.data.component.is_tiny));
|
||||||
auto use_directions = std::make_pair(use_segment, use_segment);
|
auto use_directions = std::make_pair(use_segment, use_segment);
|
||||||
@ -196,9 +176,8 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
|
|
||||||
return use_directions;
|
return use_directions;
|
||||||
},
|
},
|
||||||
[this, &has_big_component, max_distance,
|
[this, &has_big_component, max_distance, input_coordinate](
|
||||||
input_coordinate](const std::size_t num_results, const CandidateSegment &segment)
|
const std::size_t num_results, const CandidateSegment &segment) {
|
||||||
{
|
|
||||||
return (num_results > 0 && has_big_component) ||
|
return (num_results > 0 && has_big_component) ||
|
||||||
CheckSegmentDistance(input_coordinate, segment, max_distance);
|
CheckSegmentDistance(input_coordinate, segment, max_distance);
|
||||||
});
|
});
|
||||||
@ -222,8 +201,7 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
bool has_big_component = false;
|
bool has_big_component = false;
|
||||||
auto results = rtree.Nearest(
|
auto results = rtree.Nearest(
|
||||||
input_coordinate,
|
input_coordinate,
|
||||||
[&has_big_component, &has_small_component](const CandidateSegment &segment)
|
[&has_big_component, &has_small_component](const CandidateSegment &segment) {
|
||||||
{
|
|
||||||
auto use_segment = (!has_small_component ||
|
auto use_segment = (!has_small_component ||
|
||||||
(!has_big_component && !segment.data.component.is_tiny));
|
(!has_big_component && !segment.data.component.is_tiny));
|
||||||
auto use_directions = std::make_pair(use_segment, use_segment);
|
auto use_directions = std::make_pair(use_segment, use_segment);
|
||||||
@ -233,8 +211,7 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
|
|
||||||
return use_directions;
|
return use_directions;
|
||||||
},
|
},
|
||||||
[&has_big_component](const std::size_t num_results, const CandidateSegment &)
|
[&has_big_component](const std::size_t num_results, const CandidateSegment &) {
|
||||||
{
|
|
||||||
return num_results > 0 && has_big_component;
|
return num_results > 0 && has_big_component;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -257,9 +234,8 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
bool has_big_component = false;
|
bool has_big_component = false;
|
||||||
auto results = rtree.Nearest(
|
auto results = rtree.Nearest(
|
||||||
input_coordinate,
|
input_coordinate,
|
||||||
[this, bearing, bearing_range, &has_big_component,
|
[this, bearing, bearing_range, &has_big_component, &has_small_component](
|
||||||
&has_small_component](const CandidateSegment &segment)
|
const CandidateSegment &segment) {
|
||||||
{
|
|
||||||
auto use_segment = (!has_small_component ||
|
auto use_segment = (!has_small_component ||
|
||||||
(!has_big_component && !segment.data.component.is_tiny));
|
(!has_big_component && !segment.data.component.is_tiny));
|
||||||
auto use_directions = std::make_pair(use_segment, use_segment);
|
auto use_directions = std::make_pair(use_segment, use_segment);
|
||||||
@ -276,8 +252,7 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
|
|
||||||
return use_directions;
|
return use_directions;
|
||||||
},
|
},
|
||||||
[&has_big_component](const std::size_t num_results, const CandidateSegment &)
|
[&has_big_component](const std::size_t num_results, const CandidateSegment &) {
|
||||||
{
|
|
||||||
return num_results > 0 && has_big_component;
|
return num_results > 0 && has_big_component;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -303,9 +278,8 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
bool has_big_component = false;
|
bool has_big_component = false;
|
||||||
auto results = rtree.Nearest(
|
auto results = rtree.Nearest(
|
||||||
input_coordinate,
|
input_coordinate,
|
||||||
[this, bearing, bearing_range, &has_big_component,
|
[this, bearing, bearing_range, &has_big_component, &has_small_component](
|
||||||
&has_small_component](const CandidateSegment &segment)
|
const CandidateSegment &segment) {
|
||||||
{
|
|
||||||
auto use_segment = (!has_small_component ||
|
auto use_segment = (!has_small_component ||
|
||||||
(!has_big_component && !segment.data.component.is_tiny));
|
(!has_big_component && !segment.data.component.is_tiny));
|
||||||
auto use_directions = std::make_pair(use_segment, use_segment);
|
auto use_directions = std::make_pair(use_segment, use_segment);
|
||||||
@ -322,9 +296,8 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
|
|
||||||
return use_directions;
|
return use_directions;
|
||||||
},
|
},
|
||||||
[this, &has_big_component, max_distance,
|
[this, &has_big_component, max_distance, input_coordinate](
|
||||||
input_coordinate](const std::size_t num_results, const CandidateSegment &segment)
|
const std::size_t num_results, const CandidateSegment &segment) {
|
||||||
{
|
|
||||||
return (num_results > 0 && has_big_component) ||
|
return (num_results > 0 && has_big_component) ||
|
||||||
CheckSegmentDistance(input_coordinate, segment, max_distance);
|
CheckSegmentDistance(input_coordinate, segment, max_distance);
|
||||||
});
|
});
|
||||||
@ -345,9 +318,10 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
const std::vector<EdgeData> &results) const
|
const std::vector<EdgeData> &results) const
|
||||||
{
|
{
|
||||||
std::vector<PhantomNodeWithDistance> distance_and_phantoms(results.size());
|
std::vector<PhantomNodeWithDistance> distance_and_phantoms(results.size());
|
||||||
std::transform(results.begin(), results.end(), distance_and_phantoms.begin(),
|
std::transform(results.begin(),
|
||||||
[this, &input_coordinate](const EdgeData &data)
|
results.end(),
|
||||||
{
|
distance_and_phantoms.begin(),
|
||||||
|
[this, &input_coordinate](const EdgeData &data) {
|
||||||
return MakePhantomNode(input_coordinate, data);
|
return MakePhantomNode(input_coordinate, data);
|
||||||
});
|
});
|
||||||
return distance_and_phantoms;
|
return distance_and_phantoms;
|
||||||
@ -359,9 +333,11 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
util::Coordinate point_on_segment;
|
util::Coordinate point_on_segment;
|
||||||
double ratio;
|
double ratio;
|
||||||
const auto current_perpendicular_distance =
|
const auto current_perpendicular_distance =
|
||||||
util::coordinate_calculation::perpendicularDistance(
|
util::coordinate_calculation::perpendicularDistance(coordinates[data.u],
|
||||||
coordinates[data.u], coordinates[data.v], input_coordinate,
|
coordinates[data.v],
|
||||||
point_on_segment, ratio);
|
input_coordinate,
|
||||||
|
point_on_segment,
|
||||||
|
ratio);
|
||||||
|
|
||||||
// Find the node-based-edge that this belongs to, and directly
|
// Find the node-based-edge that this belongs to, and directly
|
||||||
// calculate the forward_weight, forward_offset, reverse_weight, reverse_offset
|
// calculate the forward_weight, forward_offset, reverse_weight, reverse_offset
|
||||||
@ -390,7 +366,8 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
BOOST_ASSERT(data.fwd_segment_position < reverse_weight_vector.size());
|
BOOST_ASSERT(data.fwd_segment_position < reverse_weight_vector.size());
|
||||||
|
|
||||||
for (std::size_t i = 0;
|
for (std::size_t i = 0;
|
||||||
i < reverse_weight_vector.size() - data.fwd_segment_position - 1; i++)
|
i < reverse_weight_vector.size() - data.fwd_segment_position - 1;
|
||||||
|
i++)
|
||||||
{
|
{
|
||||||
reverse_offset += reverse_weight_vector[i];
|
reverse_offset += reverse_weight_vector[i];
|
||||||
}
|
}
|
||||||
@ -408,9 +385,13 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
reverse_weight *= 1.0 - ratio;
|
reverse_weight *= 1.0 - ratio;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto transformed = PhantomNodeWithDistance{PhantomNode{data, forward_weight, forward_offset,
|
auto transformed = PhantomNodeWithDistance{PhantomNode{data,
|
||||||
reverse_weight, reverse_offset,
|
forward_weight,
|
||||||
point_on_segment, input_coordinate},
|
forward_offset,
|
||||||
|
reverse_weight,
|
||||||
|
reverse_offset,
|
||||||
|
point_on_segment,
|
||||||
|
input_coordinate},
|
||||||
current_perpendicular_distance};
|
current_perpendicular_distance};
|
||||||
|
|
||||||
return transformed;
|
return transformed;
|
||||||
@ -449,12 +430,12 @@ template <typename RTreeT, typename DataFacadeT> class GeospatialQuery
|
|||||||
: (forward_edge_bearing + 180);
|
: (forward_edge_bearing + 180);
|
||||||
|
|
||||||
const bool forward_bearing_valid =
|
const bool forward_bearing_valid =
|
||||||
util::bearing::CheckInBounds(std::round(forward_edge_bearing), filter_bearing,
|
util::bearing::CheckInBounds(
|
||||||
filter_bearing_range) &&
|
std::round(forward_edge_bearing), filter_bearing, filter_bearing_range) &&
|
||||||
segment.data.forward_segment_id.enabled;
|
segment.data.forward_segment_id.enabled;
|
||||||
const bool backward_bearing_valid =
|
const bool backward_bearing_valid =
|
||||||
util::bearing::CheckInBounds(std::round(backward_edge_bearing), filter_bearing,
|
util::bearing::CheckInBounds(
|
||||||
filter_bearing_range) &&
|
std::round(backward_edge_bearing), filter_bearing, filter_bearing_range) &&
|
||||||
segment.data.reverse_segment_id.enabled;
|
segment.data.reverse_segment_id.enabled;
|
||||||
return std::make_pair(forward_bearing_valid, backward_bearing_valid);
|
return std::make_pair(forward_bearing_valid, backward_bearing_valid);
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
#ifndef ENGINE_GUIDANCE_ASSEMBLE_GEOMETRY_HPP
|
#ifndef ENGINE_GUIDANCE_ASSEMBLE_GEOMETRY_HPP
|
||||||
#define ENGINE_GUIDANCE_ASSEMBLE_GEOMETRY_HPP
|
#define ENGINE_GUIDANCE_ASSEMBLE_GEOMETRY_HPP
|
||||||
|
|
||||||
#include "engine/internal_route_result.hpp"
|
|
||||||
#include "engine/phantom_node.hpp"
|
|
||||||
#include "engine/guidance/route_step.hpp"
|
|
||||||
#include "engine/guidance/leg_geometry.hpp"
|
|
||||||
#include "engine/guidance/toolkit.hpp"
|
|
||||||
#include "util/coordinate_calculation.hpp"
|
|
||||||
#include "util/coordinate.hpp"
|
|
||||||
#include "extractor/guidance/turn_instruction.hpp"
|
#include "extractor/guidance/turn_instruction.hpp"
|
||||||
#include "extractor/travel_mode.hpp"
|
#include "extractor/travel_mode.hpp"
|
||||||
|
#include "engine/guidance/leg_geometry.hpp"
|
||||||
|
#include "engine/guidance/route_step.hpp"
|
||||||
|
#include "engine/guidance/toolkit.hpp"
|
||||||
|
#include "engine/internal_route_result.hpp"
|
||||||
|
#include "engine/phantom_node.hpp"
|
||||||
|
#include "util/coordinate.hpp"
|
||||||
|
#include "util/coordinate_calculation.hpp"
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
@ -62,7 +62,8 @@ LegGeometry assembleGeometry(const DataFacadeT &facade,
|
|||||||
}
|
}
|
||||||
|
|
||||||
prev_coordinate = coordinate;
|
prev_coordinate = coordinate;
|
||||||
geometry.annotations.emplace_back(LegGeometry::Annotation{current_distance, path_point.duration_until_turn / 10.});
|
geometry.annotations.emplace_back(
|
||||||
|
LegGeometry::Annotation{current_distance, path_point.duration_until_turn / 10.});
|
||||||
geometry.locations.push_back(std::move(coordinate));
|
geometry.locations.push_back(std::move(coordinate));
|
||||||
}
|
}
|
||||||
current_distance =
|
current_distance =
|
||||||
@ -70,7 +71,8 @@ LegGeometry assembleGeometry(const DataFacadeT &facade,
|
|||||||
cumulative_distance += current_distance;
|
cumulative_distance += current_distance;
|
||||||
// segment leading to the target node
|
// segment leading to the target node
|
||||||
geometry.segment_distances.push_back(cumulative_distance);
|
geometry.segment_distances.push_back(cumulative_distance);
|
||||||
geometry.annotations.emplace_back(LegGeometry::Annotation{current_distance, target_node.forward_weight / 10.});
|
geometry.annotations.emplace_back(
|
||||||
|
LegGeometry::Annotation{current_distance, target_node.forward_weight / 10.});
|
||||||
geometry.segment_offsets.push_back(geometry.locations.size());
|
geometry.segment_offsets.push_back(geometry.locations.size());
|
||||||
geometry.locations.push_back(target_node.location);
|
geometry.locations.push_back(target_node.location);
|
||||||
|
|
||||||
|
@ -38,8 +38,7 @@ template <std::size_t SegmentNumber>
|
|||||||
std::array<std::uint32_t, SegmentNumber> summarizeRoute(const std::vector<PathData> &route_data)
|
std::array<std::uint32_t, SegmentNumber> summarizeRoute(const std::vector<PathData> &route_data)
|
||||||
{
|
{
|
||||||
// merges segments with same name id
|
// merges segments with same name id
|
||||||
const auto collapse_segments = [](std::vector<NamedSegment> &segments)
|
const auto collapse_segments = [](std::vector<NamedSegment> &segments) {
|
||||||
{
|
|
||||||
auto out = segments.begin();
|
auto out = segments.begin();
|
||||||
auto end = segments.end();
|
auto end = segments.end();
|
||||||
|
|
||||||
@ -69,13 +68,12 @@ std::array<std::uint32_t, SegmentNumber> summarizeRoute(const std::vector<PathDa
|
|||||||
std::vector<NamedSegment> segments(route_data.size());
|
std::vector<NamedSegment> segments(route_data.size());
|
||||||
std::uint32_t index = 0;
|
std::uint32_t index = 0;
|
||||||
std::transform(
|
std::transform(
|
||||||
route_data.begin(), route_data.end(), segments.begin(), [&index](const PathData &point)
|
route_data.begin(), route_data.end(), segments.begin(), [&index](const PathData &point) {
|
||||||
{
|
|
||||||
return NamedSegment{point.duration_until_turn, index++, point.name_id};
|
return NamedSegment{point.duration_until_turn, index++, point.name_id};
|
||||||
});
|
});
|
||||||
// this makes sure that the segment with the lowest position comes first
|
// this makes sure that the segment with the lowest position comes first
|
||||||
std::sort(segments.begin(), segments.end(), [](const NamedSegment &lhs, const NamedSegment &rhs)
|
std::sort(
|
||||||
{
|
segments.begin(), segments.end(), [](const NamedSegment &lhs, const NamedSegment &rhs) {
|
||||||
return lhs.name_id < rhs.name_id ||
|
return lhs.name_id < rhs.name_id ||
|
||||||
(lhs.name_id == rhs.name_id && lhs.position < rhs.position);
|
(lhs.name_id == rhs.name_id && lhs.position < rhs.position);
|
||||||
});
|
});
|
||||||
@ -83,33 +81,31 @@ std::array<std::uint32_t, SegmentNumber> summarizeRoute(const std::vector<PathDa
|
|||||||
segments.resize(new_end - segments.begin());
|
segments.resize(new_end - segments.begin());
|
||||||
|
|
||||||
// Filter out segments with an empty name (name_id == 0)
|
// Filter out segments with an empty name (name_id == 0)
|
||||||
new_end = std::remove_if(segments.begin(), segments.end(), [](const NamedSegment &segment)
|
new_end = std::remove_if(segments.begin(), segments.end(), [](const NamedSegment &segment) {
|
||||||
{
|
|
||||||
return segment.name_id == 0;
|
return segment.name_id == 0;
|
||||||
});
|
});
|
||||||
segments.resize(new_end - segments.begin());
|
segments.resize(new_end - segments.begin());
|
||||||
|
|
||||||
// sort descending
|
// sort descending
|
||||||
std::sort(segments.begin(), segments.end(), [](const NamedSegment &lhs, const NamedSegment &rhs)
|
std::sort(
|
||||||
{
|
segments.begin(), segments.end(), [](const NamedSegment &lhs, const NamedSegment &rhs) {
|
||||||
return lhs.duration > rhs.duration ||
|
return lhs.duration > rhs.duration ||
|
||||||
(lhs.duration == rhs.duration && lhs.position < rhs.position);
|
(lhs.duration == rhs.duration && lhs.position < rhs.position);
|
||||||
});
|
});
|
||||||
|
|
||||||
// make sure the segments are sorted by position
|
// make sure the segments are sorted by position
|
||||||
segments.resize(std::min(segments.size(), SegmentNumber));
|
segments.resize(std::min(segments.size(), SegmentNumber));
|
||||||
std::sort(segments.begin(), segments.end(), [](const NamedSegment &lhs, const NamedSegment &rhs)
|
std::sort(
|
||||||
{
|
segments.begin(), segments.end(), [](const NamedSegment &lhs, const NamedSegment &rhs) {
|
||||||
return lhs.position < rhs.position;
|
return lhs.position < rhs.position;
|
||||||
});
|
});
|
||||||
|
|
||||||
std::array<std::uint32_t, SegmentNumber> summary;
|
std::array<std::uint32_t, SegmentNumber> summary;
|
||||||
std::fill(summary.begin(), summary.end(), 0);
|
std::fill(summary.begin(), summary.end(), 0);
|
||||||
std::transform(segments.begin(), segments.end(), summary.begin(),
|
std::transform(segments.begin(),
|
||||||
[](const NamedSegment &segment)
|
segments.end(),
|
||||||
{
|
summary.begin(),
|
||||||
return segment.name_id;
|
[](const NamedSegment &segment) { return segment.name_id; });
|
||||||
});
|
|
||||||
return summary;
|
return summary;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -126,9 +122,11 @@ inline RouteLeg assembleLeg(const datafacade::BaseDataFacade &facade,
|
|||||||
(target_traversed_in_reverse ? target_node.reverse_weight : target_node.forward_weight) /
|
(target_traversed_in_reverse ? target_node.reverse_weight : target_node.forward_weight) /
|
||||||
10.;
|
10.;
|
||||||
|
|
||||||
auto distance = std::accumulate(leg_geometry.segment_distances.begin(),
|
auto distance = std::accumulate(
|
||||||
leg_geometry.segment_distances.end(), 0.);
|
leg_geometry.segment_distances.begin(), leg_geometry.segment_distances.end(), 0.);
|
||||||
auto duration = std::accumulate(route_data.begin(), route_data.end(), 0.,
|
auto duration = std::accumulate(route_data.begin(),
|
||||||
|
route_data.end(),
|
||||||
|
0.,
|
||||||
[](const double sum, const PathData &data) {
|
[](const double sum, const PathData &data) {
|
||||||
return sum + data.duration_until_turn;
|
return sum + data.duration_until_turn;
|
||||||
}) /
|
}) /
|
||||||
@ -170,10 +168,10 @@ inline RouteLeg assembleLeg(const datafacade::BaseDataFacade &facade,
|
|||||||
|
|
||||||
BOOST_ASSERT(detail::MAX_USED_SEGMENTS > 0);
|
BOOST_ASSERT(detail::MAX_USED_SEGMENTS > 0);
|
||||||
BOOST_ASSERT(summary_array.begin() != summary_array.end());
|
BOOST_ASSERT(summary_array.begin() != summary_array.end());
|
||||||
summary = std::accumulate(std::next(summary_array.begin()), summary_array.end(),
|
summary = std::accumulate(std::next(summary_array.begin()),
|
||||||
|
summary_array.end(),
|
||||||
facade.GetNameForID(summary_array.front()),
|
facade.GetNameForID(summary_array.front()),
|
||||||
[&facade](std::string previous, const std::uint32_t name_id)
|
[&facade](std::string previous, const std::uint32_t name_id) {
|
||||||
{
|
|
||||||
if (name_id != 0)
|
if (name_id != 0)
|
||||||
{
|
{
|
||||||
previous += ", " + facade.GetNameForID(name_id);
|
previous += ", " + facade.GetNameForID(name_id);
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef ENGINE_GUIDANCE_ASSEMBLE_ROUTE_HPP
|
#ifndef ENGINE_GUIDANCE_ASSEMBLE_ROUTE_HPP
|
||||||
#define ENGINE_GUIDANCE_ASSEMBLE_ROUTE_HPP
|
#define ENGINE_GUIDANCE_ASSEMBLE_ROUTE_HPP
|
||||||
|
|
||||||
#include "engine/guidance/route_leg.hpp"
|
|
||||||
#include "engine/guidance/route.hpp"
|
#include "engine/guidance/route.hpp"
|
||||||
|
#include "engine/guidance/route_leg.hpp"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
#ifndef ENGINE_GUIDANCE_ASSEMBLE_STEPS_HPP_
|
#ifndef ENGINE_GUIDANCE_ASSEMBLE_STEPS_HPP_
|
||||||
#define ENGINE_GUIDANCE_ASSEMBLE_STEPS_HPP_
|
#define ENGINE_GUIDANCE_ASSEMBLE_STEPS_HPP_
|
||||||
|
|
||||||
|
#include "extractor/guidance/turn_instruction.hpp"
|
||||||
|
#include "extractor/travel_mode.hpp"
|
||||||
#include "engine/guidance/leg_geometry.hpp"
|
#include "engine/guidance/leg_geometry.hpp"
|
||||||
#include "engine/guidance/route_step.hpp"
|
#include "engine/guidance/route_step.hpp"
|
||||||
#include "engine/guidance/step_maneuver.hpp"
|
#include "engine/guidance/step_maneuver.hpp"
|
||||||
#include "engine/guidance/toolkit.hpp"
|
#include "engine/guidance/toolkit.hpp"
|
||||||
#include "engine/internal_route_result.hpp"
|
#include "engine/internal_route_result.hpp"
|
||||||
#include "engine/phantom_node.hpp"
|
#include "engine/phantom_node.hpp"
|
||||||
#include "extractor/guidance/turn_instruction.hpp"
|
|
||||||
#include "extractor/travel_mode.hpp"
|
|
||||||
#include "util/bearing.hpp"
|
#include "util/bearing.hpp"
|
||||||
#include "util/coordinate.hpp"
|
#include "util/coordinate.hpp"
|
||||||
#include "util/coordinate_calculation.hpp"
|
#include "util/coordinate_calculation.hpp"
|
||||||
@ -65,11 +65,17 @@ std::vector<RouteStep> assembleSteps(const DataFacadeT &facade,
|
|||||||
|
|
||||||
auto bearings = detail::getDepartBearings(leg_geometry);
|
auto bearings = detail::getDepartBearings(leg_geometry);
|
||||||
|
|
||||||
StepManeuver maneuver{source_node.location, bearings.first,
|
StepManeuver maneuver{source_node.location,
|
||||||
bearings.second, extractor::guidance::TurnInstruction::NO_TURN(),
|
bearings.first,
|
||||||
WaypointType::Depart, 0};
|
bearings.second,
|
||||||
Intersection intersection{source_node.location, std::vector<short>({bearings.second}),
|
extractor::guidance::TurnInstruction::NO_TURN(),
|
||||||
std::vector<bool>({true}), Intersection::NO_INDEX, 0};
|
WaypointType::Depart,
|
||||||
|
0};
|
||||||
|
Intersection intersection{source_node.location,
|
||||||
|
std::vector<short>({bearings.second}),
|
||||||
|
std::vector<bool>({true}),
|
||||||
|
Intersection::NO_INDEX,
|
||||||
|
0};
|
||||||
|
|
||||||
if (leg_data.size() > 0)
|
if (leg_data.size() > 0)
|
||||||
{
|
{
|
||||||
@ -131,8 +137,12 @@ std::vector<RouteStep> assembleSteps(const DataFacadeT &facade,
|
|||||||
{
|
{
|
||||||
intersection.entry.push_back(entry_class.allowsEntry(idx));
|
intersection.entry.push_back(entry_class.allowsEntry(idx));
|
||||||
}
|
}
|
||||||
maneuver = {intersection.location, bearings.first, bearings.second,
|
maneuver = {intersection.location,
|
||||||
path_point.turn_instruction, WaypointType::None, 0};
|
bearings.first,
|
||||||
|
bearings.second,
|
||||||
|
path_point.turn_instruction,
|
||||||
|
WaypointType::None,
|
||||||
|
0};
|
||||||
segment_index++;
|
segment_index++;
|
||||||
segment_duration = 0;
|
segment_duration = 0;
|
||||||
}
|
}
|
||||||
@ -178,13 +188,18 @@ std::vector<RouteStep> assembleSteps(const DataFacadeT &facade,
|
|||||||
BOOST_ASSERT(segment_index == number_of_segments - 1);
|
BOOST_ASSERT(segment_index == number_of_segments - 1);
|
||||||
bearings = detail::getArriveBearings(leg_geometry);
|
bearings = detail::getArriveBearings(leg_geometry);
|
||||||
// This step has length zero, the only reason we need it is the target location
|
// This step has length zero, the only reason we need it is the target location
|
||||||
maneuver = {intersection.location, bearings.first,
|
maneuver = {intersection.location,
|
||||||
bearings.second, extractor::guidance::TurnInstruction::NO_TURN(),
|
bearings.first,
|
||||||
WaypointType::Arrive, 0};
|
bearings.second,
|
||||||
|
extractor::guidance::TurnInstruction::NO_TURN(),
|
||||||
|
WaypointType::Arrive,
|
||||||
|
0};
|
||||||
intersection = {
|
intersection = {
|
||||||
target_node.location,
|
target_node.location,
|
||||||
std::vector<short>({static_cast<short>(util::bearing::reverseBearing(bearings.first))}),
|
std::vector<short>({static_cast<short>(util::bearing::reverseBearing(bearings.first))}),
|
||||||
std::vector<bool>({true}), 0, Intersection::NO_INDEX};
|
std::vector<bool>({true}),
|
||||||
|
0,
|
||||||
|
Intersection::NO_INDEX};
|
||||||
|
|
||||||
BOOST_ASSERT(!leg_geometry.locations.empty());
|
BOOST_ASSERT(!leg_geometry.locations.empty());
|
||||||
steps.push_back(RouteStep{target_node.name_id,
|
steps.push_back(RouteStep{target_node.name_id,
|
||||||
|
@ -8,8 +8,8 @@
|
|||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
@ -32,7 +32,8 @@ struct LegGeometry
|
|||||||
std::vector<double> segment_distances;
|
std::vector<double> segment_distances;
|
||||||
|
|
||||||
// Per-coordinate metadata
|
// Per-coordinate metadata
|
||||||
struct Annotation {
|
struct Annotation
|
||||||
|
{
|
||||||
double distance;
|
double distance;
|
||||||
double duration;
|
double duration;
|
||||||
};
|
};
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#ifndef ENGINE_GUIDANCE_POST_PROCESSING_HPP
|
#ifndef ENGINE_GUIDANCE_POST_PROCESSING_HPP
|
||||||
#define ENGINE_GUIDANCE_POST_PROCESSING_HPP
|
#define ENGINE_GUIDANCE_POST_PROCESSING_HPP
|
||||||
|
|
||||||
#include "engine/phantom_node.hpp"
|
|
||||||
#include "engine/guidance/route_step.hpp"
|
|
||||||
#include "engine/guidance/leg_geometry.hpp"
|
#include "engine/guidance/leg_geometry.hpp"
|
||||||
|
#include "engine/guidance/route_step.hpp"
|
||||||
|
#include "engine/phantom_node.hpp"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef ROUTE_STEP_HPP
|
#ifndef ROUTE_STEP_HPP
|
||||||
#define ROUTE_STEP_HPP
|
#define ROUTE_STEP_HPP
|
||||||
|
|
||||||
#include "engine/guidance/step_maneuver.hpp"
|
|
||||||
#include "extractor/travel_mode.hpp"
|
#include "extractor/travel_mode.hpp"
|
||||||
|
#include "engine/guidance/step_maneuver.hpp"
|
||||||
#include "util/coordinate.hpp"
|
#include "util/coordinate.hpp"
|
||||||
#include "util/guidance/bearing_class.hpp"
|
#include "util/guidance/bearing_class.hpp"
|
||||||
#include "util/guidance/entry_class.hpp"
|
#include "util/guidance/entry_class.hpp"
|
||||||
|
@ -32,9 +32,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include "util/coordinate.hpp"
|
#include "util/coordinate.hpp"
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <iosfwd>
|
#include <iosfwd>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
@ -65,7 +65,8 @@ struct Hint
|
|||||||
|
|
||||||
static_assert(sizeof(Hint) == 60 + 4, "Hint is bigger than expected");
|
static_assert(sizeof(Hint) == 60 + 4, "Hint is bigger than expected");
|
||||||
constexpr std::size_t ENCODED_HINT_SIZE = 88;
|
constexpr std::size_t ENCODED_HINT_SIZE = 88;
|
||||||
static_assert(ENCODED_HINT_SIZE / 4 * 3 >= sizeof(Hint), "ENCODED_HINT_SIZE does not match size of Hint");
|
static_assert(ENCODED_HINT_SIZE / 4 * 3 >= sizeof(Hint),
|
||||||
|
"ENCODED_HINT_SIZE does not match size of Hint");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#ifndef RAW_ROUTE_DATA_H
|
#ifndef RAW_ROUTE_DATA_H
|
||||||
#define RAW_ROUTE_DATA_H
|
#define RAW_ROUTE_DATA_H
|
||||||
|
|
||||||
#include "engine/phantom_node.hpp"
|
|
||||||
#include "extractor/guidance/turn_instruction.hpp"
|
#include "extractor/guidance/turn_instruction.hpp"
|
||||||
#include "extractor/travel_mode.hpp"
|
#include "extractor/travel_mode.hpp"
|
||||||
|
#include "engine/phantom_node.hpp"
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
#include "osrm/coordinate.hpp"
|
#include "osrm/coordinate.hpp"
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include <boost/math/constants/constants.hpp>
|
#include <boost/math/constants/constants.hpp>
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef MATCH_HPP
|
#ifndef MATCH_HPP
|
||||||
#define MATCH_HPP
|
#define MATCH_HPP
|
||||||
|
|
||||||
#include "engine/plugins/plugin_base.hpp"
|
|
||||||
#include "engine/api/match_parameters.hpp"
|
#include "engine/api/match_parameters.hpp"
|
||||||
|
#include "engine/plugins/plugin_base.hpp"
|
||||||
|
|
||||||
#include "engine/map_matching/bayes_classifier.hpp"
|
#include "engine/map_matching/bayes_classifier.hpp"
|
||||||
#include "engine/routing_algorithms/map_matching.hpp"
|
#include "engine/routing_algorithms/map_matching.hpp"
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef NEAREST_HPP
|
#ifndef NEAREST_HPP
|
||||||
#define NEAREST_HPP
|
#define NEAREST_HPP
|
||||||
|
|
||||||
#include "engine/plugins/plugin_base.hpp"
|
|
||||||
#include "engine/api/nearest_parameters.hpp"
|
#include "engine/api/nearest_parameters.hpp"
|
||||||
|
#include "engine/plugins/plugin_base.hpp"
|
||||||
#include "osrm/json_container.hpp"
|
#include "osrm/json_container.hpp"
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
#ifndef BASE_PLUGIN_HPP
|
#ifndef BASE_PLUGIN_HPP
|
||||||
#define BASE_PLUGIN_HPP
|
#define BASE_PLUGIN_HPP
|
||||||
|
|
||||||
#include "engine/datafacade/datafacade_base.hpp"
|
|
||||||
#include "engine/api/base_parameters.hpp"
|
#include "engine/api/base_parameters.hpp"
|
||||||
|
#include "engine/datafacade/datafacade_base.hpp"
|
||||||
#include "engine/phantom_node.hpp"
|
#include "engine/phantom_node.hpp"
|
||||||
#include "engine/status.hpp"
|
#include "engine/status.hpp"
|
||||||
|
|
||||||
#include "util/coordinate.hpp"
|
#include "util/coordinate.hpp"
|
||||||
#include "util/coordinate_calculation.hpp"
|
#include "util/coordinate_calculation.hpp"
|
||||||
#include "util/json_container.hpp"
|
|
||||||
#include "util/integer_range.hpp"
|
#include "util/integer_range.hpp"
|
||||||
|
#include "util/json_container.hpp"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
@ -31,9 +31,8 @@ class BasePlugin
|
|||||||
|
|
||||||
bool CheckAllCoordinates(const std::vector<util::Coordinate> &coordinates)
|
bool CheckAllCoordinates(const std::vector<util::Coordinate> &coordinates)
|
||||||
{
|
{
|
||||||
return !std::any_of(std::begin(coordinates), std::end(coordinates),
|
return !std::any_of(
|
||||||
[](const util::Coordinate coordinate)
|
std::begin(coordinates), std::end(coordinates), [](const util::Coordinate coordinate) {
|
||||||
{
|
|
||||||
return !coordinate.IsValid();
|
return !coordinate.IsValid();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -53,27 +52,24 @@ class BasePlugin
|
|||||||
SnapPhantomNodes(const std::vector<PhantomNodePair> &phantom_node_pair_list) const
|
SnapPhantomNodes(const std::vector<PhantomNodePair> &phantom_node_pair_list) const
|
||||||
{
|
{
|
||||||
const auto check_component_id_is_tiny =
|
const auto check_component_id_is_tiny =
|
||||||
[](const std::pair<PhantomNode, PhantomNode> &phantom_pair)
|
[](const std::pair<PhantomNode, PhantomNode> &phantom_pair) {
|
||||||
{
|
|
||||||
return phantom_pair.first.component.is_tiny;
|
return phantom_pair.first.component.is_tiny;
|
||||||
};
|
};
|
||||||
|
|
||||||
// are all phantoms from a tiny cc?
|
// are all phantoms from a tiny cc?
|
||||||
const auto check_all_in_same_component =
|
const auto check_all_in_same_component =
|
||||||
[](const std::vector<std::pair<PhantomNode, PhantomNode>> &nodes)
|
[](const std::vector<std::pair<PhantomNode, PhantomNode>> &nodes) {
|
||||||
{
|
|
||||||
const auto component_id = nodes.front().first.component.id;
|
const auto component_id = nodes.front().first.component.id;
|
||||||
|
|
||||||
return std::all_of(std::begin(nodes), std::end(nodes),
|
return std::all_of(std::begin(nodes),
|
||||||
[component_id](const PhantomNodePair &phantom_pair)
|
std::end(nodes),
|
||||||
{
|
[component_id](const PhantomNodePair &phantom_pair) {
|
||||||
return component_id == phantom_pair.first.component.id;
|
return component_id == phantom_pair.first.component.id;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const auto fallback_to_big_component =
|
const auto fallback_to_big_component =
|
||||||
[](const std::pair<PhantomNode, PhantomNode> &phantom_pair)
|
[](const std::pair<PhantomNode, PhantomNode> &phantom_pair) {
|
||||||
{
|
|
||||||
if (phantom_pair.first.component.is_tiny && phantom_pair.second.IsValid() &&
|
if (phantom_pair.first.component.is_tiny && phantom_pair.second.IsValid() &&
|
||||||
!phantom_pair.second.component.is_tiny)
|
!phantom_pair.second.component.is_tiny)
|
||||||
{
|
{
|
||||||
@ -82,13 +78,11 @@ class BasePlugin
|
|||||||
return phantom_pair.first;
|
return phantom_pair.first;
|
||||||
};
|
};
|
||||||
|
|
||||||
const auto use_closed_phantom = [](const std::pair<PhantomNode, PhantomNode> &phantom_pair)
|
const auto use_closed_phantom = [](
|
||||||
{
|
const std::pair<PhantomNode, PhantomNode> &phantom_pair) { return phantom_pair.first; };
|
||||||
return phantom_pair.first;
|
|
||||||
};
|
|
||||||
|
|
||||||
const bool every_phantom_is_in_tiny_cc =
|
const bool every_phantom_is_in_tiny_cc = std::all_of(std::begin(phantom_node_pair_list),
|
||||||
std::all_of(std::begin(phantom_node_pair_list), std::end(phantom_node_pair_list),
|
std::end(phantom_node_pair_list),
|
||||||
check_component_id_is_tiny);
|
check_component_id_is_tiny);
|
||||||
auto all_in_same_component = check_all_in_same_component(phantom_node_pair_list);
|
auto all_in_same_component = check_all_in_same_component(phantom_node_pair_list);
|
||||||
|
|
||||||
@ -99,13 +93,17 @@ class BasePlugin
|
|||||||
// component
|
// component
|
||||||
if (every_phantom_is_in_tiny_cc && all_in_same_component)
|
if (every_phantom_is_in_tiny_cc && all_in_same_component)
|
||||||
{
|
{
|
||||||
std::transform(phantom_node_pair_list.begin(), phantom_node_pair_list.end(),
|
std::transform(phantom_node_pair_list.begin(),
|
||||||
std::back_inserter(snapped_phantoms), use_closed_phantom);
|
phantom_node_pair_list.end(),
|
||||||
|
std::back_inserter(snapped_phantoms),
|
||||||
|
use_closed_phantom);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::transform(phantom_node_pair_list.begin(), phantom_node_pair_list.end(),
|
std::transform(phantom_node_pair_list.begin(),
|
||||||
std::back_inserter(snapped_phantoms), fallback_to_big_component);
|
phantom_node_pair_list.end(),
|
||||||
|
std::back_inserter(snapped_phantoms),
|
||||||
|
fallback_to_big_component);
|
||||||
}
|
}
|
||||||
|
|
||||||
return snapped_phantoms;
|
return snapped_phantoms;
|
||||||
@ -137,8 +135,10 @@ class BasePlugin
|
|||||||
}
|
}
|
||||||
if (use_bearings && parameters.bearings[i])
|
if (use_bearings && parameters.bearings[i])
|
||||||
{
|
{
|
||||||
phantom_nodes[i] = facade.NearestPhantomNodesInRange(
|
phantom_nodes[i] =
|
||||||
parameters.coordinates[i], radiuses[i], parameters.bearings[i]->bearing,
|
facade.NearestPhantomNodesInRange(parameters.coordinates[i],
|
||||||
|
radiuses[i],
|
||||||
|
parameters.bearings[i]->bearing,
|
||||||
parameters.bearings[i]->range);
|
parameters.bearings[i]->range);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -179,15 +179,18 @@ class BasePlugin
|
|||||||
{
|
{
|
||||||
if (use_radiuses && parameters.radiuses[i])
|
if (use_radiuses && parameters.radiuses[i])
|
||||||
{
|
{
|
||||||
phantom_nodes[i] = facade.NearestPhantomNodes(
|
phantom_nodes[i] = facade.NearestPhantomNodes(parameters.coordinates[i],
|
||||||
parameters.coordinates[i], number_of_results, *parameters.radiuses[i],
|
number_of_results,
|
||||||
parameters.bearings[i]->bearing, parameters.bearings[i]->range);
|
*parameters.radiuses[i],
|
||||||
|
parameters.bearings[i]->bearing,
|
||||||
|
parameters.bearings[i]->range);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
phantom_nodes[i] = facade.NearestPhantomNodes(
|
phantom_nodes[i] = facade.NearestPhantomNodes(parameters.coordinates[i],
|
||||||
parameters.coordinates[i], number_of_results,
|
number_of_results,
|
||||||
parameters.bearings[i]->bearing, parameters.bearings[i]->range);
|
parameters.bearings[i]->bearing,
|
||||||
|
parameters.bearings[i]->range);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -238,14 +241,17 @@ class BasePlugin
|
|||||||
{
|
{
|
||||||
phantom_node_pairs[i] =
|
phantom_node_pairs[i] =
|
||||||
facade.NearestPhantomNodeWithAlternativeFromBigComponent(
|
facade.NearestPhantomNodeWithAlternativeFromBigComponent(
|
||||||
parameters.coordinates[i], *parameters.radiuses[i],
|
parameters.coordinates[i],
|
||||||
parameters.bearings[i]->bearing, parameters.bearings[i]->range);
|
*parameters.radiuses[i],
|
||||||
|
parameters.bearings[i]->bearing,
|
||||||
|
parameters.bearings[i]->range);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
phantom_node_pairs[i] =
|
phantom_node_pairs[i] =
|
||||||
facade.NearestPhantomNodeWithAlternativeFromBigComponent(
|
facade.NearestPhantomNodeWithAlternativeFromBigComponent(
|
||||||
parameters.coordinates[i], parameters.bearings[i]->bearing,
|
parameters.coordinates[i],
|
||||||
|
parameters.bearings[i]->bearing,
|
||||||
parameters.bearings[i]->range);
|
parameters.bearings[i]->range);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef TILEPLUGIN_HPP
|
#ifndef TILEPLUGIN_HPP
|
||||||
#define TILEPLUGIN_HPP
|
#define TILEPLUGIN_HPP
|
||||||
|
|
||||||
#include "engine/plugins/plugin_base.hpp"
|
|
||||||
#include "engine/api/tile_parameters.hpp"
|
#include "engine/api/tile_parameters.hpp"
|
||||||
|
#include "engine/plugins/plugin_base.hpp"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
@ -4,20 +4,20 @@
|
|||||||
#include "engine/plugins/plugin_base.hpp"
|
#include "engine/plugins/plugin_base.hpp"
|
||||||
|
|
||||||
#include "engine/api/trip_parameters.hpp"
|
#include "engine/api/trip_parameters.hpp"
|
||||||
#include "engine/routing_algorithms/shortest_path.hpp"
|
|
||||||
#include "engine/routing_algorithms/many_to_many.hpp"
|
#include "engine/routing_algorithms/many_to_many.hpp"
|
||||||
|
#include "engine/routing_algorithms/shortest_path.hpp"
|
||||||
|
|
||||||
#include "osrm/json_container.hpp"
|
#include "osrm/json_container.hpp"
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <iterator>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <iterator>
|
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
#ifndef VIA_ROUTE_HPP
|
#ifndef VIA_ROUTE_HPP
|
||||||
#define VIA_ROUTE_HPP
|
#define VIA_ROUTE_HPP
|
||||||
|
|
||||||
|
#include "engine/api/route_api.hpp"
|
||||||
#include "engine/datafacade/datafacade_base.hpp"
|
#include "engine/datafacade/datafacade_base.hpp"
|
||||||
#include "engine/plugins/plugin_base.hpp"
|
#include "engine/plugins/plugin_base.hpp"
|
||||||
#include "engine/api/route_api.hpp"
|
|
||||||
|
|
||||||
#include "engine/search_engine_data.hpp"
|
|
||||||
#include "engine/routing_algorithms/shortest_path.hpp"
|
|
||||||
#include "engine/routing_algorithms/alternative_path.hpp"
|
#include "engine/routing_algorithms/alternative_path.hpp"
|
||||||
#include "engine/routing_algorithms/direct_shortest_path.hpp"
|
#include "engine/routing_algorithms/direct_shortest_path.hpp"
|
||||||
|
#include "engine/routing_algorithms/shortest_path.hpp"
|
||||||
|
#include "engine/search_engine_data.hpp"
|
||||||
#include "util/json_container.hpp"
|
#include "util/json_container.hpp"
|
||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
@ -130,16 +130,22 @@ class AlternativeRouting final
|
|||||||
{
|
{
|
||||||
if (0 < forward_heap1.Size())
|
if (0 < forward_heap1.Size())
|
||||||
{
|
{
|
||||||
AlternativeRoutingStep<true>(forward_heap1, reverse_heap1, &middle_node,
|
AlternativeRoutingStep<true>(forward_heap1,
|
||||||
|
reverse_heap1,
|
||||||
|
&middle_node,
|
||||||
&upper_bound_to_shortest_path_distance,
|
&upper_bound_to_shortest_path_distance,
|
||||||
via_node_candidate_list, forward_search_space,
|
via_node_candidate_list,
|
||||||
|
forward_search_space,
|
||||||
min_edge_offset);
|
min_edge_offset);
|
||||||
}
|
}
|
||||||
if (0 < reverse_heap1.Size())
|
if (0 < reverse_heap1.Size())
|
||||||
{
|
{
|
||||||
AlternativeRoutingStep<false>(forward_heap1, reverse_heap1, &middle_node,
|
AlternativeRoutingStep<false>(forward_heap1,
|
||||||
|
reverse_heap1,
|
||||||
|
&middle_node,
|
||||||
&upper_bound_to_shortest_path_distance,
|
&upper_bound_to_shortest_path_distance,
|
||||||
via_node_candidate_list, reverse_search_space,
|
via_node_candidate_list,
|
||||||
|
reverse_search_space,
|
||||||
min_edge_offset);
|
min_edge_offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -168,10 +174,10 @@ class AlternativeRouting final
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
super::RetrievePackedPathFromSingleHeap(forward_heap1, middle_node,
|
super::RetrievePackedPathFromSingleHeap(
|
||||||
packed_forward_path);
|
forward_heap1, middle_node, packed_forward_path);
|
||||||
super::RetrievePackedPathFromSingleHeap(reverse_heap1, middle_node,
|
super::RetrievePackedPathFromSingleHeap(
|
||||||
packed_reverse_path);
|
reverse_heap1, middle_node, packed_reverse_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// this set is is used as an indicator if a node is on the shortest path
|
// this set is is used as an indicator if a node is on the shortest path
|
||||||
@ -271,8 +277,8 @@ class AlternativeRouting final
|
|||||||
{
|
{
|
||||||
std::reverse(packed_shortest_path.begin(), packed_shortest_path.end());
|
std::reverse(packed_shortest_path.begin(), packed_shortest_path.end());
|
||||||
packed_shortest_path.emplace_back(middle_node);
|
packed_shortest_path.emplace_back(middle_node);
|
||||||
packed_shortest_path.insert(packed_shortest_path.end(), packed_reverse_path.begin(),
|
packed_shortest_path.insert(
|
||||||
packed_reverse_path.end());
|
packed_shortest_path.end(), packed_reverse_path.begin(), packed_reverse_path.end());
|
||||||
}
|
}
|
||||||
std::vector<RankedCandidateNode> ranked_candidates_list;
|
std::vector<RankedCandidateNode> ranked_candidates_list;
|
||||||
|
|
||||||
@ -280,8 +286,11 @@ class AlternativeRouting final
|
|||||||
for (const NodeID node : preselected_node_list)
|
for (const NodeID node : preselected_node_list)
|
||||||
{
|
{
|
||||||
int length_of_via_path = 0, sharing_of_via_path = 0;
|
int length_of_via_path = 0, sharing_of_via_path = 0;
|
||||||
ComputeLengthAndSharingOfViaPath(node, &length_of_via_path, &sharing_of_via_path,
|
ComputeLengthAndSharingOfViaPath(node,
|
||||||
packed_shortest_path, min_edge_offset);
|
&length_of_via_path,
|
||||||
|
&sharing_of_via_path,
|
||||||
|
packed_shortest_path,
|
||||||
|
min_edge_offset);
|
||||||
const int maximum_allowed_sharing =
|
const int maximum_allowed_sharing =
|
||||||
static_cast<int>(upper_bound_to_shortest_path_distance * VIAPATH_GAMMA);
|
static_cast<int>(upper_bound_to_shortest_path_distance * VIAPATH_GAMMA);
|
||||||
if (sharing_of_via_path <= maximum_allowed_sharing &&
|
if (sharing_of_via_path <= maximum_allowed_sharing &&
|
||||||
@ -297,10 +306,16 @@ class AlternativeRouting final
|
|||||||
NodeID s_v_middle = SPECIAL_NODEID, v_t_middle = SPECIAL_NODEID;
|
NodeID s_v_middle = SPECIAL_NODEID, v_t_middle = SPECIAL_NODEID;
|
||||||
for (const RankedCandidateNode &candidate : ranked_candidates_list)
|
for (const RankedCandidateNode &candidate : ranked_candidates_list)
|
||||||
{
|
{
|
||||||
if (ViaNodeCandidatePassesTTest(
|
if (ViaNodeCandidatePassesTTest(forward_heap1,
|
||||||
forward_heap1, reverse_heap1, forward_heap2, reverse_heap2, candidate,
|
reverse_heap1,
|
||||||
upper_bound_to_shortest_path_distance, &length_of_via_path, &s_v_middle,
|
forward_heap2,
|
||||||
&v_t_middle, min_edge_offset))
|
reverse_heap2,
|
||||||
|
candidate,
|
||||||
|
upper_bound_to_shortest_path_distance,
|
||||||
|
&length_of_via_path,
|
||||||
|
&s_v_middle,
|
||||||
|
&v_t_middle,
|
||||||
|
min_edge_offset))
|
||||||
{
|
{
|
||||||
// select first admissable
|
// select first admissable
|
||||||
selected_via_node = candidate.node;
|
selected_via_node = candidate.node;
|
||||||
@ -322,7 +337,8 @@ class AlternativeRouting final
|
|||||||
|
|
||||||
super::UnpackPath(
|
super::UnpackPath(
|
||||||
// -- packed input
|
// -- packed input
|
||||||
packed_shortest_path.begin(), packed_shortest_path.end(),
|
packed_shortest_path.begin(),
|
||||||
|
packed_shortest_path.end(),
|
||||||
// -- start of route
|
// -- start of route
|
||||||
phantom_node_pair,
|
phantom_node_pair,
|
||||||
// -- unpacked output
|
// -- unpacked output
|
||||||
@ -334,8 +350,13 @@ class AlternativeRouting final
|
|||||||
{
|
{
|
||||||
std::vector<NodeID> packed_alternate_path;
|
std::vector<NodeID> packed_alternate_path;
|
||||||
// retrieve alternate path
|
// retrieve alternate path
|
||||||
RetrievePackedAlternatePath(forward_heap1, reverse_heap1, forward_heap2, reverse_heap2,
|
RetrievePackedAlternatePath(forward_heap1,
|
||||||
s_v_middle, v_t_middle, packed_alternate_path);
|
reverse_heap1,
|
||||||
|
forward_heap2,
|
||||||
|
reverse_heap2,
|
||||||
|
s_v_middle,
|
||||||
|
v_t_middle,
|
||||||
|
packed_alternate_path);
|
||||||
|
|
||||||
raw_route_data.alt_source_traversed_in_reverse.push_back(
|
raw_route_data.alt_source_traversed_in_reverse.push_back(
|
||||||
(packed_alternate_path.front() !=
|
(packed_alternate_path.front() !=
|
||||||
@ -345,8 +366,10 @@ class AlternativeRouting final
|
|||||||
phantom_node_pair.target_phantom.forward_segment_id.id));
|
phantom_node_pair.target_phantom.forward_segment_id.id));
|
||||||
|
|
||||||
// unpack the alternate path
|
// unpack the alternate path
|
||||||
super::UnpackPath(packed_alternate_path.begin(), packed_alternate_path.end(),
|
super::UnpackPath(packed_alternate_path.begin(),
|
||||||
phantom_node_pair, raw_route_data.unpacked_alternative);
|
packed_alternate_path.end(),
|
||||||
|
phantom_node_pair,
|
||||||
|
raw_route_data.unpacked_alternative);
|
||||||
|
|
||||||
raw_route_data.alternative_path_length = length_of_via_path;
|
raw_route_data.alternative_path_length = length_of_via_path;
|
||||||
}
|
}
|
||||||
@ -372,8 +395,8 @@ class AlternativeRouting final
|
|||||||
packed_path.pop_back(); // remove middle node. It's in both half-paths
|
packed_path.pop_back(); // remove middle node. It's in both half-paths
|
||||||
|
|
||||||
// fetch patched path [v,t]
|
// fetch patched path [v,t]
|
||||||
super::RetrievePackedPathFromHeap(forward_heap2, reverse_heap1, v_t_middle,
|
super::RetrievePackedPathFromHeap(
|
||||||
packed_v_t_path);
|
forward_heap2, reverse_heap1, v_t_middle, packed_v_t_path);
|
||||||
|
|
||||||
packed_path.insert(packed_path.end(), packed_v_t_path.begin(), packed_v_t_path.end());
|
packed_path.insert(packed_path.end(), packed_v_t_path.begin(), packed_v_t_path.end());
|
||||||
}
|
}
|
||||||
@ -410,9 +433,15 @@ class AlternativeRouting final
|
|||||||
const bool constexpr DO_NOT_FORCE_LOOPS = false;
|
const bool constexpr DO_NOT_FORCE_LOOPS = false;
|
||||||
while (!new_reverse_heap.Empty())
|
while (!new_reverse_heap.Empty())
|
||||||
{
|
{
|
||||||
super::RoutingStep(new_reverse_heap, existing_forward_heap, s_v_middle,
|
super::RoutingStep(new_reverse_heap,
|
||||||
upper_bound_s_v_path_length, min_edge_offset, false,
|
existing_forward_heap,
|
||||||
STALLING_ENABLED, DO_NOT_FORCE_LOOPS, DO_NOT_FORCE_LOOPS);
|
s_v_middle,
|
||||||
|
upper_bound_s_v_path_length,
|
||||||
|
min_edge_offset,
|
||||||
|
false,
|
||||||
|
STALLING_ENABLED,
|
||||||
|
DO_NOT_FORCE_LOOPS,
|
||||||
|
DO_NOT_FORCE_LOOPS);
|
||||||
}
|
}
|
||||||
// compute path <v,..,t> by reusing backward search from node t
|
// compute path <v,..,t> by reusing backward search from node t
|
||||||
NodeID v_t_middle = SPECIAL_NODEID;
|
NodeID v_t_middle = SPECIAL_NODEID;
|
||||||
@ -420,9 +449,15 @@ class AlternativeRouting final
|
|||||||
new_forward_heap.Insert(via_node, 0, via_node);
|
new_forward_heap.Insert(via_node, 0, via_node);
|
||||||
while (!new_forward_heap.Empty())
|
while (!new_forward_heap.Empty())
|
||||||
{
|
{
|
||||||
super::RoutingStep(new_forward_heap, existing_reverse_heap, v_t_middle,
|
super::RoutingStep(new_forward_heap,
|
||||||
upper_bound_of_v_t_path_length, min_edge_offset, true,
|
existing_reverse_heap,
|
||||||
STALLING_ENABLED, DO_NOT_FORCE_LOOPS, DO_NOT_FORCE_LOOPS);
|
v_t_middle,
|
||||||
|
upper_bound_of_v_t_path_length,
|
||||||
|
min_edge_offset,
|
||||||
|
true,
|
||||||
|
STALLING_ENABLED,
|
||||||
|
DO_NOT_FORCE_LOOPS,
|
||||||
|
DO_NOT_FORCE_LOOPS);
|
||||||
}
|
}
|
||||||
*real_length_of_via_path = upper_bound_s_v_path_length + upper_bound_of_v_t_path_length;
|
*real_length_of_via_path = upper_bound_s_v_path_length + upper_bound_of_v_t_path_length;
|
||||||
|
|
||||||
@ -432,10 +467,10 @@ class AlternativeRouting final
|
|||||||
}
|
}
|
||||||
|
|
||||||
// retrieve packed paths
|
// retrieve packed paths
|
||||||
super::RetrievePackedPathFromHeap(existing_forward_heap, new_reverse_heap, s_v_middle,
|
super::RetrievePackedPathFromHeap(
|
||||||
packed_s_v_path);
|
existing_forward_heap, new_reverse_heap, s_v_middle, packed_s_v_path);
|
||||||
super::RetrievePackedPathFromHeap(new_forward_heap, existing_reverse_heap, v_t_middle,
|
super::RetrievePackedPathFromHeap(
|
||||||
packed_v_t_path);
|
new_forward_heap, existing_reverse_heap, v_t_middle, packed_v_t_path);
|
||||||
|
|
||||||
// partial unpacking, compute sharing
|
// partial unpacking, compute sharing
|
||||||
// First partially unpack s-->v until paths deviate, note length of common path.
|
// First partially unpack s-->v until paths deviate, note length of common path.
|
||||||
@ -501,7 +536,8 @@ class AlternativeRouting final
|
|||||||
if (packed_v_t_path[via_path_index] == packed_shortest_path[shortest_path_index])
|
if (packed_v_t_path[via_path_index] == packed_shortest_path[shortest_path_index])
|
||||||
{
|
{
|
||||||
super::UnpackEdge(packed_v_t_path[via_path_index - 1],
|
super::UnpackEdge(packed_v_t_path[via_path_index - 1],
|
||||||
packed_v_t_path[via_path_index], partially_unpacked_via_path);
|
packed_v_t_path[via_path_index],
|
||||||
|
partially_unpacked_via_path);
|
||||||
super::UnpackEdge(packed_shortest_path[shortest_path_index - 1],
|
super::UnpackEdge(packed_shortest_path[shortest_path_index - 1],
|
||||||
packed_shortest_path[shortest_path_index],
|
packed_shortest_path[shortest_path_index],
|
||||||
partially_unpacked_shortest_path);
|
partially_unpacked_shortest_path);
|
||||||
@ -699,9 +735,15 @@ class AlternativeRouting final
|
|||||||
const bool constexpr DO_NOT_FORCE_LOOPS = false;
|
const bool constexpr DO_NOT_FORCE_LOOPS = false;
|
||||||
while (new_reverse_heap.Size() > 0)
|
while (new_reverse_heap.Size() > 0)
|
||||||
{
|
{
|
||||||
super::RoutingStep(new_reverse_heap, existing_forward_heap, *s_v_middle,
|
super::RoutingStep(new_reverse_heap,
|
||||||
upper_bound_s_v_path_length, min_edge_offset, false,
|
existing_forward_heap,
|
||||||
STALLING_ENABLED, DO_NOT_FORCE_LOOPS, DO_NOT_FORCE_LOOPS);
|
*s_v_middle,
|
||||||
|
upper_bound_s_v_path_length,
|
||||||
|
min_edge_offset,
|
||||||
|
false,
|
||||||
|
STALLING_ENABLED,
|
||||||
|
DO_NOT_FORCE_LOOPS,
|
||||||
|
DO_NOT_FORCE_LOOPS);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (INVALID_EDGE_WEIGHT == upper_bound_s_v_path_length)
|
if (INVALID_EDGE_WEIGHT == upper_bound_s_v_path_length)
|
||||||
@ -715,9 +757,15 @@ class AlternativeRouting final
|
|||||||
new_forward_heap.Insert(candidate.node, 0, candidate.node);
|
new_forward_heap.Insert(candidate.node, 0, candidate.node);
|
||||||
while (new_forward_heap.Size() > 0)
|
while (new_forward_heap.Size() > 0)
|
||||||
{
|
{
|
||||||
super::RoutingStep(new_forward_heap, existing_reverse_heap, *v_t_middle,
|
super::RoutingStep(new_forward_heap,
|
||||||
upper_bound_of_v_t_path_length, min_edge_offset, true,
|
existing_reverse_heap,
|
||||||
STALLING_ENABLED, DO_NOT_FORCE_LOOPS, DO_NOT_FORCE_LOOPS);
|
*v_t_middle,
|
||||||
|
upper_bound_of_v_t_path_length,
|
||||||
|
min_edge_offset,
|
||||||
|
true,
|
||||||
|
STALLING_ENABLED,
|
||||||
|
DO_NOT_FORCE_LOOPS,
|
||||||
|
DO_NOT_FORCE_LOOPS);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (INVALID_EDGE_WEIGHT == upper_bound_of_v_t_path_length)
|
if (INVALID_EDGE_WEIGHT == upper_bound_of_v_t_path_length)
|
||||||
@ -728,11 +776,11 @@ class AlternativeRouting final
|
|||||||
*length_of_via_path = upper_bound_s_v_path_length + upper_bound_of_v_t_path_length;
|
*length_of_via_path = upper_bound_s_v_path_length + upper_bound_of_v_t_path_length;
|
||||||
|
|
||||||
// retrieve packed paths
|
// retrieve packed paths
|
||||||
super::RetrievePackedPathFromHeap(existing_forward_heap, new_reverse_heap, *s_v_middle,
|
super::RetrievePackedPathFromHeap(
|
||||||
packed_s_v_path);
|
existing_forward_heap, new_reverse_heap, *s_v_middle, packed_s_v_path);
|
||||||
|
|
||||||
super::RetrievePackedPathFromHeap(new_forward_heap, existing_reverse_heap, *v_t_middle,
|
super::RetrievePackedPathFromHeap(
|
||||||
packed_v_t_path);
|
new_forward_heap, existing_reverse_heap, *v_t_middle, packed_v_t_path);
|
||||||
|
|
||||||
NodeID s_P = *s_v_middle, t_P = *v_t_middle;
|
NodeID s_P = *s_v_middle, t_P = *v_t_middle;
|
||||||
if (SPECIAL_NODEID == s_P)
|
if (SPECIAL_NODEID == s_P)
|
||||||
@ -812,7 +860,8 @@ class AlternativeRouting final
|
|||||||
// Traverse path s-->v
|
// Traverse path s-->v
|
||||||
BOOST_ASSERT(!packed_v_t_path.empty());
|
BOOST_ASSERT(!packed_v_t_path.empty());
|
||||||
for (unsigned i = 0, packed_path_length = static_cast<unsigned>(packed_v_t_path.size() - 1);
|
for (unsigned i = 0, packed_path_length = static_cast<unsigned>(packed_v_t_path.size() - 1);
|
||||||
(i < packed_path_length) && unpack_stack.empty(); ++i)
|
(i < packed_path_length) && unpack_stack.empty();
|
||||||
|
++i)
|
||||||
{
|
{
|
||||||
const EdgeID edgeID =
|
const EdgeID edgeID =
|
||||||
facade->FindEdgeInEitherDirection(packed_v_t_path[i], packed_v_t_path[i + 1]);
|
facade->FindEdgeInEitherDirection(packed_v_t_path[i], packed_v_t_path[i + 1]);
|
||||||
@ -884,14 +933,26 @@ class AlternativeRouting final
|
|||||||
{
|
{
|
||||||
if (!forward_heap3.Empty())
|
if (!forward_heap3.Empty())
|
||||||
{
|
{
|
||||||
super::RoutingStep(forward_heap3, reverse_heap3, middle, upper_bound,
|
super::RoutingStep(forward_heap3,
|
||||||
min_edge_offset, true, STALLING_ENABLED, DO_NOT_FORCE_LOOPS,
|
reverse_heap3,
|
||||||
|
middle,
|
||||||
|
upper_bound,
|
||||||
|
min_edge_offset,
|
||||||
|
true,
|
||||||
|
STALLING_ENABLED,
|
||||||
|
DO_NOT_FORCE_LOOPS,
|
||||||
DO_NOT_FORCE_LOOPS);
|
DO_NOT_FORCE_LOOPS);
|
||||||
}
|
}
|
||||||
if (!reverse_heap3.Empty())
|
if (!reverse_heap3.Empty())
|
||||||
{
|
{
|
||||||
super::RoutingStep(reverse_heap3, forward_heap3, middle, upper_bound,
|
super::RoutingStep(reverse_heap3,
|
||||||
min_edge_offset, false, STALLING_ENABLED, DO_NOT_FORCE_LOOPS,
|
forward_heap3,
|
||||||
|
middle,
|
||||||
|
upper_bound,
|
||||||
|
min_edge_offset,
|
||||||
|
false,
|
||||||
|
STALLING_ENABLED,
|
||||||
|
DO_NOT_FORCE_LOOPS,
|
||||||
DO_NOT_FORCE_LOOPS);
|
DO_NOT_FORCE_LOOPS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -102,12 +102,22 @@ class DirectShortestPathRouting final
|
|||||||
forward_core_heap.Clear();
|
forward_core_heap.Clear();
|
||||||
reverse_core_heap.Clear();
|
reverse_core_heap.Clear();
|
||||||
|
|
||||||
super::SearchWithCore(forward_heap, reverse_heap, forward_core_heap, reverse_core_heap,
|
super::SearchWithCore(forward_heap,
|
||||||
distance, packed_leg, DO_NOT_FORCE_LOOPS, DO_NOT_FORCE_LOOPS);
|
reverse_heap,
|
||||||
|
forward_core_heap,
|
||||||
|
reverse_core_heap,
|
||||||
|
distance,
|
||||||
|
packed_leg,
|
||||||
|
DO_NOT_FORCE_LOOPS,
|
||||||
|
DO_NOT_FORCE_LOOPS);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
super::Search(forward_heap, reverse_heap, distance, packed_leg, DO_NOT_FORCE_LOOPS,
|
super::Search(forward_heap,
|
||||||
|
reverse_heap,
|
||||||
|
distance,
|
||||||
|
packed_leg,
|
||||||
|
DO_NOT_FORCE_LOOPS,
|
||||||
DO_NOT_FORCE_LOOPS);
|
DO_NOT_FORCE_LOOPS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,7 +138,9 @@ class DirectShortestPathRouting final
|
|||||||
raw_route_data.target_traversed_in_reverse.push_back(
|
raw_route_data.target_traversed_in_reverse.push_back(
|
||||||
(packed_leg.back() != phantom_node_pair.target_phantom.forward_segment_id.id));
|
(packed_leg.back() != phantom_node_pair.target_phantom.forward_segment_id.id));
|
||||||
|
|
||||||
super::UnpackPath(packed_leg.begin(), packed_leg.end(), phantom_node_pair,
|
super::UnpackPath(packed_leg.begin(),
|
||||||
|
packed_leg.end(),
|
||||||
|
phantom_node_pair,
|
||||||
raw_route_data.unpacked_path_segments.front());
|
raw_route_data.unpacked_path_segments.front());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -66,8 +66,7 @@ class ManyToManyRouting final
|
|||||||
SearchSpaceWithBuckets search_space_with_buckets;
|
SearchSpaceWithBuckets search_space_with_buckets;
|
||||||
|
|
||||||
unsigned column_idx = 0;
|
unsigned column_idx = 0;
|
||||||
const auto search_target_phantom = [&](const PhantomNode &phantom)
|
const auto search_target_phantom = [&](const PhantomNode &phantom) {
|
||||||
{
|
|
||||||
query_heap.Clear();
|
query_heap.Clear();
|
||||||
// insert target(s) at distance 0
|
// insert target(s) at distance 0
|
||||||
|
|
||||||
@ -94,8 +93,7 @@ class ManyToManyRouting final
|
|||||||
|
|
||||||
// for each source do forward search
|
// for each source do forward search
|
||||||
unsigned row_idx = 0;
|
unsigned row_idx = 0;
|
||||||
const auto search_source_phantom = [&](const PhantomNode &phantom)
|
const auto search_source_phantom = [&](const PhantomNode &phantom) {
|
||||||
{
|
|
||||||
query_heap.Clear();
|
query_heap.Clear();
|
||||||
// insert target(s) at distance 0
|
// insert target(s) at distance 0
|
||||||
|
|
||||||
@ -115,8 +113,11 @@ class ManyToManyRouting final
|
|||||||
// explore search space
|
// explore search space
|
||||||
while (!query_heap.Empty())
|
while (!query_heap.Empty())
|
||||||
{
|
{
|
||||||
ForwardRoutingStep(row_idx, number_of_targets, query_heap,
|
ForwardRoutingStep(row_idx,
|
||||||
search_space_with_buckets, result_table);
|
number_of_targets,
|
||||||
|
query_heap,
|
||||||
|
search_space_with_buckets,
|
||||||
|
result_table);
|
||||||
}
|
}
|
||||||
++row_idx;
|
++row_idx;
|
||||||
};
|
};
|
||||||
|
@ -4,12 +4,12 @@
|
|||||||
#include "engine/routing_algorithms/routing_base.hpp"
|
#include "engine/routing_algorithms/routing_base.hpp"
|
||||||
|
|
||||||
#include "engine/map_matching/hidden_markov_model.hpp"
|
#include "engine/map_matching/hidden_markov_model.hpp"
|
||||||
#include "engine/map_matching/sub_matching.hpp"
|
|
||||||
#include "engine/map_matching/matching_confidence.hpp"
|
#include "engine/map_matching/matching_confidence.hpp"
|
||||||
|
#include "engine/map_matching/sub_matching.hpp"
|
||||||
|
|
||||||
#include "util/coordinate_calculation.hpp"
|
#include "util/coordinate_calculation.hpp"
|
||||||
#include "util/json_logger.hpp"
|
|
||||||
#include "util/for_each_pair.hpp"
|
#include "util/for_each_pair.hpp"
|
||||||
|
#include "util/json_logger.hpp"
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
|
||||||
@ -86,8 +86,7 @@ class MapMatching final : public BasicRoutingInterface<DataFacadeT, MapMatching<
|
|||||||
|
|
||||||
const bool use_timestamps = trace_timestamps.size() > 1;
|
const bool use_timestamps = trace_timestamps.size() > 1;
|
||||||
|
|
||||||
const auto median_sample_time = [&]
|
const auto median_sample_time = [&] {
|
||||||
{
|
|
||||||
if (use_timestamps)
|
if (use_timestamps)
|
||||||
{
|
{
|
||||||
return std::max(1u, GetMedianSampleTime(trace_timestamps));
|
return std::max(1u, GetMedianSampleTime(trace_timestamps));
|
||||||
@ -98,8 +97,7 @@ class MapMatching final : public BasicRoutingInterface<DataFacadeT, MapMatching<
|
|||||||
}
|
}
|
||||||
}();
|
}();
|
||||||
const auto max_broken_time = median_sample_time * MAX_BROKEN_STATES;
|
const auto max_broken_time = median_sample_time * MAX_BROKEN_STATES;
|
||||||
const auto max_distance_delta = [&]
|
const auto max_distance_delta = [&] {
|
||||||
{
|
|
||||||
if (use_timestamps)
|
if (use_timestamps)
|
||||||
{
|
{
|
||||||
return median_sample_time * MAX_SPEED;
|
return median_sample_time * MAX_SPEED;
|
||||||
@ -116,10 +114,10 @@ class MapMatching final : public BasicRoutingInterface<DataFacadeT, MapMatching<
|
|||||||
for (auto t = 0UL; t < candidates_list.size(); ++t)
|
for (auto t = 0UL; t < candidates_list.size(); ++t)
|
||||||
{
|
{
|
||||||
emission_log_probabilities[t].resize(candidates_list[t].size());
|
emission_log_probabilities[t].resize(candidates_list[t].size());
|
||||||
std::transform(candidates_list[t].begin(), candidates_list[t].end(),
|
std::transform(candidates_list[t].begin(),
|
||||||
|
candidates_list[t].end(),
|
||||||
emission_log_probabilities[t].begin(),
|
emission_log_probabilities[t].begin(),
|
||||||
[this](const PhantomNodeWithDistance &candidate)
|
[this](const PhantomNodeWithDistance &candidate) {
|
||||||
{
|
|
||||||
return default_emission_log_probability(candidate.distance);
|
return default_emission_log_probability(candidate.distance);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -134,19 +132,19 @@ class MapMatching final : public BasicRoutingInterface<DataFacadeT, MapMatching<
|
|||||||
map_matching::EmissionLogProbability emission_log_probability(
|
map_matching::EmissionLogProbability emission_log_probability(
|
||||||
*trace_gps_precision[t]);
|
*trace_gps_precision[t]);
|
||||||
std::transform(
|
std::transform(
|
||||||
candidates_list[t].begin(), candidates_list[t].end(),
|
candidates_list[t].begin(),
|
||||||
|
candidates_list[t].end(),
|
||||||
emission_log_probabilities[t].begin(),
|
emission_log_probabilities[t].begin(),
|
||||||
[&emission_log_probability](const PhantomNodeWithDistance &candidate)
|
[&emission_log_probability](const PhantomNodeWithDistance &candidate) {
|
||||||
{
|
|
||||||
return emission_log_probability(candidate.distance);
|
return emission_log_probability(candidate.distance);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::transform(candidates_list[t].begin(), candidates_list[t].end(),
|
std::transform(candidates_list[t].begin(),
|
||||||
|
candidates_list[t].end(),
|
||||||
emission_log_probabilities[t].begin(),
|
emission_log_probabilities[t].begin(),
|
||||||
[this](const PhantomNodeWithDistance &candidate)
|
[this](const PhantomNodeWithDistance &candidate) {
|
||||||
{
|
|
||||||
return default_emission_log_probability(candidate.distance);
|
return default_emission_log_probability(candidate.distance);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -269,14 +267,19 @@ class MapMatching final : public BasicRoutingInterface<DataFacadeT, MapMatching<
|
|||||||
forward_core_heap.Clear();
|
forward_core_heap.Clear();
|
||||||
reverse_core_heap.Clear();
|
reverse_core_heap.Clear();
|
||||||
network_distance = super::GetNetworkDistanceWithCore(
|
network_distance = super::GetNetworkDistanceWithCore(
|
||||||
forward_heap, reverse_heap, forward_core_heap, reverse_core_heap,
|
forward_heap,
|
||||||
|
reverse_heap,
|
||||||
|
forward_core_heap,
|
||||||
|
reverse_core_heap,
|
||||||
prev_unbroken_timestamps_list[s].phantom_node,
|
prev_unbroken_timestamps_list[s].phantom_node,
|
||||||
current_timestamps_list[s_prime].phantom_node, duration_uppder_bound);
|
current_timestamps_list[s_prime].phantom_node,
|
||||||
|
duration_uppder_bound);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
network_distance = super::GetNetworkDistance(
|
network_distance = super::GetNetworkDistance(
|
||||||
forward_heap, reverse_heap,
|
forward_heap,
|
||||||
|
reverse_heap,
|
||||||
prev_unbroken_timestamps_list[s].phantom_node,
|
prev_unbroken_timestamps_list[s].phantom_node,
|
||||||
current_timestamps_list[s_prime].phantom_node);
|
current_timestamps_list[s_prime].phantom_node);
|
||||||
}
|
}
|
||||||
@ -398,10 +401,10 @@ class MapMatching final : public BasicRoutingInterface<DataFacadeT, MapMatching<
|
|||||||
matching_distance += model.path_distances[timestamp_index][location_index];
|
matching_distance += model.path_distances[timestamp_index][location_index];
|
||||||
}
|
}
|
||||||
util::for_each_pair(
|
util::for_each_pair(
|
||||||
reconstructed_indices, [&trace_distance, &trace_coordinates](
|
reconstructed_indices,
|
||||||
const std::pair<std::size_t, std::size_t> &prev,
|
[&trace_distance,
|
||||||
const std::pair<std::size_t, std::size_t> &curr)
|
&trace_coordinates](const std::pair<std::size_t, std::size_t> &prev,
|
||||||
{
|
const std::pair<std::size_t, std::size_t> &curr) {
|
||||||
trace_distance += util::coordinate_calculation::haversineDistance(
|
trace_distance += util::coordinate_calculation::haversineDistance(
|
||||||
trace_coordinates[prev.first], trace_coordinates[curr.first]);
|
trace_coordinates[prev.first], trace_coordinates[curr.first]);
|
||||||
});
|
});
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#ifndef ROUTING_BASE_HPP
|
#ifndef ROUTING_BASE_HPP
|
||||||
#define ROUTING_BASE_HPP
|
#define ROUTING_BASE_HPP
|
||||||
|
|
||||||
|
#include "extractor/guidance/turn_instruction.hpp"
|
||||||
#include "engine/internal_route_result.hpp"
|
#include "engine/internal_route_result.hpp"
|
||||||
#include "engine/search_engine_data.hpp"
|
#include "engine/search_engine_data.hpp"
|
||||||
#include "extractor/guidance/turn_instruction.hpp"
|
|
||||||
#include "util/coordinate_calculation.hpp"
|
#include "util/coordinate_calculation.hpp"
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
@ -228,7 +228,8 @@ template <class DataFacadeT, class Derived> class BasicRoutingInterface
|
|||||||
|
|
||||||
BOOST_ASSERT(*packed_path_begin == phantom_node_pair.source_phantom.forward_segment_id.id ||
|
BOOST_ASSERT(*packed_path_begin == phantom_node_pair.source_phantom.forward_segment_id.id ||
|
||||||
*packed_path_begin == phantom_node_pair.source_phantom.reverse_segment_id.id);
|
*packed_path_begin == phantom_node_pair.source_phantom.reverse_segment_id.id);
|
||||||
BOOST_ASSERT(*std::prev(packed_path_end) == phantom_node_pair.target_phantom.forward_segment_id.id ||
|
BOOST_ASSERT(
|
||||||
|
*std::prev(packed_path_end) == phantom_node_pair.target_phantom.forward_segment_id.id ||
|
||||||
*std::prev(packed_path_end) == phantom_node_pair.target_phantom.reverse_segment_id.id);
|
*std::prev(packed_path_end) == phantom_node_pair.target_phantom.reverse_segment_id.id);
|
||||||
|
|
||||||
std::pair<NodeID, NodeID> edge;
|
std::pair<NodeID, NodeID> edge;
|
||||||
@ -322,8 +323,11 @@ template <class DataFacadeT, class Derived> class BasicRoutingInterface
|
|||||||
for (std::size_t i = start_index; i < end_index; ++i)
|
for (std::size_t i = start_index; i < end_index; ++i)
|
||||||
{
|
{
|
||||||
unpacked_path.push_back(
|
unpacked_path.push_back(
|
||||||
PathData{id_vector[i], name_index, weight_vector[i],
|
PathData{id_vector[i],
|
||||||
extractor::guidance::TurnInstruction::NO_TURN(), travel_mode,
|
name_index,
|
||||||
|
weight_vector[i],
|
||||||
|
extractor::guidance::TurnInstruction::NO_TURN(),
|
||||||
|
travel_mode,
|
||||||
INVALID_ENTRY_CLASSID});
|
INVALID_ENTRY_CLASSID});
|
||||||
}
|
}
|
||||||
BOOST_ASSERT(unpacked_path.size() > 0);
|
BOOST_ASSERT(unpacked_path.size() > 0);
|
||||||
@ -381,7 +385,9 @@ template <class DataFacadeT, class Derived> class BasicRoutingInterface
|
|||||||
BOOST_ASSERT(i < id_vector.size());
|
BOOST_ASSERT(i < id_vector.size());
|
||||||
BOOST_ASSERT(phantom_node_pair.target_phantom.forward_travel_mode > 0);
|
BOOST_ASSERT(phantom_node_pair.target_phantom.forward_travel_mode > 0);
|
||||||
unpacked_path.push_back(PathData{
|
unpacked_path.push_back(PathData{
|
||||||
id_vector[i], phantom_node_pair.target_phantom.name_id, weight_vector[i],
|
id_vector[i],
|
||||||
|
phantom_node_pair.target_phantom.name_id,
|
||||||
|
weight_vector[i],
|
||||||
extractor::guidance::TurnInstruction::NO_TURN(),
|
extractor::guidance::TurnInstruction::NO_TURN(),
|
||||||
target_traversed_in_reverse ? phantom_node_pair.target_phantom.backward_travel_mode
|
target_traversed_in_reverse ? phantom_node_pair.target_phantom.backward_travel_mode
|
||||||
: phantom_node_pair.target_phantom.forward_travel_mode,
|
: phantom_node_pair.target_phantom.forward_travel_mode,
|
||||||
@ -544,13 +550,27 @@ template <class DataFacadeT, class Derived> class BasicRoutingInterface
|
|||||||
{
|
{
|
||||||
if (!forward_heap.Empty())
|
if (!forward_heap.Empty())
|
||||||
{
|
{
|
||||||
RoutingStep(forward_heap, reverse_heap, middle, distance, min_edge_offset, true,
|
RoutingStep(forward_heap,
|
||||||
STALLING_ENABLED, force_loop_forward, force_loop_reverse);
|
reverse_heap,
|
||||||
|
middle,
|
||||||
|
distance,
|
||||||
|
min_edge_offset,
|
||||||
|
true,
|
||||||
|
STALLING_ENABLED,
|
||||||
|
force_loop_forward,
|
||||||
|
force_loop_reverse);
|
||||||
}
|
}
|
||||||
if (!reverse_heap.Empty())
|
if (!reverse_heap.Empty())
|
||||||
{
|
{
|
||||||
RoutingStep(reverse_heap, forward_heap, middle, distance, min_edge_offset, false,
|
RoutingStep(reverse_heap,
|
||||||
STALLING_ENABLED, force_loop_reverse, force_loop_forward);
|
forward_heap,
|
||||||
|
middle,
|
||||||
|
distance,
|
||||||
|
min_edge_offset,
|
||||||
|
false,
|
||||||
|
STALLING_ENABLED,
|
||||||
|
force_loop_reverse,
|
||||||
|
force_loop_forward);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -622,8 +642,15 @@ template <class DataFacadeT, class Derived> class BasicRoutingInterface
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RoutingStep(forward_heap, reverse_heap, middle, distance, min_edge_offset, true,
|
RoutingStep(forward_heap,
|
||||||
STALLING_ENABLED, force_loop_forward, force_loop_reverse);
|
reverse_heap,
|
||||||
|
middle,
|
||||||
|
distance,
|
||||||
|
min_edge_offset,
|
||||||
|
true,
|
||||||
|
STALLING_ENABLED,
|
||||||
|
force_loop_forward,
|
||||||
|
force_loop_reverse);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!reverse_heap.Empty())
|
if (!reverse_heap.Empty())
|
||||||
@ -636,8 +663,15 @@ template <class DataFacadeT, class Derived> class BasicRoutingInterface
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RoutingStep(reverse_heap, forward_heap, middle, distance, min_edge_offset,
|
RoutingStep(reverse_heap,
|
||||||
false, STALLING_ENABLED, force_loop_reverse, force_loop_forward);
|
forward_heap,
|
||||||
|
middle,
|
||||||
|
distance,
|
||||||
|
min_edge_offset,
|
||||||
|
false,
|
||||||
|
STALLING_ENABLED,
|
||||||
|
force_loop_reverse,
|
||||||
|
force_loop_forward);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -690,12 +724,24 @@ template <class DataFacadeT, class Derived> class BasicRoutingInterface
|
|||||||
while (0 < forward_core_heap.Size() && 0 < reverse_core_heap.Size() &&
|
while (0 < forward_core_heap.Size() && 0 < reverse_core_heap.Size() &&
|
||||||
distance > (forward_core_heap.MinKey() + reverse_core_heap.MinKey()))
|
distance > (forward_core_heap.MinKey() + reverse_core_heap.MinKey()))
|
||||||
{
|
{
|
||||||
RoutingStep(forward_core_heap, reverse_core_heap, middle, distance,
|
RoutingStep(forward_core_heap,
|
||||||
min_core_edge_offset, true, STALLING_DISABLED, force_loop_forward,
|
reverse_core_heap,
|
||||||
|
middle,
|
||||||
|
distance,
|
||||||
|
min_core_edge_offset,
|
||||||
|
true,
|
||||||
|
STALLING_DISABLED,
|
||||||
|
force_loop_forward,
|
||||||
force_loop_reverse);
|
force_loop_reverse);
|
||||||
|
|
||||||
RoutingStep(reverse_core_heap, forward_core_heap, middle, distance,
|
RoutingStep(reverse_core_heap,
|
||||||
min_core_edge_offset, false, STALLING_DISABLED, force_loop_reverse,
|
forward_core_heap,
|
||||||
|
middle,
|
||||||
|
distance,
|
||||||
|
min_core_edge_offset,
|
||||||
|
false,
|
||||||
|
STALLING_DISABLED,
|
||||||
|
force_loop_reverse,
|
||||||
force_loop_forward);
|
force_loop_forward);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -724,8 +770,8 @@ template <class DataFacadeT, class Derived> class BasicRoutingInterface
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::vector<NodeID> packed_core_leg;
|
std::vector<NodeID> packed_core_leg;
|
||||||
RetrievePackedPathFromHeap(forward_core_heap, reverse_core_heap, middle,
|
RetrievePackedPathFromHeap(
|
||||||
packed_core_leg);
|
forward_core_heap, reverse_core_heap, middle, packed_core_leg);
|
||||||
BOOST_ASSERT(packed_core_leg.size() > 0);
|
BOOST_ASSERT(packed_core_leg.size() > 0);
|
||||||
RetrievePackedPathFromSingleHeap(forward_heap, packed_core_leg.front(), packed_leg);
|
RetrievePackedPathFromSingleHeap(forward_heap, packed_core_leg.front(), packed_leg);
|
||||||
std::reverse(packed_leg.begin(), packed_leg.end());
|
std::reverse(packed_leg.begin(), packed_leg.end());
|
||||||
@ -872,8 +918,15 @@ template <class DataFacadeT, class Derived> class BasicRoutingInterface
|
|||||||
|
|
||||||
int duration = INVALID_EDGE_WEIGHT;
|
int duration = INVALID_EDGE_WEIGHT;
|
||||||
std::vector<NodeID> packed_path;
|
std::vector<NodeID> packed_path;
|
||||||
SearchWithCore(forward_heap, reverse_heap, forward_core_heap, reverse_core_heap, duration,
|
SearchWithCore(forward_heap,
|
||||||
packed_path, DO_NOT_FORCE_LOOPS, DO_NOT_FORCE_LOOPS, duration_upper_bound);
|
reverse_heap,
|
||||||
|
forward_core_heap,
|
||||||
|
reverse_core_heap,
|
||||||
|
duration,
|
||||||
|
packed_path,
|
||||||
|
DO_NOT_FORCE_LOOPS,
|
||||||
|
DO_NOT_FORCE_LOOPS,
|
||||||
|
duration_upper_bound);
|
||||||
|
|
||||||
double distance = std::numeric_limits<double>::max();
|
double distance = std::numeric_limits<double>::max();
|
||||||
if (duration != INVALID_EDGE_WEIGHT)
|
if (duration != INVALID_EDGE_WEIGHT)
|
||||||
@ -926,8 +979,13 @@ template <class DataFacadeT, class Derived> class BasicRoutingInterface
|
|||||||
|
|
||||||
int duration = INVALID_EDGE_WEIGHT;
|
int duration = INVALID_EDGE_WEIGHT;
|
||||||
std::vector<NodeID> packed_path;
|
std::vector<NodeID> packed_path;
|
||||||
Search(forward_heap, reverse_heap, duration, packed_path, DO_NOT_FORCE_LOOPS,
|
Search(forward_heap,
|
||||||
DO_NOT_FORCE_LOOPS, duration_upper_bound);
|
reverse_heap,
|
||||||
|
duration,
|
||||||
|
packed_path,
|
||||||
|
DO_NOT_FORCE_LOOPS,
|
||||||
|
DO_NOT_FORCE_LOOPS,
|
||||||
|
duration_upper_bound);
|
||||||
|
|
||||||
if (duration == INVALID_EDGE_WEIGHT)
|
if (duration == INVALID_EDGE_WEIGHT)
|
||||||
{
|
{
|
||||||
|
@ -96,14 +96,23 @@ class ShortestPathRouting final
|
|||||||
reverse_core_heap.Clear();
|
reverse_core_heap.Clear();
|
||||||
BOOST_ASSERT(forward_core_heap.Size() == 0);
|
BOOST_ASSERT(forward_core_heap.Size() == 0);
|
||||||
BOOST_ASSERT(reverse_core_heap.Size() == 0);
|
BOOST_ASSERT(reverse_core_heap.Size() == 0);
|
||||||
super::SearchWithCore(forward_heap, reverse_heap, forward_core_heap, reverse_core_heap,
|
super::SearchWithCore(forward_heap,
|
||||||
new_total_distance, leg_packed_path, needs_loop_forwad,
|
reverse_heap,
|
||||||
|
forward_core_heap,
|
||||||
|
reverse_core_heap,
|
||||||
|
new_total_distance,
|
||||||
|
leg_packed_path,
|
||||||
|
needs_loop_forwad,
|
||||||
needs_loop_backwards);
|
needs_loop_backwards);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
super::Search(forward_heap, reverse_heap, new_total_distance, leg_packed_path,
|
super::Search(forward_heap,
|
||||||
needs_loop_forwad, needs_loop_backwards);
|
reverse_heap,
|
||||||
|
new_total_distance,
|
||||||
|
leg_packed_path,
|
||||||
|
needs_loop_forwad,
|
||||||
|
needs_loop_backwards);
|
||||||
}
|
}
|
||||||
new_total_distance += std::min(total_distance_to_forward, total_distance_to_reverse);
|
new_total_distance += std::min(total_distance_to_forward, total_distance_to_reverse);
|
||||||
}
|
}
|
||||||
@ -159,14 +168,20 @@ class ShortestPathRouting final
|
|||||||
reverse_core_heap.Clear();
|
reverse_core_heap.Clear();
|
||||||
BOOST_ASSERT(forward_core_heap.Size() == 0);
|
BOOST_ASSERT(forward_core_heap.Size() == 0);
|
||||||
BOOST_ASSERT(reverse_core_heap.Size() == 0);
|
BOOST_ASSERT(reverse_core_heap.Size() == 0);
|
||||||
super::SearchWithCore(
|
super::SearchWithCore(forward_heap,
|
||||||
forward_heap, reverse_heap, forward_core_heap, reverse_core_heap,
|
reverse_heap,
|
||||||
new_total_distance_to_forward, leg_packed_path_forward,
|
forward_core_heap,
|
||||||
super::NeedsLoopForward(source_phantom, target_phantom), DO_NOT_FORCE_LOOP);
|
reverse_core_heap,
|
||||||
|
new_total_distance_to_forward,
|
||||||
|
leg_packed_path_forward,
|
||||||
|
super::NeedsLoopForward(source_phantom, target_phantom),
|
||||||
|
DO_NOT_FORCE_LOOP);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
super::Search(forward_heap, reverse_heap, new_total_distance_to_forward,
|
super::Search(forward_heap,
|
||||||
|
reverse_heap,
|
||||||
|
new_total_distance_to_forward,
|
||||||
leg_packed_path_forward,
|
leg_packed_path_forward,
|
||||||
super::NeedsLoopForward(source_phantom, target_phantom),
|
super::NeedsLoopForward(source_phantom, target_phantom),
|
||||||
DO_NOT_FORCE_LOOP);
|
DO_NOT_FORCE_LOOP);
|
||||||
@ -202,15 +217,22 @@ class ShortestPathRouting final
|
|||||||
reverse_core_heap.Clear();
|
reverse_core_heap.Clear();
|
||||||
BOOST_ASSERT(forward_core_heap.Size() == 0);
|
BOOST_ASSERT(forward_core_heap.Size() == 0);
|
||||||
BOOST_ASSERT(reverse_core_heap.Size() == 0);
|
BOOST_ASSERT(reverse_core_heap.Size() == 0);
|
||||||
super::SearchWithCore(forward_heap, reverse_heap, forward_core_heap,
|
super::SearchWithCore(forward_heap,
|
||||||
reverse_core_heap, new_total_distance_to_reverse,
|
reverse_heap,
|
||||||
leg_packed_path_reverse, DO_NOT_FORCE_LOOP,
|
forward_core_heap,
|
||||||
|
reverse_core_heap,
|
||||||
|
new_total_distance_to_reverse,
|
||||||
|
leg_packed_path_reverse,
|
||||||
|
DO_NOT_FORCE_LOOP,
|
||||||
super::NeedsLoopBackwards(source_phantom, target_phantom));
|
super::NeedsLoopBackwards(source_phantom, target_phantom));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
super::Search(forward_heap, reverse_heap, new_total_distance_to_reverse,
|
super::Search(forward_heap,
|
||||||
leg_packed_path_reverse, DO_NOT_FORCE_LOOP,
|
reverse_heap,
|
||||||
|
new_total_distance_to_reverse,
|
||||||
|
leg_packed_path_reverse,
|
||||||
|
DO_NOT_FORCE_LOOP,
|
||||||
super::NeedsLoopBackwards(source_phantom, target_phantom));
|
super::NeedsLoopBackwards(source_phantom, target_phantom));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -231,7 +253,9 @@ class ShortestPathRouting final
|
|||||||
auto leg_begin = total_packed_path.begin() + packed_leg_begin[current_leg];
|
auto leg_begin = total_packed_path.begin() + packed_leg_begin[current_leg];
|
||||||
auto leg_end = total_packed_path.begin() + packed_leg_begin[current_leg + 1];
|
auto leg_end = total_packed_path.begin() + packed_leg_begin[current_leg + 1];
|
||||||
const auto &unpack_phantom_node_pair = phantom_nodes_vector[current_leg];
|
const auto &unpack_phantom_node_pair = phantom_nodes_vector[current_leg];
|
||||||
super::UnpackPath(leg_begin, leg_end, unpack_phantom_node_pair,
|
super::UnpackPath(leg_begin,
|
||||||
|
leg_end,
|
||||||
|
unpack_phantom_node_pair,
|
||||||
raw_route_data.unpacked_path_segments[current_leg]);
|
raw_route_data.unpacked_path_segments[current_leg]);
|
||||||
|
|
||||||
raw_route_data.source_traversed_in_reverse.push_back(
|
raw_route_data.source_traversed_in_reverse.push_back(
|
||||||
@ -247,7 +271,9 @@ class ShortestPathRouting final
|
|||||||
const boost::optional<bool> continue_straight_at_waypoint,
|
const boost::optional<bool> continue_straight_at_waypoint,
|
||||||
InternalRouteResult &raw_route_data) const
|
InternalRouteResult &raw_route_data) const
|
||||||
{
|
{
|
||||||
const bool allow_uturn_at_waypoint = !(continue_straight_at_waypoint ? *continue_straight_at_waypoint : super::facade->GetContinueStraightDefault());
|
const bool allow_uturn_at_waypoint =
|
||||||
|
!(continue_straight_at_waypoint ? *continue_straight_at_waypoint
|
||||||
|
: super::facade->GetContinueStraightDefault());
|
||||||
|
|
||||||
engine_working_data.InitializeOrClearFirstThreadLocalStorage(
|
engine_working_data.InitializeOrClearFirstThreadLocalStorage(
|
||||||
super::facade->GetNumberOfNodes());
|
super::facade->GetNumberOfNodes());
|
||||||
@ -300,12 +326,20 @@ class ShortestPathRouting final
|
|||||||
{
|
{
|
||||||
if (allow_uturn_at_waypoint)
|
if (allow_uturn_at_waypoint)
|
||||||
{
|
{
|
||||||
SearchWithUTurn(forward_heap, reverse_heap, forward_core_heap,
|
SearchWithUTurn(forward_heap,
|
||||||
reverse_core_heap, search_from_forward_node,
|
reverse_heap,
|
||||||
search_from_reverse_node, search_to_forward_node,
|
forward_core_heap,
|
||||||
search_to_reverse_node, source_phantom, target_phantom,
|
reverse_core_heap,
|
||||||
total_distance_to_forward, total_distance_to_reverse,
|
search_from_forward_node,
|
||||||
new_total_distance_to_forward, packed_leg_to_forward);
|
search_from_reverse_node,
|
||||||
|
search_to_forward_node,
|
||||||
|
search_to_reverse_node,
|
||||||
|
source_phantom,
|
||||||
|
target_phantom,
|
||||||
|
total_distance_to_forward,
|
||||||
|
total_distance_to_reverse,
|
||||||
|
new_total_distance_to_forward,
|
||||||
|
packed_leg_to_forward);
|
||||||
// if only the reverse node is valid (e.g. when using the match plugin) we
|
// if only the reverse node is valid (e.g. when using the match plugin) we
|
||||||
// actually need to move
|
// actually need to move
|
||||||
if (!target_phantom.forward_segment_id.enabled)
|
if (!target_phantom.forward_segment_id.enabled)
|
||||||
@ -323,12 +357,22 @@ class ShortestPathRouting final
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Search(forward_heap, reverse_heap, forward_core_heap, reverse_core_heap,
|
Search(forward_heap,
|
||||||
search_from_forward_node, search_from_reverse_node,
|
reverse_heap,
|
||||||
search_to_forward_node, search_to_reverse_node, source_phantom,
|
forward_core_heap,
|
||||||
target_phantom, total_distance_to_forward, total_distance_to_reverse,
|
reverse_core_heap,
|
||||||
new_total_distance_to_forward, new_total_distance_to_reverse,
|
search_from_forward_node,
|
||||||
packed_leg_to_forward, packed_leg_to_reverse);
|
search_from_reverse_node,
|
||||||
|
search_to_forward_node,
|
||||||
|
search_to_reverse_node,
|
||||||
|
source_phantom,
|
||||||
|
target_phantom,
|
||||||
|
total_distance_to_forward,
|
||||||
|
total_distance_to_reverse,
|
||||||
|
new_total_distance_to_forward,
|
||||||
|
new_total_distance_to_reverse,
|
||||||
|
packed_leg_to_forward,
|
||||||
|
packed_leg_to_reverse);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -441,8 +485,11 @@ class ShortestPathRouting final
|
|||||||
packed_leg_to_reverse_begin.push_back(total_packed_path_to_reverse.size());
|
packed_leg_to_reverse_begin.push_back(total_packed_path_to_reverse.size());
|
||||||
BOOST_ASSERT(packed_leg_to_reverse_begin.size() == phantom_nodes_vector.size() + 1);
|
BOOST_ASSERT(packed_leg_to_reverse_begin.size() == phantom_nodes_vector.size() + 1);
|
||||||
|
|
||||||
UnpackLegs(phantom_nodes_vector, total_packed_path_to_reverse,
|
UnpackLegs(phantom_nodes_vector,
|
||||||
packed_leg_to_reverse_begin, total_distance_to_reverse, raw_route_data);
|
total_packed_path_to_reverse,
|
||||||
|
packed_leg_to_reverse_begin,
|
||||||
|
total_distance_to_reverse,
|
||||||
|
raw_route_data);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -450,8 +497,11 @@ class ShortestPathRouting final
|
|||||||
packed_leg_to_forward_begin.push_back(total_packed_path_to_forward.size());
|
packed_leg_to_forward_begin.push_back(total_packed_path_to_forward.size());
|
||||||
BOOST_ASSERT(packed_leg_to_forward_begin.size() == phantom_nodes_vector.size() + 1);
|
BOOST_ASSERT(packed_leg_to_forward_begin.size() == phantom_nodes_vector.size() + 1);
|
||||||
|
|
||||||
UnpackLegs(phantom_nodes_vector, total_packed_path_to_forward,
|
UnpackLegs(phantom_nodes_vector,
|
||||||
packed_leg_to_forward_begin, total_distance_to_forward, raw_route_data);
|
total_packed_path_to_forward,
|
||||||
|
packed_leg_to_forward_begin,
|
||||||
|
total_distance_to_forward,
|
||||||
|
raw_route_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
|
|
||||||
#include <boost/thread/tss.hpp>
|
#include <boost/thread/tss.hpp>
|
||||||
|
|
||||||
#include "util/typedefs.hpp"
|
|
||||||
#include "util/binary_heap.hpp"
|
#include "util/binary_heap.hpp"
|
||||||
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
#ifndef TRIP_BRUTE_FORCE_HPP
|
#ifndef TRIP_BRUTE_FORCE_HPP
|
||||||
#define TRIP_BRUTE_FORCE_HPP
|
#define TRIP_BRUTE_FORCE_HPP
|
||||||
|
|
||||||
#include "util/typedefs.hpp"
|
|
||||||
#include "util/dist_table_wrapper.hpp"
|
#include "util/dist_table_wrapper.hpp"
|
||||||
#include "util/simple_logger.hpp"
|
#include "util/simple_logger.hpp"
|
||||||
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
#include "osrm/json_container.hpp"
|
#include "osrm/json_container.hpp"
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <string>
|
#include <cstdlib>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <vector>
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
#ifndef TRIP_FARTHEST_INSERTION_HPP
|
#ifndef TRIP_FARTHEST_INSERTION_HPP
|
||||||
#define TRIP_FARTHEST_INSERTION_HPP
|
#define TRIP_FARTHEST_INSERTION_HPP
|
||||||
|
|
||||||
#include "util/typedefs.hpp"
|
|
||||||
#include "util/dist_table_wrapper.hpp"
|
#include "util/dist_table_wrapper.hpp"
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
#include "osrm/json_container.hpp"
|
#include "osrm/json_container.hpp"
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <limits>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <limits>
|
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
@ -153,7 +153,6 @@ std::vector<NodeID> FarthestInsertionTrip(const NodeIDIterator &start,
|
|||||||
// 5. DONE!
|
// 5. DONE!
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
// Guard against division-by-zero in the code path below.
|
// Guard against division-by-zero in the code path below.
|
||||||
BOOST_ASSERT(number_of_locations > 0);
|
BOOST_ASSERT(number_of_locations > 0);
|
||||||
|
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
#ifndef TRIP_NEAREST_NEIGHBOUR_HPP
|
#ifndef TRIP_NEAREST_NEIGHBOUR_HPP
|
||||||
#define TRIP_NEAREST_NEIGHBOUR_HPP
|
#define TRIP_NEAREST_NEIGHBOUR_HPP
|
||||||
|
|
||||||
#include "util/typedefs.hpp"
|
|
||||||
#include "util/simple_logger.hpp"
|
|
||||||
#include "util/dist_table_wrapper.hpp"
|
#include "util/dist_table_wrapper.hpp"
|
||||||
|
#include "util/simple_logger.hpp"
|
||||||
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
#include "osrm/json_container.hpp"
|
#include "osrm/json_container.hpp"
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <limits>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <limits>
|
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -11,10 +11,10 @@
|
|||||||
#include "extractor/query_node.hpp"
|
#include "extractor/query_node.hpp"
|
||||||
#include "extractor/restriction_map.hpp"
|
#include "extractor/restriction_map.hpp"
|
||||||
|
|
||||||
#include "util/guidance/bearing_class.hpp"
|
|
||||||
#include "util/guidance/entry_class.hpp"
|
|
||||||
#include "extractor/guidance/turn_analysis.hpp"
|
#include "extractor/guidance/turn_analysis.hpp"
|
||||||
#include "extractor/guidance/turn_instruction.hpp"
|
#include "extractor/guidance/turn_instruction.hpp"
|
||||||
|
#include "util/guidance/bearing_class.hpp"
|
||||||
|
#include "util/guidance/entry_class.hpp"
|
||||||
|
|
||||||
#include "util/deallocating_vector.hpp"
|
#include "util/deallocating_vector.hpp"
|
||||||
#include "util/name_table.hpp"
|
#include "util/name_table.hpp"
|
||||||
|
@ -21,8 +21,8 @@ struct EdgeBasedNode
|
|||||||
{
|
{
|
||||||
EdgeBasedNode()
|
EdgeBasedNode()
|
||||||
: forward_segment_id{SPECIAL_SEGMENTID, false},
|
: forward_segment_id{SPECIAL_SEGMENTID, false},
|
||||||
reverse_segment_id{SPECIAL_SEGMENTID, false}, u(SPECIAL_NODEID),
|
reverse_segment_id{SPECIAL_SEGMENTID, false}, u(SPECIAL_NODEID), v(SPECIAL_NODEID),
|
||||||
v(SPECIAL_NODEID), name_id(0), forward_packed_geometry_id(SPECIAL_EDGEID),
|
name_id(0), forward_packed_geometry_id(SPECIAL_EDGEID),
|
||||||
reverse_packed_geometry_id(SPECIAL_EDGEID), component{INVALID_COMPONENTID, false},
|
reverse_packed_geometry_id(SPECIAL_EDGEID), component{INVALID_COMPONENTID, false},
|
||||||
fwd_segment_position(std::numeric_limits<unsigned short>::max()),
|
fwd_segment_position(std::numeric_limits<unsigned short>::max()),
|
||||||
forward_travel_mode(TRAVEL_MODE_INACCESSIBLE),
|
forward_travel_mode(TRAVEL_MODE_INACCESSIBLE),
|
||||||
@ -42,15 +42,13 @@ struct EdgeBasedNode
|
|||||||
unsigned short fwd_segment_position,
|
unsigned short fwd_segment_position,
|
||||||
TravelMode forward_travel_mode,
|
TravelMode forward_travel_mode,
|
||||||
TravelMode backward_travel_mode)
|
TravelMode backward_travel_mode)
|
||||||
: forward_segment_id(forward_segment_id_),
|
: forward_segment_id(forward_segment_id_), reverse_segment_id(reverse_segment_id_), u(u),
|
||||||
reverse_segment_id(reverse_segment_id_), u(u), v(v), name_id(name_id),
|
v(v), name_id(name_id), forward_packed_geometry_id(forward_geometry_id_),
|
||||||
forward_packed_geometry_id(forward_geometry_id_),
|
|
||||||
reverse_packed_geometry_id(reverse_geometry_id_),
|
reverse_packed_geometry_id(reverse_geometry_id_),
|
||||||
component{component_id, is_tiny_component}, fwd_segment_position(fwd_segment_position),
|
component{component_id, is_tiny_component}, fwd_segment_position(fwd_segment_position),
|
||||||
forward_travel_mode(forward_travel_mode), backward_travel_mode(backward_travel_mode)
|
forward_travel_mode(forward_travel_mode), backward_travel_mode(backward_travel_mode)
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(forward_segment_id.enabled ||
|
BOOST_ASSERT(forward_segment_id.enabled || reverse_segment_id.enabled);
|
||||||
reverse_segment_id.enabled);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SegmentID forward_segment_id; // needed for edge-expanded graph
|
SegmentID forward_segment_id; // needed for edge-expanded graph
|
||||||
|
@ -25,15 +25,17 @@ struct ExternalMemoryNode : QueryNode
|
|||||||
|
|
||||||
static ExternalMemoryNode min_value()
|
static ExternalMemoryNode min_value()
|
||||||
{
|
{
|
||||||
return ExternalMemoryNode(util::FixedLongitude(0), util::FixedLatitude(0), MIN_OSM_NODEID,
|
return ExternalMemoryNode(
|
||||||
false, false);
|
util::FixedLongitude(0), util::FixedLatitude(0), MIN_OSM_NODEID, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ExternalMemoryNode max_value()
|
static ExternalMemoryNode max_value()
|
||||||
{
|
{
|
||||||
return ExternalMemoryNode(util::FixedLongitude(std::numeric_limits<int>::max()),
|
return ExternalMemoryNode(util::FixedLongitude(std::numeric_limits<int>::max()),
|
||||||
util::FixedLatitude(std::numeric_limits<int>::max()),
|
util::FixedLatitude(std::numeric_limits<int>::max()),
|
||||||
MAX_OSM_NODEID, false, false);
|
MAX_OSM_NODEID,
|
||||||
|
false,
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool barrier;
|
bool barrier;
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
#ifndef EXTRACTION_CONTAINERS_HPP
|
#ifndef EXTRACTION_CONTAINERS_HPP
|
||||||
#define EXTRACTION_CONTAINERS_HPP
|
#define EXTRACTION_CONTAINERS_HPP
|
||||||
|
|
||||||
#include "extractor/internal_extractor_edge.hpp"
|
|
||||||
#include "extractor/first_and_last_segment_of_way.hpp"
|
|
||||||
#include "extractor/scripting_environment.hpp"
|
|
||||||
#include "extractor/external_memory_node.hpp"
|
#include "extractor/external_memory_node.hpp"
|
||||||
|
#include "extractor/first_and_last_segment_of_way.hpp"
|
||||||
|
#include "extractor/internal_extractor_edge.hpp"
|
||||||
#include "extractor/restriction.hpp"
|
#include "extractor/restriction.hpp"
|
||||||
|
#include "extractor/scripting_environment.hpp"
|
||||||
|
|
||||||
#include <stxxl/vector>
|
#include <stxxl/vector>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef EXTRACTION_HELPER_FUNCTIONS_HPP
|
#ifndef EXTRACTION_HELPER_FUNCTIONS_HPP
|
||||||
#define EXTRACTION_HELPER_FUNCTIONS_HPP
|
#define EXTRACTION_HELPER_FUNCTIONS_HPP
|
||||||
|
|
||||||
#include <boost/spirit/include/qi.hpp>
|
|
||||||
#include <boost/spirit/include/phoenix.hpp>
|
#include <boost/spirit/include/phoenix.hpp>
|
||||||
|
#include <boost/spirit/include/qi.hpp>
|
||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -19,8 +19,7 @@ namespace qi = boost::spirit::qi;
|
|||||||
|
|
||||||
template <typename Iterator> struct iso_8601_grammar : qi::grammar<Iterator, unsigned()>
|
template <typename Iterator> struct iso_8601_grammar : qi::grammar<Iterator, unsigned()>
|
||||||
{
|
{
|
||||||
iso_8601_grammar()
|
iso_8601_grammar() : iso_8601_grammar::base_type(root)
|
||||||
: iso_8601_grammar::base_type(root)
|
|
||||||
|
|
||||||
{
|
{
|
||||||
using qi::_1;
|
using qi::_1;
|
||||||
@ -38,50 +37,38 @@ template <typename Iterator> struct iso_8601_grammar : qi::grammar<Iterator, uns
|
|||||||
mm = uint2_p[_pass = bind([](unsigned x) { return x < 60; }, _1), _val = _1];
|
mm = uint2_p[_pass = bind([](unsigned x) { return x < 60; }, _1), _val = _1];
|
||||||
ss = uint2_p[_pass = bind([](unsigned x) { return x < 60; }, _1), _val = _1];
|
ss = uint2_p[_pass = bind([](unsigned x) { return x < 60; }, _1), _val = _1];
|
||||||
|
|
||||||
osm_time
|
osm_time = (uint_p[_a = _1] >> eoi)[_val = _a * 60] |
|
||||||
= (uint_p[_a = _1] >> eoi) [_val = _a * 60]
|
(uint_p[_a = _1] >> ':' >> uint_p[_b = _1] >> eoi)[_val = _a * 3600 + _b * 60] |
|
||||||
| (uint_p[_a = _1] >> ':' >> uint_p[_b = _1] >> eoi) [_val = _a * 3600 + _b * 60]
|
(uint_p[_a = _1] >> ':' >> uint_p[_b = _1] >> ':' >> uint_p[_c = _1] >>
|
||||||
| (uint_p[_a = _1] >> ':' >> uint_p[_b = _1] >> ':' >> uint_p[_c = _1] >> eoi) [_val = _a * 3600 + _b * 60 + _c]
|
eoi)[_val = _a * 3600 + _b * 60 + _c];
|
||||||
;
|
|
||||||
|
|
||||||
alternative_time
|
alternative_time =
|
||||||
= ('T' >> hh[_a = _1] >> mm[_b = _1] >> ss[_c = _1]) [_val = _a * 3600 + _b * 60 + _c]
|
('T' >> hh[_a = _1] >> mm[_b = _1] >> ss[_c = _1])[_val = _a * 3600 + _b * 60 + _c];
|
||||||
;
|
|
||||||
|
|
||||||
extended_time
|
extended_time = ('T' >> hh[_a = _1] >> ':' >> mm[_b = _1] >> ':' >>
|
||||||
= ('T' >> hh[_a = _1] >> ':' >> mm[_b = _1] >> ':' >> ss[_c = _1]) [_val = _a * 3600 + _b * 60 + _c]
|
ss[_c = _1])[_val = _a * 3600 + _b * 60 + _c];
|
||||||
;
|
|
||||||
|
|
||||||
standard_time
|
standard_time =
|
||||||
= ('T'
|
('T' >> -(uint_ >> char_("Hh"))[_a = _1] >> -(uint_ >> char_("Mm"))[_b = _1] >>
|
||||||
>> -(uint_ >> char_("Hh"))[_a = _1]
|
-(uint_ >> char_("Ss"))[_c = _1])[_val = _a * 3600 + _b * 60 + _c];
|
||||||
>> -(uint_ >> char_("Mm"))[_b = _1]
|
|
||||||
>> -(uint_ >> char_("Ss"))[_c = _1]) [_val = _a * 3600 + _b * 60 + _c]
|
|
||||||
;
|
|
||||||
|
|
||||||
standard_date
|
standard_date = (uint_ >> char_("Dd"))[_val = _1 * 86400];
|
||||||
= (uint_ >> char_("Dd")) [_val = _1 * 86400]
|
|
||||||
;
|
|
||||||
|
|
||||||
standard_week
|
standard_week = (uint_ >> char_("Ww"))[_val = _1 * 604800];
|
||||||
= (uint_ >> char_("Ww")) [_val = _1 * 604800]
|
|
||||||
;
|
|
||||||
|
|
||||||
iso_period
|
iso_period =
|
||||||
= osm_time [_val = _1]
|
osm_time[_val = _1] | ('P' >> standard_week >> eoi)[_val = _1] |
|
||||||
| ('P' >> standard_week >> eoi) [_val = _1]
|
('P' >> (alternative_time[_a = 0, _b = _1] | extended_time[_a = 0, _b = _1] |
|
||||||
| ('P' >> ( alternative_time[_a = 0, _b = _1]
|
(eps[_a = 0, _b = 0] >> -standard_date[_a = _1] >> -standard_time[_b = _1])) >>
|
||||||
| extended_time[_a = 0, _b = _1]
|
eoi)[_val = _a + _b];
|
||||||
| (eps[_a = 0, _b = 0] >> -standard_date[_a = _1] >> -standard_time[_b = _1] ) )
|
|
||||||
>> eoi) [_val = _a + _b]
|
|
||||||
;
|
|
||||||
|
|
||||||
root = iso_period;
|
root = iso_period;
|
||||||
}
|
}
|
||||||
|
|
||||||
qi::rule<Iterator, unsigned()> root;
|
qi::rule<Iterator, unsigned()> root;
|
||||||
qi::rule<Iterator, unsigned(), qi::locals<unsigned, unsigned>> iso_period;
|
qi::rule<Iterator, unsigned(), qi::locals<unsigned, unsigned>> iso_period;
|
||||||
qi::rule<Iterator, unsigned(), qi::locals<unsigned, unsigned, unsigned>> osm_time, standard_time, alternative_time, extended_time;
|
qi::rule<Iterator, unsigned(), qi::locals<unsigned, unsigned, unsigned>> osm_time,
|
||||||
|
standard_time, alternative_time, extended_time;
|
||||||
qi::rule<Iterator, unsigned()> standard_date, standard_week;
|
qi::rule<Iterator, unsigned()> standard_date, standard_week;
|
||||||
qi::rule<Iterator, unsigned()> hh, mm, ss;
|
qi::rule<Iterator, unsigned()> hh, mm, ss;
|
||||||
|
|
||||||
@ -111,7 +98,6 @@ inline unsigned parseDuration(const std::string &s)
|
|||||||
|
|
||||||
return !s.empty() && iter == s.end() ? duration : std::numeric_limits<unsigned>::max();
|
return !s.empty() && iter == s.end() ? duration : std::numeric_limits<unsigned>::max();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,8 +30,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <boost/filesystem/path.hpp>
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -70,7 +70,8 @@ getCoordinateFromCompressedRange(util::Coordinate current_coordinate,
|
|||||||
};
|
};
|
||||||
|
|
||||||
for (auto compressed_geometry_itr = compressed_geometry_begin;
|
for (auto compressed_geometry_itr = compressed_geometry_begin;
|
||||||
compressed_geometry_itr != compressed_geometry_end; ++compressed_geometry_itr)
|
compressed_geometry_itr != compressed_geometry_end;
|
||||||
|
++compressed_geometry_itr)
|
||||||
{
|
{
|
||||||
const auto next_coordinate =
|
const auto next_coordinate =
|
||||||
extractCoordinateFromNode(query_nodes[compressed_geometry_itr->node_id]);
|
extractCoordinateFromNode(query_nodes[compressed_geometry_itr->node_id]);
|
||||||
@ -82,7 +83,8 @@ getCoordinateFromCompressedRange(util::Coordinate current_coordinate,
|
|||||||
if (distance_to_next_coordinate >= detail::DESIRED_SEGMENT_LENGTH)
|
if (distance_to_next_coordinate >= detail::DESIRED_SEGMENT_LENGTH)
|
||||||
return util::coordinate_calculation::interpolateLinear(
|
return util::coordinate_calculation::interpolateLinear(
|
||||||
getFactor(distance_to_current_coordinate, distance_to_next_coordinate),
|
getFactor(distance_to_current_coordinate, distance_to_next_coordinate),
|
||||||
current_coordinate, next_coordinate);
|
current_coordinate,
|
||||||
|
next_coordinate);
|
||||||
|
|
||||||
// prepare for next iteration
|
// prepare for next iteration
|
||||||
current_coordinate = next_coordinate;
|
current_coordinate = next_coordinate;
|
||||||
@ -98,7 +100,8 @@ getCoordinateFromCompressedRange(util::Coordinate current_coordinate,
|
|||||||
distance_to_next_coordinate >= detail::DESIRED_SEGMENT_LENGTH)
|
distance_to_next_coordinate >= detail::DESIRED_SEGMENT_LENGTH)
|
||||||
return util::coordinate_calculation::interpolateLinear(
|
return util::coordinate_calculation::interpolateLinear(
|
||||||
getFactor(distance_to_current_coordinate, distance_to_next_coordinate),
|
getFactor(distance_to_current_coordinate, distance_to_next_coordinate),
|
||||||
current_coordinate, final_coordinate);
|
current_coordinate,
|
||||||
|
final_coordinate);
|
||||||
else
|
else
|
||||||
return final_coordinate;
|
return final_coordinate;
|
||||||
}
|
}
|
||||||
@ -280,10 +283,14 @@ inline double getTurnConfidence(const double angle, TurnInstruction instruction)
|
|||||||
// swaps left <-> right modifier types
|
// swaps left <-> right modifier types
|
||||||
inline DirectionModifier::Enum mirrorDirectionModifier(const DirectionModifier::Enum modifier)
|
inline DirectionModifier::Enum mirrorDirectionModifier(const DirectionModifier::Enum modifier)
|
||||||
{
|
{
|
||||||
const constexpr DirectionModifier::Enum results[] = {
|
const constexpr DirectionModifier::Enum results[] = {DirectionModifier::UTurn,
|
||||||
DirectionModifier::UTurn, DirectionModifier::SharpLeft, DirectionModifier::Left,
|
DirectionModifier::SharpLeft,
|
||||||
DirectionModifier::SlightLeft, DirectionModifier::Straight, DirectionModifier::SlightRight,
|
DirectionModifier::Left,
|
||||||
DirectionModifier::Right, DirectionModifier::SharpRight};
|
DirectionModifier::SlightLeft,
|
||||||
|
DirectionModifier::Straight,
|
||||||
|
DirectionModifier::SlightRight,
|
||||||
|
DirectionModifier::Right,
|
||||||
|
DirectionModifier::SharpRight};
|
||||||
return results[modifier];
|
return results[modifier];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -380,8 +387,10 @@ inline bool requiresNameAnnounced(const std::string &from,
|
|||||||
return false;
|
return false;
|
||||||
if (!checkTable(first_prefix_and_suffixes.first))
|
if (!checkTable(first_prefix_and_suffixes.first))
|
||||||
return false;
|
return false;
|
||||||
return !first.compare(first_prefix_and_suffixes.first.length(), std::string::npos,
|
return !first.compare(first_prefix_and_suffixes.first.length(),
|
||||||
second, second_prefix_and_suffixes.first.length(),
|
std::string::npos,
|
||||||
|
second,
|
||||||
|
second_prefix_and_suffixes.first.length(),
|
||||||
std::string::npos);
|
std::string::npos);
|
||||||
}();
|
}();
|
||||||
|
|
||||||
@ -390,8 +399,10 @@ inline bool requiresNameAnnounced(const std::string &from,
|
|||||||
return false;
|
return false;
|
||||||
if (!checkTable(first_prefix_and_suffixes.second))
|
if (!checkTable(first_prefix_and_suffixes.second))
|
||||||
return false;
|
return false;
|
||||||
return !first.compare(0, first.length() - first_prefix_and_suffixes.second.length(),
|
return !first.compare(0,
|
||||||
second, 0,
|
first.length() - first_prefix_and_suffixes.second.length(),
|
||||||
|
second,
|
||||||
|
0,
|
||||||
second.length() - second_prefix_and_suffixes.second.length());
|
second.length() - second_prefix_and_suffixes.second.length());
|
||||||
}();
|
}();
|
||||||
|
|
||||||
@ -421,8 +432,8 @@ inline int getPriority(const FunctionalRoadClass road_class)
|
|||||||
// The road priorities indicate which roads can bee seen as more or less equal.
|
// The road priorities indicate which roads can bee seen as more or less equal.
|
||||||
// They are used in Fork-Discovery. Possibly should be moved to profiles post v5?
|
// They are used in Fork-Discovery. Possibly should be moved to profiles post v5?
|
||||||
// A fork can happen between road types that are at most 1 priority apart from each other
|
// A fork can happen between road types that are at most 1 priority apart from each other
|
||||||
const constexpr int road_priority[] = {10, 0, 10, 2, 10, 4, 10, 6,
|
const constexpr int road_priority[] = {
|
||||||
10, 8, 10, 11, 10, 12, 10, 14};
|
10, 0, 10, 2, 10, 4, 10, 6, 10, 8, 10, 11, 10, 12, 10, 14};
|
||||||
return road_priority[static_cast<int>(road_class)];
|
return road_priority[static_cast<int>(road_class)];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -441,10 +452,14 @@ inline bool canBeSeenAsFork(const FunctionalRoadClass first, const FunctionalRoa
|
|||||||
// turn and vice versa.
|
// turn and vice versa.
|
||||||
inline ConnectedRoad mirror(ConnectedRoad road)
|
inline ConnectedRoad mirror(ConnectedRoad road)
|
||||||
{
|
{
|
||||||
const constexpr DirectionModifier::Enum mirrored_modifiers[] = {
|
const constexpr DirectionModifier::Enum mirrored_modifiers[] = {DirectionModifier::UTurn,
|
||||||
DirectionModifier::UTurn, DirectionModifier::SharpLeft, DirectionModifier::Left,
|
DirectionModifier::SharpLeft,
|
||||||
DirectionModifier::SlightLeft, DirectionModifier::Straight, DirectionModifier::SlightRight,
|
DirectionModifier::Left,
|
||||||
DirectionModifier::Right, DirectionModifier::SharpRight};
|
DirectionModifier::SlightLeft,
|
||||||
|
DirectionModifier::Straight,
|
||||||
|
DirectionModifier::SlightRight,
|
||||||
|
DirectionModifier::Right,
|
||||||
|
DirectionModifier::SharpRight};
|
||||||
|
|
||||||
if (angularDeviation(road.turn.angle, 0) > std::numeric_limits<double>::epsilon())
|
if (angularDeviation(road.turn.angle, 0) > std::numeric_limits<double>::epsilon())
|
||||||
{
|
{
|
||||||
|
@ -1,23 +1,21 @@
|
|||||||
#ifndef OSRM_GUIDANCE_TURN_CLASSIFICATION_HPP_
|
#ifndef OSRM_GUIDANCE_TURN_CLASSIFICATION_HPP_
|
||||||
#define OSRM_GUIDANCE_TURN_CLASSIFICATION_HPP_
|
#define OSRM_GUIDANCE_TURN_CLASSIFICATION_HPP_
|
||||||
|
|
||||||
|
#include "extractor/compressed_edge_container.hpp"
|
||||||
#include "extractor/guidance/intersection.hpp"
|
#include "extractor/guidance/intersection.hpp"
|
||||||
#include "extractor/guidance/toolkit.hpp"
|
#include "extractor/guidance/toolkit.hpp"
|
||||||
#include "extractor/compressed_edge_container.hpp"
|
|
||||||
#include "extractor/query_node.hpp"
|
#include "extractor/query_node.hpp"
|
||||||
|
|
||||||
#include "util/guidance/entry_class.hpp"
|
|
||||||
#include "util/guidance/bearing_class.hpp"
|
|
||||||
#include "util/coordinate.hpp"
|
#include "util/coordinate.hpp"
|
||||||
|
#include "util/guidance/bearing_class.hpp"
|
||||||
|
#include "util/guidance/entry_class.hpp"
|
||||||
#include "util/node_based_graph.hpp"
|
#include "util/node_based_graph.hpp"
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <vector>
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -101,7 +101,9 @@ struct TurnInstruction
|
|||||||
const DirectionModifier::Enum modifier)
|
const DirectionModifier::Enum modifier)
|
||||||
{
|
{
|
||||||
const constexpr TurnType::Enum enter_instruction[] = {
|
const constexpr TurnType::Enum enter_instruction[] = {
|
||||||
TurnType::Invalid, TurnType::EnterRoundabout, TurnType::EnterRotary,
|
TurnType::Invalid,
|
||||||
|
TurnType::EnterRoundabout,
|
||||||
|
TurnType::EnterRotary,
|
||||||
TurnType::EnterRoundaboutIntersection};
|
TurnType::EnterRoundaboutIntersection};
|
||||||
return {enter_instruction[static_cast<int>(roundabout_type)], modifier};
|
return {enter_instruction[static_cast<int>(roundabout_type)], modifier};
|
||||||
}
|
}
|
||||||
@ -109,8 +111,9 @@ struct TurnInstruction
|
|||||||
static TurnInstruction EXIT_ROUNDABOUT(const RoundaboutType roundabout_type,
|
static TurnInstruction EXIT_ROUNDABOUT(const RoundaboutType roundabout_type,
|
||||||
const DirectionModifier::Enum modifier)
|
const DirectionModifier::Enum modifier)
|
||||||
{
|
{
|
||||||
const constexpr TurnType::Enum exit_instruction[] = {
|
const constexpr TurnType::Enum exit_instruction[] = {TurnType::Invalid,
|
||||||
TurnType::Invalid, TurnType::ExitRoundabout, TurnType::ExitRotary,
|
TurnType::ExitRoundabout,
|
||||||
|
TurnType::ExitRotary,
|
||||||
TurnType::ExitRoundaboutIntersection};
|
TurnType::ExitRoundaboutIntersection};
|
||||||
return {exit_instruction[static_cast<int>(roundabout_type)], modifier};
|
return {exit_instruction[static_cast<int>(roundabout_type)], modifier};
|
||||||
}
|
}
|
||||||
@ -119,7 +122,9 @@ struct TurnInstruction
|
|||||||
const DirectionModifier::Enum modifier)
|
const DirectionModifier::Enum modifier)
|
||||||
{
|
{
|
||||||
const constexpr TurnType::Enum exit_instruction[] = {
|
const constexpr TurnType::Enum exit_instruction[] = {
|
||||||
TurnType::Invalid, TurnType::EnterAndExitRoundabout, TurnType::EnterAndExitRotary,
|
TurnType::Invalid,
|
||||||
|
TurnType::EnterAndExitRoundabout,
|
||||||
|
TurnType::EnterAndExitRotary,
|
||||||
TurnType::EnterAndExitRoundaboutIntersection};
|
TurnType::EnterAndExitRoundaboutIntersection};
|
||||||
return {exit_instruction[static_cast<int>(roundabout_type)], modifier};
|
return {exit_instruction[static_cast<int>(roundabout_type)], modifier};
|
||||||
}
|
}
|
||||||
@ -128,7 +133,9 @@ struct TurnInstruction
|
|||||||
const DirectionModifier::Enum modifier)
|
const DirectionModifier::Enum modifier)
|
||||||
{
|
{
|
||||||
const constexpr TurnType::Enum enter_instruction[] = {
|
const constexpr TurnType::Enum enter_instruction[] = {
|
||||||
TurnType::Invalid, TurnType::EnterRoundaboutAtExit, TurnType::EnterRotaryAtExit,
|
TurnType::Invalid,
|
||||||
|
TurnType::EnterRoundaboutAtExit,
|
||||||
|
TurnType::EnterRotaryAtExit,
|
||||||
TurnType::EnterRoundaboutIntersectionAtExit};
|
TurnType::EnterRoundaboutIntersectionAtExit};
|
||||||
return {enter_instruction[static_cast<int>(roundabout_type)], modifier};
|
return {enter_instruction[static_cast<int>(roundabout_type)], modifier};
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
#ifndef INTERNAL_EXTRACTOR_EDGE_HPP
|
#ifndef INTERNAL_EXTRACTOR_EDGE_HPP
|
||||||
#define INTERNAL_EXTRACTOR_EDGE_HPP
|
#define INTERNAL_EXTRACTOR_EDGE_HPP
|
||||||
|
|
||||||
#include "util/typedefs.hpp"
|
|
||||||
#include "extractor/travel_mode.hpp"
|
|
||||||
#include "extractor/node_based_edge.hpp"
|
#include "extractor/node_based_edge.hpp"
|
||||||
|
#include "extractor/travel_mode.hpp"
|
||||||
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
|
|
||||||
|
#include "extractor/guidance/classification_data.hpp"
|
||||||
#include "osrm/coordinate.hpp"
|
#include "osrm/coordinate.hpp"
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include "extractor/guidance/classification_data.hpp"
|
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
@ -32,8 +32,7 @@ struct InternalExtractorEdge
|
|||||||
|
|
||||||
WeightData() : duration(0.0), type(WeightType::INVALID) {}
|
WeightData() : duration(0.0), type(WeightType::INVALID) {}
|
||||||
|
|
||||||
union
|
union {
|
||||||
{
|
|
||||||
double duration;
|
double duration;
|
||||||
double speed;
|
double speed;
|
||||||
};
|
};
|
||||||
@ -94,14 +93,32 @@ struct InternalExtractorEdge
|
|||||||
// necessary static util functions for stxxl's sorting
|
// necessary static util functions for stxxl's sorting
|
||||||
static InternalExtractorEdge min_osm_value()
|
static InternalExtractorEdge min_osm_value()
|
||||||
{
|
{
|
||||||
return InternalExtractorEdge(MIN_OSM_NODEID, MIN_OSM_NODEID, 0, WeightData(), false, false,
|
return InternalExtractorEdge(MIN_OSM_NODEID,
|
||||||
false, false, true, TRAVEL_MODE_INACCESSIBLE, false,
|
MIN_OSM_NODEID,
|
||||||
|
0,
|
||||||
|
WeightData(),
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
TRAVEL_MODE_INACCESSIBLE,
|
||||||
|
false,
|
||||||
guidance::RoadClassificationData());
|
guidance::RoadClassificationData());
|
||||||
}
|
}
|
||||||
static InternalExtractorEdge max_osm_value()
|
static InternalExtractorEdge max_osm_value()
|
||||||
{
|
{
|
||||||
return InternalExtractorEdge(MAX_OSM_NODEID, MAX_OSM_NODEID, 0, WeightData(), false, false,
|
return InternalExtractorEdge(MAX_OSM_NODEID,
|
||||||
false, false, true, TRAVEL_MODE_INACCESSIBLE, false,
|
MAX_OSM_NODEID,
|
||||||
|
0,
|
||||||
|
WeightData(),
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
TRAVEL_MODE_INACCESSIBLE,
|
||||||
|
false,
|
||||||
guidance::RoadClassificationData());
|
guidance::RoadClassificationData());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,8 +27,7 @@ struct OriginalEdgeData
|
|||||||
|
|
||||||
OriginalEdgeData()
|
OriginalEdgeData()
|
||||||
: via_node(std::numeric_limits<unsigned>::max()),
|
: via_node(std::numeric_limits<unsigned>::max()),
|
||||||
name_id(std::numeric_limits<unsigned>::max()),
|
name_id(std::numeric_limits<unsigned>::max()), entry_classid(INVALID_ENTRY_CLASSID),
|
||||||
entry_classid(INVALID_ENTRY_CLASSID),
|
|
||||||
turn_instruction(guidance::TurnInstruction::INVALID()),
|
turn_instruction(guidance::TurnInstruction::INVALID()),
|
||||||
travel_mode(TRAVEL_MODE_INACCESSIBLE)
|
travel_mode(TRAVEL_MODE_INACCESSIBLE)
|
||||||
{
|
{
|
||||||
|
@ -11,24 +11,19 @@ namespace extractor
|
|||||||
struct ProfileProperties
|
struct ProfileProperties
|
||||||
{
|
{
|
||||||
ProfileProperties()
|
ProfileProperties()
|
||||||
: traffic_signal_penalty(0), u_turn_penalty(0), continue_straight_at_waypoint(true), use_turn_restrictions(false)
|
: traffic_signal_penalty(0), u_turn_penalty(0), continue_straight_at_waypoint(true),
|
||||||
|
use_turn_restrictions(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
double GetUturnPenalty() const
|
double GetUturnPenalty() const { return u_turn_penalty / 10.; }
|
||||||
{
|
|
||||||
return u_turn_penalty / 10.;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetUturnPenalty(const double u_turn_penalty_)
|
void SetUturnPenalty(const double u_turn_penalty_)
|
||||||
{
|
{
|
||||||
u_turn_penalty = boost::numeric_cast<int>(u_turn_penalty_ * 10.);
|
u_turn_penalty = boost::numeric_cast<int>(u_turn_penalty_ * 10.);
|
||||||
}
|
}
|
||||||
|
|
||||||
double GetTrafficSignalPenalty() const
|
double GetTrafficSignalPenalty() const { return traffic_signal_penalty / 10.; }
|
||||||
{
|
|
||||||
return traffic_signal_penalty / 10.;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetTrafficSignalPenalty(const double traffic_signal_penalty_)
|
void SetTrafficSignalPenalty(const double traffic_signal_penalty_)
|
||||||
{
|
{
|
||||||
|
@ -36,13 +36,15 @@ struct QueryNode
|
|||||||
static QueryNode min_value()
|
static QueryNode min_value()
|
||||||
{
|
{
|
||||||
return QueryNode(util::FixedLongitude(-180 * COORDINATE_PRECISION),
|
return QueryNode(util::FixedLongitude(-180 * COORDINATE_PRECISION),
|
||||||
util::FixedLatitude(-90 * COORDINATE_PRECISION), MIN_OSM_NODEID);
|
util::FixedLatitude(-90 * COORDINATE_PRECISION),
|
||||||
|
MIN_OSM_NODEID);
|
||||||
}
|
}
|
||||||
|
|
||||||
static QueryNode max_value()
|
static QueryNode max_value()
|
||||||
{
|
{
|
||||||
return QueryNode(util::FixedLongitude(180 * COORDINATE_PRECISION),
|
return QueryNode(util::FixedLongitude(180 * COORDINATE_PRECISION),
|
||||||
util::FixedLatitude(90 * COORDINATE_PRECISION), MAX_OSM_NODEID);
|
util::FixedLatitude(90 * COORDINATE_PRECISION),
|
||||||
|
MAX_OSM_NODEID);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
#ifndef RASTER_SOURCE_HPP
|
#ifndef RASTER_SOURCE_HPP
|
||||||
#define RASTER_SOURCE_HPP
|
#define RASTER_SOURCE_HPP
|
||||||
|
|
||||||
#include "util/exception.hpp"
|
|
||||||
#include "util/coordinate.hpp"
|
#include "util/coordinate.hpp"
|
||||||
|
#include "util/exception.hpp"
|
||||||
|
|
||||||
#include <boost/filesystem.hpp>
|
|
||||||
#include <boost/filesystem/fstream.hpp>
|
|
||||||
#include <boost/spirit/include/qi_int.hpp>
|
|
||||||
#include <boost/spirit/include/qi.hpp>
|
|
||||||
#include <boost/algorithm/string/trim.hpp>
|
#include <boost/algorithm/string/trim.hpp>
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
|
#include <boost/filesystem.hpp>
|
||||||
|
#include <boost/filesystem/fstream.hpp>
|
||||||
|
#include <boost/spirit/include/qi.hpp>
|
||||||
|
#include <boost/spirit/include/qi_int.hpp>
|
||||||
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -12,8 +12,7 @@ namespace extractor
|
|||||||
|
|
||||||
struct TurnRestriction
|
struct TurnRestriction
|
||||||
{
|
{
|
||||||
union WayOrNode
|
union WayOrNode {
|
||||||
{
|
|
||||||
OSMNodeID_weak node;
|
OSMNodeID_weak node;
|
||||||
OSMEdgeID_weak way;
|
OSMEdgeID_weak way;
|
||||||
};
|
};
|
||||||
|
@ -6,9 +6,9 @@
|
|||||||
|
|
||||||
#include "util/lua_util.hpp"
|
#include "util/lua_util.hpp"
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
#include <string>
|
||||||
#include <tbb/enumerable_thread_specific.h>
|
#include <tbb/enumerable_thread_specific.h>
|
||||||
|
|
||||||
struct lua_State;
|
struct lua_State;
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
#ifndef TARJAN_SCC_HPP
|
#ifndef TARJAN_SCC_HPP
|
||||||
#define TARJAN_SCC_HPP
|
#define TARJAN_SCC_HPP
|
||||||
|
|
||||||
#include "util/typedefs.hpp"
|
|
||||||
#include "util/deallocating_vector.hpp"
|
|
||||||
#include "extractor/node_based_edge.hpp"
|
#include "extractor/node_based_edge.hpp"
|
||||||
#include "extractor/query_node.hpp"
|
#include "extractor/query_node.hpp"
|
||||||
|
#include "util/deallocating_vector.hpp"
|
||||||
#include "util/percent.hpp"
|
#include "util/percent.hpp"
|
||||||
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
#include "util/integer_range.hpp"
|
#include "util/integer_range.hpp"
|
||||||
#include "util/simple_logger.hpp"
|
#include "util/simple_logger.hpp"
|
||||||
@ -16,9 +16,9 @@
|
|||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <climits>
|
#include <climits>
|
||||||
|
#include <memory>
|
||||||
#include <stack>
|
#include <stack>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@ -160,11 +160,9 @@ template <typename GraphT> class TarjanSCC
|
|||||||
TIMER_STOP(SCC_RUN);
|
TIMER_STOP(SCC_RUN);
|
||||||
util::SimpleLogger().Write() << "SCC run took: " << TIMER_MSEC(SCC_RUN) / 1000. << "s";
|
util::SimpleLogger().Write() << "SCC run took: " << TIMER_MSEC(SCC_RUN) / 1000. << "s";
|
||||||
|
|
||||||
size_one_counter = std::count_if(component_size_vector.begin(), component_size_vector.end(),
|
size_one_counter = std::count_if(component_size_vector.begin(),
|
||||||
[](unsigned value)
|
component_size_vector.end(),
|
||||||
{
|
[](unsigned value) { return 1 == value; });
|
||||||
return 1 == value;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t GetNumberOfComponents() const { return component_size_vector.size(); }
|
std::size_t GetNumberOfComponents() const { return component_size_vector.size(); }
|
||||||
|
@ -75,8 +75,8 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
|
|||||||
BaseParametersGrammar(qi::rule<Iterator, Signature> &root_rule)
|
BaseParametersGrammar(qi::rule<Iterator, Signature> &root_rule)
|
||||||
: BaseParametersGrammar::base_type(root_rule)
|
: BaseParametersGrammar::base_type(root_rule)
|
||||||
{
|
{
|
||||||
const auto add_hint = [](engine::api::BaseParameters &base_parameters, const boost::optional<std::string> &hint_string)
|
const auto add_hint = [](engine::api::BaseParameters &base_parameters,
|
||||||
{
|
const boost::optional<std::string> &hint_string) {
|
||||||
if (hint_string)
|
if (hint_string)
|
||||||
{
|
{
|
||||||
base_parameters.hints.emplace_back(engine::Hint::FromBase64(hint_string.get()));
|
base_parameters.hints.emplace_back(engine::Hint::FromBase64(hint_string.get()));
|
||||||
@ -87,9 +87,9 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const auto add_bearing = [](engine::api::BaseParameters &base_parameters,
|
const auto add_bearing =
|
||||||
boost::optional<boost::fusion::vector2<short, short>> bearing_range)
|
[](engine::api::BaseParameters &base_parameters,
|
||||||
{
|
boost::optional<boost::fusion::vector2<short, short>> bearing_range) {
|
||||||
boost::optional<engine::Bearing> bearing;
|
boost::optional<engine::Bearing> bearing;
|
||||||
if (bearing_range)
|
if (bearing_range)
|
||||||
{
|
{
|
||||||
@ -103,48 +103,47 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
|
|||||||
base64_char = qi::char_("a-zA-Z0-9--_=");
|
base64_char = qi::char_("a-zA-Z0-9--_=");
|
||||||
unlimited_rule = qi::lit("unlimited")[qi::_val = std::numeric_limits<double>::infinity()];
|
unlimited_rule = qi::lit("unlimited")[qi::_val = std::numeric_limits<double>::infinity()];
|
||||||
|
|
||||||
bearing_rule
|
bearing_rule =
|
||||||
= (qi::short_ > ',' > qi::short_)
|
(qi::short_ > ',' > qi::short_)[qi::_val = ph::bind(
|
||||||
[qi::_val = ph::bind([](short bearing, short range) {
|
[](short bearing, short range) {
|
||||||
return osrm::engine::Bearing{bearing, range};
|
return osrm::engine::Bearing{bearing, range};
|
||||||
}, qi::_1, qi::_2)]
|
},
|
||||||
;
|
qi::_1,
|
||||||
|
qi::_2)];
|
||||||
|
|
||||||
location_rule
|
location_rule = (double_ > qi::lit(',') >
|
||||||
= (double_ > qi::lit(',') > double_)
|
double_)[qi::_val = ph::bind(
|
||||||
[qi::_val = ph::bind([](double lon, double lat) {
|
[](double lon, double lat) {
|
||||||
return util::Coordinate(util::FixedLongitude(lon * COORDINATE_PRECISION),
|
return util::Coordinate(
|
||||||
|
util::FixedLongitude(lon * COORDINATE_PRECISION),
|
||||||
util::FixedLatitude(lat * COORDINATE_PRECISION));
|
util::FixedLatitude(lat * COORDINATE_PRECISION));
|
||||||
}, qi::_1, qi::_2)]
|
},
|
||||||
;
|
qi::_1,
|
||||||
|
qi::_2)];
|
||||||
|
|
||||||
polyline_rule
|
polyline_rule = qi::as_string[qi::lit("polyline(") > +polyline_chars > ')']
|
||||||
= qi::as_string[qi::lit("polyline(") > +polyline_chars > ')']
|
[qi::_val = ph::bind(
|
||||||
[qi::_val = ph::bind([](const std::string &polyline) {
|
[](const std::string &polyline) {
|
||||||
return engine::decodePolyline(polyline);
|
return engine::decodePolyline(polyline);
|
||||||
}, qi::_1)]
|
},
|
||||||
;
|
qi::_1)];
|
||||||
|
|
||||||
query_rule
|
query_rule =
|
||||||
= ((location_rule % ';') | polyline_rule)
|
((location_rule % ';') |
|
||||||
[ph::bind(&engine::api::BaseParameters::coordinates, qi::_r1) = qi::_1]
|
polyline_rule)[ph::bind(&engine::api::BaseParameters::coordinates, qi::_r1) = qi::_1];
|
||||||
;
|
|
||||||
|
|
||||||
radiuses_rule
|
radiuses_rule = qi::lit("radiuses=") >
|
||||||
= qi::lit("radiuses=")
|
(-(qi::double_ | unlimited_rule) %
|
||||||
> (-(qi::double_ | unlimited_rule) % ';')
|
';')[ph::bind(&engine::api::BaseParameters::radiuses, qi::_r1) = qi::_1];
|
||||||
[ph::bind(&engine::api::BaseParameters::radiuses, qi::_r1) = qi::_1]
|
|
||||||
;
|
|
||||||
|
|
||||||
hints_rule
|
hints_rule = qi::lit("hints=") >
|
||||||
= qi::lit("hints=")
|
(-qi::as_string[qi::repeat(engine::ENCODED_HINT_SIZE)[base64_char]])[ph::bind(
|
||||||
> (-qi::as_string[qi::repeat(engine::ENCODED_HINT_SIZE)[base64_char]])[ph::bind(add_hint, qi::_r1, qi::_1)] % ';'
|
add_hint, qi::_r1, qi::_1)] %
|
||||||
;
|
';';
|
||||||
|
|
||||||
bearings_rule
|
bearings_rule =
|
||||||
= qi::lit("bearings=") >
|
qi::lit("bearings=") >
|
||||||
(-(qi::short_ > ',' > qi::short_))[ph::bind(add_bearing, qi::_r1, qi::_1)] % ';'
|
(-(qi::short_ > ',' > qi::short_))[ph::bind(add_bearing, qi::_r1, qi::_1)] % ';';
|
||||||
;
|
|
||||||
|
|
||||||
base_rule = radiuses_rule(qi::_r1) | hints_rule(qi::_r1) | bearings_rule(qi::_r1);
|
base_rule = radiuses_rule(qi::_r1) | hints_rule(qi::_r1) | bearings_rule(qi::_r1);
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef MATCH_PARAMETERS_GRAMMAR_HPP
|
#ifndef MATCH_PARAMETERS_GRAMMAR_HPP
|
||||||
#define MATCH_PARAMETERS_GRAMMAR_HPP
|
#define MATCH_PARAMETERS_GRAMMAR_HPP
|
||||||
|
|
||||||
#include "engine/api/match_parameters.hpp"
|
|
||||||
#include "server/api/route_parameters_grammar.hpp"
|
#include "server/api/route_parameters_grammar.hpp"
|
||||||
|
#include "engine/api/match_parameters.hpp"
|
||||||
|
|
||||||
#include <boost/spirit/include/phoenix.hpp>
|
#include <boost/spirit/include/phoenix.hpp>
|
||||||
#include <boost/spirit/include/qi.hpp>
|
#include <boost/spirit/include/qi.hpp>
|
||||||
@ -28,15 +28,13 @@ struct MatchParametersGrammar final : public RouteParametersGrammar<Iterator, Si
|
|||||||
|
|
||||||
MatchParametersGrammar() : BaseGrammar(root_rule)
|
MatchParametersGrammar() : BaseGrammar(root_rule)
|
||||||
{
|
{
|
||||||
timestamps_rule
|
timestamps_rule =
|
||||||
= qi::lit("timestamps=")
|
qi::lit("timestamps=") >
|
||||||
> (qi::uint_ % ';')[ph::bind(&engine::api::MatchParameters::timestamps, qi::_r1) = qi::_1]
|
(qi::uint_ %
|
||||||
;
|
';')[ph::bind(&engine::api::MatchParameters::timestamps, qi::_r1) = qi::_1];
|
||||||
|
|
||||||
root_rule
|
root_rule = BaseGrammar::query_rule(qi::_r1) > -qi::lit(".json") >
|
||||||
= BaseGrammar::query_rule(qi::_r1) > -qi::lit(".json")
|
-('?' > (timestamps_rule(qi::_r1) | BaseGrammar::base_rule(qi::_r1)) % '&');
|
||||||
> -('?' > (timestamps_rule(qi::_r1) | BaseGrammar::base_rule(qi::_r1)) % '&')
|
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef NEAREST_PARAMETERS_GRAMMAR_HPP
|
#ifndef NEAREST_PARAMETERS_GRAMMAR_HPP
|
||||||
#define NEAREST_PARAMETERS_GRAMMAR_HPP
|
#define NEAREST_PARAMETERS_GRAMMAR_HPP
|
||||||
|
|
||||||
#include "engine/api/nearest_parameters.hpp"
|
|
||||||
#include "server/api/base_parameters_grammar.hpp"
|
#include "server/api/base_parameters_grammar.hpp"
|
||||||
|
#include "engine/api/nearest_parameters.hpp"
|
||||||
|
|
||||||
#include <boost/spirit/include/phoenix.hpp>
|
#include <boost/spirit/include/phoenix.hpp>
|
||||||
#include <boost/spirit/include/qi.hpp>
|
#include <boost/spirit/include/qi.hpp>
|
||||||
@ -28,15 +28,12 @@ struct NearestParametersGrammar final : public BaseParametersGrammar<Iterator, S
|
|||||||
|
|
||||||
NearestParametersGrammar() : BaseGrammar(root_rule)
|
NearestParametersGrammar() : BaseGrammar(root_rule)
|
||||||
{
|
{
|
||||||
nearest_rule
|
nearest_rule = (qi::lit("number=") >
|
||||||
= (qi::lit("number=") > qi::uint_)
|
qi::uint_)[ph::bind(&engine::api::NearestParameters::number_of_results,
|
||||||
[ph::bind(&engine::api::NearestParameters::number_of_results, qi::_r1) = qi::_1]
|
qi::_r1) = qi::_1];
|
||||||
;
|
|
||||||
|
|
||||||
root_rule
|
root_rule = BaseGrammar::query_rule(qi::_r1) > -qi::lit(".json") >
|
||||||
= BaseGrammar::query_rule(qi::_r1) > -qi::lit(".json")
|
-('?' > (nearest_rule(qi::_r1) | BaseGrammar::base_rule(qi::_r1)) % '&');
|
||||||
> -('?' > (nearest_rule(qi::_r1) | BaseGrammar::base_rule(qi::_r1)) % '&')
|
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef ROUTE_PARAMETERS_GRAMMAR_HPP
|
#ifndef ROUTE_PARAMETERS_GRAMMAR_HPP
|
||||||
#define ROUTE_PARAMETERS_GRAMMAR_HPP
|
#define ROUTE_PARAMETERS_GRAMMAR_HPP
|
||||||
|
|
||||||
#include "engine/api/route_parameters.hpp"
|
|
||||||
#include "server/api/base_parameters_grammar.hpp"
|
#include "server/api/base_parameters_grammar.hpp"
|
||||||
|
#include "engine/api/route_parameters.hpp"
|
||||||
|
|
||||||
#include <boost/spirit/include/phoenix.hpp>
|
#include <boost/spirit/include/phoenix.hpp>
|
||||||
#include <boost/spirit/include/qi.hpp>
|
#include <boost/spirit/include/qi.hpp>
|
||||||
@ -28,39 +28,38 @@ struct RouteParametersGrammar : public BaseParametersGrammar<Iterator, Signature
|
|||||||
|
|
||||||
RouteParametersGrammar() : RouteParametersGrammar(root_rule)
|
RouteParametersGrammar() : RouteParametersGrammar(root_rule)
|
||||||
{
|
{
|
||||||
route_rule
|
route_rule =
|
||||||
= (qi::lit("alternatives=") > qi::bool_[ph::bind(&engine::api::RouteParameters::alternatives, qi::_r1) = qi::_1])
|
(qi::lit("alternatives=") >
|
||||||
| (qi::lit("continue_straight=")
|
qi::bool_[ph::bind(&engine::api::RouteParameters::alternatives, qi::_r1) = qi::_1]) |
|
||||||
> (qi::lit("default")
|
(qi::lit("continue_straight=") >
|
||||||
| qi::bool_[ph::bind(&engine::api::RouteParameters::continue_straight, qi::_r1) = qi::_1]))
|
(qi::lit("default") |
|
||||||
;
|
qi::bool_[ph::bind(&engine::api::RouteParameters::continue_straight, qi::_r1) =
|
||||||
|
qi::_1]));
|
||||||
|
|
||||||
root_rule
|
root_rule = query_rule(qi::_r1) > -qi::lit(".json") >
|
||||||
= query_rule(qi::_r1) > -qi::lit(".json")
|
-('?' > (route_rule(qi::_r1) | base_rule(qi::_r1)) % '&');
|
||||||
> -('?' > (route_rule(qi::_r1) | base_rule(qi::_r1)) % '&')
|
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RouteParametersGrammar(qi::rule<Iterator, Signature> &root_rule_) : BaseGrammar(root_rule_)
|
RouteParametersGrammar(qi::rule<Iterator, Signature> &root_rule_) : BaseGrammar(root_rule_)
|
||||||
{
|
{
|
||||||
geometries_type.add
|
geometries_type.add("geojson", engine::api::RouteParameters::GeometriesType::GeoJSON)(
|
||||||
("geojson", engine::api::RouteParameters::GeometriesType::GeoJSON)
|
"polyline", engine::api::RouteParameters::GeometriesType::Polyline);
|
||||||
("polyline", engine::api::RouteParameters::GeometriesType::Polyline)
|
|
||||||
;
|
|
||||||
|
|
||||||
overview_type.add
|
overview_type.add("simplified", engine::api::RouteParameters::OverviewType::Simplified)(
|
||||||
("simplified", engine::api::RouteParameters::OverviewType::Simplified)
|
"full", engine::api::RouteParameters::OverviewType::Full)(
|
||||||
("full", engine::api::RouteParameters::OverviewType::Full)
|
"false", engine::api::RouteParameters::OverviewType::False);
|
||||||
("false", engine::api::RouteParameters::OverviewType::False)
|
|
||||||
;
|
|
||||||
|
|
||||||
base_rule =
|
base_rule =
|
||||||
BaseGrammar::base_rule(qi::_r1)
|
BaseGrammar::base_rule(qi::_r1) |
|
||||||
| (qi::lit("steps=") > qi::bool_[ph::bind(&engine::api::RouteParameters::steps, qi::_r1) = qi::_1])
|
(qi::lit("steps=") >
|
||||||
| (qi::lit("annotations=") > qi::bool_[ph::bind(&engine::api::RouteParameters::annotations, qi::_r1) = qi::_1])
|
qi::bool_[ph::bind(&engine::api::RouteParameters::steps, qi::_r1) = qi::_1]) |
|
||||||
| (qi::lit("geometries=") > geometries_type[ph::bind(&engine::api::RouteParameters::geometries, qi::_r1) = qi::_1])
|
(qi::lit("annotations=") >
|
||||||
| (qi::lit("overview=") > overview_type[ph::bind(&engine::api::RouteParameters::overview, qi::_r1) = qi::_1])
|
qi::bool_[ph::bind(&engine::api::RouteParameters::annotations, qi::_r1) = qi::_1]) |
|
||||||
;
|
(qi::lit("geometries=") >
|
||||||
|
geometries_type[ph::bind(&engine::api::RouteParameters::geometries, qi::_r1) =
|
||||||
|
qi::_1]) |
|
||||||
|
(qi::lit("overview=") >
|
||||||
|
overview_type[ph::bind(&engine::api::RouteParameters::overview, qi::_r1) = qi::_1]);
|
||||||
|
|
||||||
query_rule = BaseGrammar::query_rule(qi::_r1);
|
query_rule = BaseGrammar::query_rule(qi::_r1);
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef TABLE_PARAMETERS_GRAMMAR_HPP
|
#ifndef TABLE_PARAMETERS_GRAMMAR_HPP
|
||||||
#define TABLE_PARAMETERS_GRAMMAR_HPP
|
#define TABLE_PARAMETERS_GRAMMAR_HPP
|
||||||
|
|
||||||
#include "engine/api/table_parameters.hpp"
|
|
||||||
#include "server/api/base_parameters_grammar.hpp"
|
#include "server/api/base_parameters_grammar.hpp"
|
||||||
|
#include "engine/api/table_parameters.hpp"
|
||||||
|
|
||||||
#include <boost/spirit/include/phoenix.hpp>
|
#include <boost/spirit/include/phoenix.hpp>
|
||||||
#include <boost/spirit/include/qi.hpp>
|
#include <boost/spirit/include/qi.hpp>
|
||||||
@ -37,22 +37,21 @@ struct TableParametersGrammar final : public BaseParametersGrammar<Iterator, Sig
|
|||||||
size_t_ = qi::ulong_;
|
size_t_ = qi::ulong_;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
destinations_rule
|
destinations_rule =
|
||||||
= qi::lit("destinations=")
|
qi::lit("destinations=") >
|
||||||
> (qi::lit("all") | (size_t_ % ';')[ph::bind(&engine::api::TableParameters::destinations, qi::_r1) = qi::_1])
|
(qi::lit("all") |
|
||||||
;
|
(size_t_ %
|
||||||
|
';')[ph::bind(&engine::api::TableParameters::destinations, qi::_r1) = qi::_1]);
|
||||||
|
|
||||||
sources_rule
|
sources_rule =
|
||||||
= qi::lit("sources=")
|
qi::lit("sources=") >
|
||||||
> (qi::lit("all") | (size_t_ % ';')[ph::bind(&engine::api::TableParameters::sources, qi::_r1) = qi::_1])
|
(qi::lit("all") |
|
||||||
;
|
(size_t_ % ';')[ph::bind(&engine::api::TableParameters::sources, qi::_r1) = qi::_1]);
|
||||||
|
|
||||||
table_rule = destinations_rule(qi::_r1) | sources_rule(qi::_r1);
|
table_rule = destinations_rule(qi::_r1) | sources_rule(qi::_r1);
|
||||||
|
|
||||||
root_rule
|
root_rule = BaseGrammar::query_rule(qi::_r1) > -qi::lit(".json") >
|
||||||
= BaseGrammar::query_rule(qi::_r1) > -qi::lit(".json")
|
-('?' > (table_rule(qi::_r1) | BaseGrammar::base_rule(qi::_r1)) % '&');
|
||||||
> -('?' > (table_rule(qi::_r1) | BaseGrammar::base_rule(qi::_r1)) % '&')
|
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -30,13 +30,11 @@ struct TileParametersGrammar final : boost::spirit::qi::grammar<Iterator, Signat
|
|||||||
{
|
{
|
||||||
TileParametersGrammar() : TileParametersGrammar::base_type(root_rule)
|
TileParametersGrammar() : TileParametersGrammar::base_type(root_rule)
|
||||||
{
|
{
|
||||||
root_rule
|
root_rule = qi::lit("tile(") >
|
||||||
= qi::lit("tile(")
|
qi::uint_[ph::bind(&engine::api::TileParameters::x, qi::_r1) = qi::_1] > ',' >
|
||||||
> qi::uint_[ph::bind(&engine::api::TileParameters::x, qi::_r1) = qi::_1] > ','
|
qi::uint_[ph::bind(&engine::api::TileParameters::y, qi::_r1) = qi::_1] > ',' >
|
||||||
> qi::uint_[ph::bind(&engine::api::TileParameters::y, qi::_r1) = qi::_1] > ','
|
qi::uint_[ph::bind(&engine::api::TileParameters::z, qi::_r1) = qi::_1] >
|
||||||
> qi::uint_[ph::bind(&engine::api::TileParameters::z, qi::_r1) = qi::_1]
|
qi::lit(").mvt");
|
||||||
> qi::lit(").mvt")
|
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef TRIP_PARAMETERS_GRAMMAR_HPP
|
#ifndef TRIP_PARAMETERS_GRAMMAR_HPP
|
||||||
#define TRIP_PARAMETERS_GRAMMAR_HPP
|
#define TRIP_PARAMETERS_GRAMMAR_HPP
|
||||||
|
|
||||||
#include "engine/api/trip_parameters.hpp"
|
|
||||||
#include "server/api/route_parameters_grammar.hpp"
|
#include "server/api/route_parameters_grammar.hpp"
|
||||||
|
#include "engine/api/trip_parameters.hpp"
|
||||||
|
|
||||||
#include <boost/spirit/include/qi.hpp>
|
#include <boost/spirit/include/qi.hpp>
|
||||||
|
|
||||||
@ -26,10 +26,8 @@ struct TripParametersGrammar final : public RouteParametersGrammar<Iterator, Sig
|
|||||||
|
|
||||||
TripParametersGrammar() : BaseGrammar(root_rule)
|
TripParametersGrammar() : BaseGrammar(root_rule)
|
||||||
{
|
{
|
||||||
root_rule
|
root_rule = BaseGrammar::query_rule(qi::_r1) > -qi::lit(".json") >
|
||||||
= BaseGrammar::query_rule(qi::_r1) > -qi::lit(".json")
|
-('?' > (BaseGrammar::base_rule(qi::_r1)) % '&');
|
||||||
> -('?' > (BaseGrammar::base_rule(qi::_r1)) % '&')
|
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef HEADER_HPP
|
#ifndef HEADER_HPP
|
||||||
#define HEADER_HPP
|
#define HEADER_HPP
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -14,15 +14,15 @@
|
|||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
#include <sys/types.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
#define SERVER_SERVICE_BASE_SERVICE_HPP
|
#define SERVER_SERVICE_BASE_SERVICE_HPP
|
||||||
|
|
||||||
#include "engine/status.hpp"
|
#include "engine/status.hpp"
|
||||||
#include "util/coordinate.hpp"
|
|
||||||
#include "osrm/osrm.hpp"
|
#include "osrm/osrm.hpp"
|
||||||
|
#include "util/coordinate.hpp"
|
||||||
|
|
||||||
#include <variant/variant.hpp>
|
#include <variant/variant.hpp>
|
||||||
|
|
||||||
@ -25,7 +25,8 @@ class BaseService
|
|||||||
BaseService(OSRM &routing_machine) : routing_machine(routing_machine) {}
|
BaseService(OSRM &routing_machine) : routing_machine(routing_machine) {}
|
||||||
virtual ~BaseService() = default;
|
virtual ~BaseService() = default;
|
||||||
|
|
||||||
virtual engine::Status RunQuery(std::size_t prefix_length, std::string &query, ResultT &result) = 0;
|
virtual engine::Status
|
||||||
|
RunQuery(std::size_t prefix_length, std::string &query, ResultT &result) = 0;
|
||||||
|
|
||||||
virtual unsigned GetVersion() = 0;
|
virtual unsigned GetVersion() = 0;
|
||||||
|
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
#include "server/service/base_service.hpp"
|
#include "server/service/base_service.hpp"
|
||||||
|
|
||||||
#include "engine/status.hpp"
|
#include "engine/status.hpp"
|
||||||
#include "util/coordinate.hpp"
|
|
||||||
#include "osrm/osrm.hpp"
|
#include "osrm/osrm.hpp"
|
||||||
|
#include "util/coordinate.hpp"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -22,7 +22,8 @@ class MatchService final : public BaseService
|
|||||||
public:
|
public:
|
||||||
MatchService(OSRM &routing_machine) : BaseService(routing_machine) {}
|
MatchService(OSRM &routing_machine) : BaseService(routing_machine) {}
|
||||||
|
|
||||||
engine::Status RunQuery(std::size_t prefix_length, std::string &query, ResultT &result) final override;
|
engine::Status
|
||||||
|
RunQuery(std::size_t prefix_length, std::string &query, ResultT &result) final override;
|
||||||
|
|
||||||
unsigned GetVersion() final override { return 1; }
|
unsigned GetVersion() final override { return 1; }
|
||||||
};
|
};
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
#include "server/service/base_service.hpp"
|
#include "server/service/base_service.hpp"
|
||||||
|
|
||||||
#include "engine/status.hpp"
|
#include "engine/status.hpp"
|
||||||
#include "util/coordinate.hpp"
|
|
||||||
#include "osrm/osrm.hpp"
|
#include "osrm/osrm.hpp"
|
||||||
|
#include "util/coordinate.hpp"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -22,7 +22,8 @@ class NearestService final : public BaseService
|
|||||||
public:
|
public:
|
||||||
NearestService(OSRM &routing_machine) : BaseService(routing_machine) {}
|
NearestService(OSRM &routing_machine) : BaseService(routing_machine) {}
|
||||||
|
|
||||||
engine::Status RunQuery(std::size_t prefix_length, std::string &query, ResultT &result) final override;
|
engine::Status
|
||||||
|
RunQuery(std::size_t prefix_length, std::string &query, ResultT &result) final override;
|
||||||
|
|
||||||
unsigned GetVersion() final override { return 1; }
|
unsigned GetVersion() final override { return 1; }
|
||||||
};
|
};
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
#include "server/service/base_service.hpp"
|
#include "server/service/base_service.hpp"
|
||||||
|
|
||||||
#include "engine/status.hpp"
|
#include "engine/status.hpp"
|
||||||
#include "util/coordinate.hpp"
|
|
||||||
#include "osrm/osrm.hpp"
|
#include "osrm/osrm.hpp"
|
||||||
|
#include "util/coordinate.hpp"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -22,7 +22,8 @@ class RouteService final : public BaseService
|
|||||||
public:
|
public:
|
||||||
RouteService(OSRM &routing_machine) : BaseService(routing_machine) {}
|
RouteService(OSRM &routing_machine) : BaseService(routing_machine) {}
|
||||||
|
|
||||||
engine::Status RunQuery(std::size_t prefix_length, std::string &query, ResultT &result) final override;
|
engine::Status
|
||||||
|
RunQuery(std::size_t prefix_length, std::string &query, ResultT &result) final override;
|
||||||
|
|
||||||
unsigned GetVersion() final override { return 1; }
|
unsigned GetVersion() final override { return 1; }
|
||||||
};
|
};
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
#include "server/service/base_service.hpp"
|
#include "server/service/base_service.hpp"
|
||||||
|
|
||||||
#include "engine/status.hpp"
|
#include "engine/status.hpp"
|
||||||
#include "util/coordinate.hpp"
|
|
||||||
#include "osrm/osrm.hpp"
|
#include "osrm/osrm.hpp"
|
||||||
|
#include "util/coordinate.hpp"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -22,7 +22,8 @@ class TableService final : public BaseService
|
|||||||
public:
|
public:
|
||||||
TableService(OSRM &routing_machine) : BaseService(routing_machine) {}
|
TableService(OSRM &routing_machine) : BaseService(routing_machine) {}
|
||||||
|
|
||||||
engine::Status RunQuery(std::size_t prefix_length, std::string &query, ResultT &result) final override;
|
engine::Status
|
||||||
|
RunQuery(std::size_t prefix_length, std::string &query, ResultT &result) final override;
|
||||||
|
|
||||||
unsigned GetVersion() final override { return 1; }
|
unsigned GetVersion() final override { return 1; }
|
||||||
};
|
};
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
#include "server/service/base_service.hpp"
|
#include "server/service/base_service.hpp"
|
||||||
|
|
||||||
#include "engine/status.hpp"
|
#include "engine/status.hpp"
|
||||||
#include "util/coordinate.hpp"
|
|
||||||
#include "osrm/osrm.hpp"
|
#include "osrm/osrm.hpp"
|
||||||
|
#include "util/coordinate.hpp"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -22,7 +22,8 @@ class TileService final : public BaseService
|
|||||||
public:
|
public:
|
||||||
TileService(OSRM &routing_machine) : BaseService(routing_machine) {}
|
TileService(OSRM &routing_machine) : BaseService(routing_machine) {}
|
||||||
|
|
||||||
engine::Status RunQuery(std::size_t prefix_length, std::string &query, ResultT &result) final override;
|
engine::Status
|
||||||
|
RunQuery(std::size_t prefix_length, std::string &query, ResultT &result) final override;
|
||||||
|
|
||||||
unsigned GetVersion() final override { return 1; }
|
unsigned GetVersion() final override { return 1; }
|
||||||
};
|
};
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
#include "server/service/base_service.hpp"
|
#include "server/service/base_service.hpp"
|
||||||
|
|
||||||
#include "engine/status.hpp"
|
#include "engine/status.hpp"
|
||||||
#include "util/coordinate.hpp"
|
|
||||||
#include "osrm/osrm.hpp"
|
#include "osrm/osrm.hpp"
|
||||||
|
#include "util/coordinate.hpp"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -22,7 +22,8 @@ class TripService final : public BaseService
|
|||||||
public:
|
public:
|
||||||
TripService(OSRM &routing_machine) : BaseService(routing_machine) {}
|
TripService(OSRM &routing_machine) : BaseService(routing_machine) {}
|
||||||
|
|
||||||
engine::Status RunQuery(std::size_t prefix_length, std::string &query, ResultT &result) final override;
|
engine::Status
|
||||||
|
RunQuery(std::size_t prefix_length, std::string &query, ResultT &result) final override;
|
||||||
|
|
||||||
unsigned GetVersion() final override { return 1; }
|
unsigned GetVersion() final override { return 1; }
|
||||||
};
|
};
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef SHARED_BARRIERS_HPP
|
#ifndef SHARED_BARRIERS_HPP
|
||||||
#define SHARED_BARRIERS_HPP
|
#define SHARED_BARRIERS_HPP
|
||||||
|
|
||||||
#include <boost/interprocess/sync/named_mutex.hpp>
|
|
||||||
#include <boost/interprocess/sync/named_condition.hpp>
|
#include <boost/interprocess/sync/named_condition.hpp>
|
||||||
|
#include <boost/interprocess/sync/named_mutex.hpp>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -104,8 +104,8 @@ class SharedMemory
|
|||||||
{
|
{
|
||||||
Remove(key);
|
Remove(key);
|
||||||
}
|
}
|
||||||
shm = boost::interprocess::xsi_shared_memory(boost::interprocess::open_or_create, key,
|
shm = boost::interprocess::xsi_shared_memory(
|
||||||
size);
|
boost::interprocess::open_or_create, key, size);
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
if (-1 == shmctl(shm.get_shmid(), SHM_LOCK, nullptr))
|
if (-1 == shmctl(shm.get_shmid(), SHM_LOCK, nullptr))
|
||||||
{
|
{
|
||||||
@ -236,7 +236,8 @@ class SharedMemory
|
|||||||
if (0 == size)
|
if (0 == size)
|
||||||
{ // read_only
|
{ // read_only
|
||||||
shm = boost::interprocess::shared_memory_object(
|
shm = boost::interprocess::shared_memory_object(
|
||||||
boost::interprocess::open_only, key,
|
boost::interprocess::open_only,
|
||||||
|
key,
|
||||||
read_write ? boost::interprocess::read_write : boost::interprocess::read_only);
|
read_write ? boost::interprocess::read_write : boost::interprocess::read_only);
|
||||||
region = boost::interprocess::mapped_region(
|
region = boost::interprocess::mapped_region(
|
||||||
shm, read_write ? boost::interprocess::read_write : boost::interprocess::read_only);
|
shm, read_write ? boost::interprocess::read_write : boost::interprocess::read_only);
|
||||||
@ -248,8 +249,8 @@ class SharedMemory
|
|||||||
{
|
{
|
||||||
Remove(key);
|
Remove(key);
|
||||||
}
|
}
|
||||||
shm = boost::interprocess::shared_memory_object(boost::interprocess::open_or_create,
|
shm = boost::interprocess::shared_memory_object(
|
||||||
key, boost::interprocess::read_write);
|
boost::interprocess::open_or_create, key, boost::interprocess::read_write);
|
||||||
shm.truncate(size);
|
shm.truncate(size);
|
||||||
region = boost::interprocess::mapped_region(shm, boost::interprocess::read_write);
|
region = boost::interprocess::mapped_region(shm, boost::interprocess::read_write);
|
||||||
|
|
||||||
@ -290,8 +291,8 @@ class SharedMemory
|
|||||||
bool result = true;
|
bool result = true;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
boost::interprocess::shared_memory_object shm(boost::interprocess::open_only, key,
|
boost::interprocess::shared_memory_object shm(
|
||||||
boost::interprocess::read_write);
|
boost::interprocess::open_only, key, boost::interprocess::read_write);
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
|
@ -96,7 +96,6 @@ inline double reverseBearing(const double bearing)
|
|||||||
return bearing - 180.;
|
return bearing - 180.;
|
||||||
return bearing + 180;
|
return bearing + 180;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#ifndef CAST_HPP
|
#ifndef CAST_HPP
|
||||||
#define CAST_HPP
|
#define CAST_HPP
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <sstream>
|
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
#include <boost/algorithm/string/classification.hpp>
|
#include <boost/algorithm/string/classification.hpp>
|
||||||
|
@ -32,10 +32,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include <boost/numeric/conversion/cast.hpp>
|
#include <boost/numeric/conversion/cast.hpp>
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
#include <iosfwd> //for std::ostream
|
#include <iosfwd> //for std::ostream
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cstddef>
|
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
@ -200,8 +200,10 @@ bool operator==(const FloatCoordinate lhs, const FloatCoordinate rhs);
|
|||||||
std::ostream &operator<<(std::ostream &out, const Coordinate coordinate);
|
std::ostream &operator<<(std::ostream &out, const Coordinate coordinate);
|
||||||
std::ostream &operator<<(std::ostream &out, const FloatCoordinate coordinate);
|
std::ostream &operator<<(std::ostream &out, const FloatCoordinate coordinate);
|
||||||
|
|
||||||
inline Coordinate::Coordinate(const FloatCoordinate &other) : Coordinate(toFixed(other.lon), toFixed(other.lat)) {}
|
inline Coordinate::Coordinate(const FloatCoordinate &other)
|
||||||
|
: Coordinate(toFixed(other.lon), toFixed(other.lat))
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,7 +23,6 @@ const constexpr long double RAD_TO_DEGREE = 1. / DEGREE_TO_RAD;
|
|||||||
const constexpr long double EARTH_RADIUS = 6372797.560856;
|
const constexpr long double EARTH_RADIUS = 6372797.560856;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! Takes the squared euclidean distance of the input coordinates. Does not return meters!
|
//! Takes the squared euclidean distance of the input coordinates. Does not return meters!
|
||||||
std::uint64_t squaredEuclideanDistance(const Coordinate lhs, const Coordinate rhs);
|
std::uint64_t squaredEuclideanDistance(const Coordinate lhs, const Coordinate rhs);
|
||||||
|
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
#ifndef DIST_TABLE_WRAPPER_H
|
#ifndef DIST_TABLE_WRAPPER_H
|
||||||
#define DIST_TABLE_WRAPPER_H
|
#define DIST_TABLE_WRAPPER_H
|
||||||
|
|
||||||
#include <vector>
|
#include <algorithm>
|
||||||
#include <utility>
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <algorithm>
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef FOR_EACH_PAIR_HPP
|
#ifndef FOR_EACH_PAIR_HPP
|
||||||
#define FOR_EACH_PAIR_HPP
|
#define FOR_EACH_PAIR_HPP
|
||||||
|
|
||||||
#include <numeric>
|
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <numeric>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
#ifndef GRAPH_LOADER_HPP
|
#ifndef GRAPH_LOADER_HPP
|
||||||
#define GRAPH_LOADER_HPP
|
#define GRAPH_LOADER_HPP
|
||||||
|
|
||||||
#include "util/fingerprint.hpp"
|
|
||||||
#include "util/exception.hpp"
|
|
||||||
#include "util/simple_logger.hpp"
|
|
||||||
#include "extractor/external_memory_node.hpp"
|
#include "extractor/external_memory_node.hpp"
|
||||||
#include "extractor/node_based_edge.hpp"
|
#include "extractor/node_based_edge.hpp"
|
||||||
#include "extractor/query_node.hpp"
|
#include "extractor/query_node.hpp"
|
||||||
#include "extractor/restriction.hpp"
|
#include "extractor/restriction.hpp"
|
||||||
|
#include "util/exception.hpp"
|
||||||
|
#include "util/fingerprint.hpp"
|
||||||
|
#include "util/simple_logger.hpp"
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
@ -121,9 +121,10 @@ NodeID loadEdgesFromFile(std::istream &input_stream,
|
|||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
SimpleLogger().Write() << "Validating loaded edges...";
|
SimpleLogger().Write() << "Validating loaded edges...";
|
||||||
tbb::parallel_sort(edge_list.begin(), edge_list.end(),
|
tbb::parallel_sort(
|
||||||
[](const extractor::NodeBasedEdge &lhs, const extractor::NodeBasedEdge &rhs)
|
edge_list.begin(),
|
||||||
{
|
edge_list.end(),
|
||||||
|
[](const extractor::NodeBasedEdge &lhs, const extractor::NodeBasedEdge &rhs) {
|
||||||
return (lhs.source < rhs.source) ||
|
return (lhs.source < rhs.source) ||
|
||||||
(lhs.source == rhs.source && lhs.target < rhs.target);
|
(lhs.source == rhs.source && lhs.target < rhs.target);
|
||||||
});
|
});
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
|
|
||||||
/* A set of tools required for guidance in both pre and post-processing */
|
/* A set of tools required for guidance in both pre and post-processing */
|
||||||
|
|
||||||
|
#include "extractor/guidance/turn_instruction.hpp"
|
||||||
#include "engine/guidance/route_step.hpp"
|
#include "engine/guidance/route_step.hpp"
|
||||||
#include "engine/phantom_node.hpp"
|
#include "engine/phantom_node.hpp"
|
||||||
#include "extractor/guidance/turn_instruction.hpp"
|
|
||||||
#include "util/guidance/bearing_class.hpp"
|
#include "util/guidance/bearing_class.hpp"
|
||||||
#include "util/guidance/entry_class.hpp"
|
#include "util/guidance/entry_class.hpp"
|
||||||
#include "util/simple_logger.hpp"
|
#include "util/simple_logger.hpp"
|
||||||
|
@ -33,10 +33,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include <variant/variant.hpp>
|
#include <variant/variant.hpp>
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef UTIL_JSON_DEEP_COMPARE_HPP
|
#ifndef UTIL_JSON_DEEP_COMPARE_HPP
|
||||||
#define UTIL_JSON_DEEP_COMPARE_HPP
|
#define UTIL_JSON_DEEP_COMPARE_HPP
|
||||||
|
|
||||||
#include "util/json_container.hpp"
|
|
||||||
#include "util/integer_range.hpp"
|
#include "util/integer_range.hpp"
|
||||||
|
#include "util/json_container.hpp"
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
|
|
||||||
@ -24,20 +24,24 @@ struct Comparator : mapbox::util::static_visitor<bool>
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator()(const String &lhs, const String &rhs) const {
|
bool operator()(const String &lhs, const String &rhs) const
|
||||||
|
{
|
||||||
bool is_same = lhs.value == rhs.value;
|
bool is_same = lhs.value == rhs.value;
|
||||||
if (!is_same)
|
if (!is_same)
|
||||||
{
|
{
|
||||||
reason = lhs_path + " (= \"" + lhs.value + "\") != " + rhs_path + " (= \"" + rhs.value + "\")";
|
reason = lhs_path + " (= \"" + lhs.value + "\") != " + rhs_path + " (= \"" + rhs.value +
|
||||||
|
"\")";
|
||||||
}
|
}
|
||||||
return is_same;
|
return is_same;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator()(const Number &lhs, const Number &rhs) const {
|
bool operator()(const Number &lhs, const Number &rhs) const
|
||||||
|
{
|
||||||
bool is_same = lhs.value == rhs.value;
|
bool is_same = lhs.value == rhs.value;
|
||||||
if (!is_same)
|
if (!is_same)
|
||||||
{
|
{
|
||||||
reason = lhs_path + " (= " + std::to_string(lhs.value) + ") != " + rhs_path + " (= " + std::to_string(rhs.value) + ")";
|
reason = lhs_path + " (= " + std::to_string(lhs.value) + ") != " + rhs_path + " (= " +
|
||||||
|
std::to_string(rhs.value) + ")";
|
||||||
}
|
}
|
||||||
return is_same;
|
return is_same;
|
||||||
}
|
}
|
||||||
@ -82,7 +86,8 @@ struct Comparator : mapbox::util::static_visitor<bool>
|
|||||||
const auto &rhs_child = rhs.values.find(key)->second;
|
const auto &rhs_child = rhs.values.find(key)->second;
|
||||||
const auto &lhs_child = lhs.values.find(key)->second;
|
const auto &lhs_child = lhs.values.find(key)->second;
|
||||||
auto is_same = mapbox::util::apply_visitor(
|
auto is_same = mapbox::util::apply_visitor(
|
||||||
Comparator(reason, lhs_path + "." + key, rhs_path + "." + key), lhs_child,
|
Comparator(reason, lhs_path + "." + key, rhs_path + "." + key),
|
||||||
|
lhs_child,
|
||||||
rhs_child);
|
rhs_child);
|
||||||
if (!is_same)
|
if (!is_same)
|
||||||
{
|
{
|
||||||
@ -103,10 +108,12 @@ struct Comparator : mapbox::util::static_visitor<bool>
|
|||||||
|
|
||||||
for (auto i = 0UL; i < lhs.values.size(); ++i)
|
for (auto i = 0UL; i < lhs.values.size(); ++i)
|
||||||
{
|
{
|
||||||
auto is_same = mapbox::util::apply_visitor(
|
auto is_same =
|
||||||
Comparator(reason, lhs_path + "[" + std::to_string(i) + "]",
|
mapbox::util::apply_visitor(Comparator(reason,
|
||||||
|
lhs_path + "[" + std::to_string(i) + "]",
|
||||||
rhs_path + "[" + std::to_string(i) + "]"),
|
rhs_path + "[" + std::to_string(i) + "]"),
|
||||||
lhs.values[i], rhs.values[i]);
|
lhs.values[i],
|
||||||
|
rhs.values[i]);
|
||||||
if (!is_same)
|
if (!is_same)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -148,8 +155,8 @@ struct Comparator : mapbox::util::static_visitor<bool>
|
|||||||
|
|
||||||
inline bool compare(const Value &reference, const Value &result, std::string &reason)
|
inline bool compare(const Value &reference, const Value &result, std::string &reason)
|
||||||
{
|
{
|
||||||
return mapbox::util::apply_visitor(Comparator(reason, "reference", "result"), reference,
|
return mapbox::util::apply_visitor(
|
||||||
result);
|
Comparator(reason, "reference", "result"), reference, result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,10 +9,10 @@
|
|||||||
|
|
||||||
#include "osrm/json_container.hpp"
|
#include "osrm/json_container.hpp"
|
||||||
|
|
||||||
#include <ostream>
|
|
||||||
#include <vector>
|
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <ostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
#define LUA_UTIL_HPP
|
#define LUA_UTIL_HPP
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include <lua.h>
|
|
||||||
#include <lauxlib.h>
|
#include <lauxlib.h>
|
||||||
|
#include <lua.h>
|
||||||
#include <lualib.h>
|
#include <lualib.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#ifndef MATRIX_GRAPH_WRAPPER_H
|
#ifndef MATRIX_GRAPH_WRAPPER_H
|
||||||
#define MATRIX_GRAPH_WRAPPER_H
|
#define MATRIX_GRAPH_WRAPPER_H
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
@ -20,7 +20,9 @@ template <typename T> class MatrixGraphWrapper
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MatrixGraphWrapper(std::vector<T> table, const std::size_t number_of_nodes)
|
MatrixGraphWrapper(std::vector<T> table, const std::size_t number_of_nodes)
|
||||||
: table_(std::move(table)), number_of_nodes_(number_of_nodes){}
|
: table_(std::move(table)), number_of_nodes_(number_of_nodes)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
std::size_t GetNumberOfNodes() const { return number_of_nodes_; }
|
std::size_t GetNumberOfNodes() const { return number_of_nodes_; }
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
#ifndef NODE_BASED_GRAPH_HPP
|
#ifndef NODE_BASED_GRAPH_HPP
|
||||||
#define NODE_BASED_GRAPH_HPP
|
#define NODE_BASED_GRAPH_HPP
|
||||||
|
|
||||||
#include "util/dynamic_graph.hpp"
|
|
||||||
#include "extractor/node_based_edge.hpp"
|
|
||||||
#include "util/graph_utils.hpp"
|
|
||||||
#include "extractor/guidance/classification_data.hpp"
|
#include "extractor/guidance/classification_data.hpp"
|
||||||
|
#include "extractor/node_based_edge.hpp"
|
||||||
|
#include "util/dynamic_graph.hpp"
|
||||||
|
#include "util/graph_utils.hpp"
|
||||||
|
|
||||||
#include <tbb/parallel_sort.h>
|
#include <tbb/parallel_sort.h>
|
||||||
|
|
||||||
@ -68,9 +68,9 @@ NodeBasedDynamicGraphFromEdges(std::size_t number_of_nodes,
|
|||||||
const std::vector<extractor::NodeBasedEdge> &input_edge_list)
|
const std::vector<extractor::NodeBasedEdge> &input_edge_list)
|
||||||
{
|
{
|
||||||
auto edges_list = directedEdgesFromCompressed<NodeBasedDynamicGraph::InputEdge>(
|
auto edges_list = directedEdgesFromCompressed<NodeBasedDynamicGraph::InputEdge>(
|
||||||
input_edge_list, [](NodeBasedDynamicGraph::InputEdge &output_edge,
|
input_edge_list,
|
||||||
const extractor::NodeBasedEdge &input_edge)
|
[](NodeBasedDynamicGraph::InputEdge &output_edge,
|
||||||
{
|
const extractor::NodeBasedEdge &input_edge) {
|
||||||
output_edge.data.distance = static_cast<int>(input_edge.weight);
|
output_edge.data.distance = static_cast<int>(input_edge.weight);
|
||||||
BOOST_ASSERT(output_edge.data.distance > 0);
|
BOOST_ASSERT(output_edge.data.distance > 0);
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#ifndef PERCENT_HPP
|
#ifndef PERCENT_HPP
|
||||||
#define PERCENT_HPP
|
#define PERCENT_HPP
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -7,10 +7,10 @@
|
|||||||
|
|
||||||
#include "osrm/coordinate.hpp"
|
#include "osrm/coordinate.hpp"
|
||||||
|
|
||||||
#include <iomanip>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <utility>
|
#include <iomanip>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
@ -136,20 +136,20 @@ struct RectangleInt2D
|
|||||||
location, Coordinate(max_lon, location.lat));
|
location, Coordinate(max_lon, location.lat));
|
||||||
break;
|
break;
|
||||||
case NORTH_EAST:
|
case NORTH_EAST:
|
||||||
min_dist =
|
min_dist = coordinate_calculation::squaredEuclideanDistance(
|
||||||
coordinate_calculation::squaredEuclideanDistance(location, Coordinate(max_lon, max_lat));
|
location, Coordinate(max_lon, max_lat));
|
||||||
break;
|
break;
|
||||||
case NORTH_WEST:
|
case NORTH_WEST:
|
||||||
min_dist =
|
min_dist = coordinate_calculation::squaredEuclideanDistance(
|
||||||
coordinate_calculation::squaredEuclideanDistance(location, Coordinate(min_lon, max_lat));
|
location, Coordinate(min_lon, max_lat));
|
||||||
break;
|
break;
|
||||||
case SOUTH_EAST:
|
case SOUTH_EAST:
|
||||||
min_dist =
|
min_dist = coordinate_calculation::squaredEuclideanDistance(
|
||||||
coordinate_calculation::squaredEuclideanDistance(location, Coordinate(max_lon, min_lat));
|
location, Coordinate(max_lon, min_lat));
|
||||||
break;
|
break;
|
||||||
case SOUTH_WEST:
|
case SOUTH_WEST:
|
||||||
min_dist =
|
min_dist = coordinate_calculation::squaredEuclideanDistance(
|
||||||
coordinate_calculation::squaredEuclideanDistance(location, Coordinate(min_lon, min_lat));
|
location, Coordinate(min_lon, min_lat));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -8,8 +8,8 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <vector>
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#ifndef STATIC_GRAPH_HPP
|
#ifndef STATIC_GRAPH_HPP
|
||||||
#define STATIC_GRAPH_HPP
|
#define STATIC_GRAPH_HPP
|
||||||
|
|
||||||
|
#include "util/integer_range.hpp"
|
||||||
#include "util/percent.hpp"
|
#include "util/percent.hpp"
|
||||||
#include "util/shared_memory_vector_wrapper.hpp"
|
#include "util/shared_memory_vector_wrapper.hpp"
|
||||||
#include "util/integer_range.hpp"
|
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
#ifndef STATIC_RTREE_HPP
|
#ifndef STATIC_RTREE_HPP
|
||||||
#define STATIC_RTREE_HPP
|
#define STATIC_RTREE_HPP
|
||||||
|
|
||||||
|
#include "util/bearing.hpp"
|
||||||
|
#include "util/coordinate_calculation.hpp"
|
||||||
#include "util/deallocating_vector.hpp"
|
#include "util/deallocating_vector.hpp"
|
||||||
|
#include "util/exception.hpp"
|
||||||
#include "util/hilbert_value.hpp"
|
#include "util/hilbert_value.hpp"
|
||||||
|
#include "util/integer_range.hpp"
|
||||||
#include "util/rectangle.hpp"
|
#include "util/rectangle.hpp"
|
||||||
#include "util/shared_memory_vector_wrapper.hpp"
|
#include "util/shared_memory_vector_wrapper.hpp"
|
||||||
#include "util/bearing.hpp"
|
|
||||||
#include "util/exception.hpp"
|
|
||||||
#include "util/integer_range.hpp"
|
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
#include "util/coordinate_calculation.hpp"
|
|
||||||
#include "util/web_mercator.hpp"
|
#include "util/web_mercator.hpp"
|
||||||
|
|
||||||
#include "osrm/coordinate.hpp"
|
#include "osrm/coordinate.hpp"
|
||||||
@ -52,9 +52,12 @@ class StaticRTree
|
|||||||
using EdgeData = EdgeDataT;
|
using EdgeData = EdgeDataT;
|
||||||
using CoordinateList = CoordinateListT;
|
using CoordinateList = CoordinateListT;
|
||||||
|
|
||||||
static_assert(LEAF_PAGE_SIZE >= sizeof(uint32_t) + sizeof(EdgeDataT), "LEAF_PAGE_SIZE is too small");
|
static_assert(LEAF_PAGE_SIZE >= sizeof(uint32_t) + sizeof(EdgeDataT),
|
||||||
static_assert(((LEAF_PAGE_SIZE - 1) & LEAF_PAGE_SIZE) == 0, "LEAF_PAGE_SIZE is not a power of 2");
|
"LEAF_PAGE_SIZE is too small");
|
||||||
static constexpr std::uint32_t LEAF_NODE_SIZE = (LEAF_PAGE_SIZE - sizeof(uint32_t)) / sizeof(EdgeDataT);
|
static_assert(((LEAF_PAGE_SIZE - 1) & LEAF_PAGE_SIZE) == 0,
|
||||||
|
"LEAF_PAGE_SIZE is not a power of 2");
|
||||||
|
static constexpr std::uint32_t LEAF_NODE_SIZE =
|
||||||
|
(LEAF_PAGE_SIZE - sizeof(uint32_t)) / sizeof(EdgeDataT);
|
||||||
|
|
||||||
struct CandidateSegment
|
struct CandidateSegment
|
||||||
{
|
{
|
||||||
@ -76,7 +79,8 @@ class StaticRTree
|
|||||||
LeafNode() : object_count(0), objects() {}
|
LeafNode() : object_count(0), objects() {}
|
||||||
std::uint32_t object_count;
|
std::uint32_t object_count;
|
||||||
std::array<EdgeDataT, LEAF_NODE_SIZE> objects;
|
std::array<EdgeDataT, LEAF_NODE_SIZE> objects;
|
||||||
unsigned char leaf_page_padding[LEAF_PAGE_SIZE - sizeof(std::uint32_t) - sizeof(std::array<EdgeDataT, LEAF_NODE_SIZE>)];
|
unsigned char leaf_page_padding[LEAF_PAGE_SIZE - sizeof(std::uint32_t) -
|
||||||
|
sizeof(std::array<EdgeDataT, LEAF_NODE_SIZE>)];
|
||||||
};
|
};
|
||||||
static_assert(sizeof(LeafNode) == LEAF_PAGE_SIZE, "LeafNode size does not fit the page size");
|
static_assert(sizeof(LeafNode) == LEAF_PAGE_SIZE, "LeafNode size does not fit the page size");
|
||||||
|
|
||||||
@ -100,8 +104,16 @@ class StaticRTree
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TreeIndex { std::uint32_t index; };
|
struct TreeIndex
|
||||||
struct SegmentIndex { std::uint32_t index; std::uint32_t object; Coordinate fixed_projected_coordinate; };
|
{
|
||||||
|
std::uint32_t index;
|
||||||
|
};
|
||||||
|
struct SegmentIndex
|
||||||
|
{
|
||||||
|
std::uint32_t index;
|
||||||
|
std::uint32_t object;
|
||||||
|
Coordinate fixed_projected_coordinate;
|
||||||
|
};
|
||||||
using QueryNodeType = mapbox::util::variant<TreeIndex, SegmentIndex>;
|
using QueryNodeType = mapbox::util::variant<TreeIndex, SegmentIndex>;
|
||||||
struct QueryCandidate
|
struct QueryCandidate
|
||||||
{
|
{
|
||||||
@ -140,11 +152,11 @@ class StaticRTree
|
|||||||
// generate auxiliary vector of hilbert-values
|
// generate auxiliary vector of hilbert-values
|
||||||
tbb::parallel_for(
|
tbb::parallel_for(
|
||||||
tbb::blocked_range<uint64_t>(0, element_count),
|
tbb::blocked_range<uint64_t>(0, element_count),
|
||||||
[&input_data_vector, &input_wrapper_vector,
|
[&input_data_vector, &input_wrapper_vector, this](
|
||||||
this](const tbb::blocked_range<uint64_t> &range)
|
const tbb::blocked_range<uint64_t> &range) {
|
||||||
{
|
|
||||||
for (uint64_t element_counter = range.begin(), end = range.end();
|
for (uint64_t element_counter = range.begin(), end = range.end();
|
||||||
element_counter != end; ++element_counter)
|
element_counter != end;
|
||||||
|
++element_counter)
|
||||||
{
|
{
|
||||||
WrappedInputElement ¤t_wrapper = input_wrapper_vector[element_counter];
|
WrappedInputElement ¤t_wrapper = input_wrapper_vector[element_counter];
|
||||||
current_wrapper.m_array_index = element_counter;
|
current_wrapper.m_array_index = element_counter;
|
||||||
@ -194,8 +206,10 @@ class StaticRTree
|
|||||||
}
|
}
|
||||||
|
|
||||||
// generate tree node that resemble the objects in leaf and store it for next level
|
// generate tree node that resemble the objects in leaf and store it for next level
|
||||||
InitializeMBRectangle(current_node.minimum_bounding_rectangle, current_leaf.objects,
|
InitializeMBRectangle(current_node.minimum_bounding_rectangle,
|
||||||
current_leaf.object_count, m_coordinate_list);
|
current_leaf.objects,
|
||||||
|
current_leaf.object_count,
|
||||||
|
m_coordinate_list);
|
||||||
current_node.child_is_on_disk = true;
|
current_node.child_is_on_disk = true;
|
||||||
current_node.children[0] = tree_nodes_in_level.size();
|
current_node.children[0] = tree_nodes_in_level.size();
|
||||||
tree_nodes_in_level.emplace_back(current_node);
|
tree_nodes_in_level.emplace_back(current_node);
|
||||||
@ -217,7 +231,8 @@ class StaticRTree
|
|||||||
TreeNode parent_node;
|
TreeNode parent_node;
|
||||||
// pack BRANCHING_FACTOR elements into tree_nodes each
|
// pack BRANCHING_FACTOR elements into tree_nodes each
|
||||||
for (std::uint32_t current_child_node_index = 0;
|
for (std::uint32_t current_child_node_index = 0;
|
||||||
BRANCHING_FACTOR > current_child_node_index; ++current_child_node_index)
|
BRANCHING_FACTOR > current_child_node_index;
|
||||||
|
++current_child_node_index)
|
||||||
{
|
{
|
||||||
if (processed_tree_nodes_in_level < tree_nodes_in_level.size())
|
if (processed_tree_nodes_in_level < tree_nodes_in_level.size())
|
||||||
{
|
{
|
||||||
@ -247,11 +262,10 @@ class StaticRTree
|
|||||||
std::reverse(m_search_tree.begin(), m_search_tree.end());
|
std::reverse(m_search_tree.begin(), m_search_tree.end());
|
||||||
|
|
||||||
std::uint32_t search_tree_size = m_search_tree.size();
|
std::uint32_t search_tree_size = m_search_tree.size();
|
||||||
tbb::parallel_for(tbb::blocked_range<std::uint32_t>(0, search_tree_size),
|
tbb::parallel_for(
|
||||||
[this, &search_tree_size](const tbb::blocked_range<std::uint32_t> &range)
|
tbb::blocked_range<std::uint32_t>(0, search_tree_size),
|
||||||
{
|
[this, &search_tree_size](const tbb::blocked_range<std::uint32_t> &range) {
|
||||||
for (std::uint32_t i = range.begin(), end = range.end(); i != end;
|
for (std::uint32_t i = range.begin(), end = range.end(); i != end; ++i)
|
||||||
++i)
|
|
||||||
{
|
{
|
||||||
TreeNode ¤t_tree_node = this->m_search_tree[i];
|
TreeNode ¤t_tree_node = this->m_search_tree[i];
|
||||||
for (std::uint32_t j = 0; j < current_tree_node.child_count; ++j)
|
for (std::uint32_t j = 0; j < current_tree_node.child_count; ++j)
|
||||||
@ -306,8 +320,7 @@ class StaticRTree
|
|||||||
const uint64_t number_of_nodes,
|
const uint64_t number_of_nodes,
|
||||||
const boost::filesystem::path &leaf_file,
|
const boost::filesystem::path &leaf_file,
|
||||||
const CoordinateListT &coordinate_list)
|
const CoordinateListT &coordinate_list)
|
||||||
: m_search_tree(tree_node_ptr, number_of_nodes)
|
: m_search_tree(tree_node_ptr, number_of_nodes), m_coordinate_list(coordinate_list)
|
||||||
, m_coordinate_list(coordinate_list)
|
|
||||||
{
|
{
|
||||||
MapLeafNodesFile(leaf_file);
|
MapLeafNodesFile(leaf_file);
|
||||||
}
|
}
|
||||||
@ -315,12 +328,16 @@ class StaticRTree
|
|||||||
void MapLeafNodesFile(const boost::filesystem::path &leaf_file)
|
void MapLeafNodesFile(const boost::filesystem::path &leaf_file)
|
||||||
{
|
{
|
||||||
// open leaf node file and return a pointer to the mapped leaves data
|
// open leaf node file and return a pointer to the mapped leaves data
|
||||||
try {
|
try
|
||||||
|
{
|
||||||
m_leaves_region.open(leaf_file);
|
m_leaves_region.open(leaf_file);
|
||||||
std::size_t num_leaves = m_leaves_region.size() / sizeof(LeafNode);
|
std::size_t num_leaves = m_leaves_region.size() / sizeof(LeafNode);
|
||||||
m_leaves.reset(reinterpret_cast<const LeafNode *>(m_leaves_region.data()), num_leaves);
|
m_leaves.reset(reinterpret_cast<const LeafNode *>(m_leaves_region.data()), num_leaves);
|
||||||
} catch (std::exception& exc) {
|
}
|
||||||
throw exception(boost::str(boost::format("Leaf file %1% mapping failed: %2%") % leaf_file % exc.what()));
|
catch (std::exception &exc)
|
||||||
|
{
|
||||||
|
throw exception(boost::str(boost::format("Leaf file %1% mapping failed: %2%") %
|
||||||
|
leaf_file % exc.what()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -329,7 +346,8 @@ class StaticRTree
|
|||||||
std::vector<EdgeDataT> SearchInBox(const Rectangle &search_rectangle) const
|
std::vector<EdgeDataT> SearchInBox(const Rectangle &search_rectangle) const
|
||||||
{
|
{
|
||||||
const Rectangle projected_rectangle{
|
const Rectangle projected_rectangle{
|
||||||
search_rectangle.min_lon, search_rectangle.max_lon,
|
search_rectangle.min_lon,
|
||||||
|
search_rectangle.max_lon,
|
||||||
toFixed(FloatLatitude{
|
toFixed(FloatLatitude{
|
||||||
web_mercator::latToY(toFloating(FixedLatitude(search_rectangle.min_lat)))}),
|
web_mercator::latToY(toFloating(FixedLatitude(search_rectangle.min_lat)))}),
|
||||||
toFixed(FloatLatitude{
|
toFixed(FloatLatitude{
|
||||||
@ -391,23 +409,21 @@ class StaticRTree
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Override filter and terminator for the desired behaviour.
|
// Override filter and terminator for the desired behaviour.
|
||||||
std::vector<EdgeDataT> Nearest(const Coordinate input_coordinate, const std::size_t max_results) const
|
std::vector<EdgeDataT> Nearest(const Coordinate input_coordinate,
|
||||||
|
const std::size_t max_results) const
|
||||||
{
|
{
|
||||||
return Nearest(input_coordinate,
|
return Nearest(input_coordinate,
|
||||||
[](const CandidateSegment &)
|
[](const CandidateSegment &) { return std::make_pair(true, true); },
|
||||||
{
|
[max_results](const std::size_t num_results, const CandidateSegment &) {
|
||||||
return std::make_pair(true, true);
|
|
||||||
},
|
|
||||||
[max_results](const std::size_t num_results, const CandidateSegment &)
|
|
||||||
{
|
|
||||||
return num_results >= max_results;
|
return num_results >= max_results;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Override filter and terminator for the desired behaviour.
|
// Override filter and terminator for the desired behaviour.
|
||||||
template <typename FilterT, typename TerminationT>
|
template <typename FilterT, typename TerminationT>
|
||||||
std::vector<EdgeDataT>
|
std::vector<EdgeDataT> Nearest(const Coordinate input_coordinate,
|
||||||
Nearest(const Coordinate input_coordinate, const FilterT filter, const TerminationT terminate) const
|
const FilterT filter,
|
||||||
|
const TerminationT terminate) const
|
||||||
{
|
{
|
||||||
std::vector<EdgeDataT> results;
|
std::vector<EdgeDataT> results;
|
||||||
auto projected_coordinate = web_mercator::fromWGS84(input_coordinate);
|
auto projected_coordinate = web_mercator::fromWGS84(input_coordinate);
|
||||||
@ -428,8 +444,10 @@ class StaticRTree
|
|||||||
m_search_tree[current_query_node.node.template get<TreeIndex>().index];
|
m_search_tree[current_query_node.node.template get<TreeIndex>().index];
|
||||||
if (current_tree_node.child_is_on_disk)
|
if (current_tree_node.child_is_on_disk)
|
||||||
{
|
{
|
||||||
ExploreLeafNode(current_tree_node.children[0], fixed_projected_coordinate,
|
ExploreLeafNode(current_tree_node.children[0],
|
||||||
projected_coordinate, traversal_queue);
|
fixed_projected_coordinate,
|
||||||
|
projected_coordinate,
|
||||||
|
traversal_queue);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -441,10 +459,13 @@ class StaticRTree
|
|||||||
// inspecting an actual road segment
|
// inspecting an actual road segment
|
||||||
const auto &segment_index = current_query_node.node.template get<SegmentIndex>();
|
const auto &segment_index = current_query_node.node.template get<SegmentIndex>();
|
||||||
auto edge_data = m_leaves[segment_index.index].objects[segment_index.object];
|
auto edge_data = m_leaves[segment_index.index].objects[segment_index.object];
|
||||||
const auto ¤t_candidate = CandidateSegment{segment_index.fixed_projected_coordinate, edge_data};
|
const auto ¤t_candidate =
|
||||||
|
CandidateSegment{segment_index.fixed_projected_coordinate, edge_data};
|
||||||
|
|
||||||
// to allow returns of no-results if too restrictive filtering, this needs to be done here
|
// to allow returns of no-results if too restrictive filtering, this needs to be
|
||||||
// even though performance would indicate that we want to stop after adding the first candidate
|
// done here
|
||||||
|
// even though performance would indicate that we want to stop after adding the
|
||||||
|
// first candidate
|
||||||
if (terminate(results.size(), current_candidate))
|
if (terminate(results.size(), current_candidate))
|
||||||
{
|
{
|
||||||
traversal_queue = std::priority_queue<QueryCandidate>{};
|
traversal_queue = std::priority_queue<QueryCandidate>{};
|
||||||
@ -485,14 +506,15 @@ class StaticRTree
|
|||||||
|
|
||||||
FloatCoordinate projected_nearest;
|
FloatCoordinate projected_nearest;
|
||||||
std::tie(std::ignore, projected_nearest) =
|
std::tie(std::ignore, projected_nearest) =
|
||||||
coordinate_calculation::projectPointOnSegment(projected_u, projected_v,
|
coordinate_calculation::projectPointOnSegment(
|
||||||
projected_input_coordinate);
|
projected_u, projected_v, projected_input_coordinate);
|
||||||
|
|
||||||
const auto squared_distance = coordinate_calculation::squaredEuclideanDistance(
|
const auto squared_distance = coordinate_calculation::squaredEuclideanDistance(
|
||||||
projected_input_coordinate_fixed, projected_nearest);
|
projected_input_coordinate_fixed, projected_nearest);
|
||||||
// distance must be non-negative
|
// distance must be non-negative
|
||||||
BOOST_ASSERT(0. <= squared_distance);
|
BOOST_ASSERT(0. <= squared_distance);
|
||||||
traversal_queue.push(QueryCandidate{squared_distance, SegmentIndex{leaf_id, i, Coordinate{projected_nearest}}});
|
traversal_queue.push(QueryCandidate{
|
||||||
|
squared_distance, SegmentIndex{leaf_id, i, Coordinate{projected_nearest}}});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -508,8 +530,8 @@ class StaticRTree
|
|||||||
const auto &child_rectangle = child_tree_node.minimum_bounding_rectangle;
|
const auto &child_rectangle = child_tree_node.minimum_bounding_rectangle;
|
||||||
const auto squared_lower_bound_to_element =
|
const auto squared_lower_bound_to_element =
|
||||||
child_rectangle.GetMinSquaredDist(fixed_projected_input_coordinate);
|
child_rectangle.GetMinSquaredDist(fixed_projected_input_coordinate);
|
||||||
traversal_queue.push(
|
traversal_queue.push(QueryCandidate{squared_lower_bound_to_element,
|
||||||
QueryCandidate{squared_lower_bound_to_element, TreeIndex{static_cast<std::uint32_t>(child_id)}});
|
TreeIndex{static_cast<std::uint32_t>(child_id)}});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,8 +20,7 @@ template <int length, int precision> char *printInt(char *buffer, int value)
|
|||||||
static_assert(length > 0, "length must be positive");
|
static_assert(length > 0, "length must be positive");
|
||||||
static_assert(precision > 0, "precision must be positive");
|
static_assert(precision > 0, "precision must be positive");
|
||||||
|
|
||||||
const bool minus = [&value]
|
const bool minus = [&value] {
|
||||||
{
|
|
||||||
if (value >= 0)
|
if (value >= 0)
|
||||||
{
|
{
|
||||||
value = -value;
|
value = -value;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user