osrm-backend/include/engine/plugins/nearest.hpp

108 lines
3.9 KiB
C++
Raw Normal View History

2015-01-27 11:44:46 -05:00
#ifndef NEAREST_HPP
#define NEAREST_HPP
2016-01-02 11:13:44 -05:00
#include "engine/plugins/plugin_base.hpp"
#include "engine/phantom_node.hpp"
#include "util/integer_range.hpp"
#include "osrm/json_container.hpp"
2014-11-24 11:57:01 -05:00
#include <string>
2016-01-05 10:51:13 -05:00
namespace osrm
{
namespace engine
{
namespace plugins
{
/*
* This Plugin locates the nearest point on a street in the road network for a given coordinate.
*/
2014-10-13 11:29:53 -04:00
template <class DataFacadeT> class NearestPlugin final : public BasePlugin
2014-05-02 12:06:31 -04:00
{
public:
explicit NearestPlugin(DataFacadeT *facade) : facade(facade), descriptor_string("nearest") {}
2014-05-02 12:06:31 -04:00
const std::string GetDescriptor() const override final { return descriptor_string; }
2014-05-02 12:06:31 -04:00
2015-12-17 10:45:15 -05:00
Status HandleRequest(const RouteParameters &route_parameters,
2016-01-05 10:51:13 -05:00
util::json::Object &json_result) override final
2014-05-02 12:06:31 -04:00
{
// check number of parameters
2016-01-07 19:31:57 -05:00
if (route_parameters.coordinates.empty() || !route_parameters.coordinates.front().IsValid())
2014-05-02 12:06:31 -04:00
{
2015-12-17 10:45:15 -05:00
return Status::Error;
}
const auto &input_bearings = route_parameters.bearings;
2015-12-17 10:45:15 -05:00
if (input_bearings.size() > 0 &&
route_parameters.coordinates.size() != input_bearings.size())
{
2015-12-17 10:45:15 -05:00
json_result.values["status_message"] =
2015-12-18 12:18:48 -05:00
"Number of bearings does not match number of coordinates";
2015-12-17 10:45:15 -05:00
return Status::Error;
}
2014-10-17 08:19:33 -04:00
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;
2015-12-17 10:45:15 -05:00
const int 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())
2014-05-02 12:06:31 -04:00
{
2015-12-17 10:45:15 -05:00
json_result.values["status_message"] =
2015-12-18 12:18:48 -05:00
std::string("Could not find a matching segments for coordinate");
2015-12-17 10:45:15 -05:00
return Status::NoSegment;
2014-05-02 12:06:31 -04:00
}
else
{
2015-12-18 12:18:48 -05:00
json_result.values["status_message"] = "Found nearest edge";
if (number_of_results > 1)
{
2016-01-05 10:51:13 -05:00
util::json::Array results;
2014-10-13 11:29:53 -04:00
2014-10-17 08:19:33 -04:00
auto vector_length = phantom_node_vector.size();
2015-01-27 11:44:46 -05:00
for (const auto i :
2016-01-05 10:51:13 -05:00
util::irange<std::size_t>(0, std::min(number_of_results, vector_length)))
{
2015-12-17 10:45:15 -05:00
const auto &node = phantom_node_vector[i].phantom_node;
2016-01-05 10:51:13 -05:00
util::json::Array json_coordinate;
util::json::Object result;
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;
2015-12-17 10:45:15 -05:00
result.values["name"] = facade->get_name_for_id(node.name_id);
results.values.push_back(result);
}
json_result.values["results"] = results;
}
else
{
2016-01-05 10:51:13 -05:00
util::json::Array json_coordinate;
2015-12-17 10:45:15 -05:00
json_coordinate.values.push_back(
phantom_node_vector.front().phantom_node.location.lat / COORDINATE_PRECISION);
json_coordinate.values.push_back(
phantom_node_vector.front().phantom_node.location.lon / COORDINATE_PRECISION);
json_result.values["mapped_coordinate"] = json_coordinate;
json_result.values["name"] =
2015-12-09 16:34:22 -05:00
facade->get_name_for_id(phantom_node_vector.front().phantom_node.name_id);
}
}
2015-12-17 10:45:15 -05:00
return Status::Ok;
}
2014-05-02 12:06:31 -04:00
private:
DataFacadeT *facade;
2013-08-13 12:09:20 -04:00
std::string descriptor_string;
};
2016-01-05 10:51:13 -05:00
}
}
}
2015-01-27 11:44:46 -05:00
#endif /* NEAREST_HPP */