bw-geocoder 1.2.5
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.
- data/.gitignore +6 -0
- data/.travis.yml +31 -0
- data/CHANGELOG.md +377 -0
- data/LICENSE +20 -0
- data/README.md +1041 -0
- data/Rakefile +25 -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/gemfiles/Gemfile.mongoid-2.4.x +16 -0
- data/lib/generators/geocoder/config/config_generator.rb +14 -0
- data/lib/generators/geocoder/config/templates/initializer.rb +21 -0
- data/lib/generators/geocoder/maxmind/geolite_city_generator.rb +28 -0
- data/lib/generators/geocoder/maxmind/geolite_country_generator.rb +28 -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/geocoder/cache.rb +90 -0
- data/lib/geocoder/calculations.rb +428 -0
- data/lib/geocoder/cli.rb +121 -0
- data/lib/geocoder/configuration.rb +124 -0
- data/lib/geocoder/configuration_hash.rb +11 -0
- data/lib/geocoder/exceptions.rb +21 -0
- data/lib/geocoder/ip_address.rb +21 -0
- data/lib/geocoder/lookup.rb +100 -0
- data/lib/geocoder/lookups/baidu.rb +55 -0
- data/lib/geocoder/lookups/baidu_ip.rb +54 -0
- data/lib/geocoder/lookups/base.rb +302 -0
- data/lib/geocoder/lookups/bing.rb +59 -0
- data/lib/geocoder/lookups/dstk.rb +20 -0
- data/lib/geocoder/lookups/esri.rb +48 -0
- data/lib/geocoder/lookups/freegeoip.rb +47 -0
- data/lib/geocoder/lookups/geocoder_ca.rb +54 -0
- data/lib/geocoder/lookups/geocoder_us.rb +39 -0
- data/lib/geocoder/lookups/geocodio.rb +42 -0
- data/lib/geocoder/lookups/google.rb +67 -0
- data/lib/geocoder/lookups/google_places_details.rb +50 -0
- data/lib/geocoder/lookups/google_premier.rb +47 -0
- data/lib/geocoder/lookups/here.rb +62 -0
- data/lib/geocoder/lookups/ip_address_labs.rb +43 -0
- data/lib/geocoder/lookups/mapquest.rb +60 -0
- data/lib/geocoder/lookups/maxmind.rb +90 -0
- data/lib/geocoder/lookups/maxmind_local.rb +58 -0
- data/lib/geocoder/lookups/nominatim.rb +52 -0
- data/lib/geocoder/lookups/okf.rb +43 -0
- data/lib/geocoder/lookups/opencagedata.rb +58 -0
- data/lib/geocoder/lookups/ovi.rb +62 -0
- data/lib/geocoder/lookups/pointpin.rb +68 -0
- data/lib/geocoder/lookups/smarty_streets.rb +45 -0
- data/lib/geocoder/lookups/telize.rb +40 -0
- data/lib/geocoder/lookups/test.rb +44 -0
- data/lib/geocoder/lookups/yahoo.rb +88 -0
- data/lib/geocoder/lookups/yandex.rb +54 -0
- data/lib/geocoder/models/active_record.rb +50 -0
- data/lib/geocoder/models/base.rb +39 -0
- data/lib/geocoder/models/mongo_base.rb +64 -0
- data/lib/geocoder/models/mongo_mapper.rb +26 -0
- data/lib/geocoder/models/mongoid.rb +32 -0
- data/lib/geocoder/query.rb +111 -0
- data/lib/geocoder/railtie.rb +26 -0
- data/lib/geocoder/request.rb +25 -0
- data/lib/geocoder/results/baidu.rb +79 -0
- data/lib/geocoder/results/baidu_ip.rb +62 -0
- data/lib/geocoder/results/base.rb +67 -0
- data/lib/geocoder/results/bing.rb +48 -0
- data/lib/geocoder/results/dstk.rb +6 -0
- data/lib/geocoder/results/esri.rb +51 -0
- data/lib/geocoder/results/freegeoip.rb +45 -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 +66 -0
- data/lib/geocoder/results/google.rb +124 -0
- data/lib/geocoder/results/google_places_details.rb +35 -0
- data/lib/geocoder/results/google_premier.rb +6 -0
- data/lib/geocoder/results/here.rb +62 -0
- data/lib/geocoder/results/ip_address_labs.rb +78 -0
- data/lib/geocoder/results/mapquest.rb +51 -0
- data/lib/geocoder/results/maxmind.rb +135 -0
- data/lib/geocoder/results/maxmind_local.rb +49 -0
- data/lib/geocoder/results/nominatim.rb +94 -0
- data/lib/geocoder/results/okf.rb +106 -0
- data/lib/geocoder/results/opencagedata.rb +82 -0
- data/lib/geocoder/results/ovi.rb +62 -0
- data/lib/geocoder/results/pointpin.rb +44 -0
- data/lib/geocoder/results/smarty_streets.rb +106 -0
- data/lib/geocoder/results/telize.rb +45 -0
- data/lib/geocoder/results/test.rb +33 -0
- data/lib/geocoder/results/yahoo.rb +55 -0
- data/lib/geocoder/results/yandex.rb +84 -0
- data/lib/geocoder/sql.rb +107 -0
- data/lib/geocoder/stores/active_record.rb +278 -0
- data/lib/geocoder/stores/base.rb +127 -0
- data/lib/geocoder/stores/mongo_base.rb +89 -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/geocoder.rb +47 -0
- data/lib/hash_recursive_merge.rb +74 -0
- data/lib/maxmind_database.rb +109 -0
- data/lib/oauth_util.rb +112 -0
- data/lib/tasks/geocoder.rake +29 -0
- data/lib/tasks/maxmind.rake +73 -0
- data/test/fixtures/baidu_invalid_key +1 -0
- data/test/fixtures/baidu_ip_202_198_16_3 +19 -0
- data/test/fixtures/baidu_ip_invalid_key +1 -0
- data/test/fixtures/baidu_ip_no_results +1 -0
- data/test/fixtures/baidu_no_results +1 -0
- data/test/fixtures/baidu_reverse +1 -0
- data/test/fixtures/baidu_shanghai_pearl_tower +12 -0
- data/test/fixtures/bing_invalid_key +1 -0
- data/test/fixtures/bing_madison_square_garden +40 -0
- data/test/fixtures/bing_no_results +16 -0
- data/test/fixtures/bing_reverse +42 -0
- data/test/fixtures/cloudmade_invalid_key +1 -0
- data/test/fixtures/cloudmade_madison_square_garden +1 -0
- data/test/fixtures/cloudmade_no_results +1 -0
- data/test/fixtures/esri_madison_square_garden +59 -0
- data/test/fixtures/esri_no_results +8 -0
- data/test/fixtures/esri_reverse +21 -0
- data/test/fixtures/freegeoip_74_200_247_59 +12 -0
- data/test/fixtures/freegeoip_no_results +1 -0
- data/test/fixtures/geocoder_ca_madison_square_garden +1 -0
- data/test/fixtures/geocoder_ca_no_results +1 -0
- data/test/fixtures/geocoder_ca_reverse +34 -0
- data/test/fixtures/geocoder_us_madison_square_garden +1 -0
- data/test/fixtures/geocoder_us_no_results +1 -0
- data/test/fixtures/geocodio_1101_pennsylvania_ave +1 -0
- data/test/fixtures/geocodio_bad_api_key +3 -0
- data/test/fixtures/geocodio_invalid +4 -0
- data/test/fixtures/geocodio_no_results +1 -0
- data/test/fixtures/geocodio_over_query_limit +4 -0
- data/test/fixtures/google_garbage +456 -0
- data/test/fixtures/google_madison_square_garden +57 -0
- data/test/fixtures/google_no_city_data +44 -0
- data/test/fixtures/google_no_locality +51 -0
- data/test/fixtures/google_no_results +4 -0
- data/test/fixtures/google_over_limit +4 -0
- data/test/fixtures/google_places_details_invalid_request +4 -0
- data/test/fixtures/google_places_details_madison_square_garden +120 -0
- data/test/fixtures/google_places_details_no_results +4 -0
- data/test/fixtures/google_places_details_no_reviews +60 -0
- data/test/fixtures/google_places_details_no_types +66 -0
- data/test/fixtures/here_madison_square_garden +72 -0
- data/test/fixtures/here_no_results +8 -0
- data/test/fixtures/mapquest_error +16 -0
- data/test/fixtures/mapquest_invalid_api_key +16 -0
- data/test/fixtures/mapquest_invalid_request +16 -0
- data/test/fixtures/mapquest_madison_square_garden +52 -0
- data/test/fixtures/mapquest_no_results +16 -0
- data/test/fixtures/maxmind_24_24_24_21 +1 -0
- data/test/fixtures/maxmind_24_24_24_22 +1 -0
- data/test/fixtures/maxmind_24_24_24_23 +1 -0
- data/test/fixtures/maxmind_24_24_24_24 +1 -0
- data/test/fixtures/maxmind_74_200_247_59 +1 -0
- data/test/fixtures/maxmind_invalid_key +1 -0
- data/test/fixtures/maxmind_no_results +1 -0
- data/test/fixtures/nominatim_madison_square_garden +150 -0
- data/test/fixtures/nominatim_no_results +1 -0
- data/test/fixtures/nominatim_over_limit +1 -0
- data/test/fixtures/okf_kirstinmaki +67 -0
- data/test/fixtures/okf_no_results +4 -0
- data/test/fixtures/opencagedata_invalid_api_key +25 -0
- data/test/fixtures/opencagedata_invalid_request +26 -0
- data/test/fixtures/opencagedata_madison_square_garden +73 -0
- data/test/fixtures/opencagedata_no_results +29 -0
- data/test/fixtures/opencagedata_over_limit +31 -0
- data/test/fixtures/ovi_madison_square_garden +72 -0
- data/test/fixtures/ovi_no_results +8 -0
- data/test/fixtures/pointpin_10_10_10_10 +1 -0
- data/test/fixtures/pointpin_555_555_555_555 +1 -0
- data/test/fixtures/pointpin_80_111_555_555 +1 -0
- data/test/fixtures/pointpin_no_results +1 -0
- data/test/fixtures/smarty_streets_11211 +1 -0
- data/test/fixtures/smarty_streets_madison_square_garden +47 -0
- data/test/fixtures/smarty_streets_no_results +1 -0
- data/test/fixtures/telize_10_10_10_10 +1 -0
- data/test/fixtures/telize_555_555_555_555 +4 -0
- data/test/fixtures/telize_74_200_247_59 +1 -0
- data/test/fixtures/telize_no_results +1 -0
- data/test/fixtures/yahoo_error +1 -0
- data/test/fixtures/yahoo_invalid_key +2 -0
- data/test/fixtures/yahoo_madison_square_garden +52 -0
- data/test/fixtures/yahoo_no_results +10 -0
- data/test/fixtures/yahoo_over_limit +2 -0
- data/test/fixtures/yandex_canada_rue_dupuis_14 +446 -0
- data/test/fixtures/yandex_invalid_key +1 -0
- data/test/fixtures/yandex_kremlin +48 -0
- data/test/fixtures/yandex_new_york +1 -0
- data/test/fixtures/yandex_no_city_and_town +112 -0
- data/test/fixtures/yandex_no_results +16 -0
- data/test/integration/http_client_test.rb +31 -0
- data/test/mongoid_test_helper.rb +43 -0
- data/test/test_helper.rb +386 -0
- data/test/unit/active_record_test.rb +16 -0
- data/test/unit/cache_test.rb +37 -0
- data/test/unit/calculations_test.rb +220 -0
- data/test/unit/configuration_test.rb +55 -0
- data/test/unit/error_handling_test.rb +56 -0
- data/test/unit/geocoder_test.rb +78 -0
- data/test/unit/https_test.rb +17 -0
- data/test/unit/ip_address_test.rb +27 -0
- data/test/unit/lookup_test.rb +153 -0
- data/test/unit/lookups/bing_test.rb +68 -0
- data/test/unit/lookups/dstk_test.rb +26 -0
- data/test/unit/lookups/esri_test.rb +48 -0
- data/test/unit/lookups/freegeoip_test.rb +27 -0
- data/test/unit/lookups/geocoder_ca_test.rb +17 -0
- data/test/unit/lookups/geocodio_test.rb +55 -0
- data/test/unit/lookups/google_places_details_test.rb +122 -0
- data/test/unit/lookups/google_premier_test.rb +22 -0
- data/test/unit/lookups/google_test.rb +84 -0
- data/test/unit/lookups/mapquest_test.rb +60 -0
- data/test/unit/lookups/maxmind_local_test.rb +28 -0
- data/test/unit/lookups/maxmind_test.rb +63 -0
- data/test/unit/lookups/nominatim_test.rb +31 -0
- data/test/unit/lookups/okf_test.rb +38 -0
- data/test/unit/lookups/opencagedata_test.rb +64 -0
- data/test/unit/lookups/pointpin_test.rb +30 -0
- data/test/unit/lookups/smarty_streets_test.rb +71 -0
- data/test/unit/lookups/telize_test.rb +36 -0
- data/test/unit/lookups/yahoo_test.rb +35 -0
- data/test/unit/method_aliases_test.rb +26 -0
- data/test/unit/model_test.rb +38 -0
- data/test/unit/mongoid_test.rb +47 -0
- data/test/unit/near_test.rb +87 -0
- data/test/unit/oauth_util_test.rb +31 -0
- data/test/unit/proxy_test.rb +37 -0
- data/test/unit/query_test.rb +52 -0
- data/test/unit/rake_task_test.rb +21 -0
- data/test/unit/request_test.rb +35 -0
- data/test/unit/result_test.rb +72 -0
- data/test/unit/test_mode_test.rb +70 -0
- metadata +281 -0
@@ -0,0 +1,66 @@
|
|
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 state
|
18
|
+
address_components["state"]
|
19
|
+
end
|
20
|
+
alias_method :state_code, :state
|
21
|
+
|
22
|
+
def zip
|
23
|
+
address_components["zip"]
|
24
|
+
end
|
25
|
+
alias_method :postal_code, :zip
|
26
|
+
|
27
|
+
def country
|
28
|
+
"United States" # Geocodio only supports the US
|
29
|
+
end
|
30
|
+
|
31
|
+
def country_code
|
32
|
+
"US" # Geocodio only supports the US
|
33
|
+
end
|
34
|
+
|
35
|
+
def city
|
36
|
+
address_components["city"]
|
37
|
+
end
|
38
|
+
|
39
|
+
def postdirectional
|
40
|
+
address_components["postdirectional"]
|
41
|
+
end
|
42
|
+
|
43
|
+
def location
|
44
|
+
@data['location']
|
45
|
+
end
|
46
|
+
|
47
|
+
def coordinates
|
48
|
+
['lat', 'lng'].map{ |i| location[i].to_f } if location
|
49
|
+
end
|
50
|
+
|
51
|
+
def accuracy
|
52
|
+
@data['accuracy'].to_f if @data.key?('accuracy')
|
53
|
+
end
|
54
|
+
|
55
|
+
def formatted_address(format = :full)
|
56
|
+
@data['formatted_address']
|
57
|
+
end
|
58
|
+
alias_method :address, :formatted_address
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def address_components
|
63
|
+
@data['address_components'] || {}
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Google < Base
|
5
|
+
|
6
|
+
def coordinates
|
7
|
+
['lat', 'lng'].map{ |i| geometry['location'][i] }
|
8
|
+
end
|
9
|
+
|
10
|
+
def address(format = :full)
|
11
|
+
formatted_address
|
12
|
+
end
|
13
|
+
|
14
|
+
def neighborhood
|
15
|
+
if neighborhood = address_components_of_type(:neighborhood).first
|
16
|
+
neighborhood['long_name']
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def city
|
21
|
+
fields = [:locality, :sublocality,
|
22
|
+
:administrative_area_level_3,
|
23
|
+
:administrative_area_level_2]
|
24
|
+
fields.each do |f|
|
25
|
+
if entity = address_components_of_type(f).first
|
26
|
+
return entity['long_name']
|
27
|
+
end
|
28
|
+
end
|
29
|
+
return nil # no appropriate components found
|
30
|
+
end
|
31
|
+
|
32
|
+
def state
|
33
|
+
if state = address_components_of_type(:administrative_area_level_1).first
|
34
|
+
state['long_name']
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def state_code
|
39
|
+
if state = address_components_of_type(:administrative_area_level_1).first
|
40
|
+
state['short_name']
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def sub_state
|
45
|
+
if state = address_components_of_type(:administrative_area_level_2).first
|
46
|
+
state['long_name']
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def sub_state_code
|
51
|
+
if state = address_components_of_type(:administrative_area_level_2).first
|
52
|
+
state['short_name']
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def country
|
57
|
+
if country = address_components_of_type(:country).first
|
58
|
+
country['long_name']
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def country_code
|
63
|
+
if country = address_components_of_type(:country).first
|
64
|
+
country['short_name']
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def postal_code
|
69
|
+
if postal = address_components_of_type(:postal_code).first
|
70
|
+
postal['long_name']
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def route
|
75
|
+
if route = address_components_of_type(:route).first
|
76
|
+
route['long_name']
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def street_number
|
81
|
+
if street_number = address_components_of_type(:street_number).first
|
82
|
+
street_number['long_name']
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def street_address
|
87
|
+
[street_number, route].compact.join(' ')
|
88
|
+
end
|
89
|
+
|
90
|
+
def types
|
91
|
+
@data['types']
|
92
|
+
end
|
93
|
+
|
94
|
+
def formatted_address
|
95
|
+
@data['formatted_address']
|
96
|
+
end
|
97
|
+
|
98
|
+
def address_components
|
99
|
+
@data['address_components']
|
100
|
+
end
|
101
|
+
|
102
|
+
##
|
103
|
+
# Get address components of a given type. Valid types are defined in
|
104
|
+
# Google's Geocoding API documentation and include (among others):
|
105
|
+
#
|
106
|
+
# :street_number
|
107
|
+
# :locality
|
108
|
+
# :neighborhood
|
109
|
+
# :route
|
110
|
+
# :postal_code
|
111
|
+
#
|
112
|
+
def address_components_of_type(type)
|
113
|
+
address_components.select{ |c| c['types'].include?(type.to_s) }
|
114
|
+
end
|
115
|
+
|
116
|
+
def geometry
|
117
|
+
@data['geometry']
|
118
|
+
end
|
119
|
+
|
120
|
+
def precision
|
121
|
+
geometry['location_type'] if geometry
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "geocoder/results/google"
|
2
|
+
|
3
|
+
module Geocoder
|
4
|
+
module Result
|
5
|
+
class GooglePlacesDetails < Google
|
6
|
+
def place_id
|
7
|
+
@data["place_id"]
|
8
|
+
end
|
9
|
+
|
10
|
+
def types
|
11
|
+
@data["types"] || []
|
12
|
+
end
|
13
|
+
|
14
|
+
def reviews
|
15
|
+
@data["reviews"] || []
|
16
|
+
end
|
17
|
+
|
18
|
+
def rating
|
19
|
+
@data["rating"]
|
20
|
+
end
|
21
|
+
|
22
|
+
def rating_count
|
23
|
+
@data["user_ratings_total"]
|
24
|
+
end
|
25
|
+
|
26
|
+
def phone_number
|
27
|
+
@data["international_phone_number"]
|
28
|
+
end
|
29
|
+
|
30
|
+
def website
|
31
|
+
@data["website"]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Here < Base
|
5
|
+
|
6
|
+
##
|
7
|
+
# A string in the given format.
|
8
|
+
#
|
9
|
+
def address(format = :full)
|
10
|
+
address_data['Label']
|
11
|
+
end
|
12
|
+
|
13
|
+
##
|
14
|
+
# A two-element array: [lat, lon].
|
15
|
+
#
|
16
|
+
def coordinates
|
17
|
+
fail unless d = @data['Location']['DisplayPosition']
|
18
|
+
[d['Latitude'].to_f, d['Longitude'].to_f]
|
19
|
+
end
|
20
|
+
|
21
|
+
def state
|
22
|
+
address_data['County']
|
23
|
+
end
|
24
|
+
|
25
|
+
def province
|
26
|
+
address_data['County']
|
27
|
+
end
|
28
|
+
|
29
|
+
def postal_code
|
30
|
+
address_data['PostalCode']
|
31
|
+
end
|
32
|
+
|
33
|
+
def city
|
34
|
+
address_data['City']
|
35
|
+
end
|
36
|
+
|
37
|
+
def state_code
|
38
|
+
address_data['State']
|
39
|
+
end
|
40
|
+
|
41
|
+
def province_code
|
42
|
+
address_data['State']
|
43
|
+
end
|
44
|
+
|
45
|
+
def country
|
46
|
+
fail unless d = address_data['AdditionalData']
|
47
|
+
if v = d.find{|ad| ad['key']=='CountryName'}
|
48
|
+
return v['value']
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def country_code
|
53
|
+
address_data['Country']
|
54
|
+
end
|
55
|
+
|
56
|
+
private # ----------------------------------------------------------------
|
57
|
+
|
58
|
+
def address_data
|
59
|
+
@data['Location']['Address'] || fail
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class IpAddressLabs < Base
|
5
|
+
|
6
|
+
def coordinates
|
7
|
+
[ @data["latitude"], @data["longitude"] ]
|
8
|
+
end
|
9
|
+
|
10
|
+
def continent_code
|
11
|
+
@data["continent_code"]
|
12
|
+
end
|
13
|
+
|
14
|
+
def continent_name
|
15
|
+
@data["continent_name"]
|
16
|
+
end
|
17
|
+
|
18
|
+
def country_code_iso3166alpha2
|
19
|
+
@data["country_code_iso3166alpha2"]
|
20
|
+
end
|
21
|
+
|
22
|
+
def country_code_iso3166alpha3
|
23
|
+
@data["country_code_iso3166alpha3"]
|
24
|
+
end
|
25
|
+
|
26
|
+
def country_code_iso3166numeric
|
27
|
+
@data["country_code_iso3166numeric"]
|
28
|
+
end
|
29
|
+
|
30
|
+
def country_code_fips10_4
|
31
|
+
@data["country_code_fips10-4"]
|
32
|
+
end
|
33
|
+
|
34
|
+
def country_name
|
35
|
+
@data["country_name"]
|
36
|
+
end
|
37
|
+
|
38
|
+
def region_code
|
39
|
+
@data["region_code"]
|
40
|
+
end
|
41
|
+
|
42
|
+
def region_name
|
43
|
+
@data["region_name"]
|
44
|
+
end
|
45
|
+
|
46
|
+
def city
|
47
|
+
@data["city"]
|
48
|
+
end
|
49
|
+
|
50
|
+
def postal_code
|
51
|
+
@data["postal_code"]
|
52
|
+
end
|
53
|
+
|
54
|
+
def metro_code
|
55
|
+
@data["metro_code"]
|
56
|
+
end
|
57
|
+
|
58
|
+
def area_code
|
59
|
+
@data["area_code"]
|
60
|
+
end
|
61
|
+
|
62
|
+
def latitude
|
63
|
+
@data["latitude"]
|
64
|
+
end
|
65
|
+
|
66
|
+
def longitude
|
67
|
+
@data["longitude"]
|
68
|
+
end
|
69
|
+
|
70
|
+
def isp
|
71
|
+
@data["isp"]
|
72
|
+
end
|
73
|
+
|
74
|
+
def organization
|
75
|
+
@data["organization"]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Mapquest < Base
|
5
|
+
def latitude
|
6
|
+
@data["latLng"]["lat"]
|
7
|
+
end
|
8
|
+
|
9
|
+
def longitude
|
10
|
+
@data["latLng"]["lng"]
|
11
|
+
end
|
12
|
+
|
13
|
+
def coordinates
|
14
|
+
[latitude, longitude]
|
15
|
+
end
|
16
|
+
|
17
|
+
def city
|
18
|
+
@data['adminArea5']
|
19
|
+
end
|
20
|
+
|
21
|
+
def street
|
22
|
+
@data['street']
|
23
|
+
end
|
24
|
+
|
25
|
+
def state
|
26
|
+
@data['adminArea3']
|
27
|
+
end
|
28
|
+
|
29
|
+
alias_method :state_code, :state
|
30
|
+
|
31
|
+
#FIXME: these might not be right, unclear with MQ documentation
|
32
|
+
alias_method :province, :state
|
33
|
+
alias_method :province_code, :state
|
34
|
+
|
35
|
+
def postal_code
|
36
|
+
@data['postalCode'].to_s
|
37
|
+
end
|
38
|
+
|
39
|
+
def country
|
40
|
+
@data['adminArea1']
|
41
|
+
end
|
42
|
+
|
43
|
+
def country_code
|
44
|
+
country
|
45
|
+
end
|
46
|
+
|
47
|
+
def address
|
48
|
+
[street, city, state, postal_code, country].reject{|s| s.length == 0 }.join(", ")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Maxmind < Base
|
5
|
+
|
6
|
+
##
|
7
|
+
# Hash mapping service names to names of returned fields.
|
8
|
+
#
|
9
|
+
def self.field_names
|
10
|
+
{
|
11
|
+
:country => [
|
12
|
+
:country_code,
|
13
|
+
:error
|
14
|
+
],
|
15
|
+
|
16
|
+
:city => [
|
17
|
+
:country_code,
|
18
|
+
:region_code,
|
19
|
+
:city_name,
|
20
|
+
:latitude,
|
21
|
+
:longitude,
|
22
|
+
:error
|
23
|
+
],
|
24
|
+
|
25
|
+
:city_isp_org => [
|
26
|
+
:country_code,
|
27
|
+
:region_code,
|
28
|
+
:city_name,
|
29
|
+
:postal_code,
|
30
|
+
:latitude,
|
31
|
+
:longitude,
|
32
|
+
:metro_code,
|
33
|
+
:area_code,
|
34
|
+
:isp_name,
|
35
|
+
:organization_name,
|
36
|
+
:error
|
37
|
+
],
|
38
|
+
|
39
|
+
:omni => [
|
40
|
+
:country_code,
|
41
|
+
:country_name,
|
42
|
+
:region_code,
|
43
|
+
:region_name,
|
44
|
+
:city_name,
|
45
|
+
:latitude,
|
46
|
+
:longitude,
|
47
|
+
:metro_code,
|
48
|
+
:area_code,
|
49
|
+
:time_zone,
|
50
|
+
:continent_code,
|
51
|
+
:postal_code,
|
52
|
+
:isp_name,
|
53
|
+
:organization_name,
|
54
|
+
:domain,
|
55
|
+
:as_number,
|
56
|
+
:netspeed,
|
57
|
+
:user_type,
|
58
|
+
:accuracy_radius,
|
59
|
+
:country_confidence_factor,
|
60
|
+
:city_confidence_factor,
|
61
|
+
:region_confidence_factor,
|
62
|
+
:postal_confidence_factor,
|
63
|
+
:error
|
64
|
+
]
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
##
|
69
|
+
# Name of the MaxMind service being used.
|
70
|
+
#
|
71
|
+
def service_name
|
72
|
+
# it would be much better to infer this from the length of the @data
|
73
|
+
# array, but MaxMind seems to send inconsistent and wide-ranging response
|
74
|
+
# lengths (see https://github.com/alexreisner/geocoder/issues/396)
|
75
|
+
Geocoder.config.maxmind[:service]
|
76
|
+
end
|
77
|
+
|
78
|
+
def field_names
|
79
|
+
self.class.field_names[service_name]
|
80
|
+
end
|
81
|
+
|
82
|
+
def data_hash
|
83
|
+
@data_hash ||= Hash[*field_names.zip(@data).flatten]
|
84
|
+
end
|
85
|
+
|
86
|
+
def coordinates
|
87
|
+
[data_hash[:latitude].to_f, data_hash[:longitude].to_f]
|
88
|
+
end
|
89
|
+
|
90
|
+
def address(format = :full)
|
91
|
+
s = state_code.to_s == "" ? "" : ", #{state_code}"
|
92
|
+
"#{city}#{s} #{postal_code}, #{country_code}".sub(/^[ ,]*/, "")
|
93
|
+
end
|
94
|
+
|
95
|
+
def city
|
96
|
+
data_hash[:city_name]
|
97
|
+
end
|
98
|
+
|
99
|
+
def state # not given by MaxMind
|
100
|
+
data_hash[:region_name] || data_hash[:region_code]
|
101
|
+
end
|
102
|
+
|
103
|
+
def state_code
|
104
|
+
data_hash[:region_code]
|
105
|
+
end
|
106
|
+
|
107
|
+
def country #not given by MaxMind
|
108
|
+
data_hash[:country_name] || data_hash[:country_code]
|
109
|
+
end
|
110
|
+
|
111
|
+
def country_code
|
112
|
+
data_hash[:country_code]
|
113
|
+
end
|
114
|
+
|
115
|
+
def postal_code
|
116
|
+
data_hash[:postal_code]
|
117
|
+
end
|
118
|
+
|
119
|
+
def method_missing(method, *args, &block)
|
120
|
+
if field_names.include?(method)
|
121
|
+
data_hash[method]
|
122
|
+
else
|
123
|
+
super
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def respond_to?(method)
|
128
|
+
if field_names.include?(method)
|
129
|
+
true
|
130
|
+
else
|
131
|
+
super
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class MaxmindLocal < Base
|
5
|
+
|
6
|
+
def address(format = :full)
|
7
|
+
s = state.to_s == "" ? "" : ", #{state}"
|
8
|
+
"#{city}#{s} #{postal_code}, #{country}".sub(/^[ ,]*/, "")
|
9
|
+
end
|
10
|
+
|
11
|
+
def coordinates
|
12
|
+
[@data[:latitude], @data[:longitude]]
|
13
|
+
end
|
14
|
+
|
15
|
+
def city
|
16
|
+
@data[:city_name]
|
17
|
+
end
|
18
|
+
|
19
|
+
def state
|
20
|
+
@data[:region_name]
|
21
|
+
end
|
22
|
+
|
23
|
+
def state_code
|
24
|
+
"" # Not available in Maxmind's database
|
25
|
+
end
|
26
|
+
|
27
|
+
def country
|
28
|
+
@data[:country_name]
|
29
|
+
end
|
30
|
+
|
31
|
+
def country_code
|
32
|
+
@data[:country_code2]
|
33
|
+
end
|
34
|
+
|
35
|
+
def postal_code
|
36
|
+
@data[:postal_code]
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.response_attributes
|
40
|
+
%w[ip]
|
41
|
+
end
|
42
|
+
|
43
|
+
response_attributes.each do |a|
|
44
|
+
define_method a do
|
45
|
+
@data[a]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Nominatim < Base
|
5
|
+
|
6
|
+
def poi
|
7
|
+
%w[stadium bus_stop tram_stop].each do |key|
|
8
|
+
return @data['address'][key] if @data['address'].key?(key)
|
9
|
+
end
|
10
|
+
return nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def house_number
|
14
|
+
@data['address']['house_number']
|
15
|
+
end
|
16
|
+
|
17
|
+
def address
|
18
|
+
@data['display_name']
|
19
|
+
end
|
20
|
+
|
21
|
+
def street
|
22
|
+
%w[road pedestrian highway].each do |key|
|
23
|
+
return @data['address'][key] if @data['address'].key?(key)
|
24
|
+
end
|
25
|
+
return nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def city
|
29
|
+
%w[city town village hamlet].each do |key|
|
30
|
+
return @data['address'][key] if @data['address'].key?(key)
|
31
|
+
end
|
32
|
+
return nil
|
33
|
+
end
|
34
|
+
|
35
|
+
def village
|
36
|
+
@data['address']['village']
|
37
|
+
end
|
38
|
+
|
39
|
+
def town
|
40
|
+
@data['address']['town']
|
41
|
+
end
|
42
|
+
|
43
|
+
def state
|
44
|
+
@data['address']['state']
|
45
|
+
end
|
46
|
+
|
47
|
+
alias_method :state_code, :state
|
48
|
+
|
49
|
+
def postal_code
|
50
|
+
@data['address']['postcode']
|
51
|
+
end
|
52
|
+
|
53
|
+
def county
|
54
|
+
@data['address']['county']
|
55
|
+
end
|
56
|
+
|
57
|
+
def country
|
58
|
+
@data['address']['country']
|
59
|
+
end
|
60
|
+
|
61
|
+
def country_code
|
62
|
+
@data['address']['country_code']
|
63
|
+
end
|
64
|
+
|
65
|
+
def suburb
|
66
|
+
@data['address']['suburb']
|
67
|
+
end
|
68
|
+
|
69
|
+
def coordinates
|
70
|
+
[@data['lat'].to_f, @data['lon'].to_f]
|
71
|
+
end
|
72
|
+
|
73
|
+
def place_class
|
74
|
+
@data['class']
|
75
|
+
end
|
76
|
+
|
77
|
+
def place_type
|
78
|
+
@data['type']
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.response_attributes
|
82
|
+
%w[place_id osm_type osm_id boundingbox license
|
83
|
+
polygonpoints display_name class type stadium]
|
84
|
+
end
|
85
|
+
|
86
|
+
response_attributes.each do |a|
|
87
|
+
unless method_defined?(a)
|
88
|
+
define_method a do
|
89
|
+
@data[a]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|