libosrm 1.0.0.pre.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/libosrm-prepare +42 -0
- data/ext/libosrm/dependencies.yaml +4 -0
- data/ext/libosrm/extconf.rb +76 -0
- data/ext/libosrm/globals.hpp +17 -0
- data/ext/libosrm/libosrm.cpp +23 -0
- data/ext/libosrm/mini_portile_fixed_cmake.rb +51 -0
- data/ext/libosrm/osrm_action.cpp +188 -0
- data/ext/libosrm/osrm_action.hpp +24 -0
- data/ext/libosrm/osrm_match_func.cpp +79 -0
- data/ext/libosrm/osrm_match_func.hpp +19 -0
- data/ext/libosrm/osrm_nearest_func.cpp +80 -0
- data/ext/libosrm/osrm_nearest_func.hpp +25 -0
- data/ext/libosrm/osrm_route_func.cpp +86 -0
- data/ext/libosrm/osrm_route_func.hpp +20 -0
- data/ext/libosrm/osrm_table_func.cpp +101 -0
- data/ext/libosrm/osrm_table_func.hpp +25 -0
- data/ext/libosrm/osrm_tile_func.cpp +27 -0
- data/ext/libosrm/osrm_tile_func.hpp +13 -0
- data/ext/libosrm/osrm_trip_func.cpp +109 -0
- data/ext/libosrm/osrm_trip_func.hpp +20 -0
- data/ext/libosrm/ruby_engine_config.cpp +89 -0
- data/ext/libosrm/ruby_engine_config.hpp +26 -0
- data/ext/libosrm/ruby_osrm_object.cpp +78 -0
- data/ext/libosrm/ruby_osrm_object.hpp +20 -0
- data/ext/libosrm/ruby_storage_config.cpp +86 -0
- data/ext/libosrm/ruby_storage_config.hpp +25 -0
- data/lib/libosrm.rb +12 -0
- data/lib/libosrm/osrm.rb +162 -0
- data/lib/libosrm/version.rb +5 -0
- data/libexec/.keep +0 -0
- data/osrm/profiles/.keep +0 -0
- metadata +133 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
#ifndef OSRM_MATCH_FUNC
|
2
|
+
#define OSRM_MATCH_FUNC
|
3
|
+
|
4
|
+
#include "globals.hpp"
|
5
|
+
|
6
|
+
#include <osrm/osrm.hpp>
|
7
|
+
#include <osrm/json_container.hpp>
|
8
|
+
|
9
|
+
using namespace Rice;
|
10
|
+
|
11
|
+
Rice::Object wrap_match(Rice::Object self, Rice::Array coordinates, Rice::Hash opts);
|
12
|
+
|
13
|
+
//Array parse_route_legs(osrm::util::json::Value value);
|
14
|
+
//Array parse_route_leg_steps(osrm::util::json::Value value);
|
15
|
+
//Hash parse_route_leg_annotations(osrm::util::json::Value value);
|
16
|
+
|
17
|
+
Hash parse_match_result(osrm::json::Object match);
|
18
|
+
|
19
|
+
#endif
|
@@ -0,0 +1,80 @@
|
|
1
|
+
|
2
|
+
#include "osrm_nearest_func.hpp"
|
3
|
+
|
4
|
+
#include <osrm/nearest_parameters.hpp>
|
5
|
+
|
6
|
+
Object wrap_nearest(Object self, double latitude, double longitude, int amount) {
|
7
|
+
NearestFunc func;
|
8
|
+
return func.wrap_nearest(self, latitude, longitude, amount);
|
9
|
+
}
|
10
|
+
|
11
|
+
Hash NearestFunc::parse_nearest_result(osrm::json::Object nearest) {
|
12
|
+
Hash result;
|
13
|
+
for(std::pair<std::string, osrm::util::json::Value> e : nearest.values) {
|
14
|
+
if(e.first == "code") {
|
15
|
+
result[String("code")] = e.second.get<osrm::json::String>().value;
|
16
|
+
} else if(e.first == "waypoints") {
|
17
|
+
result[String("waypoints")] = parse_waypoints(e.second.get<osrm::json::Array>());
|
18
|
+
} else {
|
19
|
+
throw Exception(rb_eRuntimeError, "Invalid JSON value when building a match from libosrm.so: %s", e.first.c_str());
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
return result;
|
24
|
+
}
|
25
|
+
|
26
|
+
Object NearestFunc::wrap_nearest(Object self, double latitude, double longitude, int amount) {
|
27
|
+
// Convert Ruby object to native type
|
28
|
+
osrm::NearestParameters params;
|
29
|
+
|
30
|
+
params.coordinates.push_back({osrm::util::FloatLongitude{longitude}, osrm::util::FloatLatitude{latitude}});
|
31
|
+
|
32
|
+
/*
|
33
|
+
if(!opts.is_nil()) {
|
34
|
+
Object geometry_type = opts[Symbol("geometry_type")];
|
35
|
+
if(!geometry_type.is_nil()) {
|
36
|
+
Symbol g_type = (Symbol) geometry_type;
|
37
|
+
const char *type = g_type.c_str();
|
38
|
+
if(strcmp(type, "polyline") == 0) {
|
39
|
+
params.geometries = osrm::RouteParameters::GeometriesType::Polyline;
|
40
|
+
}
|
41
|
+
if(strcmp(type, "polyline6") == 0) {
|
42
|
+
params.geometries = osrm::RouteParameters::GeometriesType::Polyline6;
|
43
|
+
}
|
44
|
+
if(strcmp(type, "geojson") == 0) {
|
45
|
+
params.geometries = osrm::RouteParameters::GeometriesType::GeoJSON;
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
Object steps = opts[Symbol("steps")];
|
50
|
+
if(steps) {
|
51
|
+
params.steps = true;
|
52
|
+
}
|
53
|
+
|
54
|
+
Object annotations = opts[Symbol("annotations")];
|
55
|
+
if(annotations) {
|
56
|
+
params.annotations = true;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
*/
|
60
|
+
|
61
|
+
params.number_of_results = amount;
|
62
|
+
|
63
|
+
// Response is in JSON format
|
64
|
+
osrm::json::Object result;
|
65
|
+
|
66
|
+
Data_Object<osrm::OSRM> osrm(self);
|
67
|
+
|
68
|
+
// Execute routing request, this does the heavy lifting
|
69
|
+
const auto status = osrm->Nearest(params, result);
|
70
|
+
|
71
|
+
if (status != osrm::Status::Ok) {
|
72
|
+
const auto code = result.values["code"].get<osrm::json::String>().value;
|
73
|
+
const auto message = result.values["message"].get<osrm::json::String>().value;
|
74
|
+
|
75
|
+
throw Exception(rb_eRuntimeError, "Failed to route with given input. error code: %s, message: %s", code.c_str(), message.c_str());
|
76
|
+
}
|
77
|
+
|
78
|
+
return parse_nearest_result(result);
|
79
|
+
}
|
80
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#ifndef OSRM_NEAREST_FUNC
|
2
|
+
#define OSRM_NEAREST_FUNC
|
3
|
+
|
4
|
+
#include "globals.hpp"
|
5
|
+
#include "osrm_action.hpp"
|
6
|
+
|
7
|
+
#include <osrm/osrm.hpp>
|
8
|
+
#include <osrm/json_container.hpp>
|
9
|
+
|
10
|
+
using namespace Rice;
|
11
|
+
|
12
|
+
Rice::Object wrap_nearest(Rice::Object self, double latitude, double longitude, int amount);
|
13
|
+
|
14
|
+
class NearestFunc : private OSRMAction {
|
15
|
+
|
16
|
+
public:
|
17
|
+
// amount defaults to 1
|
18
|
+
Rice::Object wrap_nearest(Rice::Object self, double latitude, double longitude, int amount);
|
19
|
+
|
20
|
+
private:
|
21
|
+
Hash parse_nearest_result(osrm::json::Object nearest);
|
22
|
+
|
23
|
+
};
|
24
|
+
|
25
|
+
#endif
|
@@ -0,0 +1,86 @@
|
|
1
|
+
|
2
|
+
#include "osrm_route_func.hpp"
|
3
|
+
|
4
|
+
#include <osrm/route_parameters.hpp>
|
5
|
+
|
6
|
+
Object wrap_route(Object self, Array coordinates, Hash opts) {
|
7
|
+
RouteFunc func;
|
8
|
+
return func.wrap_route(self, coordinates, opts);
|
9
|
+
}
|
10
|
+
|
11
|
+
template<>
|
12
|
+
Object to_ruby<osrm::json::Value>(osrm::json::Value const & x) {
|
13
|
+
if(x.is<osrm::json::String>()) {
|
14
|
+
return String(x.get<osrm::json::String>().value);
|
15
|
+
} else if(x.is<osrm::json::Number>()) {
|
16
|
+
return to_ruby(x.get<osrm::json::Number>().value);
|
17
|
+
} else {
|
18
|
+
throw Exception(rb_eRuntimeError, "Failed to convert osrm::json::Value, from libosrm.so");
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
Object RouteFunc::wrap_route(Object self, Array coordinates, Hash opts) {
|
23
|
+
// Convert Ruby object to native type
|
24
|
+
osrm::RouteParameters params;
|
25
|
+
|
26
|
+
Array::iterator it = coordinates.begin();
|
27
|
+
Array::iterator end = coordinates.end();
|
28
|
+
for(; it != end; ++it) {
|
29
|
+
Hash latlon = (Hash)*it;
|
30
|
+
double lat = from_ruby<double>(latlon[Symbol("latitude")]);
|
31
|
+
double lon = from_ruby<double>(latlon[Symbol("longitude")]);
|
32
|
+
params.coordinates.push_back({osrm::util::FloatLongitude{lon}, osrm::util::FloatLatitude{lat}});
|
33
|
+
}
|
34
|
+
|
35
|
+
Object geometry_type = opts[Symbol("geometry_type")];
|
36
|
+
if(!geometry_type.is_nil()) {
|
37
|
+
Symbol g_type = (Symbol) geometry_type;
|
38
|
+
const char *type = g_type.c_str();
|
39
|
+
if(strcmp(type, "polyline") == 0) {
|
40
|
+
params.geometries = osrm::RouteParameters::GeometriesType::Polyline;
|
41
|
+
}
|
42
|
+
if(strcmp(type, "polyline6") == 0) {
|
43
|
+
params.geometries = osrm::RouteParameters::GeometriesType::Polyline6;
|
44
|
+
}
|
45
|
+
if(strcmp(type, "geojson") == 0) {
|
46
|
+
params.geometries = osrm::RouteParameters::GeometriesType::GeoJSON;
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
Object steps = opts[Symbol("steps")];
|
51
|
+
if(steps) {
|
52
|
+
params.steps = true;
|
53
|
+
}
|
54
|
+
|
55
|
+
Object annotations = opts[Symbol("annotations")];
|
56
|
+
if(annotations) {
|
57
|
+
params.annotations = true;
|
58
|
+
}
|
59
|
+
|
60
|
+
// Response is in JSON format
|
61
|
+
osrm::json::Object result;
|
62
|
+
|
63
|
+
Data_Object<osrm::OSRM> osrm(self);
|
64
|
+
|
65
|
+
// Execute routing request, this does the heavy lifting
|
66
|
+
const auto status = osrm->Route(params, result);
|
67
|
+
|
68
|
+
if (status != osrm::Status::Ok) {
|
69
|
+
const auto code = result.values["code"].get<osrm::json::String>().value;
|
70
|
+
const auto message = result.values["message"].get<osrm::json::String>().value;
|
71
|
+
|
72
|
+
throw Exception(rb_eRuntimeError, "Failed to route with given input. error code: %s, message: %s", code.c_str(), message.c_str());
|
73
|
+
}
|
74
|
+
|
75
|
+
Hash routes_result;
|
76
|
+
routes_result[String("code")] = result.values["code"].get<osrm::json::String>().value;
|
77
|
+
|
78
|
+
Array routes_array;
|
79
|
+
auto &routeValues = result.values["routes"].get<osrm::json::Array>();
|
80
|
+
for(auto const& routeValue : routeValues.values) {
|
81
|
+
routes_array.push(parse_route(routeValue.get<osrm::json::Object>()));
|
82
|
+
}
|
83
|
+
routes_result[String("routes")] = routes_array;
|
84
|
+
|
85
|
+
return routes_result;
|
86
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#ifndef OSRM_ROUTE_FUNC
|
2
|
+
#define OSRM_ROUTE_FUNC
|
3
|
+
|
4
|
+
#include "globals.hpp"
|
5
|
+
#include "osrm_action.hpp"
|
6
|
+
|
7
|
+
#include <osrm/osrm.hpp>
|
8
|
+
#include <osrm/json_container.hpp>
|
9
|
+
|
10
|
+
using namespace Rice;
|
11
|
+
|
12
|
+
Rice::Object wrap_route(Rice::Object self, Rice::Array coordinates, Rice::Hash opts);
|
13
|
+
|
14
|
+
class RouteFunc : private OSRMAction {
|
15
|
+
|
16
|
+
public:
|
17
|
+
Rice::Object wrap_route(Rice::Object self, Rice::Array coordinates, Rice::Hash opts);
|
18
|
+
};
|
19
|
+
|
20
|
+
#endif
|
@@ -0,0 +1,101 @@
|
|
1
|
+
|
2
|
+
#include "osrm_table_func.hpp"
|
3
|
+
|
4
|
+
#include <osrm/table_parameters.hpp>
|
5
|
+
|
6
|
+
#include "osrm_nearest_func.hpp"
|
7
|
+
|
8
|
+
Object wrap_table(Object self, Array coordinates, Hash opts) {
|
9
|
+
TableFunc func;
|
10
|
+
return func.wrap_table(self, coordinates, opts);
|
11
|
+
}
|
12
|
+
|
13
|
+
Hash TableFunc::parse_table_result(osrm::json::Object match) {
|
14
|
+
Hash result;
|
15
|
+
for(std::pair<std::string, osrm::util::json::Value> e : match.values) {
|
16
|
+
if(e.first == "code") {
|
17
|
+
result[String("code")] = e.second.get<osrm::json::String>().value;
|
18
|
+
} else if(e.first == "durations") {
|
19
|
+
Array durations_result;
|
20
|
+
for(auto const& durationArrayValue : e.second.get<osrm::json::Array>().values) {
|
21
|
+
auto durationArray = durationArrayValue.get<osrm::json::Array>();
|
22
|
+
Array duration_result;
|
23
|
+
for(auto const& durationValue : durationArray.values) {
|
24
|
+
duration_result.push(durationValue.get<osrm::json::Number>().value);
|
25
|
+
}
|
26
|
+
durations_result.push(duration_result);
|
27
|
+
}
|
28
|
+
result[String("durations")] = durations_result;
|
29
|
+
} else if(e.first == "sources") {
|
30
|
+
result[String("sources")] = parse_waypoints(e.second.get<osrm::json::Array>());
|
31
|
+
} else if(e.first == "destinations") {
|
32
|
+
result[String("destinations")] = parse_waypoints(e.second.get<osrm::json::Array>());
|
33
|
+
} else {
|
34
|
+
throw Exception(rb_eRuntimeError, "Invalid JSON value when building a table from libosrm.so: %s", e.first.c_str());
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
return result;
|
39
|
+
}
|
40
|
+
|
41
|
+
std::vector<std::size_t> TableFunc::table_array_conversion(Object o) {
|
42
|
+
std::vector<std::size_t> out;
|
43
|
+
if(o.is_a(rb_cArray)) {
|
44
|
+
Array a = (Array) o;
|
45
|
+
Array::iterator it = a.begin();
|
46
|
+
Array::iterator end = a.end();
|
47
|
+
for(; it != end; ++it) {
|
48
|
+
int index = (int)(Object)*it;
|
49
|
+
out.push_back(index);
|
50
|
+
}
|
51
|
+
} else if(o.is_a(rb_cString)) {
|
52
|
+
out.push_back(from_ruby<int>(o));
|
53
|
+
} else if(o.is_a(rb_cNumeric)) {
|
54
|
+
out.push_back(from_ruby<int>(o));
|
55
|
+
}
|
56
|
+
|
57
|
+
return out;
|
58
|
+
}
|
59
|
+
|
60
|
+
Object TableFunc::wrap_table(Object self, Array coordinates, Hash opts) {
|
61
|
+
// Convert Ruby object to native type
|
62
|
+
osrm::TableParameters params;
|
63
|
+
|
64
|
+
Array::iterator it = coordinates.begin();
|
65
|
+
Array::iterator end = coordinates.end();
|
66
|
+
for(; it != end; ++it) {
|
67
|
+
Hash latlon = (Hash)*it;
|
68
|
+
double lat = from_ruby<double>(latlon[Symbol("latitude")]);
|
69
|
+
double lon = from_ruby<double>(latlon[Symbol("longitude")]);
|
70
|
+
params.coordinates.push_back({osrm::util::FloatLongitude{lon}, osrm::util::FloatLatitude{lat}});
|
71
|
+
}
|
72
|
+
|
73
|
+
if(!opts.is_nil()) {
|
74
|
+
Object sources = opts[Symbol("sources")];
|
75
|
+
if(sources) {
|
76
|
+
params.sources = table_array_conversion(sources);
|
77
|
+
}
|
78
|
+
|
79
|
+
Object destinations = opts[Symbol("destinations")];
|
80
|
+
if(sources) {
|
81
|
+
params.destinations = table_array_conversion(destinations);
|
82
|
+
}
|
83
|
+
}
|
84
|
+
|
85
|
+
// Response is in JSON format
|
86
|
+
osrm::json::Object result;
|
87
|
+
|
88
|
+
Data_Object<osrm::OSRM> osrm(self);
|
89
|
+
|
90
|
+
// Execute routing request, this does the heavy lifting
|
91
|
+
const auto status = osrm->Table(params, result);
|
92
|
+
|
93
|
+
if (status != osrm::Status::Ok) {
|
94
|
+
const auto code = result.values["code"].get<osrm::json::String>().value;
|
95
|
+
const auto message = result.values["message"].get<osrm::json::String>().value;
|
96
|
+
|
97
|
+
throw Exception(rb_eRuntimeError, "Failed to route with given input. error code: %s, message: %s", code.c_str(), message.c_str());
|
98
|
+
}
|
99
|
+
|
100
|
+
return parse_table_result(result);
|
101
|
+
}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#ifndef OSRM_TABLE_FUNC
|
2
|
+
#define OSRM_TABLE_FUNC
|
3
|
+
|
4
|
+
#include "globals.hpp"
|
5
|
+
#include "osrm_action.hpp"
|
6
|
+
|
7
|
+
#include <osrm/osrm.hpp>
|
8
|
+
#include <osrm/json_container.hpp>
|
9
|
+
|
10
|
+
using namespace Rice;
|
11
|
+
|
12
|
+
Rice::Object wrap_table(Object self, Array coordinates, Hash opts);
|
13
|
+
|
14
|
+
class TableFunc : private OSRMAction {
|
15
|
+
|
16
|
+
public:
|
17
|
+
Rice::Object wrap_table(Object self, Array coordinates, Hash opts);
|
18
|
+
|
19
|
+
private:
|
20
|
+
std::vector<std::size_t> table_array_conversion(Object o);
|
21
|
+
Hash parse_table_result(osrm::json::Object match);
|
22
|
+
|
23
|
+
};
|
24
|
+
|
25
|
+
#endif
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
#include "osrm_tile_func.hpp"
|
3
|
+
|
4
|
+
#include <osrm/tile_parameters.hpp>
|
5
|
+
|
6
|
+
Object wrap_tile(Object self, int x, int y, int zoom) {
|
7
|
+
// Convert Ruby object to native type
|
8
|
+
osrm::TileParameters params;
|
9
|
+
|
10
|
+
params.x = x;
|
11
|
+
params.y = y;
|
12
|
+
params.z = zoom;
|
13
|
+
|
14
|
+
// Response is a std::string, instead of JSON stuff that is elsewhere
|
15
|
+
std::string result;
|
16
|
+
|
17
|
+
Data_Object<osrm::OSRM> osrm(self);
|
18
|
+
|
19
|
+
// Execute routing request, this does the heavy lifting
|
20
|
+
const auto status = osrm->Tile(params, result);
|
21
|
+
|
22
|
+
if (status != osrm::Status::Ok) {
|
23
|
+
throw Exception(rb_eRuntimeError, "Failed to get tile data with given input.");
|
24
|
+
}
|
25
|
+
|
26
|
+
return to_ruby(result);
|
27
|
+
}
|
@@ -0,0 +1,109 @@
|
|
1
|
+
|
2
|
+
#include "osrm_trip_func.hpp"
|
3
|
+
|
4
|
+
#include <osrm/trip_parameters.hpp>
|
5
|
+
|
6
|
+
Object wrap_trip(Object self, Array coordinates, Hash opts) {
|
7
|
+
TripFunc func;
|
8
|
+
return func.wrap_trip(self, coordinates, opts);
|
9
|
+
}
|
10
|
+
|
11
|
+
Object TripFunc::wrap_trip(Object self, Array coordinates, Hash opts) {
|
12
|
+
// Convert Ruby object to native type
|
13
|
+
osrm::TripParameters params;
|
14
|
+
|
15
|
+
Array::iterator it = coordinates.begin();
|
16
|
+
Array::iterator end = coordinates.end();
|
17
|
+
for(; it != end; ++it) {
|
18
|
+
Hash latlon = (Hash)*it;
|
19
|
+
double lat = from_ruby<double>(latlon[Symbol("latitude")]);
|
20
|
+
double lon = from_ruby<double>(latlon[Symbol("longitude")]);
|
21
|
+
params.coordinates.push_back({osrm::util::FloatLongitude{lon}, osrm::util::FloatLatitude{lat}});
|
22
|
+
}
|
23
|
+
|
24
|
+
Object roundtrip = opts[Symbol("roundtrip")];
|
25
|
+
if(roundtrip) {
|
26
|
+
params.roundtrip = true;
|
27
|
+
}
|
28
|
+
|
29
|
+
Object source = opts[Symbol("source")];
|
30
|
+
if(!source.is_nil()) {
|
31
|
+
Symbol source_symbol = (Symbol) source;
|
32
|
+
const char *source_string = source_symbol.c_str();
|
33
|
+
if(strcmp(source_string, "any") == 0) {
|
34
|
+
params.source = osrm::TripParameters::SourceType::Any;
|
35
|
+
} else if(strcmp(source_string, "first") == 0) {
|
36
|
+
params.source = osrm::TripParameters::SourceType::First;
|
37
|
+
} else {
|
38
|
+
throw Exception(rb_eRuntimeError, "libosrm.so#wrap_trip(): failed to recognize given source symbol: %s", source_string);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
Object destination = opts[Symbol("destination")];
|
43
|
+
if(!destination.is_nil()) {
|
44
|
+
Symbol destination_symbol = (Symbol) destination;
|
45
|
+
const char *destination_string = destination_symbol.c_str();
|
46
|
+
if(strcmp(destination_string, "any") == 0) {
|
47
|
+
params.destination = osrm::TripParameters::DestinationType::Any;
|
48
|
+
} else if(strcmp(destination_string, "last") == 0) {
|
49
|
+
params.destination = osrm::TripParameters::DestinationType::Last;
|
50
|
+
} else {
|
51
|
+
throw Exception(rb_eRuntimeError, "libosrm.so#wrap_trip(): failed to recognize given destination symbol: %s", destination_string);
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
// TODO: since this option is same as in route thing, maybe we could have some kind of abstraction?
|
56
|
+
Object geometry_type = opts[Symbol("geometry_type")];
|
57
|
+
if(!geometry_type.is_nil()) {
|
58
|
+
Symbol g_type = (Symbol) geometry_type;
|
59
|
+
const char *type = g_type.c_str();
|
60
|
+
if(strcmp(type, "polyline") == 0) {
|
61
|
+
params.geometries = osrm::RouteParameters::GeometriesType::Polyline;
|
62
|
+
}
|
63
|
+
if(strcmp(type, "polyline6") == 0) {
|
64
|
+
params.geometries = osrm::RouteParameters::GeometriesType::Polyline6;
|
65
|
+
}
|
66
|
+
if(strcmp(type, "geojson") == 0) {
|
67
|
+
params.geometries = osrm::RouteParameters::GeometriesType::GeoJSON;
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
Object steps = opts[Symbol("steps")];
|
72
|
+
if(steps) {
|
73
|
+
params.steps = true;
|
74
|
+
}
|
75
|
+
|
76
|
+
Object annotations = opts[Symbol("annotations")];
|
77
|
+
if(annotations) {
|
78
|
+
params.annotations = true;
|
79
|
+
}
|
80
|
+
|
81
|
+
// Response is in JSON format
|
82
|
+
osrm::json::Object result;
|
83
|
+
|
84
|
+
Data_Object<osrm::OSRM> osrm(self);
|
85
|
+
|
86
|
+
// Execute routing request, this does the heavy lifting
|
87
|
+
const auto status = osrm->Trip(params, result);
|
88
|
+
|
89
|
+
if (status != osrm::Status::Ok) {
|
90
|
+
const auto code = result.values["code"].get<osrm::json::String>().value;
|
91
|
+
const auto message = result.values["message"].get<osrm::json::String>().value;
|
92
|
+
|
93
|
+
throw Exception(rb_eRuntimeError, "Failed to calculate a trip with given input. error code: %s, message: %s", code.c_str(), message.c_str());
|
94
|
+
}
|
95
|
+
|
96
|
+
Hash trip_result;
|
97
|
+
trip_result[String("code")] = result.values["code"].get<osrm::json::String>().value;
|
98
|
+
|
99
|
+
trip_result[String("waypoints")] = parse_waypoints(result.values["waypoints"].get<osrm::json::Array>());
|
100
|
+
|
101
|
+
Array trips_array;
|
102
|
+
auto &tripValues = result.values["trips"].get<osrm::json::Array>();
|
103
|
+
for(auto const& tripValue : tripValues.values) {
|
104
|
+
trips_array.push(parse_route(tripValue.get<osrm::json::Object>()));
|
105
|
+
}
|
106
|
+
trip_result[String("trips")] = trips_array;
|
107
|
+
|
108
|
+
return trip_result;
|
109
|
+
}
|