ultra-fast-mod 0.0.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/geocoder-1.8.6/CHANGELOG.md +669 -0
- data/geocoder-1.8.6/LICENSE +20 -0
- data/geocoder-1.8.6/README.md +827 -0
- data/geocoder-1.8.6/bin/console +13 -0
- data/geocoder-1.8.6/bin/geocode +5 -0
- data/geocoder-1.8.6/examples/app_defined_lookup_services.rb +22 -0
- data/geocoder-1.8.6/examples/cache_bypass.rb +48 -0
- data/geocoder-1.8.6/examples/reverse_geocode_job.rb +40 -0
- data/geocoder-1.8.6/lib/easting_northing.rb +171 -0
- data/geocoder-1.8.6/lib/generators/geocoder/config/config_generator.rb +14 -0
- data/geocoder-1.8.6/lib/generators/geocoder/config/templates/initializer.rb +27 -0
- data/geocoder-1.8.6/lib/generators/geocoder/maxmind/geolite_city_generator.rb +30 -0
- data/geocoder-1.8.6/lib/generators/geocoder/maxmind/geolite_country_generator.rb +30 -0
- data/geocoder-1.8.6/lib/generators/geocoder/maxmind/templates/migration/geolite_city.rb +30 -0
- data/geocoder-1.8.6/lib/generators/geocoder/maxmind/templates/migration/geolite_country.rb +17 -0
- data/geocoder-1.8.6/lib/generators/geocoder/migration_version.rb +15 -0
- data/geocoder-1.8.6/lib/geocoder/cache.rb +77 -0
- data/geocoder-1.8.6/lib/geocoder/cache_stores/base.rb +40 -0
- data/geocoder-1.8.6/lib/geocoder/cache_stores/generic.rb +35 -0
- data/geocoder-1.8.6/lib/geocoder/cache_stores/redis.rb +34 -0
- data/geocoder-1.8.6/lib/geocoder/calculations.rb +420 -0
- data/geocoder-1.8.6/lib/geocoder/cli.rb +121 -0
- data/geocoder-1.8.6/lib/geocoder/configuration.rb +151 -0
- data/geocoder-1.8.6/lib/geocoder/configuration_hash.rb +11 -0
- data/geocoder-1.8.6/lib/geocoder/esri_token.rb +38 -0
- data/geocoder-1.8.6/lib/geocoder/exceptions.rb +40 -0
- data/geocoder-1.8.6/lib/geocoder/ip_address.rb +36 -0
- data/geocoder-1.8.6/lib/geocoder/kernel_logger.rb +25 -0
- data/geocoder-1.8.6/lib/geocoder/logger.rb +47 -0
- data/geocoder-1.8.6/lib/geocoder/lookup.rb +155 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/abstract_api.rb +46 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/amap.rb +63 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/amazon_location_service.rb +58 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/azure.rb +56 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/baidu.rb +63 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/baidu_ip.rb +30 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/ban_data_gouv_fr.rb +143 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/base.rb +351 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/bing.rb +82 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/db_ip_com.rb +52 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/esri.rb +114 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/freegeoip.rb +62 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/geoapify.rb +78 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/geocoder_ca.rb +53 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/geocodio.rb +42 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/geoip2.rb +49 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/geoportail_lu.rb +65 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/google.rb +100 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/google_places_details.rb +64 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/google_places_search.rb +75 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/google_premier.rb +61 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/here.rb +73 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/ip2location.rb +71 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/ip2location_io.rb +62 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/ip2location_lite.rb +40 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/ipapi_com.rb +82 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/ipbase.rb +49 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/ipdata_co.rb +62 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/ipgeolocation.rb +51 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/ipinfo_io.rb +44 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/ipinfo_io_lite.rb +42 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/ipqualityscore.rb +50 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/ipregistry.rb +68 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/ipstack.rb +63 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/latlon.rb +58 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/location_iq.rb +54 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/mapbox.rb +60 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/mapquest.rb +58 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/maxmind.rb +90 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/maxmind_geoip2.rb +70 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/maxmind_local.rb +71 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/melissa_street.rb +41 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/nationaal_georegister_nl.rb +38 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/nominatim.rb +64 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/opencagedata.rb +65 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/osmnames.rb +57 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/pc_miler.rb +87 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/pdok_nl.rb +43 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/pelias.rb +63 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/photon.rb +89 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/pickpoint.rb +41 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/pointpin.rb +69 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/postcode_anywhere_uk.rb +50 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/postcodes_io.rb +31 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/smarty_streets.rb +68 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/telize.rb +75 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/tencent.rb +59 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/test.rb +49 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/twogis.rb +58 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/uk_ordnance_survey_names.rb +59 -0
- data/geocoder-1.8.6/lib/geocoder/lookups/yandex.rb +61 -0
- data/geocoder-1.8.6/lib/geocoder/models/active_record.rb +51 -0
- data/geocoder-1.8.6/lib/geocoder/models/base.rb +39 -0
- data/geocoder-1.8.6/lib/geocoder/models/mongo_base.rb +62 -0
- data/geocoder-1.8.6/lib/geocoder/models/mongo_mapper.rb +26 -0
- data/geocoder-1.8.6/lib/geocoder/models/mongoid.rb +32 -0
- data/geocoder-1.8.6/lib/geocoder/query.rb +125 -0
- data/geocoder-1.8.6/lib/geocoder/railtie.rb +26 -0
- data/geocoder-1.8.6/lib/geocoder/request.rb +114 -0
- data/geocoder-1.8.6/lib/geocoder/results/abstract_api.rb +146 -0
- data/geocoder-1.8.6/lib/geocoder/results/amap.rb +87 -0
- data/geocoder-1.8.6/lib/geocoder/results/amazon_location_service.rb +62 -0
- data/geocoder-1.8.6/lib/geocoder/results/azure.rb +65 -0
- data/geocoder-1.8.6/lib/geocoder/results/baidu.rb +75 -0
- data/geocoder-1.8.6/lib/geocoder/results/baidu_ip.rb +62 -0
- data/geocoder-1.8.6/lib/geocoder/results/ban_data_gouv_fr.rb +282 -0
- data/geocoder-1.8.6/lib/geocoder/results/base.rb +79 -0
- data/geocoder-1.8.6/lib/geocoder/results/bing.rb +52 -0
- data/geocoder-1.8.6/lib/geocoder/results/db_ip_com.rb +58 -0
- data/geocoder-1.8.6/lib/geocoder/results/esri.rb +78 -0
- data/geocoder-1.8.6/lib/geocoder/results/freegeoip.rb +40 -0
- data/geocoder-1.8.6/lib/geocoder/results/geoapify.rb +179 -0
- data/geocoder-1.8.6/lib/geocoder/results/geocoder_ca.rb +60 -0
- data/geocoder-1.8.6/lib/geocoder/results/geocodio.rb +78 -0
- data/geocoder-1.8.6/lib/geocoder/results/geoip2.rb +76 -0
- data/geocoder-1.8.6/lib/geocoder/results/geoportail_lu.rb +71 -0
- data/geocoder-1.8.6/lib/geocoder/results/google.rb +150 -0
- data/geocoder-1.8.6/lib/geocoder/results/google_places_details.rb +39 -0
- data/geocoder-1.8.6/lib/geocoder/results/google_places_search.rb +52 -0
- data/geocoder-1.8.6/lib/geocoder/results/google_premier.rb +6 -0
- data/geocoder-1.8.6/lib/geocoder/results/here.rb +77 -0
- data/geocoder-1.8.6/lib/geocoder/results/ip2location.rb +22 -0
- data/geocoder-1.8.6/lib/geocoder/results/ip2location_io.rb +21 -0
- data/geocoder-1.8.6/lib/geocoder/results/ip2location_lite.rb +47 -0
- data/geocoder-1.8.6/lib/geocoder/results/ipapi_com.rb +45 -0
- data/geocoder-1.8.6/lib/geocoder/results/ipbase.rb +40 -0
- data/geocoder-1.8.6/lib/geocoder/results/ipdata_co.rb +40 -0
- data/geocoder-1.8.6/lib/geocoder/results/ipgeolocation.rb +59 -0
- data/geocoder-1.8.6/lib/geocoder/results/ipinfo_io.rb +48 -0
- data/geocoder-1.8.6/lib/geocoder/results/ipinfo_io_lite.rb +16 -0
- data/geocoder-1.8.6/lib/geocoder/results/ipqualityscore.rb +54 -0
- data/geocoder-1.8.6/lib/geocoder/results/ipregistry.rb +304 -0
- data/geocoder-1.8.6/lib/geocoder/results/ipstack.rb +60 -0
- data/geocoder-1.8.6/lib/geocoder/results/latlon.rb +71 -0
- data/geocoder-1.8.6/lib/geocoder/results/location_iq.rb +6 -0
- data/geocoder-1.8.6/lib/geocoder/results/mapbox.rb +80 -0
- data/geocoder-1.8.6/lib/geocoder/results/mapquest.rb +48 -0
- data/geocoder-1.8.6/lib/geocoder/results/maxmind.rb +130 -0
- data/geocoder-1.8.6/lib/geocoder/results/maxmind_geoip2.rb +9 -0
- data/geocoder-1.8.6/lib/geocoder/results/maxmind_local.rb +44 -0
- data/geocoder-1.8.6/lib/geocoder/results/melissa_street.rb +46 -0
- data/geocoder-1.8.6/lib/geocoder/results/nationaal_georegister_nl.rb +62 -0
- data/geocoder-1.8.6/lib/geocoder/results/nominatim.rb +121 -0
- data/geocoder-1.8.6/lib/geocoder/results/opencagedata.rb +100 -0
- data/geocoder-1.8.6/lib/geocoder/results/osmnames.rb +56 -0
- data/geocoder-1.8.6/lib/geocoder/results/pc_miler.rb +98 -0
- data/geocoder-1.8.6/lib/geocoder/results/pdok_nl.rb +62 -0
- data/geocoder-1.8.6/lib/geocoder/results/pelias.rb +58 -0
- data/geocoder-1.8.6/lib/geocoder/results/photon.rb +119 -0
- data/geocoder-1.8.6/lib/geocoder/results/pickpoint.rb +6 -0
- data/geocoder-1.8.6/lib/geocoder/results/pointpin.rb +40 -0
- data/geocoder-1.8.6/lib/geocoder/results/postcode_anywhere_uk.rb +42 -0
- data/geocoder-1.8.6/lib/geocoder/results/postcodes_io.rb +40 -0
- data/geocoder-1.8.6/lib/geocoder/results/smarty_streets.rb +142 -0
- data/geocoder-1.8.6/lib/geocoder/results/telize.rb +40 -0
- data/geocoder-1.8.6/lib/geocoder/results/tencent.rb +72 -0
- data/geocoder-1.8.6/lib/geocoder/results/test.rb +33 -0
- data/geocoder-1.8.6/lib/geocoder/results/twogis.rb +76 -0
- data/geocoder-1.8.6/lib/geocoder/results/uk_ordnance_survey_names.rb +59 -0
- data/geocoder-1.8.6/lib/geocoder/results/yandex.rb +292 -0
- data/geocoder-1.8.6/lib/geocoder/sql.rb +110 -0
- data/geocoder-1.8.6/lib/geocoder/stores/active_record.rb +329 -0
- data/geocoder-1.8.6/lib/geocoder/stores/base.rb +115 -0
- data/geocoder-1.8.6/lib/geocoder/stores/mongo_base.rb +58 -0
- data/geocoder-1.8.6/lib/geocoder/stores/mongo_mapper.rb +13 -0
- data/geocoder-1.8.6/lib/geocoder/stores/mongoid.rb +13 -0
- data/geocoder-1.8.6/lib/geocoder/util.rb +29 -0
- data/geocoder-1.8.6/lib/geocoder/version.rb +3 -0
- data/geocoder-1.8.6/lib/geocoder.rb +48 -0
- data/geocoder-1.8.6/lib/maxmind_database.rb +109 -0
- data/geocoder-1.8.6/lib/tasks/geocoder.rake +54 -0
- data/geocoder-1.8.6/lib/tasks/maxmind.rake +73 -0
- data/ultra-fast-mod.gemspec +12 -0
- metadata +214 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require 'geocoder/lookups/base'
|
|
2
|
+
require 'geocoder/results/smarty_streets'
|
|
3
|
+
|
|
4
|
+
module Geocoder::Lookup
|
|
5
|
+
class SmartyStreets < Base
|
|
6
|
+
def name
|
|
7
|
+
"SmartyStreets"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def required_api_key_parts
|
|
11
|
+
%w(auth-id auth-token)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# required by API as of 26 March 2015
|
|
15
|
+
def supported_protocols
|
|
16
|
+
[:https]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private # ---------------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
def base_query_url(query)
|
|
22
|
+
if international?(query)
|
|
23
|
+
"#{protocol}://international-street.api.smartystreets.com/verify?"
|
|
24
|
+
elsif zipcode_only?(query)
|
|
25
|
+
"#{protocol}://us-zipcode.api.smartystreets.com/lookup?"
|
|
26
|
+
else
|
|
27
|
+
"#{protocol}://us-street.api.smartystreets.com/street-address?"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def zipcode_only?(query)
|
|
32
|
+
!query.text.is_a?(Array) and query.to_s.strip =~ /\A\d{5}(-\d{4})?\Z/
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def international?(query)
|
|
36
|
+
!query.options[:country].nil?
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def query_url_params(query)
|
|
40
|
+
params = {}
|
|
41
|
+
if international?(query)
|
|
42
|
+
params[:freeform] = query.sanitized_text
|
|
43
|
+
params[:country] = query.options[:country]
|
|
44
|
+
params[:geocode] = true
|
|
45
|
+
elsif zipcode_only?(query)
|
|
46
|
+
params[:zipcode] = query.sanitized_text
|
|
47
|
+
else
|
|
48
|
+
params[:street] = query.sanitized_text
|
|
49
|
+
end
|
|
50
|
+
if configuration.api_key.is_a?(Array)
|
|
51
|
+
params[:"auth-id"] = configuration.api_key[0]
|
|
52
|
+
params[:"auth-token"] = configuration.api_key[1]
|
|
53
|
+
else
|
|
54
|
+
params[:"auth-token"] = configuration.api_key
|
|
55
|
+
end
|
|
56
|
+
params.merge(super)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def results(query)
|
|
60
|
+
doc = fetch_data(query) || []
|
|
61
|
+
if doc.is_a?(Hash) and doc.key?('status') # implies there's an error
|
|
62
|
+
return []
|
|
63
|
+
else
|
|
64
|
+
return doc
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
require 'geocoder/lookups/base'
|
|
2
|
+
require 'geocoder/results/telize'
|
|
3
|
+
|
|
4
|
+
module Geocoder::Lookup
|
|
5
|
+
class Telize < Base
|
|
6
|
+
|
|
7
|
+
def name
|
|
8
|
+
"Telize"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def required_api_key_parts
|
|
12
|
+
configuration[:host] ? [] : ["key"]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def query_url(query)
|
|
16
|
+
if configuration[:host]
|
|
17
|
+
"#{protocol}://#{configuration[:host]}/location/#{query.sanitized_text}"
|
|
18
|
+
else
|
|
19
|
+
"#{protocol}://telize-v1.p.rapidapi.com/location/#{query.sanitized_text}?rapidapi-key=#{api_key}"
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def supported_protocols
|
|
24
|
+
[].tap do |array|
|
|
25
|
+
array << :https
|
|
26
|
+
array << :http if configuration[:host]
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private # ---------------------------------------------------------------
|
|
31
|
+
|
|
32
|
+
def cache_key(query)
|
|
33
|
+
query_url(query)[/(.*)\?.*/, 1]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def results(query)
|
|
37
|
+
# don't look up a loopback or private address, just return the stored result
|
|
38
|
+
return [reserved_result(query.text)] if query.internal_ip_address?
|
|
39
|
+
if (doc = fetch_data(query)).nil? or doc['code'] == 401 or empty_result?(doc)
|
|
40
|
+
[]
|
|
41
|
+
else
|
|
42
|
+
[doc]
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def empty_result?(doc)
|
|
47
|
+
!doc.is_a?(Hash) or doc.keys == ["ip"]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def reserved_result(ip)
|
|
51
|
+
{
|
|
52
|
+
"ip" => ip,
|
|
53
|
+
"latitude" => 0,
|
|
54
|
+
"longitude" => 0,
|
|
55
|
+
"city" => "",
|
|
56
|
+
"timezone" => "",
|
|
57
|
+
"asn" => 0,
|
|
58
|
+
"region" => "",
|
|
59
|
+
"offset" => 0,
|
|
60
|
+
"organization" => "",
|
|
61
|
+
"country_code" => "",
|
|
62
|
+
"country_code3" => "",
|
|
63
|
+
"postal_code" => "",
|
|
64
|
+
"continent_code" => "",
|
|
65
|
+
"country" => "",
|
|
66
|
+
"region_code" => ""
|
|
67
|
+
}
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def api_key
|
|
71
|
+
configuration.api_key
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'geocoder/lookups/base'
|
|
2
|
+
require "geocoder/results/tencent"
|
|
3
|
+
|
|
4
|
+
module Geocoder::Lookup
|
|
5
|
+
class Tencent < Base
|
|
6
|
+
|
|
7
|
+
def name
|
|
8
|
+
"Tencent"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def required_api_key_parts
|
|
12
|
+
["key"]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def supported_protocols
|
|
16
|
+
[:https]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private # ---------------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
def base_query_url(query)
|
|
22
|
+
"#{protocol}://apis.map.qq.com/ws/geocoder/v1/?"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def content_key
|
|
26
|
+
'result'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def results(query, reverse = false)
|
|
30
|
+
return [] unless doc = fetch_data(query)
|
|
31
|
+
case doc['status']
|
|
32
|
+
when 0
|
|
33
|
+
return [doc[content_key]]
|
|
34
|
+
when 311
|
|
35
|
+
raise_error(Geocoder::InvalidApiKey, "invalid api key") ||
|
|
36
|
+
Geocoder.log(:warn, "#{name} Geocoding API error: invalid api key.")
|
|
37
|
+
when 310
|
|
38
|
+
raise_error(Geocoder::InvalidRequest, "invalid request.") ||
|
|
39
|
+
Geocoder.log(:warn, "#{name} Geocoding API error: invalid request, invalid parameters.")
|
|
40
|
+
when 306
|
|
41
|
+
raise_error(Geocoder::InvalidRequest, "invalid request.") ||
|
|
42
|
+
Geocoder.log(:warn, "#{name} Geocoding API error: invalid request, check response for more info.")
|
|
43
|
+
when 110
|
|
44
|
+
raise_error(Geocoder::RequestDenied, "request denied.") ||
|
|
45
|
+
Geocoder.log(:warn, "#{name} Geocoding API error: request source is not authorized.")
|
|
46
|
+
end
|
|
47
|
+
return []
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def query_url_params(query)
|
|
51
|
+
{
|
|
52
|
+
(query.reverse_geocode? ? :location : :address) => query.sanitized_text,
|
|
53
|
+
:key => configuration.api_key,
|
|
54
|
+
:output => "json"
|
|
55
|
+
}.merge(super)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require 'geocoder/lookups/base'
|
|
2
|
+
require 'geocoder/results/test'
|
|
3
|
+
|
|
4
|
+
module Geocoder
|
|
5
|
+
module Lookup
|
|
6
|
+
class Test < Base
|
|
7
|
+
|
|
8
|
+
def name
|
|
9
|
+
"Test"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.add_stub(query_text, results)
|
|
13
|
+
stubs[query_text] = results
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.set_default_stub(results)
|
|
17
|
+
@default_stub = results
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.read_stub(query_text)
|
|
21
|
+
@default_stub ||= nil
|
|
22
|
+
stubs.fetch(query_text) {
|
|
23
|
+
return @default_stub unless @default_stub.nil?
|
|
24
|
+
raise ArgumentError, "unknown stub request #{query_text}"
|
|
25
|
+
}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.stubs
|
|
29
|
+
@stubs ||= {}
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.delete_stub(query_text)
|
|
33
|
+
stubs.delete(query_text)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def self.reset
|
|
37
|
+
@stubs = {}
|
|
38
|
+
@default_stub = nil
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def results(query)
|
|
44
|
+
Geocoder::Lookup::Test.read_stub(query.text)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'geocoder/lookups/base'
|
|
2
|
+
require "geocoder/results/twogis"
|
|
3
|
+
|
|
4
|
+
module Geocoder::Lookup
|
|
5
|
+
class Twogis < Base
|
|
6
|
+
|
|
7
|
+
def name
|
|
8
|
+
"2gis"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def required_api_key_parts
|
|
12
|
+
["key"]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def map_link_url(coordinates)
|
|
16
|
+
"https://2gis.ru/?m=#{coordinates.join(',')}"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def supported_protocols
|
|
20
|
+
[:https]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private # ---------------------------------------------------------------
|
|
24
|
+
|
|
25
|
+
def base_query_url(query)
|
|
26
|
+
"#{protocol}://catalog.api.2gis.com/3.0/items/geocode?"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def results(query)
|
|
30
|
+
return [] unless doc = fetch_data(query)
|
|
31
|
+
if doc['meta'] && doc['meta']['error']
|
|
32
|
+
Geocoder.log(:warn, "2gis Geocoding API error: #{doc['meta']["code"]} (#{doc['meta']['error']["message"]}).")
|
|
33
|
+
return []
|
|
34
|
+
end
|
|
35
|
+
if doc['result'] && doc = doc['result']['items']
|
|
36
|
+
return doc.to_a
|
|
37
|
+
else
|
|
38
|
+
Geocoder.log(:warn, "2gis Geocoding API error: unexpected response format.")
|
|
39
|
+
return []
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def query_url_params(query)
|
|
44
|
+
if query.reverse_geocode?
|
|
45
|
+
q = query.coordinates.reverse.join(",")
|
|
46
|
+
else
|
|
47
|
+
q = query.sanitized_text
|
|
48
|
+
end
|
|
49
|
+
params = {
|
|
50
|
+
:q => q,
|
|
51
|
+
:lang => "#{query.language || configuration.language}",
|
|
52
|
+
:key => configuration.api_key,
|
|
53
|
+
:fields => 'items.street,items.adm_div,items.full_address_name,items.point,items.geometry.centroid'
|
|
54
|
+
}
|
|
55
|
+
params.merge(super)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'geocoder/lookups/base'
|
|
2
|
+
require 'geocoder/results/uk_ordnance_survey_names'
|
|
3
|
+
|
|
4
|
+
module Geocoder::Lookup
|
|
5
|
+
class UkOrdnanceSurveyNames < Base
|
|
6
|
+
|
|
7
|
+
def name
|
|
8
|
+
'Ordance Survey Names'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def supported_protocols
|
|
12
|
+
[:https]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def base_query_url(query)
|
|
16
|
+
"#{protocol}://api.os.uk/search/names/v1/find?"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def required_api_key_parts
|
|
20
|
+
["key"]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def query_url(query)
|
|
24
|
+
base_query_url(query) + url_query_string(query)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private # -------------------------------------------------------------
|
|
28
|
+
|
|
29
|
+
def results(query)
|
|
30
|
+
return [] unless doc = fetch_data(query)
|
|
31
|
+
return [] if doc['header']['totalresults'].zero?
|
|
32
|
+
return doc['results'].map { |r| r['GAZETTEER_ENTRY'] }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def query_url_params(query)
|
|
36
|
+
{
|
|
37
|
+
query: query.sanitized_text,
|
|
38
|
+
key: configuration.api_key,
|
|
39
|
+
fq: filter
|
|
40
|
+
}.merge(super)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def local_types
|
|
44
|
+
%w[
|
|
45
|
+
City
|
|
46
|
+
Hamlet
|
|
47
|
+
Other_Settlement
|
|
48
|
+
Town
|
|
49
|
+
Village
|
|
50
|
+
Postcode
|
|
51
|
+
]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def filter
|
|
55
|
+
local_types.map { |t| "local_type:#{t}" }.join(' ')
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'geocoder/lookups/base'
|
|
2
|
+
require "geocoder/results/yandex"
|
|
3
|
+
|
|
4
|
+
module Geocoder::Lookup
|
|
5
|
+
class Yandex < Base
|
|
6
|
+
|
|
7
|
+
def name
|
|
8
|
+
"Yandex"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def map_link_url(coordinates)
|
|
12
|
+
"http://maps.yandex.ru/?ll=#{coordinates.reverse.join(',')}"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def supported_protocols
|
|
16
|
+
[:https]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private # ---------------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
def base_query_url(query)
|
|
22
|
+
"#{protocol}://geocode-maps.yandex.ru/1.x/?"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def results(query)
|
|
26
|
+
return [] unless doc = fetch_data(query)
|
|
27
|
+
if [400, 403].include? doc['statusCode']
|
|
28
|
+
if doc['statusCode'] == 403 and doc['message'] == 'Invalid key'
|
|
29
|
+
raise_error(Geocoder::InvalidApiKey) || Geocoder.log(:warn, "Invalid API key.")
|
|
30
|
+
else
|
|
31
|
+
Geocoder.log(:warn, "Yandex Geocoding API error: #{doc['statusCode']} (#{doc['message']}).")
|
|
32
|
+
end
|
|
33
|
+
return []
|
|
34
|
+
end
|
|
35
|
+
if doc = doc['response']['GeoObjectCollection']
|
|
36
|
+
return doc['featureMember'].to_a
|
|
37
|
+
else
|
|
38
|
+
Geocoder.log(:warn, "Yandex Geocoding API error: unexpected response format.")
|
|
39
|
+
return []
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def query_url_params(query)
|
|
44
|
+
if query.reverse_geocode?
|
|
45
|
+
q = query.coordinates.reverse.join(",")
|
|
46
|
+
else
|
|
47
|
+
q = query.sanitized_text
|
|
48
|
+
end
|
|
49
|
+
params = {
|
|
50
|
+
:geocode => q,
|
|
51
|
+
:format => "json",
|
|
52
|
+
:lang => "#{query.language || configuration.language}", # supports ru, uk, be, default -> ru
|
|
53
|
+
:apikey => configuration.api_key
|
|
54
|
+
}
|
|
55
|
+
unless (bounds = query.options[:bounds]).nil?
|
|
56
|
+
params[:bbox] = bounds.map{ |point| "%f,%f" % point }.join('~')
|
|
57
|
+
end
|
|
58
|
+
params.merge(super)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require 'geocoder/models/base'
|
|
2
|
+
|
|
3
|
+
module Geocoder
|
|
4
|
+
module Model
|
|
5
|
+
module ActiveRecord
|
|
6
|
+
include Base
|
|
7
|
+
|
|
8
|
+
##
|
|
9
|
+
# Set attribute names and include the Geocoder module.
|
|
10
|
+
#
|
|
11
|
+
def geocoded_by(address_attr, options = {}, &block)
|
|
12
|
+
geocoder_init(
|
|
13
|
+
:geocode => true,
|
|
14
|
+
:user_address => address_attr,
|
|
15
|
+
:latitude => options[:latitude] || :latitude,
|
|
16
|
+
:longitude => options[:longitude] || :longitude,
|
|
17
|
+
:geocode_block => block,
|
|
18
|
+
:units => options[:units],
|
|
19
|
+
:method => options[:method],
|
|
20
|
+
:lookup => options[:lookup],
|
|
21
|
+
:language => options[:language],
|
|
22
|
+
:params => options[:params]
|
|
23
|
+
)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
##
|
|
27
|
+
# Set attribute names and include the Geocoder module.
|
|
28
|
+
#
|
|
29
|
+
def reverse_geocoded_by(latitude_attr, longitude_attr, options = {}, &block)
|
|
30
|
+
geocoder_init(
|
|
31
|
+
:reverse_geocode => true,
|
|
32
|
+
:fetched_address => options[:address] || :address,
|
|
33
|
+
:latitude => latitude_attr,
|
|
34
|
+
:longitude => longitude_attr,
|
|
35
|
+
:reverse_block => block,
|
|
36
|
+
:units => options[:units],
|
|
37
|
+
:method => options[:method],
|
|
38
|
+
:lookup => options[:lookup],
|
|
39
|
+
:language => options[:language],
|
|
40
|
+
:params => options[:params]
|
|
41
|
+
)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
private # --------------------------------------------------------------
|
|
46
|
+
|
|
47
|
+
def geocoder_file_name; "active_record"; end
|
|
48
|
+
def geocoder_module_name; "ActiveRecord"; end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module Geocoder
|
|
2
|
+
|
|
3
|
+
##
|
|
4
|
+
# Methods for invoking Geocoder in a model.
|
|
5
|
+
#
|
|
6
|
+
module Model
|
|
7
|
+
module Base
|
|
8
|
+
|
|
9
|
+
def geocoder_options
|
|
10
|
+
if defined?(@geocoder_options)
|
|
11
|
+
@geocoder_options
|
|
12
|
+
elsif superclass.respond_to?(:geocoder_options)
|
|
13
|
+
superclass.geocoder_options || { }
|
|
14
|
+
else
|
|
15
|
+
{ }
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def geocoded_by
|
|
20
|
+
fail
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def reverse_geocoded_by
|
|
24
|
+
fail
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private # ----------------------------------------------------------------
|
|
28
|
+
|
|
29
|
+
def geocoder_init(options)
|
|
30
|
+
unless defined?(@geocoder_options)
|
|
31
|
+
@geocoder_options = {}
|
|
32
|
+
require "geocoder/stores/#{geocoder_file_name}"
|
|
33
|
+
include Geocoder::Store.const_get(geocoder_module_name)
|
|
34
|
+
end
|
|
35
|
+
@geocoder_options.merge! options
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
module Geocoder
|
|
2
|
+
|
|
3
|
+
##
|
|
4
|
+
# Methods for invoking Geocoder in a model.
|
|
5
|
+
#
|
|
6
|
+
module Model
|
|
7
|
+
module MongoBase
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
# Set attribute names and include the Geocoder module.
|
|
11
|
+
#
|
|
12
|
+
def geocoded_by(address_attr, options = {}, &block)
|
|
13
|
+
geocoder_init(
|
|
14
|
+
:geocode => true,
|
|
15
|
+
:user_address => address_attr,
|
|
16
|
+
:coordinates => options[:coordinates] || :coordinates,
|
|
17
|
+
:geocode_block => block,
|
|
18
|
+
:units => options[:units],
|
|
19
|
+
:method => options[:method],
|
|
20
|
+
:skip_index => options[:skip_index] || false,
|
|
21
|
+
:lookup => options[:lookup],
|
|
22
|
+
:language => options[:language]
|
|
23
|
+
)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
##
|
|
27
|
+
# Set attribute names and include the Geocoder module.
|
|
28
|
+
#
|
|
29
|
+
def reverse_geocoded_by(coordinates_attr, options = {}, &block)
|
|
30
|
+
geocoder_init(
|
|
31
|
+
:reverse_geocode => true,
|
|
32
|
+
:fetched_address => options[:address] || :address,
|
|
33
|
+
:coordinates => coordinates_attr,
|
|
34
|
+
:reverse_block => block,
|
|
35
|
+
:units => options[:units],
|
|
36
|
+
:method => options[:method],
|
|
37
|
+
:skip_index => options[:skip_index] || false,
|
|
38
|
+
:lookup => options[:lookup],
|
|
39
|
+
:language => options[:language]
|
|
40
|
+
)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private # ----------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
def geocoder_init(options)
|
|
46
|
+
unless geocoder_initialized?
|
|
47
|
+
@geocoder_options = { }
|
|
48
|
+
require "geocoder/stores/#{geocoder_file_name}"
|
|
49
|
+
include Geocoder::Store.const_get(geocoder_module_name)
|
|
50
|
+
end
|
|
51
|
+
@geocoder_options.merge! options
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def geocoder_initialized?
|
|
55
|
+
included_modules.include? Geocoder::Store.const_get(geocoder_module_name)
|
|
56
|
+
rescue NameError
|
|
57
|
+
false
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'geocoder/models/base'
|
|
2
|
+
require 'geocoder/models/mongo_base'
|
|
3
|
+
|
|
4
|
+
module Geocoder
|
|
5
|
+
module Model
|
|
6
|
+
module MongoMapper
|
|
7
|
+
include Base
|
|
8
|
+
include MongoBase
|
|
9
|
+
|
|
10
|
+
def self.included(base); base.extend(self); end
|
|
11
|
+
|
|
12
|
+
private # --------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
def geocoder_file_name; "mongo_mapper"; end
|
|
15
|
+
def geocoder_module_name; "MongoMapper"; end
|
|
16
|
+
|
|
17
|
+
def geocoder_init(options)
|
|
18
|
+
super(options)
|
|
19
|
+
if options[:skip_index] == false
|
|
20
|
+
ensure_index [[ geocoder_options[:coordinates], Mongo::GEO2D ]],
|
|
21
|
+
:min => -180, :max => 180 # create 2d index
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'geocoder/models/base'
|
|
2
|
+
require 'geocoder/models/mongo_base'
|
|
3
|
+
|
|
4
|
+
module Geocoder
|
|
5
|
+
module Model
|
|
6
|
+
module Mongoid
|
|
7
|
+
include Base
|
|
8
|
+
include MongoBase
|
|
9
|
+
|
|
10
|
+
def self.included(base); base.extend(self); end
|
|
11
|
+
|
|
12
|
+
private # --------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
def geocoder_file_name; "mongoid"; end
|
|
15
|
+
def geocoder_module_name; "Mongoid"; end
|
|
16
|
+
|
|
17
|
+
def geocoder_init(options)
|
|
18
|
+
super(options)
|
|
19
|
+
if options[:skip_index] == false
|
|
20
|
+
# create 2d index
|
|
21
|
+
if defined?(::Mongoid::VERSION) && ::Mongoid::VERSION >= "3"
|
|
22
|
+
index({ geocoder_options[:coordinates].to_sym => '2d' },
|
|
23
|
+
{:min => -180, :max => 180})
|
|
24
|
+
else
|
|
25
|
+
index [[ geocoder_options[:coordinates], '2d' ]],
|
|
26
|
+
:min => -180, :max => 180
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|