geocoder 1.1.9 → 1.8.0
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 +5 -5
- data/CHANGELOG.md +309 -0
- data/LICENSE +1 -1
- data/README.md +544 -540
- data/bin/console +13 -0
- data/examples/app_defined_lookup_services.rb +22 -0
- data/examples/reverse_geocode_job.rb +40 -0
- data/lib/easting_northing.rb +171 -0
- data/lib/generators/geocoder/config/templates/initializer.rb +22 -16
- 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/cache.rb +20 -32
- data/lib/geocoder/cache_stores/base.rb +40 -0
- data/lib/geocoder/cache_stores/generic.rb +35 -0
- data/lib/geocoder/cache_stores/redis.rb +34 -0
- data/lib/geocoder/calculations.rb +67 -36
- data/lib/geocoder/cli.rb +2 -2
- data/lib/geocoder/configuration.rb +33 -16
- data/lib/geocoder/configuration_hash.rb +4 -4
- data/lib/geocoder/esri_token.rb +38 -0
- data/lib/geocoder/exceptions.rb +19 -0
- data/lib/geocoder/ip_address.rb +33 -0
- data/lib/geocoder/kernel_logger.rb +25 -0
- data/lib/geocoder/logger.rb +47 -0
- data/lib/geocoder/lookup.rb +74 -11
- data/lib/geocoder/lookups/abstract_api.rb +46 -0
- data/lib/geocoder/lookups/amap.rb +63 -0
- data/lib/geocoder/lookups/amazon_location_service.rb +54 -0
- data/lib/geocoder/lookups/baidu.rb +24 -15
- data/lib/geocoder/lookups/baidu_ip.rb +30 -0
- data/lib/geocoder/lookups/ban_data_gouv_fr.rb +143 -0
- data/lib/geocoder/lookups/base.rb +109 -23
- data/lib/geocoder/lookups/bing.rb +45 -10
- data/lib/geocoder/lookups/db_ip_com.rb +52 -0
- data/lib/geocoder/lookups/dstk.rb +4 -2
- data/lib/geocoder/lookups/esri.rb +61 -8
- data/lib/geocoder/lookups/freegeoip.rb +25 -6
- data/lib/geocoder/lookups/geoapify.rb +72 -0
- data/lib/geocoder/lookups/geocoder_ca.rb +5 -6
- data/lib/geocoder/lookups/geocodio.rb +42 -0
- data/lib/geocoder/lookups/geoip2.rb +49 -0
- data/lib/geocoder/lookups/geoportail_lu.rb +65 -0
- data/lib/geocoder/lookups/google.rb +45 -12
- data/lib/geocoder/lookups/google_places_details.rb +64 -0
- data/lib/geocoder/lookups/google_places_search.rb +76 -0
- data/lib/geocoder/lookups/google_premier.rb +16 -2
- data/lib/geocoder/lookups/here.rb +73 -0
- data/lib/geocoder/lookups/ip2location.rb +71 -0
- data/lib/geocoder/lookups/ipapi_com.rb +82 -0
- data/lib/geocoder/lookups/ipdata_co.rb +62 -0
- data/lib/geocoder/lookups/ipgeolocation.rb +51 -0
- data/lib/geocoder/lookups/ipinfo_io.rb +44 -0
- data/lib/geocoder/lookups/ipqualityscore.rb +50 -0
- data/lib/geocoder/lookups/ipregistry.rb +68 -0
- data/lib/geocoder/lookups/ipstack.rb +63 -0
- data/lib/geocoder/lookups/latlon.rb +58 -0
- data/lib/geocoder/lookups/location_iq.rb +54 -0
- data/lib/geocoder/lookups/mapbox.rb +59 -0
- data/lib/geocoder/lookups/mapquest.rb +9 -10
- data/lib/geocoder/lookups/maxmind.rb +10 -8
- data/lib/geocoder/lookups/maxmind_geoip2.rb +70 -0
- data/lib/geocoder/lookups/maxmind_local.rb +71 -0
- data/lib/geocoder/lookups/melissa_street.rb +41 -0
- data/lib/geocoder/lookups/nationaal_georegister_nl.rb +38 -0
- data/lib/geocoder/lookups/nominatim.rb +26 -6
- data/lib/geocoder/lookups/opencagedata.rb +65 -0
- data/lib/geocoder/lookups/osmnames.rb +57 -0
- data/lib/geocoder/lookups/pelias.rb +63 -0
- data/lib/geocoder/lookups/photon.rb +89 -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 +68 -0
- data/lib/geocoder/lookups/telize.rb +75 -0
- data/lib/geocoder/lookups/tencent.rb +59 -0
- data/lib/geocoder/lookups/test.rb +4 -0
- data/lib/geocoder/lookups/twogis.rb +58 -0
- data/lib/geocoder/lookups/uk_ordnance_survey_names.rb +59 -0
- data/lib/geocoder/lookups/yandex.rb +18 -11
- data/lib/geocoder/models/active_record.rb +9 -4
- data/lib/geocoder/models/base.rb +1 -4
- data/lib/geocoder/models/mongo_base.rb +6 -4
- data/lib/geocoder/query.rb +23 -5
- data/lib/geocoder/railtie.rb +2 -2
- data/lib/geocoder/request.rb +102 -11
- data/lib/geocoder/results/abstract_api.rb +146 -0
- data/lib/geocoder/results/amap.rb +87 -0
- data/lib/geocoder/results/amazon_location_service.rb +57 -0
- data/lib/geocoder/results/baidu.rb +10 -14
- data/lib/geocoder/results/baidu_ip.rb +62 -0
- data/lib/geocoder/results/ban_data_gouv_fr.rb +282 -0
- data/lib/geocoder/results/base.rb +13 -1
- data/lib/geocoder/results/bing.rb +5 -1
- data/lib/geocoder/results/db_ip_com.rb +58 -0
- data/lib/geocoder/results/esri.rb +35 -8
- data/lib/geocoder/results/freegeoip.rb +2 -7
- data/lib/geocoder/results/geoapify.rb +179 -0
- data/lib/geocoder/results/geocoder_ca.rb +3 -3
- 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 +26 -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/here.rb +77 -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/ipgeolocation.rb +59 -0
- data/lib/geocoder/results/ipinfo_io.rb +48 -0
- data/lib/geocoder/results/ipqualityscore.rb +54 -0
- data/lib/geocoder/results/ipregistry.rb +304 -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 +63 -0
- data/lib/geocoder/results/mapquest.rb +5 -8
- data/lib/geocoder/results/maxmind.rb +0 -5
- data/lib/geocoder/results/maxmind_geoip2.rb +9 -0
- data/lib/geocoder/results/maxmind_local.rb +44 -0
- data/lib/geocoder/results/melissa_street.rb +46 -0
- data/lib/geocoder/results/nationaal_georegister_nl.rb +62 -0
- data/lib/geocoder/results/nominatim.rb +41 -14
- data/lib/geocoder/results/opencagedata.rb +100 -0
- data/lib/geocoder/results/osmnames.rb +56 -0
- data/lib/geocoder/results/pelias.rb +58 -0
- data/lib/geocoder/results/photon.rb +119 -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 +20 -3
- data/lib/geocoder/results/twogis.rb +76 -0
- data/lib/geocoder/results/uk_ordnance_survey_names.rb +59 -0
- data/lib/geocoder/results/yandex.rb +244 -32
- data/lib/geocoder/sql.rb +25 -21
- data/lib/geocoder/stores/active_record.rb +82 -26
- data/lib/geocoder/stores/base.rb +9 -14
- data/lib/geocoder/stores/mongo_base.rb +0 -31
- data/lib/geocoder/util.rb +29 -0
- data/lib/geocoder/version.rb +1 -1
- data/lib/geocoder.rb +6 -13
- data/lib/maxmind_database.rb +109 -0
- data/lib/tasks/geocoder.rake +30 -3
- data/lib/tasks/maxmind.rake +73 -0
- metadata +115 -98
- data/.gitignore +0 -5
- data/.travis.yml +0 -27
- data/Rakefile +0 -25
- data/examples/autoexpire_cache_dalli.rb +0 -62
- data/examples/autoexpire_cache_redis.rb +0 -28
- data/gemfiles/Gemfile.mongoid-2.4.x +0 -15
- data/lib/geocoder/lookups/geocoder_us.rb +0 -39
- data/lib/geocoder/lookups/ovi.rb +0 -62
- data/lib/geocoder/lookups/yahoo.rb +0 -86
- data/lib/geocoder/results/geocoder_us.rb +0 -39
- data/lib/geocoder/results/ovi.rb +0 -62
- data/lib/geocoder/results/yahoo.rb +0 -55
- data/lib/hash_recursive_merge.rb +0 -74
- data/lib/oauth_util.rb +0 -112
- data/test/active_record_test.rb +0 -15
- data/test/cache_test.rb +0 -35
- data/test/calculations_test.rb +0 -211
- data/test/configuration_test.rb +0 -78
- data/test/custom_block_test.rb +0 -32
- data/test/error_handling_test.rb +0 -43
- data/test/fixtures/baidu_invalid_key +0 -1
- data/test/fixtures/baidu_no_results +0 -1
- data/test/fixtures/baidu_reverse +0 -1
- data/test/fixtures/baidu_shanghai_pearl_tower +0 -12
- data/test/fixtures/bing_invalid_key +0 -1
- data/test/fixtures/bing_madison_square_garden +0 -40
- data/test/fixtures/bing_no_results +0 -16
- data/test/fixtures/bing_reverse +0 -42
- data/test/fixtures/esri_madison_square_garden +0 -59
- data/test/fixtures/esri_no_results +0 -8
- data/test/fixtures/esri_reverse +0 -21
- data/test/fixtures/freegeoip_74_200_247_59 +0 -12
- data/test/fixtures/freegeoip_no_results +0 -1
- data/test/fixtures/geocoder_ca_madison_square_garden +0 -1
- data/test/fixtures/geocoder_ca_no_results +0 -1
- data/test/fixtures/geocoder_ca_reverse +0 -34
- data/test/fixtures/geocoder_us_madison_square_garden +0 -1
- data/test/fixtures/geocoder_us_no_results +0 -1
- data/test/fixtures/google_garbage +0 -456
- data/test/fixtures/google_madison_square_garden +0 -57
- data/test/fixtures/google_no_city_data +0 -44
- data/test/fixtures/google_no_locality +0 -51
- data/test/fixtures/google_no_results +0 -4
- data/test/fixtures/google_over_limit +0 -4
- data/test/fixtures/mapquest_error +0 -16
- data/test/fixtures/mapquest_invalid_api_key +0 -16
- data/test/fixtures/mapquest_invalid_request +0 -16
- data/test/fixtures/mapquest_madison_square_garden +0 -52
- data/test/fixtures/mapquest_no_results +0 -16
- data/test/fixtures/maxmind_24_24_24_21 +0 -1
- data/test/fixtures/maxmind_24_24_24_22 +0 -1
- data/test/fixtures/maxmind_24_24_24_23 +0 -1
- data/test/fixtures/maxmind_24_24_24_24 +0 -1
- data/test/fixtures/maxmind_74_200_247_59 +0 -1
- data/test/fixtures/maxmind_invalid_key +0 -1
- data/test/fixtures/maxmind_no_results +0 -1
- data/test/fixtures/nominatim_madison_square_garden +0 -150
- data/test/fixtures/nominatim_no_results +0 -1
- data/test/fixtures/ovi_madison_square_garden +0 -72
- data/test/fixtures/ovi_no_results +0 -8
- data/test/fixtures/yahoo_error +0 -1
- data/test/fixtures/yahoo_invalid_key +0 -2
- data/test/fixtures/yahoo_madison_square_garden +0 -52
- data/test/fixtures/yahoo_no_results +0 -10
- data/test/fixtures/yahoo_over_limit +0 -2
- data/test/fixtures/yandex_invalid_key +0 -1
- data/test/fixtures/yandex_kremlin +0 -48
- data/test/fixtures/yandex_no_city_and_town +0 -112
- data/test/fixtures/yandex_no_results +0 -16
- data/test/geocoder_test.rb +0 -59
- data/test/https_test.rb +0 -16
- data/test/integration/smoke_test.rb +0 -26
- data/test/lookup_test.rb +0 -117
- data/test/method_aliases_test.rb +0 -25
- data/test/mongoid_test.rb +0 -46
- data/test/mongoid_test_helper.rb +0 -43
- data/test/near_test.rb +0 -61
- data/test/oauth_util_test.rb +0 -30
- data/test/proxy_test.rb +0 -36
- data/test/query_test.rb +0 -52
- data/test/request_test.rb +0 -29
- data/test/result_test.rb +0 -42
- data/test/services_test.rb +0 -393
- data/test/test_helper.rb +0 -289
- data/test/test_mode_test.rb +0 -59
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require 'geocoder/results/base'
|
|
2
|
+
|
|
3
|
+
module Geocoder::Result
|
|
4
|
+
class PostcodeAnywhereUk < Base
|
|
5
|
+
|
|
6
|
+
def coordinates
|
|
7
|
+
[@data['Latitude'].to_f, @data['Longitude'].to_f]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def blank_result
|
|
11
|
+
''
|
|
12
|
+
end
|
|
13
|
+
alias_method :state, :blank_result
|
|
14
|
+
alias_method :state_code, :blank_result
|
|
15
|
+
alias_method :postal_code, :blank_result
|
|
16
|
+
|
|
17
|
+
def address
|
|
18
|
+
@data['Location']
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def city
|
|
22
|
+
# is this too big a jump to assume that the API always
|
|
23
|
+
# returns a City, County as the last elements?
|
|
24
|
+
city = @data['Location'].split(',')[-2] || blank_result
|
|
25
|
+
city.strip
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def os_grid
|
|
29
|
+
@data['OsGrid']
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# This is a UK only API; all results are UK specific and
|
|
33
|
+
# so ommitted from API response.
|
|
34
|
+
def country
|
|
35
|
+
'United Kingdom'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def country_code
|
|
39
|
+
'UK'
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require 'geocoder/results/base'
|
|
2
|
+
|
|
3
|
+
module Geocoder::Result
|
|
4
|
+
class PostcodesIo < Base
|
|
5
|
+
|
|
6
|
+
def coordinates
|
|
7
|
+
[@data['latitude'].to_f, @data['longitude'].to_f]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def quality
|
|
11
|
+
@data['quality']
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def postal_code
|
|
15
|
+
@data['postcode']
|
|
16
|
+
end
|
|
17
|
+
alias address postal_code
|
|
18
|
+
|
|
19
|
+
def city
|
|
20
|
+
@data['admin_ward']
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def county
|
|
24
|
+
@data['admin_county']
|
|
25
|
+
end
|
|
26
|
+
alias state county
|
|
27
|
+
|
|
28
|
+
def state_code
|
|
29
|
+
@data['codes']['admin_county']
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def country
|
|
33
|
+
'United Kingdom'
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def country_code
|
|
37
|
+
'UK'
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
require 'geocoder/lookups/base'
|
|
2
|
+
|
|
3
|
+
module Geocoder::Result
|
|
4
|
+
class SmartyStreets < Base
|
|
5
|
+
def coordinates
|
|
6
|
+
result = %w(latitude longitude).map do |i|
|
|
7
|
+
zipcode_endpoint? ? zipcodes.first[i] : metadata[i]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
if result.compact.empty?
|
|
11
|
+
nil
|
|
12
|
+
else
|
|
13
|
+
result
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def address
|
|
18
|
+
parts =
|
|
19
|
+
if international_endpoint?
|
|
20
|
+
(1..12).map { |i| @data["address#{i}"] }
|
|
21
|
+
else
|
|
22
|
+
[
|
|
23
|
+
delivery_line_1,
|
|
24
|
+
delivery_line_2,
|
|
25
|
+
last_line
|
|
26
|
+
]
|
|
27
|
+
end
|
|
28
|
+
parts.select{ |i| i.to_s != "" }.join(" ")
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def state
|
|
32
|
+
if international_endpoint?
|
|
33
|
+
components['administrative_area']
|
|
34
|
+
elsif zipcode_endpoint?
|
|
35
|
+
city_states.first['state']
|
|
36
|
+
else
|
|
37
|
+
components['state_abbreviation']
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def state_code
|
|
42
|
+
if international_endpoint?
|
|
43
|
+
components['administrative_area']
|
|
44
|
+
elsif zipcode_endpoint?
|
|
45
|
+
city_states.first['state_abbreviation']
|
|
46
|
+
else
|
|
47
|
+
components['state_abbreviation']
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def country
|
|
52
|
+
international_endpoint? ?
|
|
53
|
+
components['country_iso_3'] :
|
|
54
|
+
"United States"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def country_code
|
|
58
|
+
international_endpoint? ?
|
|
59
|
+
components['country_iso_3'] :
|
|
60
|
+
"US"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
## Extra methods not in base.rb ------------------------
|
|
64
|
+
|
|
65
|
+
def street
|
|
66
|
+
international_endpoint? ?
|
|
67
|
+
components['thoroughfare_name'] :
|
|
68
|
+
components['street_name']
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def city
|
|
72
|
+
if international_endpoint?
|
|
73
|
+
components['locality']
|
|
74
|
+
elsif zipcode_endpoint?
|
|
75
|
+
city_states.first['city']
|
|
76
|
+
else
|
|
77
|
+
components['city_name']
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def zipcode
|
|
82
|
+
if international_endpoint?
|
|
83
|
+
components['postal_code']
|
|
84
|
+
elsif zipcode_endpoint?
|
|
85
|
+
zipcodes.first['zipcode']
|
|
86
|
+
else
|
|
87
|
+
components['zipcode']
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
alias_method :postal_code, :zipcode
|
|
91
|
+
|
|
92
|
+
def zip4
|
|
93
|
+
components['plus4_code']
|
|
94
|
+
end
|
|
95
|
+
alias_method :postal_code_extended, :zip4
|
|
96
|
+
|
|
97
|
+
def fips
|
|
98
|
+
zipcode_endpoint? ?
|
|
99
|
+
zipcodes.first['county_fips'] :
|
|
100
|
+
metadata['county_fips']
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def zipcode_endpoint?
|
|
104
|
+
zipcodes.any?
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def international_endpoint?
|
|
108
|
+
!@data['address1'].nil?
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
[
|
|
112
|
+
:delivery_line_1,
|
|
113
|
+
:delivery_line_2,
|
|
114
|
+
:last_line,
|
|
115
|
+
:delivery_point_barcode,
|
|
116
|
+
:addressee
|
|
117
|
+
].each do |m|
|
|
118
|
+
define_method(m) do
|
|
119
|
+
@data[m.to_s] || ''
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
[
|
|
124
|
+
:components,
|
|
125
|
+
:metadata,
|
|
126
|
+
:analysis
|
|
127
|
+
].each do |m|
|
|
128
|
+
define_method(m) do
|
|
129
|
+
@data[m.to_s] || {}
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
[
|
|
134
|
+
:city_states,
|
|
135
|
+
:zipcodes
|
|
136
|
+
].each do |m|
|
|
137
|
+
define_method(m) do
|
|
138
|
+
@data[m.to_s] || []
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require 'geocoder/results/base'
|
|
2
|
+
|
|
3
|
+
module Geocoder::Result
|
|
4
|
+
class Telize < Base
|
|
5
|
+
|
|
6
|
+
def city
|
|
7
|
+
@data['city']
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def state
|
|
11
|
+
@data['region']
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def state_code
|
|
15
|
+
@data['region_code']
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def country
|
|
19
|
+
@data['country']
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def country_code
|
|
23
|
+
@data['country_code']
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def postal_code
|
|
27
|
+
@data['postal_code']
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.response_attributes
|
|
31
|
+
%w[timezone isp dma_code area_code ip asn continent_code country_code3]
|
|
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,72 @@
|
|
|
1
|
+
require 'geocoder/results/base'
|
|
2
|
+
|
|
3
|
+
module Geocoder::Result
|
|
4
|
+
class Tencent < Base
|
|
5
|
+
|
|
6
|
+
def coordinates
|
|
7
|
+
['lat', 'lng'].map{ |i| @data['location'][i] }
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def address
|
|
11
|
+
"#{province}#{city}#{district}#{street}#{street_number}"
|
|
12
|
+
|
|
13
|
+
#@data['title'] or @data['address']
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# NOTE: The Tencent reverse geocoding API has the field named
|
|
17
|
+
# 'address_component' compared to 'address_components' in the
|
|
18
|
+
# regular geocoding API.
|
|
19
|
+
def province
|
|
20
|
+
@data['address_components'] and (@data['address_components']['province']) or
|
|
21
|
+
(@data['address_component'] and @data['address_component']['province']) or
|
|
22
|
+
""
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
alias_method :state, :province
|
|
26
|
+
|
|
27
|
+
def city
|
|
28
|
+
@data['address_components'] and (@data['address_components']['city']) or
|
|
29
|
+
(@data['address_component'] and @data['address_component']['city']) or
|
|
30
|
+
""
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def district
|
|
34
|
+
@data['address_components'] and (@data['address_components']['district']) or
|
|
35
|
+
(@data['address_component'] and @data['address_component']['district']) or
|
|
36
|
+
""
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def street
|
|
40
|
+
@data['address_components'] and (@data['address_components']['street']) or
|
|
41
|
+
(@data['address_component'] and @data['address_component']['street']) or
|
|
42
|
+
""
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def street_number
|
|
46
|
+
@data['address_components'] and (@data['address_components']['street_number']) or
|
|
47
|
+
(@data['address_component'] and @data['address_component']['street_number']) or
|
|
48
|
+
""
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def address_components
|
|
52
|
+
@data['address_components'] or @data['address_component']
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def state_code
|
|
56
|
+
""
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def postal_code
|
|
60
|
+
""
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def country
|
|
64
|
+
"China"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def country_code
|
|
68
|
+
"CN"
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -4,13 +4,30 @@ module Geocoder
|
|
|
4
4
|
module Result
|
|
5
5
|
class Test < Base
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
def self.add_result_attribute(attr)
|
|
8
|
+
begin
|
|
9
|
+
remove_method(attr) if method_defined?(attr)
|
|
10
|
+
rescue NameError # method defined on superclass
|
|
11
|
+
end
|
|
12
|
+
|
|
10
13
|
define_method(attr) do
|
|
11
14
|
@data[attr.to_s] || @data[attr.to_sym]
|
|
12
15
|
end
|
|
13
16
|
end
|
|
17
|
+
|
|
18
|
+
%w[coordinates neighborhood city state state_code sub_state
|
|
19
|
+
sub_state_code province province_code postal_code country
|
|
20
|
+
country_code address street_address street_number route geometry].each do |attr|
|
|
21
|
+
add_result_attribute(attr)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def initialize(data)
|
|
25
|
+
data.each_key do |attr|
|
|
26
|
+
Test.add_result_attribute(attr)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
super
|
|
30
|
+
end
|
|
14
31
|
end
|
|
15
32
|
end
|
|
16
33
|
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require 'geocoder/results/base'
|
|
2
|
+
|
|
3
|
+
module Geocoder::Result
|
|
4
|
+
class Twogis < Base
|
|
5
|
+
def coordinates
|
|
6
|
+
['lat', 'lon'].map{ |i| @data['point'][i] } if @data['point']
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def address(_format = :full)
|
|
10
|
+
@data['full_address_name'] || ''
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def city
|
|
14
|
+
return '' unless @data['adm_div']
|
|
15
|
+
@data['adm_div'].select{|u| u["type"] == "city"}.first.try(:[], 'name') || ''
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def region
|
|
19
|
+
return '' unless @data['adm_div']
|
|
20
|
+
@data['adm_div'].select{|u| u["type"] == "region"}.first.try(:[], 'name') || ''
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def country
|
|
24
|
+
return '' unless @data['adm_div']
|
|
25
|
+
@data['adm_div'].select{|u| u["type"] == "country"}.first.try(:[], 'name') || ''
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def district
|
|
29
|
+
return '' unless @data['adm_div']
|
|
30
|
+
@data['adm_div'].select{|u| u["type"] == "district"}.first.try(:[], 'name') || ''
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def district_area
|
|
34
|
+
return '' unless @data['adm_div']
|
|
35
|
+
@data['adm_div'].select{|u| u["type"] == "district_area"}.first.try(:[], 'name') || ''
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def street_address
|
|
39
|
+
@data['address_name'] || ''
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def street
|
|
43
|
+
return '' unless @data['address_name']
|
|
44
|
+
@data['address_name'].split(', ').first
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def street_number
|
|
48
|
+
return '' unless @data['address_name']
|
|
49
|
+
@data['address_name'].split(', ')[1] || ''
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def type
|
|
53
|
+
@data['type'] || ''
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def purpose_name
|
|
57
|
+
@data['purpose_name'] || ''
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def building_name
|
|
61
|
+
@data['building_name'] || ''
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def subtype
|
|
65
|
+
@data['subtype'] || ''
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def subtype_specification
|
|
69
|
+
@data['subtype_specification'] || ''
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def name
|
|
73
|
+
@data['name'] || ''
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'geocoder/results/base'
|
|
2
|
+
require 'easting_northing'
|
|
3
|
+
|
|
4
|
+
module Geocoder::Result
|
|
5
|
+
class UkOrdnanceSurveyNames < Base
|
|
6
|
+
|
|
7
|
+
def coordinates
|
|
8
|
+
@coordinates ||= Geocoder::EastingNorthing.new(
|
|
9
|
+
easting: data['GEOMETRY_X'],
|
|
10
|
+
northing: data['GEOMETRY_Y'],
|
|
11
|
+
).lat_lng
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def city
|
|
15
|
+
is_postcode? ? data['DISTRICT_BOROUGH'] : data['NAME1']
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def county
|
|
19
|
+
data['COUNTY_UNITARY']
|
|
20
|
+
end
|
|
21
|
+
alias state county
|
|
22
|
+
|
|
23
|
+
def county_code
|
|
24
|
+
code_from_uri data['COUNTY_UNITARY_URI']
|
|
25
|
+
end
|
|
26
|
+
alias state_code county_code
|
|
27
|
+
|
|
28
|
+
def province
|
|
29
|
+
data['REGION']
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def province_code
|
|
33
|
+
code_from_uri data['REGION_URI']
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def postal_code
|
|
37
|
+
is_postcode? ? data['NAME1'] : ''
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def country
|
|
41
|
+
'United Kingdom'
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def country_code
|
|
45
|
+
'UK'
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
def is_postcode?
|
|
51
|
+
data['LOCAL_TYPE'] == 'Postcode'
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def code_from_uri(uri)
|
|
55
|
+
return '' if uri.nil?
|
|
56
|
+
uri.split('/').last
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|