add support for visualising turn penalties in MLD Debug tiles (#4157)
- template function for tile functionality with edge finder operator - refactors unit tests into single function (reduce code duplication) - adds unit tests for core-ch
This commit is contained in:
parent
35550d8c0a
commit
f80e5db346
@ -18,6 +18,8 @@
|
|||||||
- .osrm.nodes file was renamed to .nbg_nodes and .ebg_nodes was added
|
- .osrm.nodes file was renamed to .nbg_nodes and .ebg_nodes was added
|
||||||
- Guidance
|
- Guidance
|
||||||
- #4075 Changed counting of exits on service roundabouts
|
- #4075 Changed counting of exits on service roundabouts
|
||||||
|
- Debug Tiles
|
||||||
|
- added support for visualising turn penalties to the MLD plugin
|
||||||
- Bugfixes
|
- Bugfixes
|
||||||
- Fixed a copy/paste issue assigning wrong directions in similar turns (left over right)
|
- Fixed a copy/paste issue assigning wrong directions in similar turns (left over right)
|
||||||
- #4074: fixed a bug that would announce entering highway ramps as u-turns
|
- #4074: fixed a bug that would announce entering highway ramps as u-turns
|
||||||
|
@ -102,6 +102,9 @@ template <> struct HasShortestPathSearch<mld::Algorithm> final : std::true_type
|
|||||||
template <> struct HasMapMatching<mld::Algorithm> final : std::true_type
|
template <> struct HasMapMatching<mld::Algorithm> final : std::true_type
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
template <> struct HasGetTileTurns<mld::Algorithm> final : std::true_type
|
||||||
|
{
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -221,15 +221,6 @@ RoutingAlgorithms<routing_algorithms::mld::Algorithm>::ManyToManySearch(
|
|||||||
{
|
{
|
||||||
throw util::exception("ManyToManySearch is not implemented");
|
throw util::exception("ManyToManySearch is not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
template <>
|
|
||||||
inline std::vector<routing_algorithms::TurnData>
|
|
||||||
RoutingAlgorithms<routing_algorithms::mld::Algorithm>::GetTileTurns(
|
|
||||||
const std::vector<datafacade::BaseDataFacade::RTreeLeaf> &,
|
|
||||||
const std::vector<std::size_t> &) const
|
|
||||||
{
|
|
||||||
throw util::exception("GetTileTurns is not implemented");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,6 +33,11 @@ getTileTurns(const datafacade::ContiguousInternalMemoryDataFacade<ch::Algorithm>
|
|||||||
const std::vector<RTreeLeaf> &edges,
|
const std::vector<RTreeLeaf> &edges,
|
||||||
const std::vector<std::size_t> &sorted_edge_indexes);
|
const std::vector<std::size_t> &sorted_edge_indexes);
|
||||||
|
|
||||||
|
std::vector<TurnData>
|
||||||
|
getTileTurns(const datafacade::ContiguousInternalMemoryDataFacade<mld::Algorithm> &facade,
|
||||||
|
const std::vector<RTreeLeaf> &edges,
|
||||||
|
const std::vector<std::size_t> &sorted_edge_indexes);
|
||||||
|
|
||||||
} // namespace routing_algorithms
|
} // namespace routing_algorithms
|
||||||
} // namespace engine
|
} // namespace engine
|
||||||
} // namespace osrm
|
} // namespace osrm
|
||||||
|
@ -7,31 +7,33 @@ namespace engine
|
|||||||
namespace routing_algorithms
|
namespace routing_algorithms
|
||||||
{
|
{
|
||||||
|
|
||||||
std::vector<TurnData>
|
namespace
|
||||||
getTileTurns(const datafacade::ContiguousInternalMemoryDataFacade<ch::Algorithm> &facade,
|
|
||||||
const std::vector<RTreeLeaf> &edges,
|
|
||||||
const std::vector<std::size_t> &sorted_edge_indexes)
|
|
||||||
{
|
{
|
||||||
std::vector<TurnData> all_turn_data;
|
// Struct to hold info on all the EdgeBasedNodes that are visible in our tile
|
||||||
|
// When we create these, we insure that (source, target) and packed_geometry_id
|
||||||
|
// are all pointed in the same direction.
|
||||||
|
struct EdgeBasedNodeInfo
|
||||||
|
{
|
||||||
|
bool is_geometry_forward; // Is the geometry forward or reverse?
|
||||||
|
unsigned packed_geometry_id;
|
||||||
|
};
|
||||||
|
|
||||||
// Struct to hold info on all the EdgeBasedNodes that are visible in our tile
|
struct SegmentData
|
||||||
// When we create these, we insure that (source, target) and packed_geometry_id
|
{
|
||||||
// are all pointed in the same direction.
|
NodeID target_node;
|
||||||
struct EdgeBasedNodeInfo
|
EdgeID edge_based_node_id;
|
||||||
{
|
};
|
||||||
bool is_geometry_forward; // Is the geometry forward or reverse?
|
|
||||||
unsigned packed_geometry_id;
|
template <typename edge_extractor, typename datafacade>
|
||||||
};
|
std::vector<TurnData> generateTurns(const datafacade &facade,
|
||||||
|
const std::vector<RTreeLeaf> &edges,
|
||||||
|
const std::vector<std::size_t> &sorted_edge_indexes,
|
||||||
|
edge_extractor const &find_edge)
|
||||||
|
{
|
||||||
// Lookup table for edge-based-nodes
|
// Lookup table for edge-based-nodes
|
||||||
std::unordered_map<NodeID, EdgeBasedNodeInfo> edge_based_node_info;
|
std::unordered_map<NodeID, EdgeBasedNodeInfo> edge_based_node_info;
|
||||||
|
|
||||||
struct SegmentData
|
|
||||||
{
|
|
||||||
NodeID target_node;
|
|
||||||
EdgeID edge_based_node_id;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::unordered_map<NodeID, std::vector<SegmentData>> directed_graph;
|
std::unordered_map<NodeID, std::vector<SegmentData>> directed_graph;
|
||||||
|
|
||||||
// Reserve enough space for unique edge-based-nodes on every edge.
|
// Reserve enough space for unique edge-based-nodes on every edge.
|
||||||
// Only a tile with all unique edges will use this much, but
|
// Only a tile with all unique edges will use this much, but
|
||||||
// it saves us a bunch of re-allocations during iteration.
|
// it saves us a bunch of re-allocations during iteration.
|
||||||
@ -41,8 +43,10 @@ getTileTurns(const datafacade::ContiguousInternalMemoryDataFacade<ch::Algorithm>
|
|||||||
return facade.GetGeometryIndex(edge.forward_segment_id.id).id;
|
return facade.GetGeometryIndex(edge.forward_segment_id.id).id;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Build an adjacency list for all the road segments visible in
|
// To build a tile, we can only rely on the r-tree to quickly find all data visible within the
|
||||||
// the tile
|
// tile itself. The Rtree returns a series of segments that may or may not offer turns
|
||||||
|
// associated with them. To be able to extract turn penalties, we extract a node based graph
|
||||||
|
// from our edge based representation.
|
||||||
for (const auto &edge_index : sorted_edge_indexes)
|
for (const auto &edge_index : sorted_edge_indexes)
|
||||||
{
|
{
|
||||||
const auto &edge = edges[edge_index];
|
const auto &edge = edges[edge_index];
|
||||||
@ -79,28 +83,32 @@ getTileTurns(const datafacade::ContiguousInternalMemoryDataFacade<ch::Algorithm>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make sure we traverse the startnodes in a consistent order
|
||||||
|
// to ensure identical PBF encoding on all platforms.
|
||||||
|
std::vector<NodeID> sorted_startnodes;
|
||||||
|
sorted_startnodes.reserve(directed_graph.size());
|
||||||
|
std::transform(directed_graph.begin(),
|
||||||
|
directed_graph.end(),
|
||||||
|
std::back_inserter(sorted_startnodes),
|
||||||
|
[](auto const &node) { return node.first; });
|
||||||
|
std::sort(sorted_startnodes.begin(), sorted_startnodes.end());
|
||||||
|
|
||||||
|
std::vector<TurnData> all_turn_data;
|
||||||
|
|
||||||
// Given a turn:
|
// Given a turn:
|
||||||
// u---v
|
// u---v
|
||||||
// |
|
// |
|
||||||
// w
|
// w
|
||||||
// uv is the "approach"
|
// uv is the "approach"
|
||||||
// vw is the "exit"
|
// vw is the "exit"
|
||||||
std::vector<contractor::QueryEdge::EdgeData> unpacked_shortcut;
|
|
||||||
std::vector<EdgeWeight> approach_weight_vector;
|
std::vector<EdgeWeight> approach_weight_vector;
|
||||||
std::vector<EdgeWeight> approach_duration_vector;
|
std::vector<EdgeWeight> approach_duration_vector;
|
||||||
|
|
||||||
// Make sure we traverse the startnodes in a consistent order
|
|
||||||
// to ensure identical PBF encoding on all platforms.
|
|
||||||
std::vector<NodeID> sorted_startnodes;
|
|
||||||
sorted_startnodes.reserve(directed_graph.size());
|
|
||||||
for (const auto &startnode : directed_graph)
|
|
||||||
sorted_startnodes.push_back(startnode.first);
|
|
||||||
std::sort(sorted_startnodes.begin(), sorted_startnodes.end());
|
|
||||||
|
|
||||||
// Look at every node in the directed graph we created
|
// Look at every node in the directed graph we created
|
||||||
for (const auto &startnode : sorted_startnodes)
|
for (const auto &startnode : sorted_startnodes)
|
||||||
{
|
{
|
||||||
const auto &nodedata = directed_graph[startnode];
|
BOOST_ASSERT(directed_graph.find(startnode) != directed_graph.end());
|
||||||
|
const auto &nodedata = directed_graph.find(startnode)->second;
|
||||||
// For all the outgoing edges from the node
|
// For all the outgoing edges from the node
|
||||||
for (const auto &approachedge : nodedata)
|
for (const auto &approachedge : nodedata)
|
||||||
{
|
{
|
||||||
@ -110,7 +118,7 @@ getTileTurns(const datafacade::ContiguousInternalMemoryDataFacade<ch::Algorithm>
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
// For each of the outgoing edges from our target coordinate
|
// For each of the outgoing edges from our target coordinate
|
||||||
for (const auto &exit_edge : directed_graph[approachedge.target_node])
|
for (const auto &exit_edge : directed_graph.find(approachedge.target_node)->second)
|
||||||
{
|
{
|
||||||
// If the next edge has the same edge_based_node_id, then it's
|
// If the next edge has the same edge_based_node_id, then it's
|
||||||
// not a turn, so skip it
|
// not a turn, so skip it
|
||||||
@ -132,55 +140,32 @@ getTileTurns(const datafacade::ContiguousInternalMemoryDataFacade<ch::Algorithm>
|
|||||||
//
|
//
|
||||||
// would offer a backward edge at `b` to `a` (due to the oneway from a to b)
|
// would offer a backward edge at `b` to `a` (due to the oneway from a to b)
|
||||||
// but could also offer a shortcut (b-c-a) from `b` to `a` which is longer.
|
// but could also offer a shortcut (b-c-a) from `b` to `a` which is longer.
|
||||||
EdgeID smaller_edge_id =
|
EdgeID edge_based_edge_id =
|
||||||
facade.FindSmallestEdge(approachedge.edge_based_node_id,
|
find_edge(approachedge.edge_based_node_id, exit_edge.edge_based_node_id);
|
||||||
exit_edge.edge_based_node_id,
|
|
||||||
[](const contractor::QueryEdge::EdgeData &data) {
|
|
||||||
return data.forward && !data.shortcut;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Depending on how the graph is constructed, we might have to look for
|
if (edge_based_edge_id != SPECIAL_EDGEID)
|
||||||
// a backwards edge instead. They're equivalent, just one is available for
|
|
||||||
// a forward routing search, and one is used for the backwards dijkstra
|
|
||||||
// steps. Their weight should be the same, we can use either one.
|
|
||||||
// If we didn't find a forward edge, try for a backward one
|
|
||||||
if (SPECIAL_EDGEID == smaller_edge_id)
|
|
||||||
{
|
{
|
||||||
smaller_edge_id =
|
const auto &data = facade.GetEdgeData(edge_based_edge_id);
|
||||||
facade.FindSmallestEdge(exit_edge.edge_based_node_id,
|
|
||||||
approachedge.edge_based_node_id,
|
|
||||||
[](const contractor::QueryEdge::EdgeData &data) {
|
|
||||||
return data.backward && !data.shortcut;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// If no edge was found, it means that there's no connection between these
|
|
||||||
// nodes, due to oneways or turn restrictions. Given the edge-based-nodes
|
|
||||||
// that we're examining here, we *should* only find directly-connected
|
|
||||||
// edges, not shortcuts
|
|
||||||
if (smaller_edge_id != SPECIAL_EDGEID)
|
|
||||||
{
|
|
||||||
const auto &data = facade.GetEdgeData(smaller_edge_id);
|
|
||||||
BOOST_ASSERT_MSG(!data.shortcut, "Connecting edge must not be a shortcut");
|
|
||||||
|
|
||||||
// Now, calculate the sum of the weight of all the segments.
|
// Now, calculate the sum of the weight of all the segments.
|
||||||
if (edge_based_node_info[approachedge.edge_based_node_id].is_geometry_forward)
|
if (edge_based_node_info.find(approachedge.edge_based_node_id)
|
||||||
|
->second.is_geometry_forward)
|
||||||
{
|
{
|
||||||
approach_weight_vector = facade.GetUncompressedForwardWeights(
|
approach_weight_vector = facade.GetUncompressedForwardWeights(
|
||||||
edge_based_node_info[approachedge.edge_based_node_id]
|
edge_based_node_info.find(approachedge.edge_based_node_id)
|
||||||
.packed_geometry_id);
|
->second.packed_geometry_id);
|
||||||
approach_duration_vector = facade.GetUncompressedForwardDurations(
|
approach_duration_vector = facade.GetUncompressedForwardDurations(
|
||||||
edge_based_node_info[approachedge.edge_based_node_id]
|
edge_based_node_info.find(approachedge.edge_based_node_id)
|
||||||
.packed_geometry_id);
|
->second.packed_geometry_id);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
approach_weight_vector = facade.GetUncompressedReverseWeights(
|
approach_weight_vector = facade.GetUncompressedReverseWeights(
|
||||||
edge_based_node_info[approachedge.edge_based_node_id]
|
edge_based_node_info.find(approachedge.edge_based_node_id)
|
||||||
.packed_geometry_id);
|
->second.packed_geometry_id);
|
||||||
approach_duration_vector = facade.GetUncompressedReverseDurations(
|
approach_duration_vector = facade.GetUncompressedReverseDurations(
|
||||||
edge_based_node_info[approachedge.edge_based_node_id]
|
edge_based_node_info.find(approachedge.edge_based_node_id)
|
||||||
.packed_geometry_id);
|
->second.packed_geometry_id);
|
||||||
}
|
}
|
||||||
const auto sum_node_weight = std::accumulate(approach_weight_vector.begin(),
|
const auto sum_node_weight = std::accumulate(approach_weight_vector.begin(),
|
||||||
approach_weight_vector.end(),
|
approach_weight_vector.end(),
|
||||||
@ -239,6 +224,90 @@ getTileTurns(const datafacade::ContiguousInternalMemoryDataFacade<ch::Algorithm>
|
|||||||
return all_turn_data;
|
return all_turn_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
// CH Version of finding all turn penalties. Here is where the actual work is happening
|
||||||
|
std::vector<TurnData>
|
||||||
|
getTileTurns(const datafacade::ContiguousInternalMemoryDataFacade<ch::Algorithm> &facade,
|
||||||
|
const std::vector<RTreeLeaf> &edges,
|
||||||
|
const std::vector<std::size_t> &sorted_edge_indexes)
|
||||||
|
{
|
||||||
|
// Define how to find the representative edge between two edge based nodes for a CH
|
||||||
|
struct EdgeFinderCH
|
||||||
|
{
|
||||||
|
EdgeFinderCH(const datafacade::ContiguousInternalMemoryDataFacade<ch::Algorithm> &facade)
|
||||||
|
: facade(facade)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
const datafacade::ContiguousInternalMemoryDataFacade<ch::Algorithm> &facade;
|
||||||
|
|
||||||
|
EdgeID operator()(const NodeID approach_node, const NodeID exit_node) const
|
||||||
|
{
|
||||||
|
// Find the connection between our source road and the target node
|
||||||
|
// Since we only want to find direct edges, we cannot check shortcut edges here.
|
||||||
|
// Otherwise we might find a forward edge even though a shorter backward edge
|
||||||
|
// exists (due to oneways).
|
||||||
|
//
|
||||||
|
// a > - > - > - b
|
||||||
|
// | |
|
||||||
|
// |------ c ----|
|
||||||
|
//
|
||||||
|
// would offer a backward edge at `b` to `a` (due to the oneway from a to b)
|
||||||
|
// but could also offer a shortcut (b-c-a) from `b` to `a` which is longer.
|
||||||
|
EdgeID edge_id = facade.FindSmallestEdge(
|
||||||
|
approach_node, exit_node, [](const contractor::QueryEdge::EdgeData &data) {
|
||||||
|
return data.forward && !data.shortcut;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Depending on how the graph is constructed, we might have to look for
|
||||||
|
// a backwards edge instead. They're equivalent, just one is available for
|
||||||
|
// a forward routing search, and one is used for the backwards dijkstra
|
||||||
|
// steps. Their weight should be the same, we can use either one.
|
||||||
|
// If we didn't find a forward edge, try for a backward one
|
||||||
|
if (SPECIAL_EDGEID == edge_id)
|
||||||
|
{
|
||||||
|
edge_id = facade.FindSmallestEdge(
|
||||||
|
exit_node, approach_node, [](const contractor::QueryEdge::EdgeData &data) {
|
||||||
|
return data.backward && !data.shortcut;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_ASSERT_MSG(edge_id == SPECIAL_EDGEID || !facade.GetEdgeData(edge_id).shortcut,
|
||||||
|
"Connecting edge must not be a shortcut");
|
||||||
|
return edge_id;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
EdgeFinderCH edge_finder(facade);
|
||||||
|
return generateTurns(facade, edges, sorted_edge_indexes, edge_finder);
|
||||||
|
}
|
||||||
|
|
||||||
|
// MLD version to find all turns
|
||||||
|
std::vector<TurnData>
|
||||||
|
getTileTurns(const datafacade::ContiguousInternalMemoryDataFacade<mld::Algorithm> &facade,
|
||||||
|
const std::vector<RTreeLeaf> &edges,
|
||||||
|
const std::vector<std::size_t> &sorted_edge_indexes)
|
||||||
|
{
|
||||||
|
// Define how to find the representative edge between two edge-based-nodes for a MLD
|
||||||
|
struct EdgeFinderMLD
|
||||||
|
{
|
||||||
|
EdgeFinderMLD(const datafacade::ContiguousInternalMemoryDataFacade<mld::Algorithm> &facade)
|
||||||
|
: facade(facade)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
const datafacade::ContiguousInternalMemoryDataFacade<mld::Algorithm> &facade;
|
||||||
|
|
||||||
|
EdgeID operator()(const NodeID approach_node, const NodeID exit_node) const
|
||||||
|
{
|
||||||
|
return facade.FindEdge(approach_node, exit_node);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
EdgeFinderMLD edge_finder(facade);
|
||||||
|
|
||||||
|
return generateTurns(facade, edges, sorted_edge_indexes, edge_finder);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace routing_algorithms
|
} // namespace routing_algorithms
|
||||||
} // namespace engine
|
} // namespace engine
|
||||||
} // namespace osrm
|
} // namespace osrm
|
||||||
|
@ -20,12 +20,10 @@
|
|||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE(tile)
|
BOOST_AUTO_TEST_SUITE(tile)
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(test_tile)
|
template <typename algorithm> void test_tile(algorithm &osrm)
|
||||||
{
|
{
|
||||||
using namespace osrm;
|
using namespace osrm;
|
||||||
|
|
||||||
auto osrm = getOSRM(OSRM_TEST_DATA_DIR "/ch/monaco.osrm");
|
|
||||||
|
|
||||||
// This tile should contain most of monaco
|
// This tile should contain most of monaco
|
||||||
TileParameters params{17059, 11948, 15};
|
TileParameters params{17059, 11948, 15};
|
||||||
|
|
||||||
@ -211,11 +209,32 @@ BOOST_AUTO_TEST_CASE(test_tile)
|
|||||||
BOOST_CHECK(number_of_turns_found > 700);
|
BOOST_CHECK(number_of_turns_found > 700);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(test_tile_turns)
|
BOOST_AUTO_TEST_CASE(test_tile_ch)
|
||||||
|
{
|
||||||
|
using namespace osrm;
|
||||||
|
auto osrm = getOSRM(OSRM_TEST_DATA_DIR "/ch/monaco.osrm", osrm::EngineConfig::Algorithm::CH);
|
||||||
|
test_tile(osrm);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(test_tile_corech)
|
||||||
|
{
|
||||||
|
using namespace osrm;
|
||||||
|
auto osrm =
|
||||||
|
getOSRM(OSRM_TEST_DATA_DIR "/corech/monaco.osrm", osrm::EngineConfig::Algorithm::CoreCH);
|
||||||
|
test_tile(osrm);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(test_tile_mld)
|
||||||
|
{
|
||||||
|
using namespace osrm;
|
||||||
|
auto osrm = getOSRM(OSRM_TEST_DATA_DIR "/mld/monaco.osrm", osrm::EngineConfig::Algorithm::MLD);
|
||||||
|
test_tile(osrm);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename algorithm> void test_tile_turns(algorithm &osrm)
|
||||||
{
|
{
|
||||||
using namespace osrm;
|
using namespace osrm;
|
||||||
|
|
||||||
auto osrm = getOSRM(OSRM_TEST_DATA_DIR "/ch/monaco.osrm");
|
|
||||||
// Small tile where we can test all the values
|
// Small tile where we can test all the values
|
||||||
TileParameters params{272953, 191177, 19};
|
TileParameters params{272953, 191177, 19};
|
||||||
|
|
||||||
@ -359,11 +378,34 @@ BOOST_AUTO_TEST_CASE(test_tile_turns)
|
|||||||
CHECK_EQUAL_RANGE(actual_turn_bearings, expected_turn_bearings);
|
CHECK_EQUAL_RANGE(actual_turn_bearings, expected_turn_bearings);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(test_tile_speeds)
|
BOOST_AUTO_TEST_CASE(test_tile_turns_ch)
|
||||||
{
|
{
|
||||||
using namespace osrm;
|
using namespace osrm;
|
||||||
|
auto osrm = getOSRM(OSRM_TEST_DATA_DIR "/ch/monaco.osrm", osrm::EngineConfig::Algorithm::CH);
|
||||||
|
|
||||||
auto osrm = getOSRM(OSRM_TEST_DATA_DIR "/ch/monaco.osrm");
|
test_tile_turns(osrm);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(test_tile_turns_corech)
|
||||||
|
{
|
||||||
|
using namespace osrm;
|
||||||
|
auto osrm =
|
||||||
|
getOSRM(OSRM_TEST_DATA_DIR "/corech/monaco.osrm", osrm::EngineConfig::Algorithm::CoreCH);
|
||||||
|
|
||||||
|
test_tile_turns(osrm);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(test_tile_turns_mld)
|
||||||
|
{
|
||||||
|
using namespace osrm;
|
||||||
|
auto osrm = getOSRM(OSRM_TEST_DATA_DIR "/mld/monaco.osrm", osrm::EngineConfig::Algorithm::MLD);
|
||||||
|
|
||||||
|
test_tile_turns(osrm);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename algorithm> void test_tile_speeds(algorithm &osrm)
|
||||||
|
{
|
||||||
|
using namespace osrm;
|
||||||
|
|
||||||
// Small tile so we can test all the values
|
// Small tile so we can test all the values
|
||||||
// TileParameters params{272953, 191177, 19};
|
// TileParameters params{272953, 191177, 19};
|
||||||
@ -522,4 +564,29 @@ BOOST_AUTO_TEST_CASE(test_tile_speeds)
|
|||||||
BOOST_CHECK(actual_names == expected_names);
|
BOOST_CHECK(actual_names == expected_names);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(test_tile_speeds_ch)
|
||||||
|
{
|
||||||
|
using namespace osrm;
|
||||||
|
|
||||||
|
auto osrm = getOSRM(OSRM_TEST_DATA_DIR "/ch/monaco.osrm", osrm::EngineConfig::Algorithm::CH);
|
||||||
|
test_tile_speeds(osrm);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(test_tile_speeds_corech)
|
||||||
|
{
|
||||||
|
using namespace osrm;
|
||||||
|
|
||||||
|
auto osrm =
|
||||||
|
getOSRM(OSRM_TEST_DATA_DIR "/corech/monaco.osrm", osrm::EngineConfig::Algorithm::CoreCH);
|
||||||
|
test_tile_speeds(osrm);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(test_tile_speeds_mld)
|
||||||
|
{
|
||||||
|
using namespace osrm;
|
||||||
|
|
||||||
|
auto osrm = getOSRM(OSRM_TEST_DATA_DIR "/mld/monaco.osrm", osrm::EngineConfig::Algorithm::MLD);
|
||||||
|
test_tile_speeds(osrm);
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
Loading…
Reference in New Issue
Block a user