geocoder 1.6.3 → 1.8.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 +4 -4
- data/CHANGELOG.md +61 -0
- data/LICENSE +1 -1
- data/README.md +329 -233
- data/examples/app_defined_lookup_services.rb +22 -0
- data/lib/generators/geocoder/config/templates/initializer.rb +6 -1
- data/lib/geocoder/cache.rb +16 -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/configuration.rb +19 -5
- data/lib/geocoder/configuration_hash.rb +4 -4
- data/lib/geocoder/ip_address.rb +6 -0
- data/lib/geocoder/lookup.rb +32 -4
- data/lib/geocoder/lookups/abstract_api.rb +46 -0
- data/lib/geocoder/lookups/amap.rb +2 -2
- data/lib/geocoder/lookups/amazon_location_service.rb +54 -0
- data/lib/geocoder/lookups/ban_data_gouv_fr.rb +1 -1
- data/lib/geocoder/lookups/base.rb +2 -1
- data/lib/geocoder/lookups/bing.rb +1 -1
- data/lib/geocoder/lookups/esri.rb +4 -0
- data/lib/geocoder/lookups/freegeoip.rb +8 -6
- data/lib/geocoder/lookups/geoapify.rb +78 -0
- data/lib/geocoder/lookups/geocodio.rb +1 -1
- data/lib/geocoder/lookups/geoip2.rb +4 -0
- data/lib/geocoder/lookups/geoportail_lu.rb +1 -1
- data/lib/geocoder/lookups/google.rb +7 -2
- data/lib/geocoder/lookups/google_places_details.rb +26 -12
- data/lib/geocoder/lookups/google_places_search.rb +45 -2
- data/lib/geocoder/lookups/google_premier.rb +4 -0
- data/lib/geocoder/lookups/here.rb +25 -20
- data/lib/geocoder/lookups/ip2location.rb +10 -6
- data/lib/geocoder/lookups/ipbase.rb +49 -0
- data/lib/geocoder/lookups/ipdata_co.rb +1 -1
- data/lib/geocoder/lookups/ipqualityscore.rb +50 -0
- data/lib/geocoder/lookups/location_iq.rb +5 -1
- data/lib/geocoder/lookups/maxmind_local.rb +7 -1
- data/lib/geocoder/lookups/melissa_street.rb +41 -0
- data/lib/geocoder/lookups/photon.rb +89 -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 +1 -1
- data/lib/geocoder/lookups/yandex.rb +3 -3
- data/lib/geocoder/results/abstract_api.rb +146 -0
- data/lib/geocoder/results/amazon_location_service.rb +57 -0
- data/lib/geocoder/results/ban_data_gouv_fr.rb +26 -1
- data/lib/geocoder/results/db_ip_com.rb +1 -1
- data/lib/geocoder/results/esri.rb +5 -2
- data/lib/geocoder/results/geoapify.rb +179 -0
- data/lib/geocoder/results/here.rb +20 -25
- data/lib/geocoder/results/ipbase.rb +40 -0
- data/lib/geocoder/results/ipqualityscore.rb +54 -0
- data/lib/geocoder/results/ipregistry.rb +4 -8
- data/lib/geocoder/results/mapbox.rb +10 -4
- data/lib/geocoder/results/melissa_street.rb +46 -0
- data/lib/geocoder/results/nationaal_georegister_nl.rb +1 -1
- data/lib/geocoder/results/nominatim.rb +27 -15
- data/lib/geocoder/results/photon.rb +119 -0
- data/lib/geocoder/results/twogis.rb +76 -0
- data/lib/geocoder/util.rb +29 -0
- data/lib/geocoder/version.rb +1 -1
- metadata +24 -6
- data/examples/autoexpire_cache_dalli.rb +0 -62
- data/examples/autoexpire_cache_redis.rb +0 -30
- data/lib/hash_recursive_merge.rb +0 -73
@@ -23,7 +23,10 @@ module Geocoder::Result
|
|
23
23
|
context_part('region')
|
24
24
|
end
|
25
25
|
|
26
|
-
|
26
|
+
def state_code
|
27
|
+
value = context_part('region', 'short_code')
|
28
|
+
value.split('-').last unless value.nil?
|
29
|
+
end
|
27
30
|
|
28
31
|
def postal_code
|
29
32
|
context_part('postcode')
|
@@ -33,7 +36,10 @@ module Geocoder::Result
|
|
33
36
|
context_part('country')
|
34
37
|
end
|
35
38
|
|
36
|
-
|
39
|
+
def country_code
|
40
|
+
value = context_part('country', 'short_code')
|
41
|
+
value.upcase unless value.nil?
|
42
|
+
end
|
37
43
|
|
38
44
|
def neighborhood
|
39
45
|
context_part('neighborhood')
|
@@ -45,8 +51,8 @@ module Geocoder::Result
|
|
45
51
|
|
46
52
|
private
|
47
53
|
|
48
|
-
def context_part(name)
|
49
|
-
context.
|
54
|
+
def context_part(name, key = 'text')
|
55
|
+
(context.detect { |c| c['id'] =~ Regexp.new(name) } || {})[key]
|
50
56
|
end
|
51
57
|
|
52
58
|
def context
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class MelissaStreet < Base
|
5
|
+
def address(format = :full)
|
6
|
+
@data['FormattedAddress']
|
7
|
+
end
|
8
|
+
|
9
|
+
def street_address
|
10
|
+
@data['AddressLine1']
|
11
|
+
end
|
12
|
+
|
13
|
+
def suffix
|
14
|
+
@data['ThoroughfareTrailingType']
|
15
|
+
end
|
16
|
+
|
17
|
+
def number
|
18
|
+
@data['PremisesNumber']
|
19
|
+
end
|
20
|
+
|
21
|
+
def city
|
22
|
+
@data['Locality']
|
23
|
+
end
|
24
|
+
|
25
|
+
def state_code
|
26
|
+
@data['AdministrativeArea']
|
27
|
+
end
|
28
|
+
alias_method :state, :state_code
|
29
|
+
|
30
|
+
def country
|
31
|
+
@data['CountryName']
|
32
|
+
end
|
33
|
+
|
34
|
+
def country_code
|
35
|
+
@data['CountryISO3166_1_Alpha2']
|
36
|
+
end
|
37
|
+
|
38
|
+
def postal_code
|
39
|
+
@data['PostalCode']
|
40
|
+
end
|
41
|
+
|
42
|
+
def coordinates
|
43
|
+
[@data['Latitude'].to_f, @data['Longitude'].to_f]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -4,12 +4,12 @@ module Geocoder::Result
|
|
4
4
|
class Nominatim < Base
|
5
5
|
|
6
6
|
def poi
|
7
|
-
return
|
7
|
+
return address_data[place_type] if address_data.key?(place_type)
|
8
8
|
return nil
|
9
9
|
end
|
10
10
|
|
11
11
|
def house_number
|
12
|
-
|
12
|
+
address_data['house_number']
|
13
13
|
end
|
14
14
|
|
15
15
|
def address
|
@@ -18,65 +18,71 @@ module Geocoder::Result
|
|
18
18
|
|
19
19
|
def street
|
20
20
|
%w[road pedestrian highway].each do |key|
|
21
|
-
return
|
21
|
+
return address_data[key] if address_data.key?(key)
|
22
22
|
end
|
23
23
|
return nil
|
24
24
|
end
|
25
25
|
|
26
26
|
def city
|
27
27
|
%w[city town village hamlet].each do |key|
|
28
|
-
return
|
28
|
+
return address_data[key] if address_data.key?(key)
|
29
29
|
end
|
30
30
|
return nil
|
31
31
|
end
|
32
32
|
|
33
33
|
def village
|
34
|
-
|
34
|
+
address_data['village']
|
35
35
|
end
|
36
36
|
|
37
37
|
def town
|
38
|
-
|
38
|
+
address_data['town']
|
39
39
|
end
|
40
40
|
|
41
41
|
def state
|
42
|
-
|
42
|
+
address_data['state']
|
43
43
|
end
|
44
44
|
|
45
45
|
alias_method :state_code, :state
|
46
46
|
|
47
47
|
def postal_code
|
48
|
-
|
48
|
+
address_data['postcode']
|
49
49
|
end
|
50
50
|
|
51
51
|
def county
|
52
|
-
|
52
|
+
address_data['county']
|
53
53
|
end
|
54
54
|
|
55
55
|
def country
|
56
|
-
|
56
|
+
address_data['country']
|
57
57
|
end
|
58
58
|
|
59
59
|
def country_code
|
60
|
-
|
60
|
+
address_data['country_code']
|
61
61
|
end
|
62
62
|
|
63
63
|
def suburb
|
64
|
-
|
64
|
+
address_data['suburb']
|
65
65
|
end
|
66
66
|
|
67
67
|
def city_district
|
68
|
-
|
68
|
+
address_data['city_district']
|
69
69
|
end
|
70
70
|
|
71
71
|
def state_district
|
72
|
-
|
72
|
+
address_data['state_district']
|
73
73
|
end
|
74
74
|
|
75
75
|
def neighbourhood
|
76
|
-
|
76
|
+
address_data['neighbourhood']
|
77
|
+
end
|
78
|
+
|
79
|
+
def municipality
|
80
|
+
address_data['municipality']
|
77
81
|
end
|
78
82
|
|
79
83
|
def coordinates
|
84
|
+
return [] unless @data['lat'] && @data['lon']
|
85
|
+
|
80
86
|
[@data['lat'].to_f, @data['lon'].to_f]
|
81
87
|
end
|
82
88
|
|
@@ -105,5 +111,11 @@ module Geocoder::Result
|
|
105
111
|
end
|
106
112
|
end
|
107
113
|
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
def address_data
|
118
|
+
@data['address'] || {}
|
119
|
+
end
|
108
120
|
end
|
109
121
|
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'geocoder/results/base'
|
2
|
+
|
3
|
+
module Geocoder::Result
|
4
|
+
class Photon < Base
|
5
|
+
def name
|
6
|
+
properties['name']
|
7
|
+
end
|
8
|
+
|
9
|
+
def address(_format = :full)
|
10
|
+
parts = []
|
11
|
+
parts << name if name
|
12
|
+
parts << street_address if street_address
|
13
|
+
parts << city
|
14
|
+
parts << state if state
|
15
|
+
parts << postal_code
|
16
|
+
parts << country
|
17
|
+
|
18
|
+
parts.join(', ')
|
19
|
+
end
|
20
|
+
|
21
|
+
def street_address
|
22
|
+
return unless street
|
23
|
+
return street unless house_number
|
24
|
+
|
25
|
+
"#{house_number} #{street}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def house_number
|
29
|
+
properties['housenumber']
|
30
|
+
end
|
31
|
+
|
32
|
+
def street
|
33
|
+
properties['street']
|
34
|
+
end
|
35
|
+
|
36
|
+
def postal_code
|
37
|
+
properties['postcode']
|
38
|
+
end
|
39
|
+
|
40
|
+
def city
|
41
|
+
properties['city']
|
42
|
+
end
|
43
|
+
|
44
|
+
def state
|
45
|
+
properties['state']
|
46
|
+
end
|
47
|
+
|
48
|
+
def state_code
|
49
|
+
''
|
50
|
+
end
|
51
|
+
|
52
|
+
def country
|
53
|
+
properties['country']
|
54
|
+
end
|
55
|
+
|
56
|
+
def country_code
|
57
|
+
''
|
58
|
+
end
|
59
|
+
|
60
|
+
def coordinates
|
61
|
+
return unless geometry
|
62
|
+
return unless geometry[:coordinates]
|
63
|
+
|
64
|
+
geometry[:coordinates].reverse
|
65
|
+
end
|
66
|
+
|
67
|
+
def geometry
|
68
|
+
return unless data['geometry']
|
69
|
+
|
70
|
+
symbol_hash data['geometry']
|
71
|
+
end
|
72
|
+
|
73
|
+
def bounds
|
74
|
+
properties['extent']
|
75
|
+
end
|
76
|
+
|
77
|
+
# Type of the result (OSM object type), one of:
|
78
|
+
#
|
79
|
+
# :node
|
80
|
+
# :way
|
81
|
+
# :relation
|
82
|
+
#
|
83
|
+
def type
|
84
|
+
{
|
85
|
+
'N' => :node,
|
86
|
+
'W' => :way,
|
87
|
+
'R' => :relation
|
88
|
+
}[properties['osm_type']]
|
89
|
+
end
|
90
|
+
|
91
|
+
def osm_id
|
92
|
+
properties['osm_id']
|
93
|
+
end
|
94
|
+
|
95
|
+
# See: https://wiki.openstreetmap.org/wiki/Tags
|
96
|
+
def osm_tag
|
97
|
+
return unless properties['osm_key']
|
98
|
+
return properties['osm_key'] unless properties['osm_value']
|
99
|
+
|
100
|
+
"#{properties['osm_key']}=#{properties['osm_value']}"
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
def properties
|
106
|
+
@properties ||= data['properties'] || {}
|
107
|
+
end
|
108
|
+
|
109
|
+
def symbol_hash(orig_hash)
|
110
|
+
{}.tap do |result|
|
111
|
+
orig_hash.each_key do |key|
|
112
|
+
next unless orig_hash[key]
|
113
|
+
|
114
|
+
result[key.to_sym] = orig_hash[key]
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
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,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Geocoder
|
4
|
+
module Util
|
5
|
+
#
|
6
|
+
# Recursive version of Hash#merge!
|
7
|
+
#
|
8
|
+
# Adds the contents of +h2+ to +h1+,
|
9
|
+
# merging entries in +h1+ with duplicate keys with those from +h2+.
|
10
|
+
#
|
11
|
+
# Compared with Hash#merge!, this method supports nested hashes.
|
12
|
+
# When both +h1+ and +h2+ contains an entry with the same key,
|
13
|
+
# it merges and returns the values from both hashes.
|
14
|
+
#
|
15
|
+
# h1 = {"a" => 100, "b" => 200, "c" => {"c1" => 12, "c2" => 14}}
|
16
|
+
# h2 = {"b" => 254, "c" => {"c1" => 16, "c3" => 94}}
|
17
|
+
# recursive_hash_merge(h1, h2) #=> {"a" => 100, "b" => 254, "c" => {"c1" => 16, "c2" => 14, "c3" => 94}}
|
18
|
+
#
|
19
|
+
# Simply using Hash#merge! would return
|
20
|
+
#
|
21
|
+
# h1.merge!(h2) #=> {"a" => 100, "b" = >254, "c" => {"c1" => 16, "c3" => 94}}
|
22
|
+
#
|
23
|
+
def self.recursive_hash_merge(h1, h2)
|
24
|
+
h1.merge!(h2) do |_key, oldval, newval|
|
25
|
+
oldval.class == h1.class ? self.recursive_hash_merge(oldval, newval) : newval
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/geocoder/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geocoder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Reisner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Object geocoding (by street or IP address), reverse geocoding (coordinates
|
14
14
|
to street address), distance queries for ActiveRecord and Mongoid, result caching,
|
@@ -25,8 +25,7 @@ files:
|
|
25
25
|
- README.md
|
26
26
|
- bin/console
|
27
27
|
- bin/geocode
|
28
|
-
- examples/
|
29
|
-
- examples/autoexpire_cache_redis.rb
|
28
|
+
- examples/app_defined_lookup_services.rb
|
30
29
|
- examples/cache_bypass.rb
|
31
30
|
- examples/reverse_geocode_job.rb
|
32
31
|
- lib/easting_northing.rb
|
@@ -39,6 +38,9 @@ files:
|
|
39
38
|
- lib/generators/geocoder/migration_version.rb
|
40
39
|
- lib/geocoder.rb
|
41
40
|
- lib/geocoder/cache.rb
|
41
|
+
- lib/geocoder/cache_stores/base.rb
|
42
|
+
- lib/geocoder/cache_stores/generic.rb
|
43
|
+
- lib/geocoder/cache_stores/redis.rb
|
42
44
|
- lib/geocoder/calculations.rb
|
43
45
|
- lib/geocoder/cli.rb
|
44
46
|
- lib/geocoder/configuration.rb
|
@@ -49,7 +51,9 @@ files:
|
|
49
51
|
- lib/geocoder/kernel_logger.rb
|
50
52
|
- lib/geocoder/logger.rb
|
51
53
|
- lib/geocoder/lookup.rb
|
54
|
+
- lib/geocoder/lookups/abstract_api.rb
|
52
55
|
- lib/geocoder/lookups/amap.rb
|
56
|
+
- lib/geocoder/lookups/amazon_location_service.rb
|
53
57
|
- lib/geocoder/lookups/baidu.rb
|
54
58
|
- lib/geocoder/lookups/baidu_ip.rb
|
55
59
|
- lib/geocoder/lookups/ban_data_gouv_fr.rb
|
@@ -59,6 +63,7 @@ files:
|
|
59
63
|
- lib/geocoder/lookups/dstk.rb
|
60
64
|
- lib/geocoder/lookups/esri.rb
|
61
65
|
- lib/geocoder/lookups/freegeoip.rb
|
66
|
+
- lib/geocoder/lookups/geoapify.rb
|
62
67
|
- lib/geocoder/lookups/geocoder_ca.rb
|
63
68
|
- lib/geocoder/lookups/geocodio.rb
|
64
69
|
- lib/geocoder/lookups/geoip2.rb
|
@@ -70,9 +75,11 @@ files:
|
|
70
75
|
- lib/geocoder/lookups/here.rb
|
71
76
|
- lib/geocoder/lookups/ip2location.rb
|
72
77
|
- lib/geocoder/lookups/ipapi_com.rb
|
78
|
+
- lib/geocoder/lookups/ipbase.rb
|
73
79
|
- lib/geocoder/lookups/ipdata_co.rb
|
74
80
|
- lib/geocoder/lookups/ipgeolocation.rb
|
75
81
|
- lib/geocoder/lookups/ipinfo_io.rb
|
82
|
+
- lib/geocoder/lookups/ipqualityscore.rb
|
76
83
|
- lib/geocoder/lookups/ipregistry.rb
|
77
84
|
- lib/geocoder/lookups/ipstack.rb
|
78
85
|
- lib/geocoder/lookups/latlon.rb
|
@@ -82,11 +89,13 @@ files:
|
|
82
89
|
- lib/geocoder/lookups/maxmind.rb
|
83
90
|
- lib/geocoder/lookups/maxmind_geoip2.rb
|
84
91
|
- lib/geocoder/lookups/maxmind_local.rb
|
92
|
+
- lib/geocoder/lookups/melissa_street.rb
|
85
93
|
- lib/geocoder/lookups/nationaal_georegister_nl.rb
|
86
94
|
- lib/geocoder/lookups/nominatim.rb
|
87
95
|
- lib/geocoder/lookups/opencagedata.rb
|
88
96
|
- lib/geocoder/lookups/osmnames.rb
|
89
97
|
- lib/geocoder/lookups/pelias.rb
|
98
|
+
- lib/geocoder/lookups/photon.rb
|
90
99
|
- lib/geocoder/lookups/pickpoint.rb
|
91
100
|
- lib/geocoder/lookups/pointpin.rb
|
92
101
|
- lib/geocoder/lookups/postcode_anywhere_uk.rb
|
@@ -95,6 +104,7 @@ files:
|
|
95
104
|
- lib/geocoder/lookups/telize.rb
|
96
105
|
- lib/geocoder/lookups/tencent.rb
|
97
106
|
- lib/geocoder/lookups/test.rb
|
107
|
+
- lib/geocoder/lookups/twogis.rb
|
98
108
|
- lib/geocoder/lookups/uk_ordnance_survey_names.rb
|
99
109
|
- lib/geocoder/lookups/yandex.rb
|
100
110
|
- lib/geocoder/models/active_record.rb
|
@@ -105,7 +115,9 @@ files:
|
|
105
115
|
- lib/geocoder/query.rb
|
106
116
|
- lib/geocoder/railtie.rb
|
107
117
|
- lib/geocoder/request.rb
|
118
|
+
- lib/geocoder/results/abstract_api.rb
|
108
119
|
- lib/geocoder/results/amap.rb
|
120
|
+
- lib/geocoder/results/amazon_location_service.rb
|
109
121
|
- lib/geocoder/results/baidu.rb
|
110
122
|
- lib/geocoder/results/baidu_ip.rb
|
111
123
|
- lib/geocoder/results/ban_data_gouv_fr.rb
|
@@ -115,6 +127,7 @@ files:
|
|
115
127
|
- lib/geocoder/results/dstk.rb
|
116
128
|
- lib/geocoder/results/esri.rb
|
117
129
|
- lib/geocoder/results/freegeoip.rb
|
130
|
+
- lib/geocoder/results/geoapify.rb
|
118
131
|
- lib/geocoder/results/geocoder_ca.rb
|
119
132
|
- lib/geocoder/results/geocodio.rb
|
120
133
|
- lib/geocoder/results/geoip2.rb
|
@@ -126,9 +139,11 @@ files:
|
|
126
139
|
- lib/geocoder/results/here.rb
|
127
140
|
- lib/geocoder/results/ip2location.rb
|
128
141
|
- lib/geocoder/results/ipapi_com.rb
|
142
|
+
- lib/geocoder/results/ipbase.rb
|
129
143
|
- lib/geocoder/results/ipdata_co.rb
|
130
144
|
- lib/geocoder/results/ipgeolocation.rb
|
131
145
|
- lib/geocoder/results/ipinfo_io.rb
|
146
|
+
- lib/geocoder/results/ipqualityscore.rb
|
132
147
|
- lib/geocoder/results/ipregistry.rb
|
133
148
|
- lib/geocoder/results/ipstack.rb
|
134
149
|
- lib/geocoder/results/latlon.rb
|
@@ -138,11 +153,13 @@ files:
|
|
138
153
|
- lib/geocoder/results/maxmind.rb
|
139
154
|
- lib/geocoder/results/maxmind_geoip2.rb
|
140
155
|
- lib/geocoder/results/maxmind_local.rb
|
156
|
+
- lib/geocoder/results/melissa_street.rb
|
141
157
|
- lib/geocoder/results/nationaal_georegister_nl.rb
|
142
158
|
- lib/geocoder/results/nominatim.rb
|
143
159
|
- lib/geocoder/results/opencagedata.rb
|
144
160
|
- lib/geocoder/results/osmnames.rb
|
145
161
|
- lib/geocoder/results/pelias.rb
|
162
|
+
- lib/geocoder/results/photon.rb
|
146
163
|
- lib/geocoder/results/pickpoint.rb
|
147
164
|
- lib/geocoder/results/pointpin.rb
|
148
165
|
- lib/geocoder/results/postcode_anywhere_uk.rb
|
@@ -151,6 +168,7 @@ files:
|
|
151
168
|
- lib/geocoder/results/telize.rb
|
152
169
|
- lib/geocoder/results/tencent.rb
|
153
170
|
- lib/geocoder/results/test.rb
|
171
|
+
- lib/geocoder/results/twogis.rb
|
154
172
|
- lib/geocoder/results/uk_ordnance_survey_names.rb
|
155
173
|
- lib/geocoder/results/yandex.rb
|
156
174
|
- lib/geocoder/sql.rb
|
@@ -159,8 +177,8 @@ files:
|
|
159
177
|
- lib/geocoder/stores/mongo_base.rb
|
160
178
|
- lib/geocoder/stores/mongo_mapper.rb
|
161
179
|
- lib/geocoder/stores/mongoid.rb
|
180
|
+
- lib/geocoder/util.rb
|
162
181
|
- lib/geocoder/version.rb
|
163
|
-
- lib/hash_recursive_merge.rb
|
164
182
|
- lib/maxmind_database.rb
|
165
183
|
- lib/tasks/geocoder.rake
|
166
184
|
- lib/tasks/maxmind.rake
|
@@ -185,7 +203,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
185
203
|
- !ruby/object:Gem::Version
|
186
204
|
version: '0'
|
187
205
|
requirements: []
|
188
|
-
rubygems_version: 3.1.
|
206
|
+
rubygems_version: 3.1.6
|
189
207
|
signing_key:
|
190
208
|
specification_version: 4
|
191
209
|
summary: Complete geocoding solution for Ruby.
|
@@ -1,62 +0,0 @@
|
|
1
|
-
# This class implements a cache with simple delegation to the the Dalli Memcached client
|
2
|
-
# https://github.com/mperham/dalli
|
3
|
-
#
|
4
|
-
# A TTL is set on initialization
|
5
|
-
|
6
|
-
class AutoexpireCacheDalli
|
7
|
-
def initialize(store, ttl = 86400)
|
8
|
-
@store = store
|
9
|
-
@keys = 'GeocoderDalliClientKeys'
|
10
|
-
@ttl = ttl
|
11
|
-
end
|
12
|
-
|
13
|
-
def [](url)
|
14
|
-
res = @store.get(url)
|
15
|
-
res = YAML::load(res) if res.present?
|
16
|
-
res
|
17
|
-
end
|
18
|
-
|
19
|
-
def []=(url, value)
|
20
|
-
if value.nil?
|
21
|
-
del(url)
|
22
|
-
else
|
23
|
-
key_cache_add(url) if @store.add(url, YAML::dump(value), @ttl)
|
24
|
-
end
|
25
|
-
value
|
26
|
-
end
|
27
|
-
|
28
|
-
def keys
|
29
|
-
key_cache
|
30
|
-
end
|
31
|
-
|
32
|
-
def del(url)
|
33
|
-
key_cache_delete(url) if @store.delete(url)
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def key_cache
|
39
|
-
the_keys = @store.get(@keys)
|
40
|
-
if the_keys.nil?
|
41
|
-
@store.add(@keys, YAML::dump([]))
|
42
|
-
[]
|
43
|
-
else
|
44
|
-
YAML::load(the_keys)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def key_cache_add(key)
|
49
|
-
@store.replace(@keys, YAML::dump(key_cache << key))
|
50
|
-
end
|
51
|
-
|
52
|
-
def key_cache_delete(key)
|
53
|
-
tmp = key_cache
|
54
|
-
tmp.delete(key)
|
55
|
-
@store.replace(@keys, YAML::dump(tmp))
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
# Here Dalli is set up as on Heroku using the Memcachier gem.
|
60
|
-
# https://devcenter.heroku.com/articles/memcachier#ruby
|
61
|
-
# On other setups you might have to specify your Memcached server in Dalli::Client.new
|
62
|
-
Geocoder.configure(:cache => AutoexpireCacheDalli.new(Dalli::Client.new))
|
@@ -1,30 +0,0 @@
|
|
1
|
-
# This class implements a cache with simple delegation to the Redis store, but
|
2
|
-
# when it creates a key/value pair, it also sends an EXPIRE command with a TTL.
|
3
|
-
# It should be fairly simple to do the same thing with Memcached.
|
4
|
-
# Alternatively, this class could inherit from Redis, which would make most
|
5
|
-
# of the below methods unnecessary.
|
6
|
-
class AutoexpireCacheRedis
|
7
|
-
def initialize(store, ttl = 86400)
|
8
|
-
@store = store
|
9
|
-
@ttl = ttl
|
10
|
-
end
|
11
|
-
|
12
|
-
def [](url)
|
13
|
-
@store.get(url)
|
14
|
-
end
|
15
|
-
|
16
|
-
def []=(url, value)
|
17
|
-
@store.set(url, value)
|
18
|
-
@store.expire(url, @ttl)
|
19
|
-
end
|
20
|
-
|
21
|
-
def keys
|
22
|
-
@store.keys
|
23
|
-
end
|
24
|
-
|
25
|
-
def del(url)
|
26
|
-
@store.del(url)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
Geocoder.configure(:cache => AutoexpireCacheRedis.new(Redis.new))
|