Class: Geokit::Geocoders::AwsGeoplacesGeocoder

Inherits:
Geocoder
  • Object
show all
Defined in:
lib/geokit_aws_geoplaces.rb

Overview

and use :aws_geoplaces to specify this geocoder in your list of geocoders.

Class Method Summary collapse

Class Method Details

.do_geocode(address, options = {}) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/geokit_aws_geoplaces.rb', line 18

def self.do_geocode(address, options = {})
  client = Aws::GeoPlaces::Client.new(
    region: region,
    credentials: Aws::Credentials.new( access_key_id, secret_access_key )
  )
  res = client.geocode(query_text: address)
  return GeoLoc.new unless res.successful?

  parse_response res
rescue => e
  logger.error("AwsGeoplacesGeocoder error for #{address.inspect}: #{e.class}: #{e.message}")
  GeoLoc.new
end

.extract_geoloc(result_item) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/geokit_aws_geoplaces.rb', line 39

def self.extract_geoloc(result_item)
  loc = new_loc
  loc.lat = result_item.position[1]
  loc.lng = result_item.position[0]

  set_address_components(result_item, loc)
  set_precision(result_item, loc)
  set_bounds(result_item, loc)

  loc.success  = true
  loc
end

.parse_response(res) ⇒ Object



32
33
34
35
36
37
# File 'lib/geokit_aws_geoplaces.rb', line 32

def self.parse_response(res)
  return GeoLoc.new unless res.result_items.size > 0
  result_item = res.result_items.first

  extract_geoloc result_item
end

.set_address_components(result_item, loc) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/geokit_aws_geoplaces.rb', line 52

def self.set_address_components(result_item, loc)
  address = result_item.address

  loc.country      = address.country.name
  loc.country_code = address.country.code_2
  loc.city         = address.locality
  loc.district     = address.district
  loc.zip          = address.postal_code

  if address.region.present?
    loc.state_code = address.region.code
    loc.state_name = address.region.name
    loc.state      = address.region.name
  end

  if address.sub_region.present?
    loc.county     = address.sub_region.name
  end

  if result_item.place_type.to_s == "PointAddress"
    loc.street_address = "#{address.address_number} #{address.street}"
    loc.street_name    = address.street
    loc.street_number  = address.address_number
    loc.full_address   = address.label
  end
end

.set_bounds(result_item, loc) ⇒ Object



92
93
94
95
96
97
98
99
# File 'lib/geokit_aws_geoplaces.rb', line 92

def self.set_bounds(result_item, loc)
  map_view = result_item.map_view

  loc.suggested_bounds = Bounds.normalize(
    [ map_view[1], map_view[0] ],
    [ map_view[3], map_view[2] ]
  )
end

.set_precision(result_item, loc) ⇒ Object



88
89
90
# File 'lib/geokit_aws_geoplaces.rb', line 88

def self.set_precision(result_item, loc)
  loc.precision = PRECISION_MAP[result_item.place_type] || 'unknown'
end