"status" is now always: - 200 if the request was successful - 207 if the result is empty (no path found) - 400 if the request is invalid viaroute and trip now have a maximum of 500 and 100 locations respectively. Override with the --max-viaroute-size and --max-trip-size parameters.
182 lines
4.7 KiB
Ruby
182 lines
4.7 KiB
Ruby
require 'net/http'
|
|
|
|
HOST = "http://127.0.0.1:#{OSRM_PORT}"
|
|
DESTINATION_REACHED = 15 #OSRM instruction code
|
|
|
|
def request_path service, params
|
|
uri = "#{HOST}/" + service
|
|
response = send_request uri, params
|
|
return response
|
|
end
|
|
|
|
def request_url path
|
|
uri = URI.parse"#{HOST}/#{path}"
|
|
@query = uri.to_s
|
|
Timeout.timeout(OSRM_TIMEOUT) do
|
|
Net::HTTP.get_response uri
|
|
end
|
|
rescue Errno::ECONNREFUSED => e
|
|
raise "*** osrm-routed is not running."
|
|
rescue Timeout::Error
|
|
raise "*** osrm-routed did not respond."
|
|
end
|
|
|
|
# Overwriters the default values in defaults.
|
|
# e.g. [[a, 1], [b, 2]], [[a, 5], [d, 10]] => [[a, 5], [b, 2], [d, 10]]
|
|
def overwrite_params defaults, other
|
|
merged = []
|
|
defaults.each do |k,v|
|
|
idx = other.index { |p| p[0] == k }
|
|
if idx == nil then
|
|
merged << [k, v]
|
|
else
|
|
merged << [k, other[idx][1]]
|
|
end
|
|
end
|
|
other.each do |k,v|
|
|
if merged.index { |pair| pair[0] == k} == nil then
|
|
merged << [k, v]
|
|
end
|
|
end
|
|
|
|
return merged
|
|
end
|
|
|
|
def request_route waypoints, bearings, user_params
|
|
raise "*** number of bearings does not equal the number of waypoints" unless bearings.size == 0 || bearings.size == waypoints.size
|
|
|
|
defaults = [['output','json'], ['instructions',true], ['alt',false]]
|
|
params = overwrite_params defaults, user_params
|
|
encoded_waypoint = waypoints.map{ |w| ["loc","#{w.lat},#{w.lon}"] }
|
|
if bearings.size > 0
|
|
encoded_bearings = bearings.map { |b| ["b", b.to_s]}
|
|
parasm = params.concat encoded_waypoint.zip(encoded_bearings).flatten! 1
|
|
else
|
|
params = params.concat encoded_waypoint
|
|
end
|
|
|
|
return request_path "viaroute", params
|
|
end
|
|
|
|
def request_nearest node, user_params
|
|
defaults = [['output', 'json']]
|
|
params = overwrite_params defaults, user_params
|
|
params << ["loc", "#{node.lat},#{node.lon}"]
|
|
|
|
return request_path "nearest", params
|
|
end
|
|
|
|
def request_table waypoints, user_params
|
|
defaults = [['output', 'json']]
|
|
params = overwrite_params defaults, user_params
|
|
params = params.concat waypoints.map{ |w| [w[:type],"#{w[:coord].lat},#{w[:coord].lon}"] }
|
|
|
|
return request_path "table", params
|
|
end
|
|
|
|
def request_trip waypoints, user_params
|
|
defaults = [['output', 'json']]
|
|
params = overwrite_params defaults, user_params
|
|
params = params.concat waypoints.map{ |w| ["loc","#{w.lat},#{w.lon}"] }
|
|
|
|
return request_path "trip", params
|
|
end
|
|
|
|
def request_matching waypoints, timestamps, user_params
|
|
defaults = [['output', 'json']]
|
|
params = overwrite_params defaults, user_params
|
|
encoded_waypoint = waypoints.map{ |w| ["loc","#{w.lat},#{w.lon}"] }
|
|
if timestamps.size > 0
|
|
encoded_timestamps = timestamps.map { |t| ["t", t.to_s]}
|
|
parasm = params.concat encoded_waypoint.zip(encoded_timestamps).flatten! 1
|
|
else
|
|
params = params.concat encoded_waypoint
|
|
end
|
|
|
|
return request_path "match", params
|
|
end
|
|
|
|
def got_route? response
|
|
if response.code == "200" && !response.body.empty?
|
|
json = JSON.parse response.body
|
|
if json['status'] == 200
|
|
return way_list( json['route_instructions']).empty? == false
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
def route_status response
|
|
if response.code == "200" && !response.body.empty?
|
|
json = JSON.parse response.body
|
|
return json['status']
|
|
else
|
|
"HTTP #{response.code}"
|
|
end
|
|
end
|
|
|
|
def extract_instruction_list instructions, index, postfix=nil
|
|
if instructions
|
|
instructions.reject { |r| r[0].to_s=="#{DESTINATION_REACHED}" }.
|
|
map { |r| r[index] }.
|
|
map { |r| (r=="" || r==nil) ? '""' : "#{r}#{postfix}" }.
|
|
join(',')
|
|
end
|
|
end
|
|
|
|
def way_list instructions
|
|
extract_instruction_list instructions, 1
|
|
end
|
|
|
|
def compass_list instructions
|
|
extract_instruction_list instructions, 6
|
|
end
|
|
|
|
def bearing_list instructions
|
|
extract_instruction_list instructions, 7
|
|
end
|
|
|
|
def turn_list instructions
|
|
if instructions
|
|
types = {
|
|
0 => :none,
|
|
1 => :straight,
|
|
2 => :slight_right,
|
|
3 => :right,
|
|
4 => :sharp_right,
|
|
5 => :u_turn,
|
|
6 => :sharp_left,
|
|
7 => :left,
|
|
8 => :slight_left,
|
|
9 => :via,
|
|
10 => :head,
|
|
11 => :enter_roundabout,
|
|
12 => :leave_roundabout,
|
|
13 => :stay_roundabout,
|
|
14 => :start_end_of_street,
|
|
15 => :destination,
|
|
16 => :enter_contraflow,
|
|
17 => :leave_contraflow
|
|
}
|
|
# replace instructions codes with strings
|
|
# "11-3" (enter roundabout and leave a 3rd exit) gets converted to "enter_roundabout-3"
|
|
instructions.map do |r|
|
|
r[0].to_s.gsub(/^\d*/) do |match|
|
|
types[match.to_i].to_s
|
|
end
|
|
end.join(',')
|
|
end
|
|
end
|
|
|
|
def mode_list instructions
|
|
extract_instruction_list instructions, 8
|
|
end
|
|
|
|
def time_list instructions
|
|
extract_instruction_list instructions, 4, "s"
|
|
end
|
|
|
|
def distance_list instructions
|
|
extract_instruction_list instructions, 2, "m"
|
|
end
|