geocoder 1.6.7 → 1.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +29 -0
- data/README.md +323 -205
- data/examples/app_defined_lookup_services.rb +22 -0
- data/lib/generators/geocoder/config/templates/initializer.rb +7 -1
- data/lib/geocoder/cache.rb +12 -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 +9 -3
- data/lib/geocoder/ip_address.rb +6 -0
- data/lib/geocoder/lookup.rb +29 -4
- data/lib/geocoder/lookups/amazon_location_service.rb +54 -0
- data/lib/geocoder/lookups/base.rb +8 -2
- data/lib/geocoder/lookups/bing.rb +1 -1
- data/lib/geocoder/lookups/freegeoip.rb +8 -6
- data/lib/geocoder/lookups/geoapify.rb +72 -0
- data/lib/geocoder/lookups/geoip2.rb +4 -0
- data/lib/geocoder/lookups/ip2location.rb +10 -6
- 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/melissa_street.rb +41 -0
- data/lib/geocoder/lookups/photon.rb +89 -0
- data/lib/geocoder/results/amazon_location_service.rb +57 -0
- data/lib/geocoder/results/esri.rb +5 -2
- data/lib/geocoder/results/geoapify.rb +179 -0
- data/lib/geocoder/results/ipqualityscore.rb +54 -0
- data/lib/geocoder/results/mapbox.rb +10 -4
- data/lib/geocoder/results/melissa_street.rb +46 -0
- data/lib/geocoder/results/nominatim.rb +24 -16
- data/lib/geocoder/results/photon.rb +119 -0
- data/lib/geocoder/version.rb +1 -1
- metadata +16 -4
- data/examples/autoexpire_cache_dalli.rb +0 -62
- data/examples/autoexpire_cache_redis.rb +0 -30
|
@@ -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
|
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.7.5
|
|
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-03-14 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
|
|
@@ -51,6 +53,7 @@ files:
|
|
|
51
53
|
- lib/geocoder/lookup.rb
|
|
52
54
|
- lib/geocoder/lookups/abstract_api.rb
|
|
53
55
|
- lib/geocoder/lookups/amap.rb
|
|
56
|
+
- lib/geocoder/lookups/amazon_location_service.rb
|
|
54
57
|
- lib/geocoder/lookups/baidu.rb
|
|
55
58
|
- lib/geocoder/lookups/baidu_ip.rb
|
|
56
59
|
- lib/geocoder/lookups/ban_data_gouv_fr.rb
|
|
@@ -60,6 +63,7 @@ files:
|
|
|
60
63
|
- lib/geocoder/lookups/dstk.rb
|
|
61
64
|
- lib/geocoder/lookups/esri.rb
|
|
62
65
|
- lib/geocoder/lookups/freegeoip.rb
|
|
66
|
+
- lib/geocoder/lookups/geoapify.rb
|
|
63
67
|
- lib/geocoder/lookups/geocoder_ca.rb
|
|
64
68
|
- lib/geocoder/lookups/geocodio.rb
|
|
65
69
|
- lib/geocoder/lookups/geoip2.rb
|
|
@@ -74,6 +78,7 @@ files:
|
|
|
74
78
|
- lib/geocoder/lookups/ipdata_co.rb
|
|
75
79
|
- lib/geocoder/lookups/ipgeolocation.rb
|
|
76
80
|
- lib/geocoder/lookups/ipinfo_io.rb
|
|
81
|
+
- lib/geocoder/lookups/ipqualityscore.rb
|
|
77
82
|
- lib/geocoder/lookups/ipregistry.rb
|
|
78
83
|
- lib/geocoder/lookups/ipstack.rb
|
|
79
84
|
- lib/geocoder/lookups/latlon.rb
|
|
@@ -83,11 +88,13 @@ files:
|
|
|
83
88
|
- lib/geocoder/lookups/maxmind.rb
|
|
84
89
|
- lib/geocoder/lookups/maxmind_geoip2.rb
|
|
85
90
|
- lib/geocoder/lookups/maxmind_local.rb
|
|
91
|
+
- lib/geocoder/lookups/melissa_street.rb
|
|
86
92
|
- lib/geocoder/lookups/nationaal_georegister_nl.rb
|
|
87
93
|
- lib/geocoder/lookups/nominatim.rb
|
|
88
94
|
- lib/geocoder/lookups/opencagedata.rb
|
|
89
95
|
- lib/geocoder/lookups/osmnames.rb
|
|
90
96
|
- lib/geocoder/lookups/pelias.rb
|
|
97
|
+
- lib/geocoder/lookups/photon.rb
|
|
91
98
|
- lib/geocoder/lookups/pickpoint.rb
|
|
92
99
|
- lib/geocoder/lookups/pointpin.rb
|
|
93
100
|
- lib/geocoder/lookups/postcode_anywhere_uk.rb
|
|
@@ -108,6 +115,7 @@ files:
|
|
|
108
115
|
- lib/geocoder/request.rb
|
|
109
116
|
- lib/geocoder/results/abstract_api.rb
|
|
110
117
|
- lib/geocoder/results/amap.rb
|
|
118
|
+
- lib/geocoder/results/amazon_location_service.rb
|
|
111
119
|
- lib/geocoder/results/baidu.rb
|
|
112
120
|
- lib/geocoder/results/baidu_ip.rb
|
|
113
121
|
- lib/geocoder/results/ban_data_gouv_fr.rb
|
|
@@ -117,6 +125,7 @@ files:
|
|
|
117
125
|
- lib/geocoder/results/dstk.rb
|
|
118
126
|
- lib/geocoder/results/esri.rb
|
|
119
127
|
- lib/geocoder/results/freegeoip.rb
|
|
128
|
+
- lib/geocoder/results/geoapify.rb
|
|
120
129
|
- lib/geocoder/results/geocoder_ca.rb
|
|
121
130
|
- lib/geocoder/results/geocodio.rb
|
|
122
131
|
- lib/geocoder/results/geoip2.rb
|
|
@@ -131,6 +140,7 @@ files:
|
|
|
131
140
|
- lib/geocoder/results/ipdata_co.rb
|
|
132
141
|
- lib/geocoder/results/ipgeolocation.rb
|
|
133
142
|
- lib/geocoder/results/ipinfo_io.rb
|
|
143
|
+
- lib/geocoder/results/ipqualityscore.rb
|
|
134
144
|
- lib/geocoder/results/ipregistry.rb
|
|
135
145
|
- lib/geocoder/results/ipstack.rb
|
|
136
146
|
- lib/geocoder/results/latlon.rb
|
|
@@ -140,11 +150,13 @@ files:
|
|
|
140
150
|
- lib/geocoder/results/maxmind.rb
|
|
141
151
|
- lib/geocoder/results/maxmind_geoip2.rb
|
|
142
152
|
- lib/geocoder/results/maxmind_local.rb
|
|
153
|
+
- lib/geocoder/results/melissa_street.rb
|
|
143
154
|
- lib/geocoder/results/nationaal_georegister_nl.rb
|
|
144
155
|
- lib/geocoder/results/nominatim.rb
|
|
145
156
|
- lib/geocoder/results/opencagedata.rb
|
|
146
157
|
- lib/geocoder/results/osmnames.rb
|
|
147
158
|
- lib/geocoder/results/pelias.rb
|
|
159
|
+
- lib/geocoder/results/photon.rb
|
|
148
160
|
- lib/geocoder/results/pickpoint.rb
|
|
149
161
|
- lib/geocoder/results/pointpin.rb
|
|
150
162
|
- lib/geocoder/results/postcode_anywhere_uk.rb
|
|
@@ -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))
|