diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/tom_tom.rb | 4 | ||||
| -rw-r--r-- | lib/tom_tom/matrix.rb | 89 |
2 files changed, 93 insertions, 0 deletions
diff --git a/lib/tom_tom.rb b/lib/tom_tom.rb index a1a2bda43..fcebcc7ac 100644 --- a/lib/tom_tom.rb +++ b/lib/tom_tom.rb @@ -19,4 +19,8 @@ module TomTom def self.batch(way_costs) TomTom::Batch.new(@connection).batch(way_costs) end + + def self.matrix(way_costs) + TomTom::Matrix.new(@connection).matrix(way_costs) + end end diff --git a/lib/tom_tom/matrix.rb b/lib/tom_tom/matrix.rb new file mode 100644 index 000000000..985055dae --- /dev/null +++ b/lib/tom_tom/matrix.rb @@ -0,0 +1,89 @@ +module TomTom + class Matrix + def initialize(connection) + @connection = connection + end + + def matrix(way_costs) + points = points_from_way_costs(way_costs) + points = points_as_params(points) + + response = @connection.post do |req| + req.url '/routing/1/matrix/json' + req.headers['Content-Type'] = 'application/json' + + req.params[:routeType] = 'shortest' + req.params[:travelMode] = 'bus' + + req.body = { + origins: points, + destinations: points + }.to_json + end + + extract_costs_to_way_costs!( + way_costs, + points, + JSON.parse(response.body) + ) + end + + def points_from_way_costs(way_costs) + points = Set.new + + way_costs.each do |way_cost| + points.add(way_cost.departure) + points.add(way_cost.arrival) + end + + points + end + + def points_as_params(points) + points.map do |latlng| + { + point: { + latitude: latlng.lat, + longitude: latlng.lng + } + } + end + end + + # TODO: We actually need to create new WayCost objects to hold the new dot connections given to us by the matrix API. + def extract_costs_to_way_costs!(way_costs, points, matrix_json) + way_costs = [] + + # `row` and `column` order is the same as `points` + matrix_json['matrix'].each_with_index do |row, row_i| + row.each_with_index do |column, column_i| + next if column['statusCode'] != 200 + + distance = column['response']['routeSummary']['lengthInMeters'] + + # Ignore costs between a point and itself (e.g. from A to A) + next if distance == 0 + + departure = points[row_i] + arrival = points[column_i] + + way_costs << WayCost.new( + departure: Geokit::LatLng.new( + departure[:point][:latitude], + departure[:point][:longitude] + ), + arrival: Geokit::LatLng.new( + arrival[:point][:latitude], + arrival[:point][:longitude] + ), + distance: distance, + time: column['response']['routeSummary']['travelTimeInSeconds'] + # id: 'TODO: figure out how to add combined stop IDs' + ) + end + end + + way_costs + end + end +end |
