Removes the breaking libosrm API change by replacing the use of variant response type with method overloading. This has the added benefit of being explicit about the supported response types for each libosrm API method.
90 lines
2.9 KiB
C++
90 lines
2.9 KiB
C++
#include "osrm/match_parameters.hpp"
|
|
#include "osrm/nearest_parameters.hpp"
|
|
#include "osrm/route_parameters.hpp"
|
|
#include "osrm/table_parameters.hpp"
|
|
#include "osrm/trip_parameters.hpp"
|
|
|
|
#include "osrm/coordinate.hpp"
|
|
#include "osrm/engine_config.hpp"
|
|
#include "osrm/json_container.hpp"
|
|
|
|
#include "osrm/osrm.hpp"
|
|
#include "osrm/status.hpp"
|
|
|
|
#include <exception>
|
|
#include <iostream>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
#include <cstdlib>
|
|
|
|
int main(int argc, const char *argv[])
|
|
{
|
|
if (argc < 2)
|
|
{
|
|
std::cerr << "Usage: " << argv[0] << " data.osrm\n";
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
using namespace osrm;
|
|
|
|
// Configure based on a .osrm base path, and no datasets in shared mem from osrm-datastore
|
|
EngineConfig config;
|
|
|
|
config.storage_config = {argv[1]};
|
|
config.use_shared_memory = false;
|
|
|
|
// We support two routing speed up techniques:
|
|
// - Contraction Hierarchies (CH): requires extract+contract pre-processing
|
|
// - Multi-Level Dijkstra (MLD): requires extract+partition+customize pre-processing
|
|
//
|
|
// config.algorithm = EngineConfig::Algorithm::CH;
|
|
config.algorithm = EngineConfig::Algorithm::MLD;
|
|
|
|
// Routing machine with several services (such as Route, Table, Nearest, Trip, Match)
|
|
const OSRM osrm{config};
|
|
|
|
// The following shows how to use the Route service; configure this service
|
|
RouteParameters params;
|
|
|
|
// Route in monaco
|
|
params.coordinates.push_back({util::FloatLongitude{7.419758}, util::FloatLatitude{43.731142}});
|
|
params.coordinates.push_back({util::FloatLongitude{7.419505}, util::FloatLatitude{43.736825}});
|
|
|
|
// Response is in JSON format
|
|
json::Object result;
|
|
|
|
// Execute routing request, this does the heavy lifting
|
|
const auto status = osrm.Route(params, result);
|
|
|
|
if (status == Status::Ok)
|
|
{
|
|
auto &routes = result.values["routes"].get<json::Array>();
|
|
|
|
// Let's just use the first route
|
|
auto &route = routes.values.at(0).get<json::Object>();
|
|
const auto distance = route.values["distance"].get<json::Number>().value;
|
|
const auto duration = route.values["duration"].get<json::Number>().value;
|
|
|
|
// Warn users if extract does not contain the default coordinates from above
|
|
if (distance == 0 || duration == 0)
|
|
{
|
|
std::cout << "Note: distance or duration is zero. ";
|
|
std::cout << "You are probably doing a query outside of the OSM extract.\n\n";
|
|
}
|
|
|
|
std::cout << "Distance: " << distance << " meter\n";
|
|
std::cout << "Duration: " << duration << " seconds\n";
|
|
return EXIT_SUCCESS;
|
|
}
|
|
else if (status == Status::Error)
|
|
{
|
|
const auto code = result.values["code"].get<json::String>().value;
|
|
const auto message = result.values["message"].get<json::String>().value;
|
|
|
|
std::cout << "Code: " << code << "\n";
|
|
std::cout << "Message: " << code << "\n";
|
|
return EXIT_FAILURE;
|
|
}
|
|
}
|