Refactor StaticRTree to remove application dependent code
StaticRTree now acts like a container, just returning the input data (NodeBasedEdge) and not PhantomNodes.
This commit is contained in:
+24
-19
@@ -108,8 +108,8 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
|
||||
|
||||
const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum());
|
||||
|
||||
PhantomNodeArray phantom_node_source_vector(number_of_sources);
|
||||
PhantomNodeArray phantom_node_target_vector(number_of_destination);
|
||||
std::vector<PhantomNodePair> phantom_node_source_vector(number_of_sources);
|
||||
std::vector<PhantomNodePair> phantom_node_target_vector(number_of_destination);
|
||||
auto phantom_node_source_out_iter = phantom_node_source_vector.begin();
|
||||
auto phantom_node_target_out_iter = phantom_node_target_vector.begin();
|
||||
for (const auto i : osrm::irange<std::size_t>(0u, route_parameters.coordinates.size()))
|
||||
@@ -123,7 +123,7 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
|
||||
{
|
||||
if (route_parameters.is_source[i])
|
||||
{
|
||||
phantom_node_source_out_iter->emplace_back(std::move(current_phantom_node));
|
||||
*phantom_node_source_out_iter = std::make_pair(current_phantom_node, current_phantom_node);
|
||||
if (route_parameters.is_destination[i])
|
||||
{
|
||||
*phantom_node_target_out_iter = *phantom_node_source_out_iter;
|
||||
@@ -134,7 +134,7 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
|
||||
else
|
||||
{
|
||||
BOOST_ASSERT(route_parameters.is_destination[i] && !route_parameters.is_source[i]);
|
||||
phantom_node_target_out_iter->emplace_back(std::move(current_phantom_node));
|
||||
*phantom_node_target_out_iter = std::make_pair(current_phantom_node, current_phantom_node);
|
||||
phantom_node_target_out_iter++;
|
||||
}
|
||||
continue;
|
||||
@@ -146,11 +146,14 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
|
||||
: 180;
|
||||
if (route_parameters.is_source[i])
|
||||
{
|
||||
facade->IncrementalFindPhantomNodeForCoordinate(route_parameters.coordinates[i],
|
||||
*phantom_node_source_out_iter, 1,
|
||||
bearing, range);
|
||||
BOOST_ASSERT(
|
||||
phantom_node_source_out_iter->front().is_valid(facade->GetNumberOfNodes()));
|
||||
*phantom_node_source_out_iter = facade->NearestPhantomNodeWithAlternativeFromBigComponent(route_parameters.coordinates[i], bearing, range);
|
||||
// we didn't found a fitting node, return error
|
||||
if (!phantom_node_source_out_iter->first.is_valid(facade->GetNumberOfNodes()))
|
||||
{
|
||||
json_result.values["status_message"] = std::string("Could not find matching road for via ") + std::to_string(i);
|
||||
return 400;
|
||||
}
|
||||
|
||||
if (route_parameters.is_destination[i])
|
||||
{
|
||||
*phantom_node_target_out_iter = *phantom_node_source_out_iter;
|
||||
@@ -161,14 +164,16 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
|
||||
else
|
||||
{
|
||||
BOOST_ASSERT(route_parameters.is_destination[i] && !route_parameters.is_source[i]);
|
||||
facade->IncrementalFindPhantomNodeForCoordinate(route_parameters.coordinates[i],
|
||||
*phantom_node_target_out_iter, 1,
|
||||
bearing, range);
|
||||
BOOST_ASSERT(
|
||||
phantom_node_target_out_iter->front().is_valid(facade->GetNumberOfNodes()));
|
||||
|
||||
*phantom_node_target_out_iter = facade->NearestPhantomNodeWithAlternativeFromBigComponent(route_parameters.coordinates[i], bearing, range);
|
||||
// we didn't found a fitting node, return error
|
||||
if (!phantom_node_target_out_iter->first.is_valid(facade->GetNumberOfNodes()))
|
||||
{
|
||||
json_result.values["status_message"] = std::string("Could not find matching road for via ") + std::to_string(i);
|
||||
return 400;
|
||||
}
|
||||
phantom_node_target_out_iter++;
|
||||
}
|
||||
|
||||
}
|
||||
BOOST_ASSERT((phantom_node_source_out_iter - phantom_node_source_vector.begin()) ==
|
||||
number_of_sources);
|
||||
@@ -195,20 +200,20 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
|
||||
}
|
||||
json_result.values["distance_table"] = matrix_json_array;
|
||||
osrm::json::Array target_coord_json_array;
|
||||
for (const std::vector<PhantomNode> &phantom_node_vector : phantom_node_target_vector)
|
||||
for (const auto &pair : phantom_node_target_vector)
|
||||
{
|
||||
osrm::json::Array json_coord;
|
||||
FixedPointCoordinate coord = phantom_node_vector[0].location;
|
||||
FixedPointCoordinate coord = pair.first.location;
|
||||
json_coord.values.push_back(coord.lat / COORDINATE_PRECISION);
|
||||
json_coord.values.push_back(coord.lon / COORDINATE_PRECISION);
|
||||
target_coord_json_array.values.push_back(json_coord);
|
||||
}
|
||||
json_result.values["destination_coordinates"] = target_coord_json_array;
|
||||
osrm::json::Array source_coord_json_array;
|
||||
for (const std::vector<PhantomNode> &phantom_node_vector : phantom_node_source_vector)
|
||||
for (const auto &pair : phantom_node_source_vector)
|
||||
{
|
||||
osrm::json::Array json_coord;
|
||||
FixedPointCoordinate coord = phantom_node_vector[0].location;
|
||||
FixedPointCoordinate coord = pair.first.location;
|
||||
json_coord.values.push_back(coord.lat / COORDINATE_PRECISION);
|
||||
json_coord.values.push_back(coord.lon / COORDINATE_PRECISION);
|
||||
source_coord_json_array.values.push_back(json_coord);
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (c) 2015, Project OSRM contributors
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
Redistributions of source code must retain the above copyright notice, this list
|
||||
of conditions and the following disclaimer.
|
||||
Redistributions in binary form must reproduce the above copyright notice, this
|
||||
list of conditions and the following disclaimer in the documentation and/or
|
||||
other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef LOCATE_HPP
|
||||
#define LOCATE_HPP
|
||||
|
||||
#include "plugin_base.hpp"
|
||||
|
||||
#include "../util/json_renderer.hpp"
|
||||
#include "../util/string_util.hpp"
|
||||
|
||||
#include <osrm/json_container.hpp>
|
||||
|
||||
#include <string>
|
||||
|
||||
// locates the nearest node in the road network for a given coordinate.
|
||||
template <class DataFacadeT> class LocatePlugin final : public BasePlugin
|
||||
{
|
||||
public:
|
||||
explicit LocatePlugin(DataFacadeT *facade) : descriptor_string("locate"), facade(facade) {}
|
||||
const std::string GetDescriptor() const override final { return descriptor_string; }
|
||||
|
||||
int HandleRequest(const RouteParameters &route_parameters,
|
||||
osrm::json::Object &json_result) override final
|
||||
{
|
||||
// check number of parameters
|
||||
if (route_parameters.coordinates.empty() ||
|
||||
!route_parameters.coordinates.front().is_valid())
|
||||
{
|
||||
return 400;
|
||||
}
|
||||
|
||||
FixedPointCoordinate result;
|
||||
if (!facade->LocateClosestEndPointForCoordinate(route_parameters.coordinates.front(),
|
||||
result))
|
||||
{
|
||||
json_result.values["status"] = 207;
|
||||
}
|
||||
else
|
||||
{
|
||||
json_result.values["status"] = 0;
|
||||
osrm::json::Array json_coordinate;
|
||||
json_coordinate.values.push_back(result.lat / COORDINATE_PRECISION);
|
||||
json_coordinate.values.push_back(result.lon / COORDINATE_PRECISION);
|
||||
json_result.values["mapped_coordinate"] = json_coordinate;
|
||||
}
|
||||
return 200;
|
||||
}
|
||||
|
||||
private:
|
||||
std::string descriptor_string;
|
||||
DataFacadeT *facade;
|
||||
};
|
||||
|
||||
#endif /* LOCATE_HPP */
|
||||
+17
-20
@@ -128,28 +128,25 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<std::pair<PhantomNode, double>> candidates;
|
||||
// Use bearing values if supplied, otherwise fallback to 0,180 defaults
|
||||
auto bearing = input_bearings.size() > 0 ? input_bearings[current_coordinate].first : 0;
|
||||
auto range = input_bearings.size() > 0 ? (input_bearings[current_coordinate].second ? *input_bearings[current_coordinate].second : 10 ) : 180;
|
||||
facade->IncrementalFindPhantomNodeForCoordinateWithMaxDistance(
|
||||
input_coords[current_coordinate], candidates, query_radius,
|
||||
bearing, range);
|
||||
auto candidates = facade->NearestPhantomNodesInRange(input_coords[current_coordinate], query_radius, bearing, range);
|
||||
|
||||
// sort by foward id, then by reverse id and then by distance
|
||||
std::sort(candidates.begin(), candidates.end(),
|
||||
[](const std::pair<PhantomNode, double>& lhs, const std::pair<PhantomNode, double>& rhs) {
|
||||
return lhs.first.forward_node_id < rhs.first.forward_node_id ||
|
||||
(lhs.first.forward_node_id == rhs.first.forward_node_id &&
|
||||
(lhs.first.reverse_node_id < rhs.first.reverse_node_id ||
|
||||
(lhs.first.reverse_node_id == rhs.first.reverse_node_id &&
|
||||
lhs.second < rhs.second)));
|
||||
[](const std::pair<double, PhantomNode>& lhs, const std::pair<double, PhantomNode>& rhs) {
|
||||
return lhs.second.forward_node_id < rhs.second.forward_node_id ||
|
||||
(lhs.second.forward_node_id == rhs.second.forward_node_id &&
|
||||
(lhs.second.reverse_node_id < rhs.second.reverse_node_id ||
|
||||
(lhs.second.reverse_node_id == rhs.second.reverse_node_id &&
|
||||
lhs.first < rhs.first)));
|
||||
});
|
||||
|
||||
auto new_end = std::unique(candidates.begin(), candidates.end(),
|
||||
[](const std::pair<PhantomNode, double>& lhs, const std::pair<PhantomNode, double>& rhs) {
|
||||
return lhs.first.forward_node_id == rhs.first.forward_node_id &&
|
||||
lhs.first.reverse_node_id == rhs.first.reverse_node_id;
|
||||
[](const std::pair<double, PhantomNode>& lhs, const std::pair<double, PhantomNode>& rhs) {
|
||||
return lhs.second.forward_node_id == rhs.second.forward_node_id &&
|
||||
lhs.second.reverse_node_id == rhs.second.reverse_node_id;
|
||||
});
|
||||
candidates.resize(new_end - candidates.begin());
|
||||
|
||||
@@ -159,22 +156,22 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
|
||||
for (const auto i : osrm::irange<std::size_t>(0, compact_size))
|
||||
{
|
||||
// Split edge if it is bidirectional and append reverse direction to end of list
|
||||
if (candidates[i].first.forward_node_id != SPECIAL_NODEID &&
|
||||
candidates[i].first.reverse_node_id != SPECIAL_NODEID)
|
||||
if (candidates[i].second.forward_node_id != SPECIAL_NODEID &&
|
||||
candidates[i].second.reverse_node_id != SPECIAL_NODEID)
|
||||
{
|
||||
PhantomNode reverse_node(candidates[i].first);
|
||||
PhantomNode reverse_node(candidates[i].second);
|
||||
reverse_node.forward_node_id = SPECIAL_NODEID;
|
||||
candidates.push_back(std::make_pair(reverse_node, candidates[i].second));
|
||||
candidates.push_back(std::make_pair(candidates[i].first, reverse_node));
|
||||
|
||||
candidates[i].first.reverse_node_id = SPECIAL_NODEID;
|
||||
candidates[i].second.reverse_node_id = SPECIAL_NODEID;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// sort by distance to make pruning effective
|
||||
std::sort(candidates.begin(), candidates.end(),
|
||||
[](const std::pair<PhantomNode, double>& lhs, const std::pair<PhantomNode, double>& rhs) {
|
||||
return lhs.second < rhs.second;
|
||||
[](const std::pair<double, PhantomNode>& lhs, const std::pair<double, PhantomNode>& rhs) {
|
||||
return lhs.first < rhs.first;
|
||||
});
|
||||
|
||||
candidates_lists.push_back(std::move(candidates));
|
||||
|
||||
+9
-13
@@ -67,14 +67,11 @@ template <class DataFacadeT> class NearestPlugin final : public BasePlugin
|
||||
}
|
||||
|
||||
auto number_of_results = static_cast<std::size_t>(route_parameters.num_results);
|
||||
std::vector<PhantomNode> phantom_node_vector;
|
||||
const int bearing = input_bearings.size() > 0 ? input_bearings.front().first : 0;
|
||||
const int range = input_bearings.size() > 0 ? (input_bearings.front().second?*input_bearings.front().second:10) : 180;
|
||||
facade->IncrementalFindPhantomNodeForCoordinate(route_parameters.coordinates.front(),
|
||||
phantom_node_vector,
|
||||
static_cast<int>(number_of_results), bearing, range);
|
||||
auto phantom_node_vector = facade->NearestPhantomNodes(route_parameters.coordinates.front(), number_of_results, bearing, range);
|
||||
|
||||
if (phantom_node_vector.empty() || !phantom_node_vector.front().is_valid())
|
||||
if (phantom_node_vector.empty() || !phantom_node_vector.front().second.is_valid())
|
||||
{
|
||||
json_result.values["status"] = 207;
|
||||
}
|
||||
@@ -91,15 +88,14 @@ template <class DataFacadeT> class NearestPlugin final : public BasePlugin
|
||||
for (const auto i :
|
||||
osrm::irange<std::size_t>(0, std::min(number_of_results, vector_length)))
|
||||
{
|
||||
const auto& node = phantom_node_vector[i].second;
|
||||
osrm::json::Array json_coordinate;
|
||||
osrm::json::Object result;
|
||||
json_coordinate.values.push_back(phantom_node_vector.at(i).location.lat /
|
||||
COORDINATE_PRECISION);
|
||||
json_coordinate.values.push_back(phantom_node_vector.at(i).location.lon /
|
||||
COORDINATE_PRECISION);
|
||||
json_coordinate.values.push_back(node.location.lat / COORDINATE_PRECISION);
|
||||
json_coordinate.values.push_back(node.location.lon / COORDINATE_PRECISION);
|
||||
result.values["mapped coordinate"] = json_coordinate;
|
||||
result.values["name"] =
|
||||
facade->get_name_for_id(phantom_node_vector.at(i).name_id);
|
||||
facade->get_name_for_id(node.name_id);
|
||||
results.values.push_back(result);
|
||||
}
|
||||
json_result.values["results"] = results;
|
||||
@@ -107,13 +103,13 @@ template <class DataFacadeT> class NearestPlugin final : public BasePlugin
|
||||
else
|
||||
{
|
||||
osrm::json::Array json_coordinate;
|
||||
json_coordinate.values.push_back(phantom_node_vector.front().location.lat /
|
||||
json_coordinate.values.push_back(phantom_node_vector.front().second.location.lat /
|
||||
COORDINATE_PRECISION);
|
||||
json_coordinate.values.push_back(phantom_node_vector.front().location.lon /
|
||||
json_coordinate.values.push_back(phantom_node_vector.front().second.location.lon /
|
||||
COORDINATE_PRECISION);
|
||||
json_result.values["mapped_coordinate"] = json_coordinate;
|
||||
json_result.values["name"] =
|
||||
facade->get_name_for_id(phantom_node_vector.front().name_id);
|
||||
facade->get_name_for_id(phantom_node_vector.front().second.name_id);
|
||||
}
|
||||
}
|
||||
return 200;
|
||||
|
||||
+13
-18
@@ -73,7 +73,7 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
|
||||
const std::string GetDescriptor() const override final { return descriptor_string; }
|
||||
|
||||
void GetPhantomNodes(const RouteParameters &route_parameters,
|
||||
PhantomNodeArray &phantom_node_vector)
|
||||
std::vector<PhantomNodePair> &phantom_node_pair_list)
|
||||
{
|
||||
const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum());
|
||||
const auto &input_bearings = route_parameters.bearings;
|
||||
@@ -89,19 +89,16 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
|
||||
ObjectEncoder::DecodeFromBase64(route_parameters.hints[i], current_phantom_node);
|
||||
if (current_phantom_node.is_valid(facade->GetNumberOfNodes()))
|
||||
{
|
||||
phantom_node_vector[i].emplace_back(std::move(current_phantom_node));
|
||||
phantom_node_pair_list[i] = std::make_pair(current_phantom_node, current_phantom_node);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
const int bearing = input_bearings.size() > 0 ? input_bearings[i].first : 0;
|
||||
const int range = input_bearings.size() > 0 ? (input_bearings[i].second?*input_bearings[i].second:10) : 180;
|
||||
facade->IncrementalFindPhantomNodeForCoordinate(route_parameters.coordinates[i],
|
||||
phantom_node_vector[i], 1, bearing, range);
|
||||
if (phantom_node_vector[i].size() > 1)
|
||||
{
|
||||
phantom_node_vector[i].erase(std::begin(phantom_node_vector[i]));
|
||||
}
|
||||
BOOST_ASSERT(phantom_node_vector[i].front().is_valid(facade->GetNumberOfNodes()));
|
||||
auto phantom_nodes = facade->NearestPhantomNodes(route_parameters.coordinates[i], 1, bearing, range);
|
||||
// FIXME we only use the pair because that is what DistanceTable expects
|
||||
phantom_node_pair_list[i] = std::make_pair(phantom_nodes.front().second, phantom_nodes.front().second);
|
||||
BOOST_ASSERT(phantom_node_pair_list[i].first.is_valid(facade->GetNumberOfNodes()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -206,7 +203,7 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
|
||||
json_result.values["permutation"] = json_permutation;
|
||||
}
|
||||
|
||||
InternalRouteResult ComputeRoute(const PhantomNodeArray &phantom_node_vector,
|
||||
InternalRouteResult ComputeRoute(const std::vector<PhantomNodePair> &phantom_node_pair_list,
|
||||
const RouteParameters &route_parameters,
|
||||
const std::vector<NodeID> &trip)
|
||||
{
|
||||
@@ -223,7 +220,7 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
|
||||
const auto to_node = std::next(it) != end ? *std::next(it) : *start;
|
||||
|
||||
viapoint =
|
||||
PhantomNodes{phantom_node_vector[from_node][0], phantom_node_vector[to_node][0]};
|
||||
PhantomNodes{phantom_node_pair_list[from_node].first, phantom_node_pair_list[to_node].first};
|
||||
min_route.segment_end_coordinates.emplace_back(viapoint);
|
||||
}
|
||||
BOOST_ASSERT(min_route.segment_end_coordinates.size() == trip.size());
|
||||
@@ -257,13 +254,13 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
|
||||
}
|
||||
|
||||
// get phantom nodes
|
||||
PhantomNodeArray phantom_node_vector(route_parameters.coordinates.size());
|
||||
GetPhantomNodes(route_parameters, phantom_node_vector);
|
||||
const auto number_of_locations = phantom_node_vector.size();
|
||||
std::vector<PhantomNodePair> phantom_node_pair_list(route_parameters.coordinates.size());
|
||||
GetPhantomNodes(route_parameters, phantom_node_pair_list);
|
||||
const auto number_of_locations = phantom_node_pair_list.size();
|
||||
|
||||
// compute the distance table of all phantom nodes
|
||||
const auto result_table = DistTableWrapper<EdgeWeight>(
|
||||
*search_engine_ptr->distance_table(phantom_node_vector, phantom_node_vector), number_of_locations);
|
||||
*search_engine_ptr->distance_table(phantom_node_pair_list, phantom_node_pair_list), number_of_locations);
|
||||
|
||||
if (result_table.size() == 0)
|
||||
{
|
||||
@@ -331,7 +328,7 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
|
||||
comp_route.reserve(route_result.size());
|
||||
for (auto &elem : route_result)
|
||||
{
|
||||
comp_route.push_back(ComputeRoute(phantom_node_vector, route_parameters, elem));
|
||||
comp_route.push_back(ComputeRoute(phantom_node_pair_list, route_parameters, elem));
|
||||
}
|
||||
|
||||
TIMER_STOP(TRIP_TIMER);
|
||||
@@ -360,8 +357,6 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
|
||||
|
||||
json_result.values["trips"] = std::move(trip);
|
||||
|
||||
|
||||
|
||||
return 200;
|
||||
}
|
||||
};
|
||||
|
||||
+12
-20
@@ -87,7 +87,7 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
|
||||
return 400;
|
||||
}
|
||||
|
||||
std::vector<phantom_node_pair> phantom_node_pair_list(route_parameters.coordinates.size());
|
||||
std::vector<PhantomNodePair> phantom_node_pair_list(route_parameters.coordinates.size());
|
||||
const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum());
|
||||
|
||||
for (const auto i : osrm::irange<std::size_t>(0, route_parameters.coordinates.size()))
|
||||
@@ -96,34 +96,26 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
|
||||
!route_parameters.hints[i].empty())
|
||||
{
|
||||
ObjectEncoder::DecodeFromBase64(route_parameters.hints[i],
|
||||
phantom_node_pair_list[i]);
|
||||
phantom_node_pair_list[i].first);
|
||||
if (phantom_node_pair_list[i].first.is_valid(facade->GetNumberOfNodes()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
std::vector<PhantomNode> phantom_node_vector;
|
||||
const int bearing = input_bearings.size() > 0 ? input_bearings[i].first : 0;
|
||||
const int range = input_bearings.size() > 0 ? (input_bearings[i].second?*input_bearings[i].second:10) : 180;
|
||||
if (facade->IncrementalFindPhantomNodeForCoordinate(route_parameters.coordinates[i],
|
||||
phantom_node_vector, 1, bearing, range))
|
||||
{
|
||||
BOOST_ASSERT(!phantom_node_vector.empty());
|
||||
phantom_node_pair_list[i].first = phantom_node_vector.front();
|
||||
if (phantom_node_vector.size() > 1)
|
||||
{
|
||||
phantom_node_pair_list[i].second = phantom_node_vector.back();
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
phantom_node_pair_list[i] = facade->NearestPhantomNodeWithAlternativeFromBigComponent(route_parameters.coordinates[i], bearing, range);
|
||||
// we didn't found a fitting node, return error
|
||||
if (!phantom_node_pair_list[i].first.is_valid(facade->GetNumberOfNodes()))
|
||||
{
|
||||
json_result.values["status_message"] = std::string("Could not find a matching segment for coordinate ") + std::to_string(i);
|
||||
return 400;
|
||||
}
|
||||
BOOST_ASSERT(phantom_node_pair_list[i].first.is_valid(facade->GetNumberOfNodes()));
|
||||
BOOST_ASSERT(phantom_node_pair_list[i].second.is_valid(facade->GetNumberOfNodes()));
|
||||
}
|
||||
|
||||
const auto check_component_id_is_tiny = [](const phantom_node_pair &phantom_pair)
|
||||
const auto check_component_id_is_tiny = [](const PhantomNodePair &phantom_pair)
|
||||
{
|
||||
return phantom_pair.first.component.is_tiny;
|
||||
};
|
||||
@@ -133,18 +125,18 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
|
||||
check_component_id_is_tiny);
|
||||
|
||||
// are all phantoms from a tiny cc?
|
||||
const auto check_all_in_same_component = [](const std::vector<phantom_node_pair> &nodes)
|
||||
const auto check_all_in_same_component = [](const std::vector<PhantomNodePair> &nodes)
|
||||
{
|
||||
const auto component_id = nodes.front().first.component.id;
|
||||
|
||||
return std::all_of(std::begin(nodes), std::end(nodes),
|
||||
[component_id](const phantom_node_pair &phantom_pair)
|
||||
[component_id](const PhantomNodePair &phantom_pair)
|
||||
{
|
||||
return component_id == phantom_pair.first.component.id;
|
||||
});
|
||||
};
|
||||
|
||||
auto swap_phantom_from_big_cc_into_front = [](phantom_node_pair &phantom_pair)
|
||||
auto swap_phantom_from_big_cc_into_front = [](PhantomNodePair &phantom_pair)
|
||||
{
|
||||
if (phantom_pair.first.component.is_tiny && phantom_pair.second.is_valid() && !phantom_pair.second.component.is_tiny)
|
||||
{
|
||||
@@ -167,7 +159,7 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
|
||||
|
||||
InternalRouteResult raw_route;
|
||||
auto build_phantom_pairs =
|
||||
[&raw_route](const phantom_node_pair &first_pair, const phantom_node_pair &second_pair)
|
||||
[&raw_route](const PhantomNodePair &first_pair, const PhantomNodePair &second_pair)
|
||||
{
|
||||
raw_route.segment_end_coordinates.emplace_back(
|
||||
PhantomNodes{first_pair.first, second_pair.first});
|
||||
|
||||
Reference in New Issue
Block a user