class OSRMRouting
Attributes
debug[RW]
origin[RW]
waypoints[RW]
Public Class Methods
new(origin = {}, waypoints = [], debug = false)
click to toggle source
# File lib/osrm-routing.rb, line 11 def initialize(origin = {}, waypoints = [], debug = false) self.origin = origin self.waypoints = waypoints self.debug = debug end
Public Instance Methods
optimize()
click to toggle source
# File lib/osrm-routing.rb, line 17 def optimize response = { status: 200, errors: {}, result: nil } if self.origin.class != Hash response[:status] = 400 response[:errors][:origin] = 'Invalid format' end if self.origin.keys.length == 0 if response[:status] == 200 response[:status] = 400 end response[:errors][:origin] = 'Required parameter' end points = [ [ origin[:longitude], origin[:latitude] ] ] if self.waypoints.class != Array if response[:status] == 200 response[:status] = 400 end response[:errors][:waypoints] = 'Invalid format' end if self.waypoints.length == 0 if response[:status] == 200 response[:status] = 400 end response[:errors][:waypoints] = 'Required parameter' end self.waypoints.each do |waypoint| if waypoint.class != Hash if response[:status] == 200 response[:status] = 400 end response[:errors][:waypoints] = 'Invalid format' end if waypoint.keys.length == 0 if response[:status] == 200 response[:status] = 400 end response[:errors][:waypoints] = 'Invalid format' end if response[:status] != 200 break end points.push([ waypoint[:longitude], waypoint[:latitude] ]) end route = "https://router.project-osrm.org/trip/v1/driving/#{points.map{ |point| point.join(",")}.join(";")}?roundtrip=true" if self.debug puts "=============================== Debug control logger ===============================" puts "Query route: #{route}" puts "====================================================================================" end uri = URI.parse(route) osrm = Net::HTTP.get_response(uri) response[:status] = osrm.code.to_i if response[:status] != 200 response[:errors][:request] = "HTTP Error" response[:result] = JSON.parse(osrm.body) else final_route = [] osrm = JSON.parse(osrm.body, :symbolize_names => true) osrm[:waypoints].each do |waypoint| final_route.push(waypoint[:waypoint_index]) end final_route.push(0) steps = [] osrm[:trips][0][:legs].each.with_index do |leg, i| if i == (osrm[:trips][0][:legs].length - 1) steps.push({ origin: final_route[i], destination: final_route[0], distance: leg[:distance], duration: leg[:duration] }) else steps.push({ origin: final_route[i], destination: final_route[i + 1], distance: leg[:distance], duration: leg[:duration] }) end end response[:result] = { optimized_route: final_route, total_duration: osrm[:trips][0][:duration] / 60.0, total_distance: osrm[:trips][0][:distance] / 1000.0, steps: steps } end return response end