geocoder 1.2.6 → 1.8.2
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 +266 -1
- data/LICENSE +1 -1
- data/README.md +530 -804
- 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 +2 -0
- data/lib/generators/geocoder/maxmind/geolite_country_generator.rb +2 -0
- data/lib/generators/geocoder/maxmind/templates/migration/geolite_city.rb +1 -1
- data/lib/generators/geocoder/maxmind/templates/migration/geolite_country.rb +1 -1
- data/lib/generators/geocoder/migration_version.rb +15 -0
- data/lib/geocoder/cache.rb +20 -33
- 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 +30 -38
- data/lib/geocoder/cli.rb +2 -2
- data/lib/geocoder/configuration.rb +36 -9
- 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 +26 -11
- data/lib/geocoder/kernel_logger.rb +25 -0
- data/lib/geocoder/logger.rb +47 -0
- data/lib/geocoder/lookup.rb +63 -13
- 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 +55 -0
- data/lib/geocoder/lookups/baidu.rb +17 -9
- data/lib/geocoder/lookups/baidu_ip.rb +7 -31
- data/lib/geocoder/lookups/ban_data_gouv_fr.rb +143 -0
- data/lib/geocoder/lookups/base.rb +75 -26
- data/lib/geocoder/lookups/bing.rb +38 -15
- data/lib/geocoder/lookups/db_ip_com.rb +52 -0
- data/lib/geocoder/lookups/dstk.rb +4 -2
- data/lib/geocoder/lookups/esri.rb +78 -12
- data/lib/geocoder/lookups/freegeoip.rb +22 -7
- data/lib/geocoder/lookups/geoapify.rb +78 -0
- data/lib/geocoder/lookups/geocoder_ca.rb +5 -6
- data/lib/geocoder/lookups/geocodio.rb +8 -8
- data/lib/geocoder/lookups/geoip2.rb +13 -4
- data/lib/geocoder/lookups/geoportail_lu.rb +65 -0
- data/lib/geocoder/lookups/google.rb +44 -11
- data/lib/geocoder/lookups/google_places_details.rb +31 -17
- data/lib/geocoder/lookups/google_places_search.rb +76 -0
- data/lib/geocoder/lookups/google_premier.rb +15 -1
- data/lib/geocoder/lookups/here.rb +38 -27
- data/lib/geocoder/lookups/ip2location.rb +71 -0
- data/lib/geocoder/lookups/ipapi_com.rb +82 -0
- data/lib/geocoder/lookups/ipbase.rb +49 -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 +7 -9
- data/lib/geocoder/lookups/maxmind.rb +7 -7
- data/lib/geocoder/lookups/maxmind_geoip2.rb +70 -0
- data/lib/geocoder/lookups/maxmind_local.rb +16 -3
- 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 +18 -6
- data/lib/geocoder/lookups/opencagedata.rb +16 -9
- data/lib/geocoder/lookups/osmnames.rb +57 -0
- data/lib/geocoder/lookups/pc_miler.rb +85 -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 +14 -13
- data/lib/geocoder/lookups/postcode_anywhere_uk.rb +7 -8
- data/lib/geocoder/lookups/postcodes_io.rb +31 -0
- data/lib/geocoder/lookups/smarty_streets.rb +29 -6
- data/lib/geocoder/lookups/telize.rb +42 -7
- data/lib/geocoder/lookups/tencent.rb +59 -0
- data/lib/geocoder/lookups/test.rb +5 -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 +20 -13
- data/lib/geocoder/models/active_record.rb +4 -3
- data/lib/geocoder/models/mongo_base.rb +0 -2
- data/lib/geocoder/query.rb +15 -1
- data/lib/geocoder/railtie.rb +1 -1
- data/lib/geocoder/request.rb +103 -14
- 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/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 +15 -3
- data/lib/geocoder/results/geoip2.rb +37 -25
- 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 +4 -0
- data/lib/geocoder/results/google_places_search.rb +52 -0
- data/lib/geocoder/results/here.rb +30 -15
- data/lib/geocoder/results/ip2location.rb +22 -0
- data/lib/geocoder/results/ipapi_com.rb +45 -0
- data/lib/geocoder/results/ipbase.rb +40 -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 +0 -5
- 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 +20 -2
- data/lib/geocoder/results/osmnames.rb +56 -0
- data/lib/geocoder/results/pc_miler.rb +98 -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 +0 -4
- data/lib/geocoder/results/postcodes_io.rb +40 -0
- data/lib/geocoder/results/smarty_streets.rb +55 -19
- data/lib/geocoder/results/telize.rb +0 -5
- data/lib/geocoder/results/tencent.rb +72 -0
- data/lib/geocoder/results/test.rb +1 -1
- 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 +240 -32
- data/lib/geocoder/sql.rb +9 -6
- data/lib/geocoder/stores/active_record.rb +49 -10
- data/lib/geocoder/stores/base.rb +2 -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 +2 -1
- data/lib/maxmind_database.rb +9 -9
- data/lib/tasks/geocoder.rake +29 -4
- data/lib/tasks/maxmind.rake +1 -1
- metadata +91 -169
- data/.gitignore +0 -6
- data/.travis.yml +0 -31
- 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 -16
- data/lib/geocoder/lookups/geocoder_us.rb +0 -39
- data/lib/geocoder/lookups/okf.rb +0 -43
- data/lib/geocoder/lookups/ovi.rb +0 -62
- data/lib/geocoder/lookups/yahoo.rb +0 -88
- data/lib/geocoder/results/geocoder_us.rb +0 -39
- data/lib/geocoder/results/okf.rb +0 -106
- 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/fixtures/baidu_invalid_key +0 -1
- data/test/fixtures/baidu_ip_202_198_16_3 +0 -19
- data/test/fixtures/baidu_ip_invalid_key +0 -1
- data/test/fixtures/baidu_ip_no_results +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/cloudmade_invalid_key +0 -1
- data/test/fixtures/cloudmade_madison_square_garden +0 -1
- data/test/fixtures/cloudmade_no_results +0 -1
- 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/geocodio_1101_pennsylvania_ave +0 -1
- data/test/fixtures/geocodio_bad_api_key +0 -3
- data/test/fixtures/geocodio_invalid +0 -4
- data/test/fixtures/geocodio_no_results +0 -1
- data/test/fixtures/geocodio_over_query_limit +0 -4
- 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/google_places_details_invalid_request +0 -4
- data/test/fixtures/google_places_details_madison_square_garden +0 -120
- data/test/fixtures/google_places_details_no_results +0 -4
- data/test/fixtures/google_places_details_no_reviews +0 -60
- data/test/fixtures/google_places_details_no_types +0 -66
- data/test/fixtures/here_madison_square_garden +0 -72
- data/test/fixtures/here_no_results +0 -8
- 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/nominatim_over_limit +0 -1
- data/test/fixtures/okf_kirstinmaki +0 -67
- data/test/fixtures/okf_no_results +0 -4
- data/test/fixtures/opencagedata_invalid_api_key +0 -25
- data/test/fixtures/opencagedata_invalid_request +0 -26
- data/test/fixtures/opencagedata_madison_square_garden +0 -73
- data/test/fixtures/opencagedata_no_results +0 -29
- data/test/fixtures/opencagedata_over_limit +0 -31
- data/test/fixtures/ovi_madison_square_garden +0 -72
- data/test/fixtures/ovi_no_results +0 -8
- data/test/fixtures/pointpin_10_10_10_10 +0 -1
- data/test/fixtures/pointpin_555_555_555_555 +0 -1
- data/test/fixtures/pointpin_80_111_555_555 +0 -1
- data/test/fixtures/pointpin_no_results +0 -1
- data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_WR26NJ +0 -1
- data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_generic_error +0 -1
- data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_hampshire +0 -1
- data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_key_limit_exceeded +0 -1
- data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_no_results +0 -1
- data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_romsey +0 -1
- data/test/fixtures/postcode_anywhere_uk_geocode_v2_00_unknown_key +0 -1
- data/test/fixtures/smarty_streets_11211 +0 -1
- data/test/fixtures/smarty_streets_madison_square_garden +0 -47
- data/test/fixtures/smarty_streets_no_results +0 -1
- data/test/fixtures/telize_10_10_10_10 +0 -1
- data/test/fixtures/telize_555_555_555_555 +0 -4
- data/test/fixtures/telize_74_200_247_59 +0 -1
- data/test/fixtures/telize_no_results +0 -1
- 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_canada_rue_dupuis_14 +0 -446
- data/test/fixtures/yandex_invalid_key +0 -1
- data/test/fixtures/yandex_kremlin +0 -48
- data/test/fixtures/yandex_new_york +0 -1
- data/test/fixtures/yandex_no_city_and_town +0 -112
- data/test/fixtures/yandex_no_results +0 -16
- data/test/integration/http_client_test.rb +0 -31
- data/test/mongoid_test_helper.rb +0 -43
- data/test/test_helper.rb +0 -416
- data/test/unit/active_record_test.rb +0 -16
- data/test/unit/cache_test.rb +0 -37
- data/test/unit/calculations_test.rb +0 -220
- data/test/unit/configuration_test.rb +0 -55
- data/test/unit/error_handling_test.rb +0 -56
- data/test/unit/geocoder_test.rb +0 -78
- data/test/unit/https_test.rb +0 -17
- data/test/unit/ip_address_test.rb +0 -27
- data/test/unit/lookup_test.rb +0 -153
- data/test/unit/lookups/bing_test.rb +0 -68
- data/test/unit/lookups/dstk_test.rb +0 -26
- data/test/unit/lookups/esri_test.rb +0 -48
- data/test/unit/lookups/freegeoip_test.rb +0 -27
- data/test/unit/lookups/geocoder_ca_test.rb +0 -17
- data/test/unit/lookups/geocodio_test.rb +0 -55
- data/test/unit/lookups/geoip2_test.rb +0 -27
- data/test/unit/lookups/google_places_details_test.rb +0 -122
- data/test/unit/lookups/google_premier_test.rb +0 -22
- data/test/unit/lookups/google_test.rb +0 -84
- data/test/unit/lookups/mapquest_test.rb +0 -60
- data/test/unit/lookups/maxmind_local_test.rb +0 -28
- data/test/unit/lookups/maxmind_test.rb +0 -63
- data/test/unit/lookups/nominatim_test.rb +0 -31
- data/test/unit/lookups/okf_test.rb +0 -38
- data/test/unit/lookups/opencagedata_test.rb +0 -64
- data/test/unit/lookups/pointpin_test.rb +0 -30
- data/test/unit/lookups/postcode_anywhere_uk_test.rb +0 -70
- data/test/unit/lookups/smarty_streets_test.rb +0 -71
- data/test/unit/lookups/telize_test.rb +0 -36
- data/test/unit/lookups/yahoo_test.rb +0 -35
- data/test/unit/method_aliases_test.rb +0 -26
- data/test/unit/model_test.rb +0 -38
- data/test/unit/mongoid_test.rb +0 -47
- data/test/unit/near_test.rb +0 -87
- data/test/unit/oauth_util_test.rb +0 -31
- data/test/unit/proxy_test.rb +0 -37
- data/test/unit/query_test.rb +0 -52
- data/test/unit/rake_task_test.rb +0 -21
- data/test/unit/request_test.rb +0 -35
- data/test/unit/result_test.rb +0 -72
- data/test/unit/test_mode_test.rb +0 -70
|
@@ -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
|
|
@@ -15,7 +15,7 @@ module Geocoder
|
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
%w[
|
|
18
|
+
%w[coordinates neighborhood city state state_code sub_state
|
|
19
19
|
sub_state_code province province_code postal_code country
|
|
20
20
|
country_code address street_address street_number route geometry].each do |attr|
|
|
21
21
|
add_result_attribute(attr)
|
|
@@ -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
|
|
@@ -2,61 +2,223 @@ require 'geocoder/results/base'
|
|
|
2
2
|
|
|
3
3
|
module Geocoder::Result
|
|
4
4
|
class Yandex < Base
|
|
5
|
+
# Yandex result has difficult tree structure,
|
|
6
|
+
# and presence of some nodes depends on exact search case.
|
|
7
|
+
|
|
8
|
+
# Also Yandex lacks documentation about it.
|
|
9
|
+
# See https://tech.yandex.com/maps/doc/geocoder/desc/concepts/response_structure-docpage/
|
|
10
|
+
|
|
11
|
+
# Ultimatly, we need to find Locality and/or Thoroughfare data.
|
|
12
|
+
|
|
13
|
+
# It may resides on the top (ADDRESS_DETAILS) level.
|
|
14
|
+
# example: 'Baltic Sea'
|
|
15
|
+
# "AddressDetails": {
|
|
16
|
+
# "Locality": {
|
|
17
|
+
# "Premise": {
|
|
18
|
+
# "PremiseName": "Baltic Sea"
|
|
19
|
+
# }
|
|
20
|
+
# }
|
|
21
|
+
# }
|
|
22
|
+
|
|
23
|
+
ADDRESS_DETAILS = %w[
|
|
24
|
+
GeoObject metaDataProperty GeocoderMetaData
|
|
25
|
+
AddressDetails
|
|
26
|
+
].freeze
|
|
27
|
+
|
|
28
|
+
# On COUNTRY_LEVEL.
|
|
29
|
+
# example: 'Potomak'
|
|
30
|
+
# "AddressDetails": {
|
|
31
|
+
# "Country": {
|
|
32
|
+
# "AddressLine": "reka Potomak",
|
|
33
|
+
# "CountryNameCode": "US",
|
|
34
|
+
# "CountryName": "United States of America",
|
|
35
|
+
# "Locality": {
|
|
36
|
+
# "Premise": {
|
|
37
|
+
# "PremiseName": "reka Potomak"
|
|
38
|
+
# }
|
|
39
|
+
# }
|
|
40
|
+
# }
|
|
41
|
+
# }
|
|
42
|
+
|
|
43
|
+
COUNTRY_LEVEL = %w[
|
|
44
|
+
GeoObject metaDataProperty GeocoderMetaData
|
|
45
|
+
AddressDetails Country
|
|
46
|
+
].freeze
|
|
47
|
+
|
|
48
|
+
# On ADMIN_LEVEL (usually state or city)
|
|
49
|
+
# example: 'Moscow, Tverskaya'
|
|
50
|
+
# "AddressDetails": {
|
|
51
|
+
# "Country": {
|
|
52
|
+
# "AddressLine": "Moscow, Tverskaya Street",
|
|
53
|
+
# "CountryNameCode": "RU",
|
|
54
|
+
# "CountryName": "Russia",
|
|
55
|
+
# "AdministrativeArea": {
|
|
56
|
+
# "AdministrativeAreaName": "Moscow",
|
|
57
|
+
# "Locality": {
|
|
58
|
+
# "LocalityName": "Moscow",
|
|
59
|
+
# "Thoroughfare": {
|
|
60
|
+
# "ThoroughfareName": "Tverskaya Street"
|
|
61
|
+
# }
|
|
62
|
+
# }
|
|
63
|
+
# }
|
|
64
|
+
# }
|
|
65
|
+
# }
|
|
66
|
+
|
|
67
|
+
ADMIN_LEVEL = %w[
|
|
68
|
+
GeoObject metaDataProperty GeocoderMetaData
|
|
69
|
+
AddressDetails Country
|
|
70
|
+
AdministrativeArea
|
|
71
|
+
].freeze
|
|
72
|
+
|
|
73
|
+
# On SUBADMIN_LEVEL (may refer to urban district)
|
|
74
|
+
# example: 'Moscow Region, Krasnogorsk'
|
|
75
|
+
# "AddressDetails": {
|
|
76
|
+
# "Country": {
|
|
77
|
+
# "AddressLine": "Moscow Region, Krasnogorsk",
|
|
78
|
+
# "CountryNameCode": "RU",
|
|
79
|
+
# "CountryName": "Russia",
|
|
80
|
+
# "AdministrativeArea": {
|
|
81
|
+
# "AdministrativeAreaName": "Moscow Region",
|
|
82
|
+
# "SubAdministrativeArea": {
|
|
83
|
+
# "SubAdministrativeAreaName": "gorodskoy okrug Krasnogorsk",
|
|
84
|
+
# "Locality": {
|
|
85
|
+
# "LocalityName": "Krasnogorsk"
|
|
86
|
+
# }
|
|
87
|
+
# }
|
|
88
|
+
# }
|
|
89
|
+
# }
|
|
90
|
+
# }
|
|
91
|
+
|
|
92
|
+
SUBADMIN_LEVEL = %w[
|
|
93
|
+
GeoObject metaDataProperty GeocoderMetaData
|
|
94
|
+
AddressDetails Country
|
|
95
|
+
AdministrativeArea
|
|
96
|
+
SubAdministrativeArea
|
|
97
|
+
].freeze
|
|
98
|
+
|
|
99
|
+
# On DEPENDENT_LOCALITY_1 (may refer to district of city)
|
|
100
|
+
# example: 'Paris, Etienne Marcel'
|
|
101
|
+
# "AddressDetails": {
|
|
102
|
+
# "Country": {
|
|
103
|
+
# "AddressLine": "Île-de-France, Paris, 1er Arrondissement, Rue Étienne Marcel",
|
|
104
|
+
# "CountryNameCode": "FR",
|
|
105
|
+
# "CountryName": "France",
|
|
106
|
+
# "AdministrativeArea": {
|
|
107
|
+
# "AdministrativeAreaName": "Île-de-France",
|
|
108
|
+
# "Locality": {
|
|
109
|
+
# "LocalityName": "Paris",
|
|
110
|
+
# "DependentLocality": {
|
|
111
|
+
# "DependentLocalityName": "1er Arrondissement",
|
|
112
|
+
# "Thoroughfare": {
|
|
113
|
+
# "ThoroughfareName": "Rue Étienne Marcel"
|
|
114
|
+
# }
|
|
115
|
+
# }
|
|
116
|
+
# }
|
|
117
|
+
# }
|
|
118
|
+
# }
|
|
119
|
+
# }
|
|
120
|
+
|
|
121
|
+
DEPENDENT_LOCALITY_1 = %w[
|
|
122
|
+
GeoObject metaDataProperty GeocoderMetaData
|
|
123
|
+
AddressDetails Country
|
|
124
|
+
AdministrativeArea Locality
|
|
125
|
+
DependentLocality
|
|
126
|
+
].freeze
|
|
127
|
+
|
|
128
|
+
# On DEPENDENT_LOCALITY_2 (for special cases like turkish "mahalle")
|
|
129
|
+
# https://en.wikipedia.org/wiki/Mahalle
|
|
130
|
+
# example: 'Istanbul Mabeyinci Yokuşu 17'
|
|
131
|
+
|
|
132
|
+
# "AddressDetails": {
|
|
133
|
+
# "Country": {
|
|
134
|
+
# "AddressLine": "İstanbul, Fatih, Saraç İshak Mah., Mabeyinci Yokuşu, 17",
|
|
135
|
+
# "CountryNameCode": "TR",
|
|
136
|
+
# "CountryName": "Turkey",
|
|
137
|
+
# "AdministrativeArea": {
|
|
138
|
+
# "AdministrativeAreaName": "İstanbul",
|
|
139
|
+
# "SubAdministrativeArea": {
|
|
140
|
+
# "SubAdministrativeAreaName": "Fatih",
|
|
141
|
+
# "Locality": {
|
|
142
|
+
# "DependentLocality": {
|
|
143
|
+
# "DependentLocalityName": "Saraç İshak Mah.",
|
|
144
|
+
# "Thoroughfare": {
|
|
145
|
+
# "ThoroughfareName": "Mabeyinci Yokuşu",
|
|
146
|
+
# "Premise": {
|
|
147
|
+
# "PremiseNumber": "17"
|
|
148
|
+
# }
|
|
149
|
+
# }
|
|
150
|
+
# }
|
|
151
|
+
# }
|
|
152
|
+
# }
|
|
153
|
+
# }
|
|
154
|
+
# }
|
|
155
|
+
# }
|
|
156
|
+
|
|
157
|
+
DEPENDENT_LOCALITY_2 = %w[
|
|
158
|
+
GeoObject metaDataProperty GeocoderMetaData
|
|
159
|
+
AddressDetails Country
|
|
160
|
+
AdministrativeArea
|
|
161
|
+
SubAdministrativeArea Locality
|
|
162
|
+
DependentLocality
|
|
163
|
+
].freeze
|
|
5
164
|
|
|
6
165
|
def coordinates
|
|
7
166
|
@data['GeoObject']['Point']['pos'].split(' ').reverse.map(&:to_f)
|
|
8
167
|
end
|
|
9
168
|
|
|
10
|
-
def address(
|
|
169
|
+
def address(_format = :full)
|
|
11
170
|
@data['GeoObject']['metaDataProperty']['GeocoderMetaData']['text']
|
|
12
171
|
end
|
|
13
172
|
|
|
14
173
|
def city
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
174
|
+
result =
|
|
175
|
+
if state.empty?
|
|
176
|
+
find_in_hash(@data, *COUNTRY_LEVEL, 'Locality', 'LocalityName')
|
|
177
|
+
elsif sub_state.empty?
|
|
178
|
+
find_in_hash(@data, *ADMIN_LEVEL, 'Locality', 'LocalityName')
|
|
179
|
+
else
|
|
180
|
+
find_in_hash(@data, *SUBADMIN_LEVEL, 'Locality', 'LocalityName')
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
result || ""
|
|
24
184
|
end
|
|
25
185
|
|
|
26
186
|
def country
|
|
27
|
-
|
|
187
|
+
find_in_hash(@data, *COUNTRY_LEVEL, 'CountryName') || ""
|
|
28
188
|
end
|
|
29
189
|
|
|
30
190
|
def country_code
|
|
31
|
-
|
|
191
|
+
find_in_hash(@data, *COUNTRY_LEVEL, 'CountryNameCode') || ""
|
|
32
192
|
end
|
|
33
193
|
|
|
34
194
|
def state
|
|
35
|
-
|
|
36
|
-
address_details['AdministrativeArea']['AdministrativeAreaName']
|
|
37
|
-
else
|
|
38
|
-
""
|
|
39
|
-
end
|
|
195
|
+
find_in_hash(@data, *ADMIN_LEVEL, 'AdministrativeAreaName') || ""
|
|
40
196
|
end
|
|
41
197
|
|
|
42
198
|
def sub_state
|
|
43
|
-
if
|
|
44
|
-
|
|
45
|
-
else
|
|
46
|
-
""
|
|
47
|
-
end
|
|
199
|
+
return "" if state.empty?
|
|
200
|
+
find_in_hash(@data, *SUBADMIN_LEVEL, 'SubAdministrativeAreaName') || ""
|
|
48
201
|
end
|
|
49
202
|
|
|
50
203
|
def state_code
|
|
51
204
|
""
|
|
52
205
|
end
|
|
53
206
|
|
|
54
|
-
def
|
|
55
|
-
""
|
|
207
|
+
def street
|
|
208
|
+
thoroughfare_data.is_a?(Hash) ? thoroughfare_data['ThoroughfareName'] : ""
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def street_number
|
|
212
|
+
premise.is_a?(Hash) ? premise.fetch('PremiseNumber', "") : ""
|
|
56
213
|
end
|
|
57
214
|
|
|
58
215
|
def premise_name
|
|
59
|
-
|
|
216
|
+
premise.is_a?(Hash) ? premise.fetch('PremiseName', "") : ""
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def postal_code
|
|
220
|
+
return "" unless premise.is_a?(Hash)
|
|
221
|
+
find_in_hash(premise, 'PostalCode', 'PostalCodeNumber') || ""
|
|
60
222
|
end
|
|
61
223
|
|
|
62
224
|
def kind
|
|
@@ -67,18 +229,64 @@ module Geocoder::Result
|
|
|
67
229
|
@data['GeoObject']['metaDataProperty']['GeocoderMetaData']['precision']
|
|
68
230
|
end
|
|
69
231
|
|
|
232
|
+
def viewport
|
|
233
|
+
envelope = @data['GeoObject']['boundedBy']['Envelope'] || fail
|
|
234
|
+
east, north = envelope['upperCorner'].split(' ').map(&:to_f)
|
|
235
|
+
west, south = envelope['lowerCorner'].split(' ').map(&:to_f)
|
|
236
|
+
[south, west, north, east]
|
|
237
|
+
end
|
|
238
|
+
|
|
70
239
|
private # ----------------------------------------------------------------
|
|
71
240
|
|
|
72
|
-
def
|
|
73
|
-
@data
|
|
241
|
+
def top_level_locality
|
|
242
|
+
find_in_hash(@data, *ADDRESS_DETAILS, 'Locality')
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def country_level_locality
|
|
246
|
+
find_in_hash(@data, *COUNTRY_LEVEL, 'Locality')
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def admin_locality
|
|
250
|
+
find_in_hash(@data, *ADMIN_LEVEL, 'Locality')
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def subadmin_locality
|
|
254
|
+
find_in_hash(@data, *SUBADMIN_LEVEL, 'Locality')
|
|
74
255
|
end
|
|
75
256
|
|
|
76
|
-
def
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
257
|
+
def dependent_locality
|
|
258
|
+
find_in_hash(@data, *DEPENDENT_LOCALITY_1) ||
|
|
259
|
+
find_in_hash(@data, *DEPENDENT_LOCALITY_2)
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
def locality_data
|
|
263
|
+
dependent_locality || subadmin_locality || admin_locality ||
|
|
264
|
+
country_level_locality || top_level_locality
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def thoroughfare_data
|
|
268
|
+
locality_data['Thoroughfare'] if locality_data.is_a?(Hash)
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def premise
|
|
272
|
+
if thoroughfare_data.is_a?(Hash)
|
|
273
|
+
thoroughfare_data['Premise']
|
|
274
|
+
elsif locality_data.is_a?(Hash)
|
|
275
|
+
locality_data['Premise']
|
|
81
276
|
end
|
|
82
277
|
end
|
|
278
|
+
|
|
279
|
+
def find_in_hash(source, *keys)
|
|
280
|
+
key = keys.shift
|
|
281
|
+
result = source[key]
|
|
282
|
+
|
|
283
|
+
if keys.empty?
|
|
284
|
+
return result
|
|
285
|
+
elsif !result.is_a?(Hash)
|
|
286
|
+
return nil
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
find_in_hash(result, *keys)
|
|
290
|
+
end
|
|
83
291
|
end
|
|
84
292
|
end
|
data/lib/geocoder/sql.rb
CHANGED
|
@@ -4,8 +4,8 @@ module Geocoder
|
|
|
4
4
|
|
|
5
5
|
##
|
|
6
6
|
# Distance calculation for use with a database that supports POWER(),
|
|
7
|
-
# SQRT(), PI(), and trigonometric functions SIN(), COS(), ASIN(),
|
|
8
|
-
# ATAN2()
|
|
7
|
+
# SQRT(), PI(), and trigonometric functions SIN(), COS(), ASIN(),
|
|
8
|
+
# ATAN2().
|
|
9
9
|
#
|
|
10
10
|
# Based on the excellent tutorial at:
|
|
11
11
|
# http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL
|
|
@@ -44,13 +44,13 @@ module Geocoder
|
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
def within_bounding_box(sw_lat, sw_lng, ne_lat, ne_lng, lat_attr, lon_attr)
|
|
47
|
-
spans = "#{lat_attr} BETWEEN #{sw_lat} AND #{ne_lat} AND "
|
|
47
|
+
spans = "#{lat_attr} BETWEEN #{sw_lat.to_f} AND #{ne_lat.to_f} AND "
|
|
48
48
|
# handle box that spans 180 longitude
|
|
49
49
|
if sw_lng.to_f > ne_lng.to_f
|
|
50
|
-
spans + "#{lon_attr} BETWEEN #{sw_lng} AND 180 OR " +
|
|
51
|
-
"#{lon_attr} BETWEEN -180 AND #{ne_lng}"
|
|
50
|
+
spans + "(#{lon_attr} BETWEEN #{sw_lng.to_f} AND 180 OR " +
|
|
51
|
+
"#{lon_attr} BETWEEN -180 AND #{ne_lng.to_f})"
|
|
52
52
|
else
|
|
53
|
-
spans + "#{lon_attr} BETWEEN #{sw_lng} AND #{ne_lng}"
|
|
53
|
+
spans + "#{lon_attr} BETWEEN #{sw_lng.to_f} AND #{ne_lng.to_f}"
|
|
54
54
|
end
|
|
55
55
|
end
|
|
56
56
|
|
|
@@ -59,6 +59,9 @@ module Geocoder
|
|
|
59
59
|
# and an options hash which must include a :bearing value
|
|
60
60
|
# (:linear or :spherical).
|
|
61
61
|
#
|
|
62
|
+
# For use with a database that supports MOD() and trigonometric functions
|
|
63
|
+
# SIN(), COS(), ASIN(), ATAN2().
|
|
64
|
+
#
|
|
62
65
|
# Based on:
|
|
63
66
|
# http://www.beginningspatial.com/calculating_bearing_one_point_another
|
|
64
67
|
#
|