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
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cfcb4338e74ba04017eadd08b4ea6f87b1710766
|
4
|
+
data.tar.gz: 07a0cfd4dd83545f2e1ab951fd1b7f45fb139990
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4d9889352472136de6cccbc235c3b7337aa5dda83fa4df874e437db0a5d19b8777f6386746b6d0e0fa1201556ee3304c1e1c8777d94ace9d803980ff5aba1272
|
7
|
+
data.tar.gz: 6fb73dda9d9b1aabbfa08c6a67a806d7b05204a3c0ed8d4c27543f403f3015de2a4422ad395bfcd4a68f78d28554ac7aceb81afbf48a240873771e2ea2b9d05f
|
data/bin/libosrm-prepare
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#require_relative "../lib/libosrm/version"
|
4
|
+
|
5
|
+
def print_usage
|
6
|
+
puts "Usage: #{$0} path_to_map.pbf"
|
7
|
+
exit 1
|
8
|
+
end
|
9
|
+
|
10
|
+
unless ARGV[0]
|
11
|
+
print_usage
|
12
|
+
end
|
13
|
+
|
14
|
+
pbf = ARGV[0]
|
15
|
+
|
16
|
+
if(pbf == "-h" || pbf == "--help")
|
17
|
+
puts "libosrm-prepare is an utility to prepare Openstreetmap map data for ruby-libosrm to use."
|
18
|
+
puts
|
19
|
+
print_usage
|
20
|
+
end
|
21
|
+
|
22
|
+
unless File.file? pbf
|
23
|
+
puts "Given file does not exist."
|
24
|
+
puts
|
25
|
+
print_usage
|
26
|
+
end
|
27
|
+
|
28
|
+
result = system "#{__dir__}/../libexec/osrm-extract #{pbf} -p #{__dir__}/../osrm/profiles/car.lua"
|
29
|
+
|
30
|
+
unless result
|
31
|
+
puts
|
32
|
+
puts "Extracting map data failed."
|
33
|
+
exit 1
|
34
|
+
end
|
35
|
+
|
36
|
+
result = system "#{__dir__}/../libexec/osrm-contract #{pbf}"
|
37
|
+
|
38
|
+
unless result
|
39
|
+
puts
|
40
|
+
puts "Creating osrm compliant data failed."
|
41
|
+
exit 1
|
42
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require "mkmf-rice"
|
2
|
+
|
3
|
+
require "fileutils"
|
4
|
+
require "yaml"
|
5
|
+
|
6
|
+
def do_help
|
7
|
+
print <<HELP
|
8
|
+
usage: ruby #{$0} [options]
|
9
|
+
|
10
|
+
--use-system-libraries
|
11
|
+
Use system libraries instead of building and using the bundled
|
12
|
+
libraries.
|
13
|
+
HELP
|
14
|
+
exit! 0
|
15
|
+
end
|
16
|
+
|
17
|
+
case
|
18
|
+
when arg_config("--help")
|
19
|
+
do_help
|
20
|
+
end
|
21
|
+
|
22
|
+
def using_system_libraries?
|
23
|
+
arg_config("--use-system-libraries", !!ENV["LIBOSRM_USE_SYSTEM_LIBRARIES"])
|
24
|
+
end
|
25
|
+
|
26
|
+
def symlink_osrm_data recipe
|
27
|
+
FileUtils.ln_s "../#{recipe.work_path}/osrm-extract", "libexec/osrm-extract" unless File.exist? "libexec/osrm-extract"
|
28
|
+
FileUtils.ln_s "../#{recipe.work_path}/osrm-contract", "libexec/osrm-contract" unless File.exist? "libexec/osrm-contract"
|
29
|
+
FileUtils.ln_s "../../#{recipe.work_path}/../profiles/car.lua", "osrm/profiles/car.lua" unless File.exist? "osrm/profiles/car.lua"
|
30
|
+
end
|
31
|
+
|
32
|
+
case
|
33
|
+
when using_system_libraries?
|
34
|
+
message "Building ruby-libosrm using system libraries.\n"
|
35
|
+
|
36
|
+
# Using system libraries means we rely on the system libxml2 with
|
37
|
+
# regard to the iconv support.
|
38
|
+
|
39
|
+
dir_config("libosrm").any? or package_config("libosrm")
|
40
|
+
|
41
|
+
append_cflags("-I/usr/include/osrm")
|
42
|
+
have_library "osrm"
|
43
|
+
else
|
44
|
+
message "Building ruby-libosrm using packaged libraries.\n"
|
45
|
+
|
46
|
+
#puts Dir.pwd.inspect
|
47
|
+
|
48
|
+
Dir.chdir "#{__dir__}/../.." do
|
49
|
+
|
50
|
+
# The gem version constraint in the Rakefile is not respected at install time.
|
51
|
+
# Keep this version in sync with the one in the Rakefile !
|
52
|
+
require "rubygems"
|
53
|
+
gem "mini_portile2", "~> 2.3.0"
|
54
|
+
require "mini_portile2"
|
55
|
+
|
56
|
+
# Current version doesn’t support out of tree builds
|
57
|
+
require_relative "mini_portile_fixed_cmake"
|
58
|
+
|
59
|
+
deps = YAML.load_file "ext/libosrm/dependencies.yaml"
|
60
|
+
|
61
|
+
recipe = MiniPortileFixedCMake.new("libosrm", deps["libosrm"]["version"])
|
62
|
+
recipe.files = [ deps["libosrm"]["download_uri"] ]
|
63
|
+
recipe.cook
|
64
|
+
recipe.activate
|
65
|
+
|
66
|
+
symlink_osrm_data recipe
|
67
|
+
|
68
|
+
append_cflags("-I#{recipe.path}/include -I#{recipe.path}/include/osrm")
|
69
|
+
find_library "osrm", nil, "#{recipe.path}/lib"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
append_cflags("-DHAVE_CXX11")
|
74
|
+
|
75
|
+
#create_makefile "libosrm/libosrm"
|
76
|
+
create_makefile "libosrm/ruby_libosrm"
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#ifndef LIBOSRM_GLOBALS_H_
|
2
|
+
#define LIBOSRM_GLOBALS_H_
|
3
|
+
|
4
|
+
#include "rice/Data_Type.hpp"
|
5
|
+
#include "rice/Constructor.hpp"
|
6
|
+
#include "rice/Enum.hpp"
|
7
|
+
#include "rice/Struct.hpp"
|
8
|
+
|
9
|
+
using namespace Rice;
|
10
|
+
|
11
|
+
static Module rb_mLibOSRM = define_module("LibOSRM");
|
12
|
+
|
13
|
+
#define ATTR_ACCESSOR_DECL(klass, variable) \
|
14
|
+
.define_method(#variable, &klass##_##variable##_get) \
|
15
|
+
.define_method(#variable "=", &klass##_##variable##_set)
|
16
|
+
|
17
|
+
#endif
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
#include "globals.hpp"
|
3
|
+
|
4
|
+
using namespace Rice;
|
5
|
+
|
6
|
+
#include "ruby_engine_config.hpp"
|
7
|
+
#include "ruby_osrm_object.hpp"
|
8
|
+
|
9
|
+
extern "C"
|
10
|
+
void Init_ruby_libosrm() {
|
11
|
+
try {
|
12
|
+
//RUBY_TRY
|
13
|
+
//{
|
14
|
+
init_engine_config();
|
15
|
+
init_osrm_object();
|
16
|
+
//}
|
17
|
+
//RUBY_CATCH
|
18
|
+
} catch(...) {
|
19
|
+
std::clog << "Exception found:" << std::endl;
|
20
|
+
std::exception_ptr p = std::current_exception();
|
21
|
+
std::clog <<(p ? p.__cxa_exception_type()->name() : "null") << std::endl;
|
22
|
+
}
|
23
|
+
}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "mini_portile2/mini_portile"
|
2
|
+
|
3
|
+
class MiniPortileFixedCMake < MiniPortile
|
4
|
+
def configure_prefix
|
5
|
+
"-DCMAKE_INSTALL_PREFIX=#{File.expand_path(port_path)}"
|
6
|
+
end
|
7
|
+
|
8
|
+
def configure_defaults
|
9
|
+
if MiniPortile.windows?
|
10
|
+
[ '-G "NMake Makefiles"' ]
|
11
|
+
else
|
12
|
+
[]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def configure
|
17
|
+
return if configured?
|
18
|
+
|
19
|
+
cache_file = File.join(tmp_path, "configure.options_cache")
|
20
|
+
File.open(cache_file, "w") { |f| f.write computed_options.to_s }
|
21
|
+
|
22
|
+
#execute("configure", %w(cmake) + computed_options + [ "-Bbuild" ] + [ "-H." ])
|
23
|
+
execute("configure", %w(cmake) + computed_options + [ ".." ])
|
24
|
+
end
|
25
|
+
|
26
|
+
def configured?
|
27
|
+
configure = File.join(work_path, "configure")
|
28
|
+
makefile = File.join(work_path, "CMakefile")
|
29
|
+
cache_file = File.join(tmp_path, "configure.options_cache")
|
30
|
+
|
31
|
+
stored_options = File.exist?(cache_file) ? File.read(cache_file) : ""
|
32
|
+
current_options = computed_options.to_s
|
33
|
+
|
34
|
+
(current_options == stored_options) && newer?(makefile, configure)
|
35
|
+
end
|
36
|
+
|
37
|
+
def make_cmd
|
38
|
+
return "nmake" if MiniPortile.windows?
|
39
|
+
super
|
40
|
+
end
|
41
|
+
|
42
|
+
#def tmp_path
|
43
|
+
# "nya"
|
44
|
+
#end
|
45
|
+
|
46
|
+
def work_path
|
47
|
+
orig = super
|
48
|
+
Dir.mkdir "#{orig}/build" unless Dir.exist? "#{orig}/build"
|
49
|
+
"#{orig}/build"
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,188 @@
|
|
1
|
+
|
2
|
+
#include "osrm_action.hpp"
|
3
|
+
|
4
|
+
Array OSRMAction::parse_waypoints(osrm::json::Array waypoints) {
|
5
|
+
Array waypoints_result;
|
6
|
+
for(auto const& waypointValue : waypoints.values) {
|
7
|
+
auto waypoint = waypointValue.get<osrm::json::Object>();
|
8
|
+
Hash waypoint_result;
|
9
|
+
for(std::pair<std::string, osrm::util::json::Value> e : waypoint.values) {
|
10
|
+
if(e.first == "name") {
|
11
|
+
waypoint_result[String("name")] = e.second.get<osrm::json::String>().value;
|
12
|
+
} else if(e.first == "location") {
|
13
|
+
Hash location;
|
14
|
+
auto const& values = e.second.get<osrm::json::Array>().values;
|
15
|
+
location[Symbol("latitude")] = values[1].get<osrm::json::Number>().value;
|
16
|
+
location[Symbol("longitude")] = values[0].get<osrm::json::Number>().value;
|
17
|
+
waypoint_result[String("location")] = location;
|
18
|
+
} else if(e.first == "hint") {
|
19
|
+
waypoint_result[String("hint")] = e.second.get<osrm::json::String>().value;
|
20
|
+
} else if(e.first == "distance") {
|
21
|
+
waypoint_result[String("distance")] = e.second.get<osrm::json::Number>().value;
|
22
|
+
} else if(e.first == "waypoint_index") { // Present in trip action
|
23
|
+
waypoint_result[String("waypoint_index")] = e.second.get<osrm::json::Number>().value;
|
24
|
+
} else if(e.first == "trips_index") { // Present in trip action
|
25
|
+
waypoint_result[String("trips_index")] = e.second.get<osrm::json::Number>().value;
|
26
|
+
} else {
|
27
|
+
throw Exception(rb_eRuntimeError, "Invalid JSON value when building waypoints from libosrm.so: %s", e.first.c_str());
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
waypoints_result.push(waypoint_result);
|
32
|
+
}
|
33
|
+
|
34
|
+
return waypoints_result;
|
35
|
+
}
|
36
|
+
|
37
|
+
Hash OSRMAction::parse_route(osrm::json::Object route) {
|
38
|
+
Hash route_result;
|
39
|
+
for(std::pair<std::string, osrm::util::json::Value> e : route.values) {
|
40
|
+
if(e.first == "distance") {
|
41
|
+
route_result[String("distance")] = e.second.get<osrm::json::Number>().value;
|
42
|
+
} else if(e.first == "duration") {
|
43
|
+
route_result[String("duration")] = e.second.get<osrm::json::Number>().value;
|
44
|
+
} else if(e.first == "weight") {
|
45
|
+
route_result[String("weight")] = e.second.get<osrm::json::Number>().value;
|
46
|
+
} else if(e.first == "weight_name") {
|
47
|
+
route_result[String("weight_name")] = e.second.get<osrm::json::String>().value;
|
48
|
+
} else if(e.first == "geometry") {
|
49
|
+
route_result[String("geometry")] = e.second.get<osrm::json::String>().value;
|
50
|
+
} else if(e.first == "legs") {
|
51
|
+
route_result[String("legs")] = parse_route_legs(e.second);
|
52
|
+
} else {
|
53
|
+
throw Exception(rb_eRuntimeError, "Invalid JSON value when building a route from libosrm.so: %s", e.first.c_str());
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
return route_result;
|
58
|
+
}
|
59
|
+
|
60
|
+
Hash OSRMAction::parse_route_leg_annotations(osrm::util::json::Value value) {
|
61
|
+
auto annotations = value.get<osrm::json::Object>();
|
62
|
+
Hash result;
|
63
|
+
for(std::pair<std::string, osrm::util::json::Value> e : annotations.values) {
|
64
|
+
if(e.first == "distance") {
|
65
|
+
Array values;
|
66
|
+
for(auto const &value : e.second.get<osrm::json::Array>().values) {
|
67
|
+
values.push(to_ruby(value));
|
68
|
+
}
|
69
|
+
result[String("distance")] = values;
|
70
|
+
} else if(e.first == "duration") {
|
71
|
+
Array values;
|
72
|
+
for(auto const &value : e.second.get<osrm::json::Array>().values) {
|
73
|
+
values.push(to_ruby(value));
|
74
|
+
}
|
75
|
+
result[String("duration")] = values;
|
76
|
+
} else if(e.first == "datasources") {
|
77
|
+
Array values;
|
78
|
+
for(auto const &value : e.second.get<osrm::json::Array>().values) {
|
79
|
+
values.push(to_ruby(value));
|
80
|
+
}
|
81
|
+
result[String("datasources")] = values;
|
82
|
+
} else if(e.first == "nodes") {
|
83
|
+
Array values;
|
84
|
+
for(auto const &value : e.second.get<osrm::json::Array>().values) {
|
85
|
+
values.push(to_ruby(value));
|
86
|
+
}
|
87
|
+
result[String("nodes")] = values;
|
88
|
+
} else if(e.first == "weight") {
|
89
|
+
Array values;
|
90
|
+
for(auto const &value : e.second.get<osrm::json::Array>().values) {
|
91
|
+
values.push(to_ruby(value));
|
92
|
+
}
|
93
|
+
result[String("weight")] = values;
|
94
|
+
} else if(e.first == "speed") {
|
95
|
+
Array values;
|
96
|
+
for(auto const &value : e.second.get<osrm::json::Array>().values) {
|
97
|
+
values.push(to_ruby(value));
|
98
|
+
}
|
99
|
+
result[String("speed")] = values;
|
100
|
+
} else {
|
101
|
+
throw Exception(rb_eRuntimeError, "Invalid JSON value when building a route leg annotations from libosrm.so: %s", e.first.c_str());
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
return result;
|
106
|
+
}
|
107
|
+
|
108
|
+
Array OSRMAction::parse_route_leg_steps(osrm::util::json::Value value) {
|
109
|
+
Array steps_array;
|
110
|
+
|
111
|
+
auto &stepsValues = value.get<osrm::json::Array>();
|
112
|
+
for(auto const& stepValue : stepsValues.values) {
|
113
|
+
auto step = stepValue.get<osrm::json::Object>();
|
114
|
+
Hash step_result;
|
115
|
+
for(std::pair<std::string, osrm::util::json::Value> e : step.values) {
|
116
|
+
if(e.first == "distance") {
|
117
|
+
step_result[String("distance")] = e.second.get<osrm::json::Number>().value;
|
118
|
+
} else if(e.first == "duration") {
|
119
|
+
step_result[String("duration")] = e.second.get<osrm::json::Number>().value;
|
120
|
+
} else if(e.first == "weight") {
|
121
|
+
step_result[String("weight")] = e.second.get<osrm::json::Number>().value;
|
122
|
+
} else if(e.first == "geometry") {
|
123
|
+
step_result[String("geometry")] = e.second.get<osrm::json::String>().value;
|
124
|
+
} else if(e.first == "name") {
|
125
|
+
step_result[String("name")] = e.second.get<osrm::json::String>().value;
|
126
|
+
} else if(e.first == "ref") {
|
127
|
+
step_result[String("ref")] = e.second.get<osrm::json::String>().value;
|
128
|
+
} else if(e.first == "pronunciation") {
|
129
|
+
step_result[String("pronunciation")] = e.second.get<osrm::json::String>().value;
|
130
|
+
} else if(e.first == "destinations") {
|
131
|
+
step_result[String("destinations")] = e.second.get<osrm::json::String>().value;
|
132
|
+
} else if(e.first == "exits") {
|
133
|
+
step_result[String("exits")] = e.second.get<osrm::json::String>().value;
|
134
|
+
} else if(e.first == "mode") {
|
135
|
+
step_result[String("mode")] = e.second.get<osrm::json::String>().value;
|
136
|
+
} else if(e.first == "maneuver") {
|
137
|
+
auto values = e.second.get<osrm::json::Object>().values;
|
138
|
+
Hash maneuver;
|
139
|
+
maneuver[String("modifier")] = values.at("modifier").get<osrm::json::String>().value;
|
140
|
+
maneuver[String("type")] = values.at("type").get<osrm::json::String>().value;
|
141
|
+
step_result[String("maneuver")] = maneuver;
|
142
|
+
} else if(e.first == "intersections") {
|
143
|
+
//step_result[String("intersections")] = e.second.get<osrm::json::String>().value; // TODO
|
144
|
+
} else if(e.first == "rotary_name") {
|
145
|
+
step_result[String("rotary_name")] = e.second.get<osrm::json::String>().value;
|
146
|
+
} else if(e.first == "rotary_pronunciation") {
|
147
|
+
step_result[String("rotary_pronunciation")] = e.second.get<osrm::json::String>().value;
|
148
|
+
} else {
|
149
|
+
throw Exception(rb_eRuntimeError, "Invalid JSON value when building a route leg steps from libosrm.so: %s", e.first.c_str());
|
150
|
+
}
|
151
|
+
}
|
152
|
+
|
153
|
+
steps_array.push(step_result);
|
154
|
+
}
|
155
|
+
|
156
|
+
return steps_array;
|
157
|
+
}
|
158
|
+
|
159
|
+
Array OSRMAction::parse_route_legs(osrm::util::json::Value value) {
|
160
|
+
Array legs_array;
|
161
|
+
|
162
|
+
auto &legsValues = value.get<osrm::json::Array>();
|
163
|
+
for(auto const& legValue : legsValues.values) {
|
164
|
+
auto leg = legValue.get<osrm::json::Object>();
|
165
|
+
Hash leg_result;
|
166
|
+
for(std::pair<std::string, osrm::util::json::Value> e : leg.values) {
|
167
|
+
if(e.first == "distance") {
|
168
|
+
leg_result[String("distance")] = e.second.get<osrm::json::Number>().value;
|
169
|
+
} else if(e.first == "duration") {
|
170
|
+
leg_result[String("duration")] = e.second.get<osrm::json::Number>().value;
|
171
|
+
} else if(e.first == "weight") {
|
172
|
+
leg_result[String("weight")] = e.second.get<osrm::json::Number>().value;
|
173
|
+
} else if(e.first == "summary") {
|
174
|
+
leg_result[String("summary")] = e.second.get<osrm::json::String>().value;
|
175
|
+
} else if(e.first == "steps") {
|
176
|
+
leg_result[String("steps")] = parse_route_leg_steps(e.second);
|
177
|
+
} else if(e.first == "annotation") {
|
178
|
+
leg_result[String("annotation")] = parse_route_leg_annotations(e.second);
|
179
|
+
} else {
|
180
|
+
throw Exception(rb_eRuntimeError, "Invalid JSON value when building a route legs from libosrm.so: %s", e.first.c_str());
|
181
|
+
}
|
182
|
+
}
|
183
|
+
|
184
|
+
legs_array.push(leg_result);
|
185
|
+
}
|
186
|
+
|
187
|
+
return legs_array;
|
188
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#ifndef OSRM_ACTION
|
2
|
+
#define OSRM_ACTION
|
3
|
+
|
4
|
+
#include "globals.hpp"
|
5
|
+
|
6
|
+
#include <osrm/osrm.hpp>
|
7
|
+
#include <osrm/json_container.hpp>
|
8
|
+
|
9
|
+
/**
|
10
|
+
* Abstract class implementing some common methods many OSRM actions requires.
|
11
|
+
*/
|
12
|
+
class OSRMAction {
|
13
|
+
|
14
|
+
public:
|
15
|
+
Array parse_waypoints(osrm::json::Array waypoints);
|
16
|
+
Hash parse_route(osrm::json::Object route);
|
17
|
+
|
18
|
+
private:
|
19
|
+
Array parse_route_legs(osrm::util::json::Value value);
|
20
|
+
Array parse_route_leg_steps(osrm::util::json::Value value);
|
21
|
+
Hash parse_route_leg_annotations(osrm::util::json::Value value);
|
22
|
+
};
|
23
|
+
|
24
|
+
#endif
|
@@ -0,0 +1,79 @@
|
|
1
|
+
|
2
|
+
#include "osrm_match_func.hpp"
|
3
|
+
|
4
|
+
#include <osrm/match_parameters.hpp>
|
5
|
+
|
6
|
+
Hash parse_match_result(osrm::json::Object match) {
|
7
|
+
Hash result;
|
8
|
+
for(std::pair<std::string, osrm::util::json::Value> e : match.values) {
|
9
|
+
if(e.first == "code") {
|
10
|
+
result[String("code")] = e.second.get<osrm::json::String>().value;
|
11
|
+
} else if(e.first == "tracepoints") {
|
12
|
+
// TODO
|
13
|
+
} else if(e.first == "matchings") {
|
14
|
+
// TODO
|
15
|
+
} else {
|
16
|
+
throw Exception(rb_eRuntimeError, "Invalid JSON value when building a match from libosrm.so: %s", e.first.c_str());
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
return result;
|
21
|
+
}
|
22
|
+
|
23
|
+
Object wrap_match(Object self, Array coordinates, Hash opts) {
|
24
|
+
// Convert Ruby object to native type
|
25
|
+
osrm::MatchParameters params;
|
26
|
+
|
27
|
+
Array::iterator it = coordinates.begin();
|
28
|
+
Array::iterator end = coordinates.end();
|
29
|
+
for(; it != end; ++it) {
|
30
|
+
Hash latlon = (Hash)*it;
|
31
|
+
double lat = from_ruby<double>(latlon[Symbol("latitude")]);
|
32
|
+
double lon = from_ruby<double>(latlon[Symbol("longitude")]);
|
33
|
+
params.coordinates.push_back({osrm::util::FloatLongitude{lon}, osrm::util::FloatLatitude{lat}});
|
34
|
+
}
|
35
|
+
|
36
|
+
if(!opts.is_nil()) {
|
37
|
+
Object geometry_type = opts[Symbol("geometry_type")];
|
38
|
+
if(!geometry_type.is_nil()) {
|
39
|
+
Symbol g_type = (Symbol) geometry_type;
|
40
|
+
const char *type = g_type.c_str();
|
41
|
+
if(strcmp(type, "polyline") == 0) {
|
42
|
+
params.geometries = osrm::RouteParameters::GeometriesType::Polyline;
|
43
|
+
}
|
44
|
+
if(strcmp(type, "polyline6") == 0) {
|
45
|
+
params.geometries = osrm::RouteParameters::GeometriesType::Polyline6;
|
46
|
+
}
|
47
|
+
if(strcmp(type, "geojson") == 0) {
|
48
|
+
params.geometries = osrm::RouteParameters::GeometriesType::GeoJSON;
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
Object steps = opts[Symbol("steps")];
|
53
|
+
if(steps) {
|
54
|
+
params.steps = true;
|
55
|
+
}
|
56
|
+
|
57
|
+
Object annotations = opts[Symbol("annotations")];
|
58
|
+
if(annotations) {
|
59
|
+
params.annotations = true;
|
60
|
+
}
|
61
|
+
}
|
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->Match(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_match_result(result);
|
79
|
+
}
|