Replace codes with enum
This commit is contained in:
parent
78ac3cffde
commit
70f4cdd0ca
@ -111,7 +111,7 @@ int OSRM::OSRM_impl::RunQuery(const RouteParameters &route_parameters, osrm::jso
|
|||||||
increase_concurrent_query_count();
|
increase_concurrent_query_count();
|
||||||
auto return_code = plugin_iterator->second->HandleRequest(route_parameters, json_result);
|
auto return_code = plugin_iterator->second->HandleRequest(route_parameters, json_result);
|
||||||
decrease_concurrent_query_count();
|
decrease_concurrent_query_count();
|
||||||
return return_code;
|
return static_cast<int>(return_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
// decrease number of concurrent queries
|
// decrease number of concurrent queries
|
||||||
|
@ -67,13 +67,13 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
|
|||||||
|
|
||||||
const std::string GetDescriptor() const override final { return descriptor_string; }
|
const std::string GetDescriptor() const override final { return descriptor_string; }
|
||||||
|
|
||||||
int HandleRequest(const RouteParameters &route_parameters,
|
Status HandleRequest(const RouteParameters &route_parameters,
|
||||||
osrm::json::Object &json_result) override final
|
osrm::json::Object &json_result) override final
|
||||||
{
|
{
|
||||||
if (!check_all_coordinates(route_parameters.coordinates))
|
if (!check_all_coordinates(route_parameters.coordinates))
|
||||||
{
|
{
|
||||||
json_result.values["status_message"] = "Coordinates are invalid.";
|
json_result.values["status_message"] = "Coordinates are invalid.";
|
||||||
return 400;
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto &input_bearings = route_parameters.bearings;
|
const auto &input_bearings = route_parameters.bearings;
|
||||||
@ -82,7 +82,7 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
|
|||||||
{
|
{
|
||||||
json_result.values["status_message"] =
|
json_result.values["status_message"] =
|
||||||
"Number of bearings does not match number of coordinates.";
|
"Number of bearings does not match number of coordinates.";
|
||||||
return 400;
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto number_of_sources =
|
auto number_of_sources =
|
||||||
@ -106,7 +106,7 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
|
|||||||
"Number of entries " + std::to_string(number_of_sources * number_of_destination) +
|
"Number of entries " + std::to_string(number_of_sources * number_of_destination) +
|
||||||
" is higher than current maximum (" +
|
" is higher than current maximum (" +
|
||||||
std::to_string(max_locations_distance_table * max_locations_distance_table) + ")";
|
std::to_string(max_locations_distance_table * max_locations_distance_table) + ")";
|
||||||
return 400;
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum());
|
const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum());
|
||||||
@ -160,7 +160,7 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
|
|||||||
{
|
{
|
||||||
json_result.values["status_message"] =
|
json_result.values["status_message"] =
|
||||||
std::string("Could not find matching road for via ") + std::to_string(i);
|
std::string("Could not find matching road for via ") + std::to_string(i);
|
||||||
return 400;
|
return Status::NoSegment;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (route_parameters.is_destination[i])
|
if (route_parameters.is_destination[i])
|
||||||
@ -182,7 +182,7 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
|
|||||||
{
|
{
|
||||||
json_result.values["status_message"] =
|
json_result.values["status_message"] =
|
||||||
std::string("Could not find matching road for via ") + std::to_string(i);
|
std::string("Could not find matching road for via ") + std::to_string(i);
|
||||||
return 400;
|
return Status::NoSegment;
|
||||||
}
|
}
|
||||||
phantom_node_target_out_iter++;
|
phantom_node_target_out_iter++;
|
||||||
}
|
}
|
||||||
@ -204,7 +204,7 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
|
|||||||
if (!result_table)
|
if (!result_table)
|
||||||
{
|
{
|
||||||
json_result.values["status_message"] = "No distance table found.";
|
json_result.values["status_message"] = "No distance table found.";
|
||||||
return 400;
|
return Status::EmptyResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
osrm::json::Array matrix_json_array;
|
osrm::json::Array matrix_json_array;
|
||||||
@ -236,7 +236,7 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
|
|||||||
source_coord_json_array.values.push_back(json_coord);
|
source_coord_json_array.values.push_back(json_coord);
|
||||||
}
|
}
|
||||||
json_result.values["source_coordinates"] = source_coord_json_array;
|
json_result.values["source_coordinates"] = source_coord_json_array;
|
||||||
return 200;
|
return Status::Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -46,7 +46,7 @@ class HelloWorldPlugin final : public BasePlugin
|
|||||||
virtual ~HelloWorldPlugin() {}
|
virtual ~HelloWorldPlugin() {}
|
||||||
const std::string GetDescriptor() const override final { return descriptor_string; }
|
const std::string GetDescriptor() const override final { return descriptor_string; }
|
||||||
|
|
||||||
int HandleRequest(const RouteParameters &routeParameters,
|
Status HandleRequest(const RouteParameters &routeParameters,
|
||||||
osrm::json::Object &json_result) override final
|
osrm::json::Object &json_result) override final
|
||||||
{
|
{
|
||||||
std::string temp_string;
|
std::string temp_string;
|
||||||
@ -96,7 +96,7 @@ class HelloWorldPlugin final : public BasePlugin
|
|||||||
++counter;
|
++counter;
|
||||||
}
|
}
|
||||||
json_result.values["hints"] = json_hints;
|
json_result.values["hints"] = json_hints;
|
||||||
return 200;
|
return Status::Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -93,14 +93,17 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
|
|||||||
return label_with_confidence;
|
return label_with_confidence;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool getCandidates(const std::vector<FixedPointCoordinate> &input_coords,
|
osrm::matching::CandidateLists getCandidates(
|
||||||
const std::vector<std::pair<const int,const boost::optional<int>>> &input_bearings,
|
const std::vector<FixedPointCoordinate> &input_coords,
|
||||||
const double gps_precision,
|
const std::vector<std::pair<const int, const boost::optional<int>>> &input_bearings,
|
||||||
std::vector<double> &sub_trace_lengths,
|
const double gps_precision,
|
||||||
osrm::matching::CandidateLists &candidates_lists)
|
std::vector<double> &sub_trace_lengths)
|
||||||
{
|
{
|
||||||
|
osrm::matching::CandidateLists candidates_lists;
|
||||||
|
|
||||||
double query_radius = 10 * gps_precision;
|
double query_radius = 10 * gps_precision;
|
||||||
double last_distance = coordinate_calculation::haversine_distance(input_coords[0], input_coords[1]);
|
double last_distance =
|
||||||
|
coordinate_calculation::haversine_distance(input_coords[0], input_coords[1]);
|
||||||
|
|
||||||
sub_trace_lengths.resize(input_coords.size());
|
sub_trace_lengths.resize(input_coords.size());
|
||||||
sub_trace_lengths[0] = 0;
|
sub_trace_lengths[0] = 0;
|
||||||
@ -109,7 +112,8 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
|
|||||||
bool allow_uturn = false;
|
bool allow_uturn = false;
|
||||||
if (0 < current_coordinate)
|
if (0 < current_coordinate)
|
||||||
{
|
{
|
||||||
last_distance = coordinate_calculation::haversine_distance(input_coords[current_coordinate - 1], input_coords[current_coordinate]);
|
last_distance = coordinate_calculation::haversine_distance(
|
||||||
|
input_coords[current_coordinate - 1], input_coords[current_coordinate]);
|
||||||
|
|
||||||
sub_trace_lengths[current_coordinate] +=
|
sub_trace_lengths[current_coordinate] +=
|
||||||
sub_trace_lengths[current_coordinate - 1] + last_distance;
|
sub_trace_lengths[current_coordinate - 1] + last_distance;
|
||||||
@ -130,26 +134,36 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
|
|||||||
|
|
||||||
// Use bearing values if supplied, otherwise fallback to 0,180 defaults
|
// Use bearing values if supplied, otherwise fallback to 0,180 defaults
|
||||||
auto bearing = input_bearings.size() > 0 ? input_bearings[current_coordinate].first : 0;
|
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;
|
auto range = input_bearings.size() > 0
|
||||||
auto candidates = facade->NearestPhantomNodesInRange(input_coords[current_coordinate], query_radius, bearing, range);
|
? (input_bearings[current_coordinate].second
|
||||||
|
? *input_bearings[current_coordinate].second
|
||||||
|
: 10)
|
||||||
|
: 180;
|
||||||
|
auto candidates = facade->NearestPhantomNodesInRange(input_coords[current_coordinate],
|
||||||
|
query_radius, bearing, range);
|
||||||
|
|
||||||
if (candidates.size() == 0)
|
if (candidates.size() == 0)
|
||||||
{
|
{
|
||||||
return false;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// sort by foward id, then by reverse id and then by distance
|
// sort by foward id, then by reverse id and then by distance
|
||||||
std::sort(candidates.begin(), candidates.end(),
|
std::sort(
|
||||||
[](const PhantomNodeWithDistance& lhs, const PhantomNodeWithDistance& rhs) {
|
candidates.begin(), candidates.end(),
|
||||||
|
[](const PhantomNodeWithDistance &lhs, const PhantomNodeWithDistance &rhs)
|
||||||
|
{
|
||||||
return lhs.phantom_node.forward_node_id < rhs.phantom_node.forward_node_id ||
|
return lhs.phantom_node.forward_node_id < rhs.phantom_node.forward_node_id ||
|
||||||
(lhs.phantom_node.forward_node_id == rhs.phantom_node.forward_node_id &&
|
(lhs.phantom_node.forward_node_id == rhs.phantom_node.forward_node_id &&
|
||||||
(lhs.phantom_node.reverse_node_id < rhs.phantom_node.reverse_node_id ||
|
(lhs.phantom_node.reverse_node_id < rhs.phantom_node.reverse_node_id ||
|
||||||
(lhs.phantom_node.reverse_node_id == rhs.phantom_node.reverse_node_id &&
|
(lhs.phantom_node.reverse_node_id ==
|
||||||
lhs.distance < rhs.distance)));
|
rhs.phantom_node.reverse_node_id &&
|
||||||
|
lhs.distance < rhs.distance)));
|
||||||
});
|
});
|
||||||
|
|
||||||
auto new_end = std::unique(candidates.begin(), candidates.end(),
|
auto new_end = std::unique(
|
||||||
[](const PhantomNodeWithDistance& lhs, const PhantomNodeWithDistance& rhs) {
|
candidates.begin(), candidates.end(),
|
||||||
|
[](const PhantomNodeWithDistance &lhs, const PhantomNodeWithDistance &rhs)
|
||||||
|
{
|
||||||
return lhs.phantom_node.forward_node_id == rhs.phantom_node.forward_node_id &&
|
return lhs.phantom_node.forward_node_id == rhs.phantom_node.forward_node_id &&
|
||||||
lhs.phantom_node.reverse_node_id == rhs.phantom_node.reverse_node_id;
|
lhs.phantom_node.reverse_node_id == rhs.phantom_node.reverse_node_id;
|
||||||
});
|
});
|
||||||
@ -166,7 +180,8 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
|
|||||||
{
|
{
|
||||||
PhantomNode reverse_node(candidates[i].phantom_node);
|
PhantomNode reverse_node(candidates[i].phantom_node);
|
||||||
reverse_node.forward_node_id = SPECIAL_NODEID;
|
reverse_node.forward_node_id = SPECIAL_NODEID;
|
||||||
candidates.push_back(PhantomNodeWithDistance { reverse_node, candidates[i].distance});
|
candidates.push_back(
|
||||||
|
PhantomNodeWithDistance{reverse_node, candidates[i].distance});
|
||||||
|
|
||||||
candidates[i].phantom_node.reverse_node_id = SPECIAL_NODEID;
|
candidates[i].phantom_node.reverse_node_id = SPECIAL_NODEID;
|
||||||
}
|
}
|
||||||
@ -175,14 +190,15 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
|
|||||||
|
|
||||||
// sort by distance to make pruning effective
|
// sort by distance to make pruning effective
|
||||||
std::sort(candidates.begin(), candidates.end(),
|
std::sort(candidates.begin(), candidates.end(),
|
||||||
[](const PhantomNodeWithDistance& lhs, const PhantomNodeWithDistance& rhs) {
|
[](const PhantomNodeWithDistance &lhs, const PhantomNodeWithDistance &rhs)
|
||||||
return lhs.distance < rhs.distance;
|
{
|
||||||
});
|
return lhs.distance < rhs.distance;
|
||||||
|
});
|
||||||
|
|
||||||
candidates_lists.push_back(std::move(candidates));
|
candidates_lists.push_back(std::move(candidates));
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return candidates_lists;
|
||||||
}
|
}
|
||||||
|
|
||||||
osrm::json::Object submatchingToJSON(const osrm::matching::SubMatching &sub,
|
osrm::json::Object submatchingToJSON(const osrm::matching::SubMatching &sub,
|
||||||
@ -230,18 +246,18 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
|
|||||||
|
|
||||||
if (route_parameters.geometry)
|
if (route_parameters.geometry)
|
||||||
{
|
{
|
||||||
subtrace.values["geometry"] = factory.AppendGeometryString(route_parameters.compression);
|
subtrace.values["geometry"] =
|
||||||
|
factory.AppendGeometryString(route_parameters.compression);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (route_parameters.print_instructions)
|
if (route_parameters.print_instructions)
|
||||||
{
|
{
|
||||||
std::vector<typename JSONDescriptor<DataFacadeT>::Segment> temp_segments;
|
std::vector<typename JSONDescriptor<DataFacadeT>::Segment> temp_segments;
|
||||||
subtrace.values["instructions"] = json_descriptor.BuildTextualDescription(factory, temp_segments);
|
subtrace.values["instructions"] =
|
||||||
|
json_descriptor.BuildTextualDescription(factory, temp_segments);
|
||||||
}
|
}
|
||||||
|
|
||||||
factory.BuildRouteSummary(factory.get_entire_length(),
|
factory.BuildRouteSummary(factory.get_entire_length(), raw_route.shortest_path_length);
|
||||||
raw_route.shortest_path_length);
|
|
||||||
osrm::json::Object json_route_summary;
|
osrm::json::Object json_route_summary;
|
||||||
json_route_summary.values["total_distance"] = factory.summary.distance;
|
json_route_summary.values["total_distance"] = factory.summary.distance;
|
||||||
json_route_summary.values["total_time"] = factory.summary.duration;
|
json_route_summary.values["total_time"] = factory.summary.duration;
|
||||||
@ -262,61 +278,65 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
|
|||||||
osrm::json::Array names;
|
osrm::json::Array names;
|
||||||
for (const auto &node : sub.nodes)
|
for (const auto &node : sub.nodes)
|
||||||
{
|
{
|
||||||
names.values.emplace_back( facade->get_name_for_id(node.name_id) );
|
names.values.emplace_back(facade->get_name_for_id(node.name_id));
|
||||||
}
|
}
|
||||||
subtrace.values["matched_names"] = names;
|
subtrace.values["matched_names"] = names;
|
||||||
|
|
||||||
return subtrace;
|
return subtrace;
|
||||||
}
|
}
|
||||||
|
|
||||||
int HandleRequest(const RouteParameters &route_parameters,
|
Status HandleRequest(const RouteParameters &route_parameters,
|
||||||
osrm::json::Object &json_result) final override
|
osrm::json::Object &json_result) final override
|
||||||
{
|
{
|
||||||
// enforce maximum number of locations for performance reasons
|
// enforce maximum number of locations for performance reasons
|
||||||
if (max_locations_map_matching > 0 &&
|
if (max_locations_map_matching > 0 &&
|
||||||
static_cast<int>(route_parameters.coordinates.size()) > max_locations_map_matching)
|
static_cast<int>(route_parameters.coordinates.size()) > max_locations_map_matching)
|
||||||
{
|
{
|
||||||
json_result.values["status_message"] = "Too many coodindates.";
|
json_result.values["status_message"] = "Too many coodindates.";
|
||||||
return 400;
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check number of parameters
|
// check number of parameters
|
||||||
if (!check_all_coordinates(route_parameters.coordinates))
|
if (!check_all_coordinates(route_parameters.coordinates))
|
||||||
{
|
{
|
||||||
json_result.values["status_message"] = "Invalid coordinates.";
|
json_result.values["status_message"] = "Invalid coordinates.";
|
||||||
return 400;
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<double> sub_trace_lengths;
|
std::vector<double> sub_trace_lengths;
|
||||||
osrm::matching::CandidateLists candidates_lists;
|
|
||||||
const auto &input_coords = route_parameters.coordinates;
|
const auto &input_coords = route_parameters.coordinates;
|
||||||
const auto &input_timestamps = route_parameters.timestamps;
|
const auto &input_timestamps = route_parameters.timestamps;
|
||||||
const auto &input_bearings = route_parameters.bearings;
|
const auto &input_bearings = route_parameters.bearings;
|
||||||
if (input_timestamps.size() > 0 && input_coords.size() != input_timestamps.size())
|
if (input_timestamps.size() > 0 && input_coords.size() != input_timestamps.size())
|
||||||
{
|
{
|
||||||
json_result.values["status_message"] = "Number of timestamps does not match number of coordinates.";
|
json_result.values["status_message"] =
|
||||||
return 400;
|
"Number of timestamps does not match number of coordinates.";
|
||||||
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (input_bearings.size() > 0 && input_coords.size() != input_bearings.size())
|
if (input_bearings.size() > 0 && input_coords.size() != input_bearings.size())
|
||||||
{
|
{
|
||||||
json_result.values["status_message"] = "Number of bearings does not match number of coordinates.";
|
json_result.values["status_message"] =
|
||||||
return 400;
|
"Number of bearings does not match number of coordinates.";
|
||||||
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// enforce maximum number of locations for performance reasons
|
// enforce maximum number of locations for performance reasons
|
||||||
if (static_cast<int>(input_coords.size()) < 2)
|
if (static_cast<int>(input_coords.size()) < 2)
|
||||||
{
|
{
|
||||||
json_result.values["status_message"] = "At least two coordinates needed.";
|
json_result.values["status_message"] = "At least two coordinates needed.";
|
||||||
return 400;
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool found_candidates =
|
const auto candidates_lists = getCandidates(
|
||||||
getCandidates(input_coords, input_bearings, route_parameters.gps_precision, sub_trace_lengths, candidates_lists);
|
input_coords, input_bearings, route_parameters.gps_precision, sub_trace_lengths);
|
||||||
if (!found_candidates)
|
if (candidates_lists.size() != input_coords.size())
|
||||||
{
|
{
|
||||||
json_result.values["status_message"] = "No suitable matching candidates found.";
|
BOOST_ASSERT(candidates_lists.size() < input_coords.size());
|
||||||
return 400;
|
json_result.values["status_message"] =
|
||||||
|
std::string("Could not find a matching segment for coordinate ") +
|
||||||
|
std::to_string(candidates_lists.size());
|
||||||
|
return Status::NoSegment;
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup logging if enabled
|
// setup logging if enabled
|
||||||
@ -380,11 +400,11 @@ template <class DataFacadeT> class MapMatchingPlugin : public BasePlugin
|
|||||||
if (sub_matchings.empty())
|
if (sub_matchings.empty())
|
||||||
{
|
{
|
||||||
json_result.values["status_message"] = "Cannot find matchings.";
|
json_result.values["status_message"] = "Cannot find matchings.";
|
||||||
return 207;
|
return Status::EmptyResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
json_result.values["status_message"] = "Found matchings.";
|
json_result.values["status_message"] = "Found matchings.";
|
||||||
return 200;
|
return Status::Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -49,32 +49,39 @@ template <class DataFacadeT> class NearestPlugin final : public BasePlugin
|
|||||||
|
|
||||||
const std::string GetDescriptor() const override final { return descriptor_string; }
|
const std::string GetDescriptor() const override final { return descriptor_string; }
|
||||||
|
|
||||||
int HandleRequest(const RouteParameters &route_parameters,
|
Status HandleRequest(const RouteParameters &route_parameters,
|
||||||
osrm::json::Object &json_result) override final
|
osrm::json::Object &json_result) override final
|
||||||
{
|
{
|
||||||
// check number of parameters
|
// check number of parameters
|
||||||
if (route_parameters.coordinates.empty() ||
|
if (route_parameters.coordinates.empty() ||
|
||||||
!route_parameters.coordinates.front().is_valid())
|
!route_parameters.coordinates.front().is_valid())
|
||||||
{
|
{
|
||||||
return 400;
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto &input_bearings = route_parameters.bearings;
|
const auto &input_bearings = route_parameters.bearings;
|
||||||
if (input_bearings.size() > 0 && route_parameters.coordinates.size() != input_bearings.size())
|
if (input_bearings.size() > 0 &&
|
||||||
|
route_parameters.coordinates.size() != input_bearings.size())
|
||||||
{
|
{
|
||||||
json_result.values["status_message"] = "Number of bearings does not match number of coordinates.";
|
json_result.values["status_message"] =
|
||||||
return 400;
|
"Number of bearings does not match number of coordinates.";
|
||||||
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto number_of_results = static_cast<std::size_t>(route_parameters.num_results);
|
auto number_of_results = static_cast<std::size_t>(route_parameters.num_results);
|
||||||
const int bearing = input_bearings.size() > 0 ? input_bearings.front().first : 0;
|
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;
|
const int range =
|
||||||
auto phantom_node_vector = facade->NearestPhantomNodes(route_parameters.coordinates.front(), number_of_results, bearing, range);
|
input_bearings.size() > 0
|
||||||
|
? (input_bearings.front().second ? *input_bearings.front().second : 10)
|
||||||
|
: 180;
|
||||||
|
auto phantom_node_vector = facade->NearestPhantomNodes(route_parameters.coordinates.front(),
|
||||||
|
number_of_results, bearing, range);
|
||||||
|
|
||||||
if (phantom_node_vector.empty() || !phantom_node_vector.front().phantom_node.is_valid())
|
if (phantom_node_vector.empty())
|
||||||
{
|
{
|
||||||
json_result.values["status_message"] = "No nearest edge found.";
|
json_result.values["status_message"] =
|
||||||
return 207;
|
std::string("Could not find a matching segments for coordinate.");
|
||||||
|
return Status::NoSegment;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -87,14 +94,13 @@ template <class DataFacadeT> class NearestPlugin final : public BasePlugin
|
|||||||
for (const auto i :
|
for (const auto i :
|
||||||
osrm::irange<std::size_t>(0, std::min(number_of_results, vector_length)))
|
osrm::irange<std::size_t>(0, std::min(number_of_results, vector_length)))
|
||||||
{
|
{
|
||||||
const auto& node = phantom_node_vector[i].phantom_node;
|
const auto &node = phantom_node_vector[i].phantom_node;
|
||||||
osrm::json::Array json_coordinate;
|
osrm::json::Array json_coordinate;
|
||||||
osrm::json::Object result;
|
osrm::json::Object result;
|
||||||
json_coordinate.values.push_back(node.location.lat / COORDINATE_PRECISION);
|
json_coordinate.values.push_back(node.location.lat / COORDINATE_PRECISION);
|
||||||
json_coordinate.values.push_back(node.location.lon / COORDINATE_PRECISION);
|
json_coordinate.values.push_back(node.location.lon / COORDINATE_PRECISION);
|
||||||
result.values["mapped coordinate"] = json_coordinate;
|
result.values["mapped coordinate"] = json_coordinate;
|
||||||
result.values["name"] =
|
result.values["name"] = facade->get_name_for_id(node.name_id);
|
||||||
facade->get_name_for_id(node.name_id);
|
|
||||||
results.values.push_back(result);
|
results.values.push_back(result);
|
||||||
}
|
}
|
||||||
json_result.values["results"] = results;
|
json_result.values["results"] = results;
|
||||||
@ -102,16 +108,16 @@ template <class DataFacadeT> class NearestPlugin final : public BasePlugin
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
osrm::json::Array json_coordinate;
|
osrm::json::Array json_coordinate;
|
||||||
json_coordinate.values.push_back(phantom_node_vector.front().phantom_node.location.lat /
|
json_coordinate.values.push_back(
|
||||||
COORDINATE_PRECISION);
|
phantom_node_vector.front().phantom_node.location.lat / COORDINATE_PRECISION);
|
||||||
json_coordinate.values.push_back(phantom_node_vector.front().phantom_node.location.lon /
|
json_coordinate.values.push_back(
|
||||||
COORDINATE_PRECISION);
|
phantom_node_vector.front().phantom_node.location.lon / COORDINATE_PRECISION);
|
||||||
json_result.values["mapped_coordinate"] = json_coordinate;
|
json_result.values["mapped_coordinate"] = json_coordinate;
|
||||||
json_result.values["name"] =
|
json_result.values["name"] =
|
||||||
facade->get_name_for_id(phantom_node_vector.front().phantom_node.name_id);
|
facade->get_name_for_id(phantom_node_vector.front().phantom_node.name_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 200;
|
return Status::Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -41,11 +41,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
class BasePlugin
|
class BasePlugin
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
enum class Status : int
|
||||||
|
{
|
||||||
|
Ok = 200,
|
||||||
|
EmptyResult = 207,
|
||||||
|
NoSegment = 208,
|
||||||
|
Error = 400
|
||||||
|
};
|
||||||
|
|
||||||
BasePlugin() {}
|
BasePlugin() {}
|
||||||
// Maybe someone can explain the pure virtual destructor thing to me (dennis)
|
// Maybe someone can explain the pure virtual destructor thing to me (dennis)
|
||||||
virtual ~BasePlugin() {}
|
virtual ~BasePlugin() {}
|
||||||
virtual const std::string GetDescriptor() const = 0;
|
virtual const std::string GetDescriptor() const = 0;
|
||||||
virtual int HandleRequest(const RouteParameters &, osrm::json::Object &) = 0;
|
virtual Status HandleRequest(const RouteParameters &, osrm::json::Object &) = 0;
|
||||||
virtual bool check_all_coordinates(const std::vector<FixedPointCoordinate> &coordinates,
|
virtual bool check_all_coordinates(const std::vector<FixedPointCoordinate> &coordinates,
|
||||||
const unsigned min = 2) const final
|
const unsigned min = 2) const final
|
||||||
{
|
{
|
||||||
|
@ -44,15 +44,14 @@ template <class DataFacadeT> class TimestampPlugin final : public BasePlugin
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
const std::string GetDescriptor() const override final { return descriptor_string; }
|
const std::string GetDescriptor() const override final { return descriptor_string; }
|
||||||
int HandleRequest(const RouteParameters &route_parameters,
|
Status HandleRequest(const RouteParameters &route_parameters,
|
||||||
osrm::json::Object &json_result) override final
|
osrm::json::Object &json_result) override final
|
||||||
{
|
{
|
||||||
(void)route_parameters; // unused
|
(void)route_parameters; // unused
|
||||||
|
|
||||||
json_result.values["status"] = 0;
|
|
||||||
const std::string timestamp = facade->GetTimestamp();
|
const std::string timestamp = facade->GetTimestamp();
|
||||||
json_result.values["timestamp"] = timestamp;
|
json_result.values["timestamp"] = timestamp;
|
||||||
return 200;
|
return Status::Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -42,7 +42,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "../descriptors/json_descriptor.hpp" // to make json output
|
#include "../descriptors/json_descriptor.hpp" // to make json output
|
||||||
#include "../util/make_unique.hpp"
|
#include "../util/make_unique.hpp"
|
||||||
#include "../util/timing_util.hpp" // to time runtime
|
#include "../util/timing_util.hpp" // to time runtime
|
||||||
#include "../util/simple_logger.hpp" // for logging output
|
//#include "../util/simple_logger.hpp" // for logging output
|
||||||
#include "../util/dist_table_wrapper.hpp" // to access the dist
|
#include "../util/dist_table_wrapper.hpp" // to access the dist
|
||||||
// table more easily
|
// table more easily
|
||||||
|
|
||||||
@ -101,10 +101,12 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
|
|||||||
const int range = input_bearings.size() > 0
|
const int range = input_bearings.size() > 0
|
||||||
? (input_bearings[i].second ? *input_bearings[i].second : 10)
|
? (input_bearings[i].second ? *input_bearings[i].second : 10)
|
||||||
: 180;
|
: 180;
|
||||||
phantom_node_list.push_back(
|
auto results = facade->NearestPhantomNodes(route_parameters.coordinates[i], 1, bearing, range);
|
||||||
facade->NearestPhantomNodes(route_parameters.coordinates[i], 1, bearing, range)
|
if (results.empty())
|
||||||
.front()
|
{
|
||||||
.phantom_node);
|
break;
|
||||||
|
}
|
||||||
|
phantom_node_list.push_back(std::move(results.front().phantom_node));
|
||||||
BOOST_ASSERT(phantom_node_list.back().is_valid(facade->GetNumberOfNodes()));
|
BOOST_ASSERT(phantom_node_list.back().is_valid(facade->GetNumberOfNodes()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,7 +248,7 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
|
|||||||
return min_route;
|
return min_route;
|
||||||
}
|
}
|
||||||
|
|
||||||
int HandleRequest(const RouteParameters &route_parameters,
|
Status HandleRequest(const RouteParameters &route_parameters,
|
||||||
osrm::json::Object &json_result) override final
|
osrm::json::Object &json_result) override final
|
||||||
{
|
{
|
||||||
if (max_locations_trip > 0 &&
|
if (max_locations_trip > 0 &&
|
||||||
@ -255,14 +257,14 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
|
|||||||
json_result.values["status_message"] =
|
json_result.values["status_message"] =
|
||||||
"Number of entries " + std::to_string(route_parameters.coordinates.size()) +
|
"Number of entries " + std::to_string(route_parameters.coordinates.size()) +
|
||||||
" is higher than current maximum (" + std::to_string(max_locations_trip) + ")";
|
" is higher than current maximum (" + std::to_string(max_locations_trip) + ")";
|
||||||
return 400;
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if all inputs are coordinates
|
// check if all inputs are coordinates
|
||||||
if (!check_all_coordinates(route_parameters.coordinates))
|
if (!check_all_coordinates(route_parameters.coordinates))
|
||||||
{
|
{
|
||||||
json_result.values["status_message"] = "Invalid coordinates.";
|
json_result.values["status_message"] = "Invalid coordinates.";
|
||||||
return 400;
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto &input_bearings = route_parameters.bearings;
|
const auto &input_bearings = route_parameters.bearings;
|
||||||
@ -271,11 +273,20 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
|
|||||||
{
|
{
|
||||||
json_result.values["status_message"] =
|
json_result.values["status_message"] =
|
||||||
"Number of bearings does not match number of coordinates.";
|
"Number of bearings does not match number of coordinates.";
|
||||||
return 400;
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get phantom nodes
|
// get phantom nodes
|
||||||
auto phantom_node_list = GetPhantomNodes(route_parameters);
|
auto phantom_node_list = GetPhantomNodes(route_parameters);
|
||||||
|
if (phantom_node_list.size() != route_parameters.coordinates.size())
|
||||||
|
{
|
||||||
|
BOOST_ASSERT(phantom_node_list.size() < route_parameters.coordinates.size());
|
||||||
|
json_result.values["status_message"] =
|
||||||
|
std::string("Could not find a matching segment for coordinate ") +
|
||||||
|
std::to_string(phantom_node_list.size());
|
||||||
|
return Status::NoSegment;
|
||||||
|
}
|
||||||
|
|
||||||
const auto number_of_locations = phantom_node_list.size();
|
const auto number_of_locations = phantom_node_list.size();
|
||||||
|
|
||||||
// compute the distance table of all phantom nodes
|
// compute the distance table of all phantom nodes
|
||||||
@ -285,7 +296,7 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
|
|||||||
|
|
||||||
if (result_table.size() == 0)
|
if (result_table.size() == 0)
|
||||||
{
|
{
|
||||||
return 400;
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
const constexpr std::size_t BF_MAX_FEASABLE = 10;
|
const constexpr std::size_t BF_MAX_FEASABLE = 10;
|
||||||
@ -354,9 +365,6 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
|
|||||||
|
|
||||||
TIMER_STOP(TRIP_TIMER);
|
TIMER_STOP(TRIP_TIMER);
|
||||||
|
|
||||||
SimpleLogger().Write() << "Trip calculation took: " << TIMER_MSEC(TRIP_TIMER) / 1000.
|
|
||||||
<< "s";
|
|
||||||
|
|
||||||
// prepare JSON output
|
// prepare JSON output
|
||||||
// create a json object for every trip
|
// create a json object for every trip
|
||||||
osrm::json::Array trip;
|
osrm::json::Array trip;
|
||||||
@ -381,11 +389,11 @@ template <class DataFacadeT> class RoundTripPlugin final : public BasePlugin
|
|||||||
if (trip.values.empty())
|
if (trip.values.empty())
|
||||||
{
|
{
|
||||||
json_result.values["status_message"] = "Cannot find trips.";
|
json_result.values["status_message"] = "Cannot find trips.";
|
||||||
return 207;
|
return Status::EmptyResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
json_result.values["status_message"] = "Found trips.";
|
json_result.values["status_message"] = "Found trips.";
|
||||||
return 200;
|
return Status::Ok;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
|
|||||||
|
|
||||||
const std::string GetDescriptor() const override final { return descriptor_string; }
|
const std::string GetDescriptor() const override final { return descriptor_string; }
|
||||||
|
|
||||||
int HandleRequest(const RouteParameters &route_parameters,
|
Status HandleRequest(const RouteParameters &route_parameters,
|
||||||
osrm::json::Object &json_result) override final
|
osrm::json::Object &json_result) override final
|
||||||
{
|
{
|
||||||
if (max_locations_viaroute > 0 &&
|
if (max_locations_viaroute > 0 &&
|
||||||
@ -84,13 +84,13 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
|
|||||||
json_result.values["status_message"] =
|
json_result.values["status_message"] =
|
||||||
"Number of entries " + std::to_string(route_parameters.coordinates.size()) +
|
"Number of entries " + std::to_string(route_parameters.coordinates.size()) +
|
||||||
" is higher than current maximum (" + std::to_string(max_locations_viaroute) + ")";
|
" is higher than current maximum (" + std::to_string(max_locations_viaroute) + ")";
|
||||||
return 400;
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!check_all_coordinates(route_parameters.coordinates))
|
if (!check_all_coordinates(route_parameters.coordinates))
|
||||||
{
|
{
|
||||||
json_result.values["status_message"] = "Invalid coordinates.";
|
json_result.values["status_message"] = "Invalid coordinates.";
|
||||||
return 400;
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto &input_bearings = route_parameters.bearings;
|
const auto &input_bearings = route_parameters.bearings;
|
||||||
@ -99,7 +99,7 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
|
|||||||
{
|
{
|
||||||
json_result.values["status_message"] =
|
json_result.values["status_message"] =
|
||||||
"Number of bearings does not match number of coordinates.";
|
"Number of bearings does not match number of coordinates.";
|
||||||
return 400;
|
return Status::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<PhantomNodePair> phantom_node_pair_list(route_parameters.coordinates.size());
|
std::vector<PhantomNodePair> phantom_node_pair_list(route_parameters.coordinates.size());
|
||||||
@ -129,7 +129,7 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
|
|||||||
json_result.values["status_message"] =
|
json_result.values["status_message"] =
|
||||||
std::string("Could not find a matching segment for coordinate ") +
|
std::string("Could not find a matching segment for coordinate ") +
|
||||||
std::to_string(i);
|
std::to_string(i);
|
||||||
return 400;
|
return Status::NoSegment;
|
||||||
}
|
}
|
||||||
BOOST_ASSERT(phantom_node_pair_list[i].first.is_valid(facade->GetNumberOfNodes()));
|
BOOST_ASSERT(phantom_node_pair_list[i].first.is_valid(facade->GetNumberOfNodes()));
|
||||||
BOOST_ASSERT(phantom_node_pair_list[i].second.is_valid(facade->GetNumberOfNodes()));
|
BOOST_ASSERT(phantom_node_pair_list[i].second.is_valid(facade->GetNumberOfNodes()));
|
||||||
@ -166,11 +166,6 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
|
|||||||
|
|
||||||
bool no_route = INVALID_EDGE_WEIGHT == raw_route.shortest_path_length;
|
bool no_route = INVALID_EDGE_WEIGHT == raw_route.shortest_path_length;
|
||||||
|
|
||||||
if (no_route)
|
|
||||||
{
|
|
||||||
SimpleLogger().Write(logDEBUG) << "Error occurred, single path not found";
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unique_ptr<BaseDescriptor<DataFacadeT>> descriptor;
|
std::unique_ptr<BaseDescriptor<DataFacadeT>> descriptor;
|
||||||
switch (descriptor_table.get_id(route_parameters.output_format))
|
switch (descriptor_table.get_id(route_parameters.output_format))
|
||||||
{
|
{
|
||||||
@ -201,13 +196,12 @@ template <class DataFacadeT> class ViaRoutePlugin final : public BasePlugin
|
|||||||
});
|
});
|
||||||
if (not_in_same_component)
|
if (not_in_same_component)
|
||||||
{
|
{
|
||||||
SimpleLogger().Write(logDEBUG) << "Coordinates not in same component.";
|
|
||||||
json_result.values["status_message"] = "Impossible route between points.";
|
json_result.values["status_message"] = "Impossible route between points.";
|
||||||
return 207;
|
return Status::EmptyResult;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 200;
|
return Status::Ok;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user