diff options
| author | Alban Peignier | 2018-03-15 17:09:34 +0100 | 
|---|---|---|
| committer | GitHub | 2018-03-15 17:09:34 +0100 | 
| commit | f011f7e9806ffeaaba3ad73510bc818211f55dbd (patch) | |
| tree | b59a6a71f82b7121fb3a0ffa3a65b9d7cedaa3aa /lib | |
| parent | d3d3c0f40c37d716cfccbf9297bfbdc98c692521 (diff) | |
| parent | 9291d45e825edbaf52cb556c102498366985496f (diff) | |
| download | chouette-core-f011f7e9806ffeaaba3ad73510bc818211f55dbd.tar.bz2 | |
Merge pull request #379 from af83/6095-route--calculate-distance-and-time-cost-between-stops
Calculate distance and time cost between Route stops. Refs #6095 
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/stop_areas_to_way_costs_converter.rb | 21 | ||||
| -rw-r--r-- | lib/tom_tom.rb | 22 | ||||
| -rw-r--r-- | lib/tom_tom/batch.rb | 54 | ||||
| -rw-r--r-- | lib/way_cost.rb | 27 | ||||
| -rw-r--r-- | lib/way_cost_collection_json_serializer.rb | 16 | 
5 files changed, 140 insertions, 0 deletions
| diff --git a/lib/stop_areas_to_way_costs_converter.rb b/lib/stop_areas_to_way_costs_converter.rb new file mode 100644 index 000000000..c6a00d31b --- /dev/null +++ b/lib/stop_areas_to_way_costs_converter.rb @@ -0,0 +1,21 @@ +class StopAreasToWayCostsConverter +  def initialize(stop_areas) +    @stop_areas = stop_areas +  end + +  def convert +    @stop_areas.each_cons(2).map do |stop_area_pair| +      WayCost.new( +        departure: Geokit::LatLng.new( +          stop_area_pair[0].latitude, +          stop_area_pair[0].longitude +        ), +        arrival: Geokit::LatLng.new( +          stop_area_pair[1].latitude, +          stop_area_pair[1].longitude +        ), +        id: "#{stop_area_pair[0].id}-#{stop_area_pair[1].id}" +      ) +    end +  end +end diff --git a/lib/tom_tom.rb b/lib/tom_tom.rb new file mode 100644 index 000000000..a1a2bda43 --- /dev/null +++ b/lib/tom_tom.rb @@ -0,0 +1,22 @@ +module TomTom +  BASE_URL = 'https://api.tomtom.com' +  @api_key = Rails.application.secrets.tomtom_api_key + +  @connection = Faraday.new( +    url: BASE_URL, +    params: { +      key: @api_key +    } +  ) do |faraday| +    faraday.use FaradayMiddleware::FollowRedirects, limit: 1 +    faraday.adapter Faraday.default_adapter +  end + +  def self.enabled? +    @api_key.present? +  end + +  def self.batch(way_costs) +    TomTom::Batch.new(@connection).batch(way_costs) +  end +end diff --git a/lib/tom_tom/batch.rb b/lib/tom_tom/batch.rb new file mode 100644 index 000000000..6ceb9c226 --- /dev/null +++ b/lib/tom_tom/batch.rb @@ -0,0 +1,54 @@ +module TomTom +  class Batch +    def initialize(connection) +      @connection = connection +    end + +    def batch(way_costs) +      params = URI.encode_www_form({ +        travelMode: 'bus', +        routeType: 'shortest' +      }) +      batch_items = convert_way_costs(way_costs).map do |locations| +        { +          query: "/calculateRoute/#{locations}/json?#{params}" +        } +      end + +      response = @connection.post do |req| +        req.url '/routing/1/batch/json' +        req.headers['Content-Type'] = 'application/json' +        req.body = { +          batchItems: batch_items +        }.to_json +      end + +      extract_costs_to_way_costs!( +        way_costs, +        JSON.parse(response.body) +      ) +    end + +    def extract_costs_to_way_costs!(way_costs, batch_json) +      calculated_routes = batch_json['batchItems'] +      calculated_routes.each_with_index do |route, i| +        next if route['statusCode'] != 200 + +        distance = route['response']['routes'][0]['summary']['lengthInMeters'] +        time = route['response']['routes'][0]['summary']['travelTimeInSeconds'] + +        way_costs[i].distance = distance +        way_costs[i].time = time +      end + +      way_costs +    end + +    def convert_way_costs(way_costs) +      way_costs.map do |way_cost| +        "#{way_cost.departure.lat},#{way_cost.departure.lng}" \ +        ":#{way_cost.arrival.lat},#{way_cost.arrival.lng}" +      end +    end +  end +end diff --git a/lib/way_cost.rb b/lib/way_cost.rb new file mode 100644 index 000000000..9f860308c --- /dev/null +++ b/lib/way_cost.rb @@ -0,0 +1,27 @@ +class WayCost +  attr_reader :departure, :arrival, :id +  attr_accessor :distance, :time + +  def initialize( +    departure:, +    arrival:, +    distance: nil, +    time: nil, +    id: nil +  ) +    @departure = departure +    @arrival = arrival +    @distance = distance +    @time = time +    @id = id +  end + +  def ==(other) +    other.is_a?(self.class) && +      @departure == other.departure && +      @arrival == other.arrival && +      @distance == other.distance && +      @time == other.time && +      @id == other.id +  end +end diff --git a/lib/way_cost_collection_json_serializer.rb b/lib/way_cost_collection_json_serializer.rb new file mode 100644 index 000000000..191871cca --- /dev/null +++ b/lib/way_cost_collection_json_serializer.rb @@ -0,0 +1,16 @@ +class WayCostCollectionJSONSerializer +  def self.dump(way_costs) +    return if way_costs.nil? + +    costs_by_id = {} + +    way_costs.each do |way_cost| +      costs_by_id[way_cost.id] = { +        distance: way_cost.distance, +        time: way_cost.time +      } +    end + +    JSON.dump(costs_by_id) +  end +end | 
