module Geoloco::Adapters::Tomtom
Tomtom
geocoding adapter
Constants
- GEOCODE_URL
Public Class Methods
geocode(address, key:, qps_limit: 5)
click to toggle source
# File lib/geoloco/adapters/tomtom.rb, line 10 def geocode(address, key:, qps_limit: 5) wait_qps_limit_time(qps_limit) unless qps_limit&.zero? response = Geoloco.http.get(geocode_url(address), query: { key: key }) handle_errors(response) map_results(response.parsed_response) end
Private Class Methods
geocode_url(address)
click to toggle source
# File lib/geoloco/adapters/tomtom.rb, line 19 def geocode_url(address) escaped_address = CGI.escape(address) format(GEOCODE_URL, escaped_address) end
handle_errors(response)
click to toggle source
# File lib/geoloco/adapters/tomtom.rb, line 24 def handle_errors(response) raise Geoloco::Forbidden, response if response.code == 403 end
map_result(result)
click to toggle source
rubocop:disable Metrics/AbcSize, Metrics/MethodLength
# File lib/geoloco/adapters/tomtom.rb, line 34 def map_result(result) address = result['address'] geometry = Geoloco::Geometry.new( lat: result.dig('position', 'lat').to_f, lng: result.dig('position', 'lon').to_f ) Geoloco::Location.new( geometry: geometry, full_address: address['freeformAddress'], street: address['streetName'], number: address['streetNumber'], city: address['municipality'], zipcode: address['postalCode'], district: address['countrySecondarySubdivision'], municipality: address['countryTertiarySubdivision'], state: address['countrySubdivisionName'], state_code: address['countrySubdivision'], country: address['country'], country_code: address['countryCode'] ) end
map_results(parsed)
click to toggle source
# File lib/geoloco/adapters/tomtom.rb, line 28 def map_results(parsed) parsed.fetch('results', []) .map(&method(:map_result)) end
wait_qps_limit_time(qps_limit)
click to toggle source
rubocop:enable Metrics/AbcSize, Metrics/MethodLength
# File lib/geoloco/adapters/tomtom.rb, line 54 def wait_qps_limit_time(qps_limit) time_since_last_call = @last_api_call ? Time.now - @last_api_call : 2 wait_time = 1.0 / qps_limit.to_f - time_since_last_call sleep wait_time if wait_time.positive? @last_api_call = Time.now end