libosrm 1.0.0.pre.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
}
|