Add support for tile plugin
This commit is contained in:
@@ -46,4 +46,9 @@ engine::Status OSRM::Match(const engine::api::MatchParameters ¶ms, json::Obj
|
||||
return engine_->Match(params, result);
|
||||
}
|
||||
|
||||
engine::Status OSRM::Tile(const engine::api::TileParameters ¶ms, std::string &result)
|
||||
{
|
||||
return engine_->Tile(params, result);
|
||||
}
|
||||
|
||||
} // ns osrm
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "server/api/nearest_parameter_grammar.hpp"
|
||||
#include "server/api/trip_parameter_grammar.hpp"
|
||||
#include "server/api/match_parameter_grammar.hpp"
|
||||
#include "server/api/tile_parameter_grammar.hpp"
|
||||
|
||||
namespace osrm
|
||||
{
|
||||
@@ -15,7 +16,10 @@ namespace api
|
||||
|
||||
namespace detail
|
||||
{
|
||||
template <typename T> using is_grammar_t = std::is_base_of<BaseParametersGrammar, T>;
|
||||
template <typename T>
|
||||
using is_grammar_t = std::integral_constant<bool,
|
||||
std::is_base_of<BaseParametersGrammar, T>::value ||
|
||||
std::is_same<TileParametersGrammar, T>::value>;
|
||||
|
||||
template <typename ParameterT,
|
||||
typename GrammarT,
|
||||
@@ -70,6 +74,13 @@ boost::optional<engine::api::MatchParameters> parseParameters(std::string::itera
|
||||
return detail::parseParameters<engine::api::MatchParameters, MatchParametersGrammar>(iter, end);
|
||||
}
|
||||
|
||||
template <>
|
||||
boost::optional<engine::api::TileParameters> parseParameters(std::string::iterator &iter,
|
||||
std::string::iterator end)
|
||||
{
|
||||
return detail::parseParameters<engine::api::TileParameters, TileParametersGrammar>(iter, end);
|
||||
}
|
||||
|
||||
} // ns api
|
||||
} // ns server
|
||||
} // ns osrm
|
||||
|
||||
@@ -41,45 +41,29 @@ struct URLGrammar : boost::spirit::qi::grammar<Iterator>
|
||||
{
|
||||
parsed_url.profile = std::move(profile);
|
||||
};
|
||||
const auto set_options = [this](std::string &options)
|
||||
const auto set_query = [this](std::string &query)
|
||||
{
|
||||
parsed_url.options = std::move(options);
|
||||
};
|
||||
const auto add_coordinate = [this](const boost::fusion::vector<double, double> &lonLat)
|
||||
{
|
||||
parsed_url.coordinates.emplace_back(util::Coordinate(
|
||||
util::FixedLongitude(boost::fusion::at_c<0>(lonLat) * COORDINATE_PRECISION),
|
||||
util::FixedLatitude(boost::fusion::at_c<1>(lonLat) * COORDINATE_PRECISION)));
|
||||
};
|
||||
const auto polyline_to_coordinates = [this](const std::string &polyline)
|
||||
{
|
||||
parsed_url.coordinates = engine::decodePolyline(polyline);
|
||||
parsed_url.query = std::move(query);
|
||||
};
|
||||
|
||||
alpha_numeral = qi::char_("a-zA-Z0-9");
|
||||
polyline_chars = qi::char_("a-zA-Z0-9_.--[]{}@?|\\%~`^");
|
||||
all_chars = polyline_chars | qi::char_("=,;:&");
|
||||
|
||||
polyline_rule = qi::as_string[qi::lit("polyline(") >> +polyline_chars >>
|
||||
qi::lit(")")][polyline_to_coordinates];
|
||||
location_rule = (qi::double_ >> qi::lit(',') >> qi::double_)[add_coordinate];
|
||||
query_rule = (location_rule % ';') | polyline_rule;
|
||||
all_chars = polyline_chars | qi::char_("=,;:&().");
|
||||
|
||||
service_rule = +alpha_numeral;
|
||||
version_rule = qi::uint_;
|
||||
profile_rule = +alpha_numeral;
|
||||
options_rule = *all_chars;
|
||||
query_rule = +all_chars;
|
||||
|
||||
url_rule = qi::lit('/') >> service_rule[set_service] >> qi::lit('/') >> qi::lit('v') >>
|
||||
version_rule[set_version] >> qi::lit('/') >> profile_rule[set_profile] >>
|
||||
qi::lit('/') >> query_rule >> -(qi::lit('?') >> options_rule[set_options]);
|
||||
qi::lit('/') >> query_rule[set_query];
|
||||
}
|
||||
|
||||
ParsedURL parsed_url;
|
||||
|
||||
qi::rule<Iterator> url_rule;
|
||||
qi::rule<Iterator, std::string()> options_rule, service_rule, profile_rule;
|
||||
qi::rule<Iterator> query_rule, polyline_rule, location_rule;
|
||||
qi::rule<Iterator, std::string()> service_rule, profile_rule, query_rule;
|
||||
qi::rule<Iterator, unsigned()> version_rule;
|
||||
qi::rule<Iterator, char()> alpha_numeral, all_chars, polyline_chars;
|
||||
};
|
||||
|
||||
@@ -45,8 +45,6 @@ void RequestHandler::HandleRequest(const http::request ¤t_request,
|
||||
return;
|
||||
}
|
||||
|
||||
util::json::Object json_result;
|
||||
|
||||
// parse command
|
||||
try
|
||||
{
|
||||
@@ -81,11 +79,14 @@ void RequestHandler::HandleRequest(const http::request ¤t_request,
|
||||
|
||||
auto api_iterator = request_string.begin();
|
||||
auto maybe_parsed_url = api::parseURL(api_iterator, request_string.end());;
|
||||
ServiceHandler::ResultT result;
|
||||
|
||||
|
||||
// check if the was an error with the request
|
||||
if (maybe_parsed_url && api_iterator == request_string.end())
|
||||
{
|
||||
const engine::Status status = service_handler->RunQuery(std::move(*maybe_parsed_url), json_result);
|
||||
|
||||
const engine::Status status = service_handler->RunQuery(std::move(*maybe_parsed_url), result);
|
||||
if (status != engine::Status::Ok)
|
||||
{
|
||||
// 4xx bad request return code
|
||||
@@ -104,20 +105,33 @@ void RequestHandler::HandleRequest(const http::request ¤t_request,
|
||||
std::string context(context_begin, context_end);
|
||||
|
||||
current_reply.status = http::reply::bad_request;
|
||||
result = util::json::Object();
|
||||
auto& json_result = result.get<util::json::Object>();
|
||||
json_result.values["code"] = "invalid-url";
|
||||
json_result.values["message"] =
|
||||
"URL string malformed close to position " + std::to_string(position) + ": \"" + context + "\"";
|
||||
}
|
||||
|
||||
|
||||
current_reply.headers.emplace_back("Access-Control-Allow-Origin", "*");
|
||||
current_reply.headers.emplace_back("Access-Control-Allow-Methods", "GET");
|
||||
current_reply.headers.emplace_back("Access-Control-Allow-Headers",
|
||||
"X-Requested-With, Content-Type");
|
||||
current_reply.headers.emplace_back("Content-Type", "application/json; charset=UTF-8");
|
||||
current_reply.headers.emplace_back("Content-Disposition",
|
||||
"inline; filename=\"response.json\"");
|
||||
if (result.is<util::json::Object>())
|
||||
{
|
||||
current_reply.headers.emplace_back("Content-Type", "application/json; charset=UTF-8");
|
||||
current_reply.headers.emplace_back("Content-Disposition",
|
||||
"inline; filename=\"response.json\"");
|
||||
|
||||
util::json::render(current_reply.content, json_result);
|
||||
util::json::render(current_reply.content, result.get<util::json::Object>());
|
||||
}
|
||||
else
|
||||
{
|
||||
BOOST_ASSERT(result.is<std::string>());
|
||||
std::copy(result.get<std::string>().cbegin(), result.get<std::string>().cend(), std::back_inserter(current_reply.content));
|
||||
|
||||
current_reply.headers.emplace_back("Content-Type", "application/x-protobuf");
|
||||
}
|
||||
|
||||
// set headers
|
||||
current_reply.headers.emplace_back("Content-Length",
|
||||
|
||||
@@ -40,34 +40,33 @@ std::string getWrongOptionHelp(const engine::api::MatchParameters ¶meters)
|
||||
}
|
||||
} // anon. ns
|
||||
|
||||
engine::Status MatchService::RunQuery(std::vector<util::Coordinate> coordinates,
|
||||
std::string &options,
|
||||
util::json::Object &result)
|
||||
engine::Status MatchService::RunQuery(std::string &query, ResultT &result)
|
||||
{
|
||||
auto options_iterator = options.begin();
|
||||
result = util::json::Object();
|
||||
auto& json_result = result.get<util::json::Object>();
|
||||
|
||||
auto query_iterator = query.begin();
|
||||
auto parameters =
|
||||
api::parseParameters<engine::api::MatchParameters>(options_iterator, options.end());
|
||||
if (!parameters || options_iterator != options.end())
|
||||
api::parseParameters<engine::api::MatchParameters>(query_iterator, query.end());
|
||||
if (!parameters || query_iterator != query.end())
|
||||
{
|
||||
const auto position = std::distance(options.begin(), options_iterator);
|
||||
result.values["code"] = "invalid-options";
|
||||
result.values["message"] =
|
||||
"Options string malformed close to position " + std::to_string(position);
|
||||
const auto position = std::distance(query.begin(), query_iterator);
|
||||
json_result.values["code"] = "invalid-query";
|
||||
json_result.values["message"] =
|
||||
"Query string malformed close to position " + std::to_string(position);
|
||||
return engine::Status::Error;
|
||||
}
|
||||
|
||||
BOOST_ASSERT(parameters);
|
||||
parameters->coordinates = std::move(coordinates);
|
||||
|
||||
if (!parameters->IsValid())
|
||||
{
|
||||
result.values["code"] = "invalid-options";
|
||||
result.values["message"] = getWrongOptionHelp(*parameters);
|
||||
json_result.values["code"] = "invalid-options";
|
||||
json_result.values["message"] = getWrongOptionHelp(*parameters);
|
||||
return engine::Status::Error;
|
||||
}
|
||||
BOOST_ASSERT(parameters->IsValid());
|
||||
|
||||
return BaseService::routing_machine.Match(*parameters, result);
|
||||
return BaseService::routing_machine.Match(*parameters, json_result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,35 +39,33 @@ std::string getWrongOptionHelp(const engine::api::NearestParameters ¶meters)
|
||||
}
|
||||
} // anon. ns
|
||||
|
||||
engine::Status NearestService::RunQuery(std::vector<util::Coordinate> coordinates,
|
||||
std::string &options,
|
||||
util::json::Object &result)
|
||||
engine::Status NearestService::RunQuery(std::string &query, ResultT &result)
|
||||
{
|
||||
auto options_iterator = options.begin();
|
||||
result = util::json::Object();
|
||||
auto& json_result = result.get<util::json::Object>();
|
||||
|
||||
auto query_iterator = query.begin();
|
||||
auto parameters =
|
||||
api::parseParameters<engine::api::NearestParameters>(options_iterator, options.end());
|
||||
if (!parameters || options_iterator != options.end())
|
||||
api::parseParameters<engine::api::NearestParameters>(query_iterator, query.end());
|
||||
if (!parameters || query_iterator != query.end())
|
||||
{
|
||||
const auto position = std::distance(options.begin(), options_iterator);
|
||||
result.values["code"] = "invalid-options";
|
||||
result.values["message"] =
|
||||
"Options string malformed close to position " + std::to_string(position);
|
||||
const auto position = std::distance(query.begin(), query_iterator);
|
||||
json_result.values["code"] = "invalid-query";
|
||||
json_result.values["message"] =
|
||||
"Query string malformed close to position " + std::to_string(position);
|
||||
return engine::Status::Error;
|
||||
}
|
||||
|
||||
BOOST_ASSERT(parameters);
|
||||
parameters->coordinates = std::move(coordinates);
|
||||
|
||||
if (!parameters->IsValid())
|
||||
{
|
||||
result.values["code"] = "invalid-options";
|
||||
result.values["message"] = getWrongOptionHelp(*parameters);
|
||||
json_result.values["code"] = "invalid-options";
|
||||
json_result.values["message"] = getWrongOptionHelp(*parameters);
|
||||
return engine::Status::Error;
|
||||
}
|
||||
BOOST_ASSERT(parameters->IsValid());
|
||||
|
||||
return BaseService::routing_machine.Nearest(*parameters, result);
|
||||
return Status::Error;
|
||||
return BaseService::routing_machine.Nearest(*parameters, json_result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,34 +38,33 @@ std::string getWrongOptionHelp(const engine::api::RouteParameters ¶meters)
|
||||
}
|
||||
} // anon. ns
|
||||
|
||||
engine::Status RouteService::RunQuery(std::vector<util::Coordinate> coordinates,
|
||||
std::string &options,
|
||||
util::json::Object &result)
|
||||
engine::Status RouteService::RunQuery(std::string &query, ResultT &result)
|
||||
{
|
||||
auto options_iterator = options.begin();
|
||||
result = util::json::Object();
|
||||
auto &json_result = result.get<util::json::Object>();
|
||||
|
||||
auto query_iterator = query.begin();
|
||||
auto parameters =
|
||||
api::parseParameters<engine::api::RouteParameters>(options_iterator, options.end());
|
||||
if (!parameters || options_iterator != options.end())
|
||||
api::parseParameters<engine::api::RouteParameters>(query_iterator, query.end());
|
||||
if (!parameters || query_iterator != query.end())
|
||||
{
|
||||
const auto position = std::distance(options.begin(), options_iterator);
|
||||
result.values["code"] = "invalid-options";
|
||||
result.values["message"] =
|
||||
"Options string malformed close to position " + std::to_string(position);
|
||||
const auto position = std::distance(query.begin(), query_iterator);
|
||||
json_result.values["code"] = "invalid-query";
|
||||
json_result.values["message"] =
|
||||
"Query string malformed close to position " + std::to_string(position);
|
||||
return engine::Status::Error;
|
||||
}
|
||||
|
||||
BOOST_ASSERT(parameters);
|
||||
parameters->coordinates = std::move(coordinates);
|
||||
|
||||
if (!parameters->IsValid())
|
||||
{
|
||||
result.values["code"] = "invalid-options";
|
||||
result.values["message"] = getWrongOptionHelp(*parameters);
|
||||
json_result.values["code"] = "invalid-options";
|
||||
json_result.values["message"] = getWrongOptionHelp(*parameters);
|
||||
return engine::Status::Error;
|
||||
}
|
||||
BOOST_ASSERT(parameters->IsValid());
|
||||
|
||||
return BaseService::routing_machine.Route(*parameters, result);
|
||||
return BaseService::routing_machine.Route(*parameters, json_result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "server/service/table_service.hpp"
|
||||
|
||||
#include "engine/api/route_parameters.hpp"
|
||||
#include "engine/api/table_parameters.hpp"
|
||||
#include "server/api/parameters_parser.hpp"
|
||||
|
||||
#include "util/json_container.hpp"
|
||||
@@ -57,35 +57,33 @@ std::string getWrongOptionHelp(const engine::api::TableParameters ¶meters)
|
||||
}
|
||||
} // anon. ns
|
||||
|
||||
engine::Status TableService::RunQuery(std::vector<util::Coordinate> coordinates,
|
||||
std::string &options,
|
||||
util::json::Object &result)
|
||||
engine::Status TableService::RunQuery(std::string &query, ResultT &result)
|
||||
{
|
||||
result = util::json::Object();
|
||||
auto &json_result = result.get<util::json::Object>();
|
||||
|
||||
auto options_iterator = options.begin();
|
||||
auto query_iterator = query.begin();
|
||||
auto parameters =
|
||||
api::parseParameters<engine::api::TableParameters>(options_iterator, options.end());
|
||||
if (!parameters || options_iterator != options.end())
|
||||
api::parseParameters<engine::api::TableParameters>(query_iterator, query.end());
|
||||
if (!parameters || query_iterator != query.end())
|
||||
{
|
||||
const auto position = std::distance(options.begin(), options_iterator);
|
||||
result.values["code"] = "invalid-options";
|
||||
result.values["message"] =
|
||||
"Options string malformed close to position " + std::to_string(position);
|
||||
const auto position = std::distance(query.begin(), query_iterator);
|
||||
json_result.values["code"] = "invalid-query";
|
||||
json_result.values["message"] =
|
||||
"Query string malformed close to position " + std::to_string(position);
|
||||
return engine::Status::Error;
|
||||
}
|
||||
|
||||
BOOST_ASSERT(parameters);
|
||||
parameters->coordinates = std::move(coordinates);
|
||||
|
||||
if (!parameters->IsValid())
|
||||
{
|
||||
result.values["code"] = "invalid-options";
|
||||
result.values["message"] = getWrongOptionHelp(*parameters);
|
||||
json_result.values["code"] = "invalid-options";
|
||||
json_result.values["message"] = getWrongOptionHelp(*parameters);
|
||||
return engine::Status::Error;
|
||||
}
|
||||
BOOST_ASSERT(parameters->IsValid());
|
||||
|
||||
return BaseService::routing_machine.Table(*parameters, result);
|
||||
return BaseService::routing_machine.Table(*parameters, json_result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
#include "server/service/tile_service.hpp"
|
||||
#include "server/service/utils.hpp"
|
||||
|
||||
#include "engine/api/tile_parameters.hpp"
|
||||
#include "server/api/parameters_parser.hpp"
|
||||
|
||||
#include "util/json_container.hpp"
|
||||
|
||||
#include <boost/format.hpp>
|
||||
|
||||
namespace osrm
|
||||
{
|
||||
namespace server
|
||||
{
|
||||
namespace service
|
||||
{
|
||||
|
||||
engine::Status TileService::RunQuery(std::string &query, ResultT &result)
|
||||
{
|
||||
auto query_iterator = query.begin();
|
||||
auto parameters =
|
||||
api::parseParameters<engine::api::TileParameters>(query_iterator, query.end());
|
||||
if (!parameters || query_iterator != query.end())
|
||||
{
|
||||
const auto position = std::distance(query.begin(), query_iterator);
|
||||
result = util::json::Object();
|
||||
auto &json_result = result.get<util::json::Object>();
|
||||
json_result.values["code"] = "invalid-query";
|
||||
json_result.values["message"] =
|
||||
"Query string malformed close to position " + std::to_string(position);
|
||||
return engine::Status::Error;
|
||||
}
|
||||
BOOST_ASSERT(parameters);
|
||||
|
||||
if (!parameters->IsValid())
|
||||
{
|
||||
result = util::json::Object();
|
||||
auto &json_result = result.get<util::json::Object>();
|
||||
json_result.values["code"] = "invalid-options";
|
||||
json_result.values["message"] = "Invalid coodinates. Only zoomlevel 12+ is supported";
|
||||
return engine::Status::Error;
|
||||
}
|
||||
BOOST_ASSERT(parameters->IsValid());
|
||||
|
||||
result = std::string();
|
||||
auto &string_result = result.get<std::string>();
|
||||
return BaseService::routing_machine.Tile(*parameters, string_result);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -38,34 +38,35 @@ std::string getWrongOptionHelp(const engine::api::TripParameters ¶meters)
|
||||
}
|
||||
} // anon. ns
|
||||
|
||||
engine::Status TripService::RunQuery(std::vector<util::Coordinate> coordinates,
|
||||
std::string &options,
|
||||
util::json::Object &result)
|
||||
engine::Status TripService::RunQuery(std::string &query, ResultT &result)
|
||||
{
|
||||
auto options_iterator = options.begin();
|
||||
result = util::json::Object();
|
||||
auto &json_result = result.get<util::json::Object>();
|
||||
|
||||
auto query_iterator = query.begin();
|
||||
auto parameters =
|
||||
api::parseParameters<engine::api::TripParameters>(options_iterator, options.end());
|
||||
if (!parameters || options_iterator != options.end())
|
||||
api::parseParameters<engine::api::TripParameters>(query_iterator, query.end());
|
||||
if (!parameters || query_iterator != query.end())
|
||||
{
|
||||
const auto position = std::distance(options.begin(), options_iterator);
|
||||
result.values["code"] = "invalid-options";
|
||||
result.values["message"] =
|
||||
"Options string malformed close to position " + std::to_string(position);
|
||||
const auto position = std::distance(query.begin(), query_iterator);
|
||||
result = util::json::Object();
|
||||
auto &json_result = result.get<util::json::Object>();
|
||||
json_result.values["code"] = "invalid-query";
|
||||
json_result.values["message"] =
|
||||
"Query string malformed close to position " + std::to_string(position);
|
||||
return engine::Status::Error;
|
||||
}
|
||||
|
||||
BOOST_ASSERT(parameters);
|
||||
parameters->coordinates = std::move(coordinates);
|
||||
|
||||
if (!parameters->IsValid())
|
||||
{
|
||||
result.values["code"] = "invalid-options";
|
||||
result.values["message"] = getWrongOptionHelp(*parameters);
|
||||
json_result.values["code"] = "invalid-options";
|
||||
json_result.values["message"] = getWrongOptionHelp(*parameters);
|
||||
return engine::Status::Error;
|
||||
}
|
||||
BOOST_ASSERT(parameters->IsValid());
|
||||
|
||||
return BaseService::routing_machine.Trip(*parameters, result);
|
||||
return BaseService::routing_machine.Trip(*parameters, json_result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "server/service/nearest_service.hpp"
|
||||
#include "server/service/trip_service.hpp"
|
||||
#include "server/service/match_service.hpp"
|
||||
#include "server/service/tile_service.hpp"
|
||||
|
||||
#include "server/api/parsed_url.hpp"
|
||||
#include "util/json_util.hpp"
|
||||
@@ -21,27 +22,32 @@ ServiceHandler::ServiceHandler(osrm::EngineConfig &config) : routing_machine(con
|
||||
service_map["nearest"] = util::make_unique<service::NearestService>(routing_machine);
|
||||
service_map["trip"] = util::make_unique<service::TripService>(routing_machine);
|
||||
service_map["match"] = util::make_unique<service::MatchService>(routing_machine);
|
||||
service_map["tile"] = util::make_unique<service::TileService>(routing_machine);
|
||||
}
|
||||
|
||||
engine::Status ServiceHandler::RunQuery(api::ParsedURL parsed_url, util::json::Object &result)
|
||||
engine::Status ServiceHandler::RunQuery(api::ParsedURL parsed_url, service::BaseService::ResultT &result)
|
||||
{
|
||||
const auto &service_iter = service_map.find(parsed_url.service);
|
||||
if (service_iter == service_map.end())
|
||||
{
|
||||
result.values["code"] = "invalid-service";
|
||||
result.values["message"] = "Service " + parsed_url.service + " not found!";
|
||||
result = util::json::Object();
|
||||
auto &json_result = result.get<util::json::Object>();
|
||||
json_result.values["code"] = "invalid-service";
|
||||
json_result.values["message"] = "Service " + parsed_url.service + " not found!";
|
||||
return engine::Status::Error;
|
||||
}
|
||||
auto &service = service_iter->second;
|
||||
|
||||
if (service->GetVersion() != parsed_url.version)
|
||||
{
|
||||
result.values["code"] = "invalid-version";
|
||||
result.values["message"] = "Service " + parsed_url.service + " not found!";
|
||||
result = util::json::Object();
|
||||
auto &json_result = result.get<util::json::Object>();
|
||||
json_result.values["code"] = "invalid-version";
|
||||
json_result.values["message"] = "Service " + parsed_url.service + " not found!";
|
||||
return engine::Status::Error;
|
||||
}
|
||||
|
||||
return service->RunQuery(std::move(parsed_url.coordinates), parsed_url.options, result);
|
||||
return service->RunQuery(parsed_url.query, result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user