class JDX::Geocoder::Google

Constants

CITY_FIELDS
RADIUS

Public Class Methods

new(term) click to toggle source
# File lib/jdx/geocoder/google.rb, line 10
def initialize(term)
  @term = term
end

Public Instance Methods

address() click to toggle source
# File lib/jdx/geocoder/google.rb, line 27
def address
  data['formatted_address']
end
bounds() click to toggle source
[northeast
southwest]
# File lib/jdx/geocoder/google.rb, line 61
def bounds
  @bounds ||= begin
    bounds = data.dig('geometry', 'bounds') || data.dig('geometry', 'viewport')
    return nil if bounds.nil?

    bounds.values.map do |v|
      v.values.reverse!
    end
  end
end
center() click to toggle source
# File lib/jdx/geocoder/google.rb, line 72
def center
  @center ||= begin
    co1, co2 = bounds
    [(co1[0] + co2[0]) / 2, (co1[1] + co2[1]) / 2]
  end
end
city() click to toggle source
# File lib/jdx/geocoder/google.rb, line 31
def city
  CITY_FIELDS.each do |c|
    if (r = type_find(c, 'long_name'))
      return r
    end
  end
  nil
end
coordinates() click to toggle source

coordinate order is longitude, latitude

# File lib/jdx/geocoder/google.rb, line 15
def coordinates
  data.dig('geometry', 'location').values.reverse!
end
country() click to toggle source
# File lib/jdx/geocoder/google.rb, line 44
def country
  type_find('country', 'long_name')
end
country_code() click to toggle source
# File lib/jdx/geocoder/google.rb, line 52
def country_code
  type_find('country', 'short_name')
end
deg2rad(lng, lat) click to toggle source
# File lib/jdx/geocoder/google.rb, line 85
def deg2rad(lng, lat)
  [lng * Math::PI / 180, lat * Math::PI / 180]
end
latitude() click to toggle source
# File lib/jdx/geocoder/google.rb, line 19
def latitude
  data.dig('geometry', 'location', 'lat')
end
longitude() click to toggle source
# File lib/jdx/geocoder/google.rb, line 23
def longitude
  data.dig('geometry', 'location', 'lng')
end
place_id() click to toggle source
# File lib/jdx/geocoder/google.rb, line 93
def place_id
  data['place_id']
end
postal_code() click to toggle source
# File lib/jdx/geocoder/google.rb, line 56
def postal_code
  type_find('postal_code', 'short_name')
end
spherical_distance() click to toggle source
# File lib/jdx/geocoder/google.rb, line 79
def spherical_distance # rubocop:disable Metrics/AbcSize
  rlng1, rlat1 = deg2rad(*bounds[1])
  rlng2, rlat2 = deg2rad(*center)
  (2 * RADIUS * Math.asin(Math.sqrt(Math.sin((rlat2 - rlat1) / 2)**2 + Math.cos(rlat1) * Math.cos(rlat2) * Math.sin((rlng2 - rlng1) / 2)**2))).round(3)
end
state() click to toggle source
# File lib/jdx/geocoder/google.rb, line 40
def state
  type_find('administrative_area_level_1', 'long_name')
end
state_code() click to toggle source
# File lib/jdx/geocoder/google.rb, line 48
def state_code
  type_find('administrative_area_level_1', 'short_name')
end
types() click to toggle source
# File lib/jdx/geocoder/google.rb, line 89
def types
  data['types']
end

Private Instance Methods

cache_redis() click to toggle source
# File lib/jdx/geocoder/google.rb, line 127
def cache_redis
  @cache_redis ||= Geocoder.configuration.location_cache_db
end
google_key() click to toggle source
# File lib/jdx/geocoder/google.rb, line 123
def google_key
  @google_key ||= Geocoder.configuration.google_key
end
handle_response() click to toggle source
# File lib/jdx/geocoder/google.rb, line 111
def handle_response
  response = typhoeus_get

  if response.success?
    data = parse_json(response.body)
    return [true, data]
  end

  handle_request_error(response)
  false
end
serialize_data(response_data) click to toggle source
# File lib/jdx/geocoder/google.rb, line 107
def serialize_data(response_data)
  response_data['results'][0]
end
type_find(area, range) click to toggle source
# File lib/jdx/geocoder/google.rb, line 99
def type_find(area, range)
  data['address_components'].find { |a| a['types'].include?(area) }&.dig(range)
end
url() click to toggle source
# File lib/jdx/geocoder/google.rb, line 103
def url
  "https://maps.googleapis.com/maps/api/geocode/json?key=#{google_key}&address=#{escape_term}&region=us"
end