really-broken-geocoder 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +557 -0
- data/LICENSE +20 -0
- data/README.md +3 -0
- data/bin/geocode +5 -0
- data/examples/autoexpire_cache_dalli.rb +62 -0
- data/examples/autoexpire_cache_redis.rb +28 -0
- data/examples/cache_bypass.rb +48 -0
- data/examples/reverse_geocode_job.rb +40 -0
- data/lib/generators/geocoder/config/config_generator.rb +14 -0
- data/lib/generators/geocoder/config/templates/initializer.rb +22 -0
- data/lib/generators/geocoder/maxmind/geolite_city_generator.rb +30 -0
- data/lib/generators/geocoder/maxmind/geolite_country_generator.rb +30 -0
- data/lib/generators/geocoder/maxmind/templates/migration/geolite_city.rb +30 -0
- data/lib/generators/geocoder/maxmind/templates/migration/geolite_country.rb +17 -0
- data/lib/generators/geocoder/migration_version.rb +15 -0
- data/lib/geocoder.rb +48 -0
- data/lib/geocoder/cache.rb +94 -0
- data/lib/geocoder/calculations.rb +420 -0
- data/lib/geocoder/cli.rb +121 -0
- data/lib/geocoder/configuration.rb +137 -0
- data/lib/geocoder/configuration_hash.rb +11 -0
- data/lib/geocoder/esri_token.rb +38 -0
- data/lib/geocoder/exceptions.rb +40 -0
- data/lib/geocoder/ip_address.rb +26 -0
- data/lib/geocoder/kernel_logger.rb +25 -0
- data/lib/geocoder/logger.rb +47 -0
- data/lib/geocoder/lookup.rb +118 -0
- data/lib/geocoder/lookups/amap.rb +63 -0
- data/lib/geocoder/lookups/baidu.rb +63 -0
- data/lib/geocoder/lookups/baidu_ip.rb +30 -0
- data/lib/geocoder/lookups/ban_data_gouv_fr.rb +130 -0
- data/lib/geocoder/lookups/base.rb +348 -0
- data/lib/geocoder/lookups/bing.rb +82 -0
- data/lib/geocoder/lookups/db_ip_com.rb +52 -0
- data/lib/geocoder/lookups/dstk.rb +22 -0
- data/lib/geocoder/lookups/esri.rb +95 -0
- data/lib/geocoder/lookups/freegeoip.rb +60 -0
- data/lib/geocoder/lookups/geocoder_ca.rb +53 -0
- data/lib/geocoder/lookups/geocoder_us.rb +51 -0
- data/lib/geocoder/lookups/geocodio.rb +42 -0
- data/lib/geocoder/lookups/geoip2.rb +45 -0
- data/lib/geocoder/lookups/geoportail_lu.rb +65 -0
- data/lib/geocoder/lookups/google.rb +95 -0
- data/lib/geocoder/lookups/google_places_details.rb +50 -0
- data/lib/geocoder/lookups/google_places_search.rb +33 -0
- data/lib/geocoder/lookups/google_premier.rb +57 -0
- data/lib/geocoder/lookups/here.rb +77 -0
- data/lib/geocoder/lookups/ip2location.rb +75 -0
- data/lib/geocoder/lookups/ipapi_com.rb +82 -0
- data/lib/geocoder/lookups/ipdata_co.rb +62 -0
- data/lib/geocoder/lookups/ipinfo_io.rb +44 -0
- data/lib/geocoder/lookups/ipstack.rb +63 -0
- data/lib/geocoder/lookups/latlon.rb +59 -0
- data/lib/geocoder/lookups/location_iq.rb +50 -0
- data/lib/geocoder/lookups/mapbox.rb +59 -0
- data/lib/geocoder/lookups/mapquest.rb +58 -0
- data/lib/geocoder/lookups/maxmind.rb +90 -0
- data/lib/geocoder/lookups/maxmind_geoip2.rb +70 -0
- data/lib/geocoder/lookups/maxmind_local.rb +65 -0
- data/lib/geocoder/lookups/nominatim.rb +64 -0
- data/lib/geocoder/lookups/opencagedata.rb +65 -0
- data/lib/geocoder/lookups/pelias.rb +63 -0
- data/lib/geocoder/lookups/pickpoint.rb +41 -0
- data/lib/geocoder/lookups/pointpin.rb +69 -0
- data/lib/geocoder/lookups/postcode_anywhere_uk.rb +50 -0
- data/lib/geocoder/lookups/postcodes_io.rb +31 -0
- data/lib/geocoder/lookups/smarty_streets.rb +63 -0
- data/lib/geocoder/lookups/telize.rb +75 -0
- data/lib/geocoder/lookups/tencent.rb +59 -0
- data/lib/geocoder/lookups/test.rb +44 -0
- data/lib/geocoder/lookups/yandex.rb +62 -0
- data/lib/geocoder/models/active_record.rb +51 -0
- data/lib/geocoder/models/base.rb +39 -0
- data/lib/geocoder/models/mongo_base.rb +62 -0
- data/lib/geocoder/models/mongo_mapper.rb +26 -0
- data/lib/geocoder/models/mongoid.rb +32 -0
- data/lib/geocoder/query.rb +125 -0
- data/lib/geocoder/railtie.rb +26 -0
- data/lib/geocoder/request.rb +114 -0
- data/lib/geocoder/results/amap.rb +87 -0
- data/lib/geocoder/results/baidu.rb +79 -0
- data/lib/geocoder/results/baidu_ip.rb +62 -0
- data/lib/geocoder/results/ban_data_gouv_fr.rb +257 -0
- data/lib/geocoder/results/base.rb +79 -0
- data/lib/geocoder/results/bing.rb +52 -0
- data/lib/geocoder/results/db_ip_com.rb +58 -0
- data/lib/geocoder/results/dstk.rb +6 -0
- data/lib/geocoder/results/esri.rb +75 -0
- data/lib/geocoder/results/freegeoip.rb +40 -0
- data/lib/geocoder/results/geocoder_ca.rb +60 -0
- data/lib/geocoder/results/geocoder_us.rb +39 -0
- data/lib/geocoder/results/geocodio.rb +78 -0
- data/lib/geocoder/results/geoip2.rb +76 -0
- data/lib/geocoder/results/geoportail_lu.rb +71 -0
- data/lib/geocoder/results/google.rb +150 -0
- data/lib/geocoder/results/google_places_details.rb +39 -0
- data/lib/geocoder/results/google_places_search.rb +52 -0
- data/lib/geocoder/results/google_premier.rb +6 -0
- data/lib/geocoder/results/here.rb +79 -0
- data/lib/geocoder/results/ip2location.rb +22 -0
- data/lib/geocoder/results/ipapi_com.rb +45 -0
- data/lib/geocoder/results/ipdata_co.rb +40 -0
- data/lib/geocoder/results/ipinfo_io.rb +48 -0
- data/lib/geocoder/results/ipstack.rb +60 -0
- data/lib/geocoder/results/latlon.rb +71 -0
- data/lib/geocoder/results/location_iq.rb +6 -0
- data/lib/geocoder/results/mapbox.rb +57 -0
- data/lib/geocoder/results/mapquest.rb +48 -0
- data/lib/geocoder/results/maxmind.rb +130 -0
- data/lib/geocoder/results/maxmind_geoip2.rb +9 -0
- data/lib/geocoder/results/maxmind_local.rb +44 -0
- data/lib/geocoder/results/nominatim.rb +109 -0
- data/lib/geocoder/results/opencagedata.rb +100 -0
- data/lib/geocoder/results/pelias.rb +58 -0
- data/lib/geocoder/results/pickpoint.rb +6 -0
- data/lib/geocoder/results/pointpin.rb +40 -0
- data/lib/geocoder/results/postcode_anywhere_uk.rb +42 -0
- data/lib/geocoder/results/postcodes_io.rb +40 -0
- data/lib/geocoder/results/smarty_streets.rb +142 -0
- data/lib/geocoder/results/telize.rb +40 -0
- data/lib/geocoder/results/tencent.rb +72 -0
- data/lib/geocoder/results/test.rb +33 -0
- data/lib/geocoder/results/yandex.rb +134 -0
- data/lib/geocoder/sql.rb +110 -0
- data/lib/geocoder/stores/active_record.rb +328 -0
- data/lib/geocoder/stores/base.rb +115 -0
- data/lib/geocoder/stores/mongo_base.rb +58 -0
- data/lib/geocoder/stores/mongo_mapper.rb +13 -0
- data/lib/geocoder/stores/mongoid.rb +13 -0
- data/lib/geocoder/version.rb +3 -0
- data/lib/hash_recursive_merge.rb +74 -0
- data/lib/maxmind_database.rb +109 -0
- data/lib/tasks/geocoder.rake +54 -0
- data/lib/tasks/maxmind.rake +73 -0
- metadata +186 -0
@@ -0,0 +1,79 @@
|
|
1
|
+
module Geocoder
|
2
|
+
module Result
|
3
|
+
class Base
|
4
|
+
|
5
|
+
# data (hash) fetched from geocoding service
|
6
|
+
attr_accessor :data
|
7
|
+
|
8
|
+
# true if result came from cache, false if from request to geocoding
|
9
|
+
# service; nil if cache is not configured
|
10
|
+
attr_accessor :cache_hit
|
11
|
+
|
12
|
+
##
|
13
|
+
# Takes a hash of data from a parsed geocoding service response.
|
14
|
+
#
|
15
|
+
def initialize(data)
|
16
|
+
@data = data
|
17
|
+
@cache_hit = nil
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
# A string in the given format.
|
22
|
+
#
|
23
|
+
# This default implementation dumbly follows the United States address
|
24
|
+
# format and will return incorrect results for most countries. Some APIs
|
25
|
+
# return properly formatted addresses and those should be funneled
|
26
|
+
# through this method.
|
27
|
+
#
|
28
|
+
def address(format = :full)
|
29
|
+
if state_code.to_s != ""
|
30
|
+
s = ", #{state_code}"
|
31
|
+
elsif state.to_s != ""
|
32
|
+
s = ", #{state}"
|
33
|
+
else
|
34
|
+
s = ""
|
35
|
+
end
|
36
|
+
"#{city}#{s} #{postal_code}, #{country}".sub(/^[ ,]*/, '')
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# A two-element array: [lat, lon].
|
41
|
+
#
|
42
|
+
def coordinates
|
43
|
+
[@data['latitude'].to_f, @data['longitude'].to_f]
|
44
|
+
end
|
45
|
+
|
46
|
+
def latitude
|
47
|
+
coordinates[0]
|
48
|
+
end
|
49
|
+
|
50
|
+
def longitude
|
51
|
+
coordinates[1]
|
52
|
+
end
|
53
|
+
|
54
|
+
def state
|
55
|
+
fail
|
56
|
+
end
|
57
|
+
|
58
|
+
def province
|
59
|
+
state
|
60
|
+
end
|
61
|
+
|
62
|
+
def state_code
|
63
|
+
fail
|
64
|
+
end
|
65
|
+
|
66
|
+
def province_code
|
67
|
+
state_code
|
68
|
+
end
|
69
|
+
|
70
|
+
def country
|
71
|
+
fail
|
72
|
+
end
|
73
|
+
|
74
|
+
def country_code
|
75
|
+
fail
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Bing < Base
|
5
|
+
|
6
|
+
def address(format = :full)
|
7
|
+
@data['address']['formattedAddress']
|
8
|
+
end
|
9
|
+
|
10
|
+
def city
|
11
|
+
@data['address']['locality']
|
12
|
+
end
|
13
|
+
|
14
|
+
def state_code
|
15
|
+
@data['address']['adminDistrict']
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_method :state, :state_code
|
19
|
+
|
20
|
+
def country
|
21
|
+
@data['address']['countryRegion']
|
22
|
+
end
|
23
|
+
|
24
|
+
alias_method :country_code, :country
|
25
|
+
|
26
|
+
def postal_code
|
27
|
+
@data['address']['postalCode'].to_s
|
28
|
+
end
|
29
|
+
|
30
|
+
def coordinates
|
31
|
+
@data['point']['coordinates']
|
32
|
+
end
|
33
|
+
|
34
|
+
def address_data
|
35
|
+
@data['address']
|
36
|
+
end
|
37
|
+
|
38
|
+
def viewport
|
39
|
+
@data['bbox']
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.response_attributes
|
43
|
+
%w[bbox name confidence entityType]
|
44
|
+
end
|
45
|
+
|
46
|
+
response_attributes.each do |a|
|
47
|
+
define_method a do
|
48
|
+
@data[a]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class DbIpCom < Base
|
5
|
+
|
6
|
+
def coordinates
|
7
|
+
['latitude', 'longitude'].map{ |coordinate_name| @data[coordinate_name] }
|
8
|
+
end
|
9
|
+
|
10
|
+
def city
|
11
|
+
@data['city']
|
12
|
+
end
|
13
|
+
|
14
|
+
def district
|
15
|
+
@data['district']
|
16
|
+
end
|
17
|
+
|
18
|
+
def state_code
|
19
|
+
@data['stateProv']
|
20
|
+
end
|
21
|
+
alias_method :state, :state_code
|
22
|
+
|
23
|
+
def zip_code
|
24
|
+
@data['zipCode']
|
25
|
+
end
|
26
|
+
alias_method :postal_code, :zip_code
|
27
|
+
|
28
|
+
def country_name
|
29
|
+
@data['countryName']
|
30
|
+
end
|
31
|
+
alias_method :country, :country_name
|
32
|
+
|
33
|
+
def country_code
|
34
|
+
@data['countryCode']
|
35
|
+
end
|
36
|
+
|
37
|
+
def continent_name
|
38
|
+
@data['continentName']
|
39
|
+
end
|
40
|
+
alias_method :continent, :continent_name
|
41
|
+
|
42
|
+
def continent_code
|
43
|
+
@data['continentCode']
|
44
|
+
end
|
45
|
+
|
46
|
+
def time_zone
|
47
|
+
@data['timeZone']
|
48
|
+
end
|
49
|
+
|
50
|
+
def gmt_offset
|
51
|
+
@data['gmtOffset']
|
52
|
+
end
|
53
|
+
|
54
|
+
def currency_code
|
55
|
+
@data['currencyCode']
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Esri < Base
|
5
|
+
|
6
|
+
def address
|
7
|
+
address_key = reverse_geocode? ? 'Address' : 'Match_addr'
|
8
|
+
attributes[address_key]
|
9
|
+
end
|
10
|
+
|
11
|
+
def city
|
12
|
+
if !reverse_geocode? && is_city?
|
13
|
+
place_name
|
14
|
+
else
|
15
|
+
attributes['City']
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def state_code
|
20
|
+
attributes['Region']
|
21
|
+
end
|
22
|
+
|
23
|
+
alias_method :state, :state_code
|
24
|
+
|
25
|
+
def country
|
26
|
+
country_key = reverse_geocode? ? "CountryCode" : "Country"
|
27
|
+
attributes[country_key]
|
28
|
+
end
|
29
|
+
|
30
|
+
alias_method :country_code, :country
|
31
|
+
|
32
|
+
def postal_code
|
33
|
+
attributes['Postal']
|
34
|
+
end
|
35
|
+
|
36
|
+
def place_name
|
37
|
+
place_name_key = reverse_geocode? ? "Address" : "PlaceName"
|
38
|
+
attributes[place_name_key]
|
39
|
+
end
|
40
|
+
|
41
|
+
def place_type
|
42
|
+
reverse_geocode? ? "Address" : attributes['Type']
|
43
|
+
end
|
44
|
+
|
45
|
+
def coordinates
|
46
|
+
[geometry["y"], geometry["x"]]
|
47
|
+
end
|
48
|
+
|
49
|
+
def viewport
|
50
|
+
north = attributes['Ymax']
|
51
|
+
south = attributes['Ymin']
|
52
|
+
east = attributes['Xmax']
|
53
|
+
west = attributes['Xmin']
|
54
|
+
[south, west, north, east]
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def attributes
|
60
|
+
reverse_geocode? ? @data['address'] : @data['locations'].first['feature']['attributes']
|
61
|
+
end
|
62
|
+
|
63
|
+
def geometry
|
64
|
+
reverse_geocode? ? @data["location"] : @data['locations'].first['feature']["geometry"]
|
65
|
+
end
|
66
|
+
|
67
|
+
def reverse_geocode?
|
68
|
+
@data['locations'].nil?
|
69
|
+
end
|
70
|
+
|
71
|
+
def is_city?
|
72
|
+
['City', 'State Capital', 'National Capital'].include?(place_type)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Freegeoip < Base
|
5
|
+
|
6
|
+
def city
|
7
|
+
@data['city']
|
8
|
+
end
|
9
|
+
|
10
|
+
def state
|
11
|
+
@data['region_name']
|
12
|
+
end
|
13
|
+
|
14
|
+
def state_code
|
15
|
+
@data['region_code']
|
16
|
+
end
|
17
|
+
|
18
|
+
def country
|
19
|
+
@data['country_name']
|
20
|
+
end
|
21
|
+
|
22
|
+
def country_code
|
23
|
+
@data['country_code']
|
24
|
+
end
|
25
|
+
|
26
|
+
def postal_code
|
27
|
+
@data['zipcode'] || @data['zip_code']
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.response_attributes
|
31
|
+
%w[metro_code ip]
|
32
|
+
end
|
33
|
+
|
34
|
+
response_attributes.each do |a|
|
35
|
+
define_method a do
|
36
|
+
@data[a]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class GeocoderCa < Base
|
5
|
+
|
6
|
+
def coordinates
|
7
|
+
[@data['latt'].to_f, @data['longt'].to_f]
|
8
|
+
end
|
9
|
+
|
10
|
+
def address(format = :full)
|
11
|
+
"#{street_address}, #{city}, #{state} #{postal_code}, #{country}".sub(/^[ ,]*/, "")
|
12
|
+
end
|
13
|
+
|
14
|
+
def street_address
|
15
|
+
"#{@data['stnumber']} #{@data['staddress']}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def city
|
19
|
+
@data['city'] or (@data['standard'] and @data['standard']['city']) or ""
|
20
|
+
end
|
21
|
+
|
22
|
+
def state
|
23
|
+
@data['prov'] or (@data['standard'] and @data['standard']['prov']) or ""
|
24
|
+
end
|
25
|
+
|
26
|
+
alias_method :state_code, :state
|
27
|
+
|
28
|
+
def postal_code
|
29
|
+
@data['postal'] or (@data['standard'] and @data['standard']['postal']) or ""
|
30
|
+
end
|
31
|
+
|
32
|
+
def country
|
33
|
+
country_code == 'CA' ? 'Canada' : 'United States'
|
34
|
+
end
|
35
|
+
|
36
|
+
def country_code
|
37
|
+
return nil if state.nil? || state == ""
|
38
|
+
canadian_province_abbreviations.include?(state) ? "CA" : "US"
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.response_attributes
|
42
|
+
%w[latt longt inlatt inlongt distance stnumber staddress prov
|
43
|
+
NearRoad NearRoadDistance betweenRoad1 betweenRoad2
|
44
|
+
intersection major_intersection]
|
45
|
+
end
|
46
|
+
|
47
|
+
response_attributes.each do |a|
|
48
|
+
define_method a do
|
49
|
+
@data[a]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
private # ----------------------------------------------------------------
|
55
|
+
|
56
|
+
def canadian_province_abbreviations
|
57
|
+
%w[ON QC NS NB MB BC PE SK AB NL]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class GeocoderUs < Base
|
5
|
+
def coordinates
|
6
|
+
[@data[0].to_f, @data[1].to_f]
|
7
|
+
end
|
8
|
+
|
9
|
+
def address(format = :full)
|
10
|
+
"#{street_address}, #{city}, #{state} #{postal_code}, #{country}".sub(/^[ ,]*/, "")
|
11
|
+
end
|
12
|
+
|
13
|
+
def street_address
|
14
|
+
@data[2]
|
15
|
+
end
|
16
|
+
|
17
|
+
def city
|
18
|
+
@data[3]
|
19
|
+
end
|
20
|
+
|
21
|
+
def state
|
22
|
+
@data[4]
|
23
|
+
end
|
24
|
+
|
25
|
+
alias_method :state_code, :state
|
26
|
+
|
27
|
+
def postal_code
|
28
|
+
@data[5]
|
29
|
+
end
|
30
|
+
|
31
|
+
def country
|
32
|
+
'United States'
|
33
|
+
end
|
34
|
+
|
35
|
+
def country_code
|
36
|
+
'US'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Geocodio < Base
|
5
|
+
def number
|
6
|
+
address_components["number"]
|
7
|
+
end
|
8
|
+
|
9
|
+
def street
|
10
|
+
address_components["street"]
|
11
|
+
end
|
12
|
+
|
13
|
+
def suffix
|
14
|
+
address_components["suffix"]
|
15
|
+
end
|
16
|
+
|
17
|
+
def street_address
|
18
|
+
[number, address_components["formatted_street"]].compact.join(' ')
|
19
|
+
end
|
20
|
+
|
21
|
+
def state
|
22
|
+
address_components["state"]
|
23
|
+
end
|
24
|
+
alias_method :state_code, :state
|
25
|
+
|
26
|
+
def zip
|
27
|
+
# Postal code is not returned for Canada geocode results
|
28
|
+
address_components["zip"] || ""
|
29
|
+
end
|
30
|
+
alias_method :postal_code, :zip
|
31
|
+
|
32
|
+
def country
|
33
|
+
# Geocodio supports US and Canada, however they don't return the full
|
34
|
+
# country name.
|
35
|
+
|
36
|
+
if country_code == "CA"
|
37
|
+
"Canada"
|
38
|
+
else
|
39
|
+
"United States"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def country_code
|
44
|
+
address_components['country']
|
45
|
+
end
|
46
|
+
|
47
|
+
def city
|
48
|
+
address_components["city"]
|
49
|
+
end
|
50
|
+
|
51
|
+
def postdirectional
|
52
|
+
address_components["postdirectional"]
|
53
|
+
end
|
54
|
+
|
55
|
+
def location
|
56
|
+
@data['location']
|
57
|
+
end
|
58
|
+
|
59
|
+
def coordinates
|
60
|
+
['lat', 'lng'].map{ |i| location[i].to_f } if location
|
61
|
+
end
|
62
|
+
|
63
|
+
def accuracy
|
64
|
+
@data['accuracy'].to_f if @data.key?('accuracy')
|
65
|
+
end
|
66
|
+
|
67
|
+
def formatted_address(format = :full)
|
68
|
+
@data['formatted_address']
|
69
|
+
end
|
70
|
+
alias_method :address, :formatted_address
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def address_components
|
75
|
+
@data['address_components'] || {}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|