geocoder_plus 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/geocoder.rb +22 -36
- data/lib/geocoder_plus.rb +3 -7
- data/lib/geocoders/google_v3_geocoder.rb +21 -16
- data/lib/geocoders/yahoo_place_finder_geocoder.rb +17 -13
- metadata +37 -5
data/lib/geocoder.rb
CHANGED
@@ -1,58 +1,44 @@
|
|
1
1
|
module Geokit
|
2
2
|
module Geocoders
|
3
3
|
|
4
|
-
@@
|
5
|
-
@@
|
6
|
-
@@
|
7
|
-
|
4
|
+
@@api_cache = nil
|
5
|
+
@@api_cache_valid = 86400
|
6
|
+
@@api_cache_timeout = 5
|
7
|
+
|
8
8
|
__define_accessors
|
9
9
|
|
10
10
|
# The Geocoder base class which defines the interface to be used by all
|
11
11
|
# other geocoders.
|
12
12
|
class Geocoder
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
def self.cache_query
|
17
|
-
@_cache ||= initialize_cache
|
14
|
+
def self.normalize_address(addr)
|
15
|
+
addr.gsub(/\s*,\s*/, ',').strip
|
18
16
|
end
|
19
17
|
|
20
|
-
|
21
|
-
|
22
|
-
if (Geokit::Geocoders::cache && Geokit::Geocoders::hydra && self.respond_to?(:success_response?))
|
23
|
-
@cache = Geokit::Geocoders::cache
|
24
|
-
Geokit::Geocoders::hydra.cache_setter do |request|
|
25
|
-
@cache.set(request.cache_key, request.response, request.cache_timeout)
|
26
|
-
end
|
27
|
-
|
28
|
-
Geokit::Geocoders::hydra.cache_getter do |request|
|
29
|
-
@cache.get(request.cache_key) rescue nil
|
30
|
-
end
|
31
|
-
return true
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
18
|
+
private
|
19
|
+
|
35
20
|
# Wraps the geocoder call around a proxy if necessary.
|
36
21
|
# Use typhoeus and memcache if defined
|
37
|
-
def self.do_get(url)
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
:
|
42
|
-
:
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
else
|
22
|
+
def self.do_get(url)
|
23
|
+
if (defined?(APICache) && Geokit::Geocoders::api_cache)
|
24
|
+
body = APICache.get(url, {
|
25
|
+
:cache => Geokit::Geocoders::api_cache,
|
26
|
+
:valid => Geokit::Geocoders::api_cache_valid,
|
27
|
+
:timeout => Geokit::Geocoders::api_cache_timeout})
|
28
|
+
# fake Net::HTTPOK so that caching will work for all geocoders
|
29
|
+
res = Net::HTTPOK.new(1.0, 200, 'OK')
|
30
|
+
res.instance_variable_set(:@body, body)
|
31
|
+
res.instance_variable_set(:@read, true)
|
32
|
+
else
|
33
|
+
uri = URI.parse(url)
|
48
34
|
req = Net::HTTP::Get.new(url)
|
49
35
|
req.basic_auth(uri.user, uri.password) if uri.userinfo
|
50
36
|
res = Net::HTTP::Proxy(GeoKit::Geocoders::proxy_addr,
|
51
37
|
GeoKit::Geocoders::proxy_port,
|
52
38
|
GeoKit::Geocoders::proxy_user,
|
53
|
-
GeoKit::Geocoders::proxy_pass).start(uri.host, uri.port) { |http| http.get(uri.path + "?" + uri.query) }
|
54
|
-
return res
|
39
|
+
GeoKit::Geocoders::proxy_pass).start(uri.host, uri.port) { |http| http.get(uri.path + "?" + uri.query) }
|
55
40
|
end
|
41
|
+
return res
|
56
42
|
end
|
57
43
|
end
|
58
44
|
|
data/lib/geocoder_plus.rb
CHANGED
@@ -15,14 +15,10 @@ require 'geocoders/google_v3_geocoder'
|
|
15
15
|
|
16
16
|
module GeocoderPlus
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
# by default, try requiring Typhoeus -- if that works, use it
|
21
|
-
# if you have Typheous and don't want to use it (or want another service),
|
22
|
-
# you can run Koala.http_service = NetHTTPService (or MyHTTPService)
|
18
|
+
# by default, try requiring api_cache -- if that works, use it
|
23
19
|
begin
|
24
|
-
require '
|
20
|
+
require 'api_cache'
|
25
21
|
rescue LoadError
|
26
|
-
puts "
|
22
|
+
puts "APICache is not installed. Install it to enable query caching, gem install 'api_cache'"
|
27
23
|
end
|
28
24
|
end
|
@@ -7,11 +7,7 @@ module Geokit
|
|
7
7
|
private
|
8
8
|
|
9
9
|
def self.success_response?(res)
|
10
|
-
|
11
|
-
return res.success?
|
12
|
-
else
|
13
|
-
return res.is_a?(Net::HTTPSuccess)
|
14
|
-
end
|
10
|
+
res.is_a?(Net::HTTPSuccess) || res.is_a?(String)
|
15
11
|
end
|
16
12
|
|
17
13
|
def self.get_url(address, options={})
|
@@ -21,24 +17,33 @@ module Geokit
|
|
21
17
|
end
|
22
18
|
|
23
19
|
def self.do_geocode(address, options = {})
|
24
|
-
|
20
|
+
# debugger
|
21
|
+
geo_url = self.get_url(normalize_address(address), options)
|
25
22
|
logger.debug "Making Geocode request to: #{geo_url}"
|
26
|
-
res = self.call_geocoder_service(geo_url)
|
27
|
-
|
28
|
-
|
29
|
-
if success_response?(res)
|
30
|
-
|
31
|
-
else
|
32
|
-
|
33
|
-
end
|
23
|
+
res = self.call_geocoder_service(geo_url)
|
24
|
+
return GeoLoc.new if !res.is_a?(Net::HTTPSuccess)
|
25
|
+
logger.debug "Google V3 geocoding. Address: #{address}. Result: #{res}"
|
26
|
+
# if success_response?(res)
|
27
|
+
# return self.parse_body(res)
|
28
|
+
# else
|
29
|
+
# return GeoLoc.new
|
30
|
+
# end
|
31
|
+
return self.parse_body(res)
|
34
32
|
rescue Exception => e
|
35
33
|
logger.info "Caught an error during Google V3 geocoding call: #{e.inspect}"
|
36
34
|
return GeoLoc.new
|
37
35
|
end
|
38
36
|
|
39
|
-
def self.parse_body(
|
37
|
+
def self.parse_body(res)
|
38
|
+
# debugger
|
39
|
+
# if res.is_a?(String)
|
40
|
+
# body = Yajl::Parser.parse(res)
|
41
|
+
# else
|
42
|
+
body = Yajl::Parser.parse(res.body)
|
43
|
+
# end
|
44
|
+
|
40
45
|
if body['status'] != "OK"
|
41
|
-
if body['status'
|
46
|
+
if body['status'] == 'OVER_QUERY_LIMIT'
|
42
47
|
raise Geokit::TooManyQueriesError "Google returned OVER_QUERY_LIMIT: #{body}"
|
43
48
|
elsif body['status'] == 'ZERO_RESULTS'
|
44
49
|
logger.info "Found no results from google v3"
|
@@ -5,11 +5,7 @@ module Geokit
|
|
5
5
|
private
|
6
6
|
|
7
7
|
def self.success_response?(res)
|
8
|
-
|
9
|
-
return res.success?
|
10
|
-
else
|
11
|
-
return res.is_a?(Net::HTTPSuccess)
|
12
|
-
end
|
8
|
+
res.is_a?(Net::HTTPSuccess) || res.is_a?(String)
|
13
9
|
end
|
14
10
|
|
15
11
|
def self.get_url(address, options={})
|
@@ -28,7 +24,7 @@ module Geokit
|
|
28
24
|
logger.debug "Yahoo PlaceFinder reverse-geocoding. LL: #{latlng}. Result: #{res}"
|
29
25
|
|
30
26
|
if success_response?(res)
|
31
|
-
return self.parse_body(Yajl::Parser.parse(res
|
27
|
+
return self.parse_body(Yajl::Parser.parse(res))
|
32
28
|
else
|
33
29
|
return GeoLoc.new
|
34
30
|
end
|
@@ -36,20 +32,28 @@ module Geokit
|
|
36
32
|
|
37
33
|
def self.do_geocode(address, options={})
|
38
34
|
address_str = address.is_a?(GeoLoc) ? address.to_geocodeable_s : address
|
39
|
-
res = self.call_geocoder_service(self.get_url(address, options))
|
35
|
+
res = self.call_geocoder_service(self.get_url(normalize_address(address), options))
|
36
|
+
return GeoLoc.new if !res.is_a?(Net::HTTPSuccess)
|
40
37
|
logger.debug "Yahoo PlaceFinder geocoding. Address: #{address}. Result: #{res}"
|
41
38
|
|
42
|
-
if success_response?(res)
|
43
|
-
|
44
|
-
else
|
45
|
-
|
46
|
-
end
|
39
|
+
# if success_response?(res)
|
40
|
+
# return self.parse_body(res)
|
41
|
+
# else
|
42
|
+
# return GeoLoc.new
|
43
|
+
# end
|
44
|
+
return self.parse_body(res)
|
47
45
|
rescue
|
48
46
|
logger.info "Caught an error during Yahoo PlaceFinder geocoding call: "+$!
|
49
47
|
return GeoLoc.new
|
50
48
|
end
|
51
49
|
|
52
|
-
def self.parse_body(
|
50
|
+
def self.parse_body(res)
|
51
|
+
# if res.is_a?(String)
|
52
|
+
# body = Yajl::Parser.parse(res)
|
53
|
+
# else
|
54
|
+
body = Yajl::Parser.parse(res.body)
|
55
|
+
# end
|
56
|
+
|
53
57
|
count = body['query']['count']
|
54
58
|
if (count == 1)
|
55
59
|
return extract_place(body['query']['results']['Result'])
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geocoder_plus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 4
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.4.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Fajar A B
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-04-
|
18
|
+
date: 2011-04-24 00:00:00 +07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -124,7 +124,39 @@ dependencies:
|
|
124
124
|
name: rcov
|
125
125
|
prerelease: false
|
126
126
|
type: :development
|
127
|
-
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ~>
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
hash: 23
|
134
|
+
segments:
|
135
|
+
- 0
|
136
|
+
- 2
|
137
|
+
- 0
|
138
|
+
version: 0.2.0
|
139
|
+
version_requirements: *id008
|
140
|
+
name: api_cache
|
141
|
+
prerelease: false
|
142
|
+
type: :development
|
143
|
+
- !ruby/object:Gem::Dependency
|
144
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ~>
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
hash: 7
|
150
|
+
segments:
|
151
|
+
- 0
|
152
|
+
- 6
|
153
|
+
- 0
|
154
|
+
version: 0.6.0
|
155
|
+
version_requirements: *id009
|
156
|
+
name: moneta
|
157
|
+
prerelease: false
|
158
|
+
type: :development
|
159
|
+
description: This gem consists two additional geocoders for geokit, Yahoo! PlaceFinder and Google V3. And add support for caching using api_caching gem.
|
128
160
|
email: fajar.ab@gmail.com
|
129
161
|
executables: []
|
130
162
|
|