geocoder_plus 0.2.0 → 0.2.3
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.
- data/lib/geocoder.rb +11 -6
- data/lib/geocoders/google_v3_geocoder.rb +30 -23
- data/lib/geocoders/yahoo_place_finder_geocoder.rb +21 -4
- metadata +24 -61
data/lib/geocoder.rb
CHANGED
@@ -3,6 +3,8 @@ module Geokit
|
|
3
3
|
|
4
4
|
@@cache = nil
|
5
5
|
@@hydra = nil
|
6
|
+
@@typhoeus_timeout = 30000
|
7
|
+
@@typhoeus_cache_timeout = 604800
|
6
8
|
__define_accessors
|
7
9
|
|
8
10
|
# The Geocoder base class which defines the interface to be used by all
|
@@ -16,9 +18,9 @@ module Geokit
|
|
16
18
|
end
|
17
19
|
|
18
20
|
# Set hydra and memcache if defined in configuration file
|
19
|
-
def self.initialize_cache
|
20
|
-
if (Geokit::Geocoders::cache && Geokit::Geocoders::hydra)
|
21
|
-
@cache = Geokit::Geocoders::cache
|
21
|
+
def self.initialize_cache
|
22
|
+
if (Geokit::Geocoders::cache && Geokit::Geocoders::hydra && self.respond_to?(:success_response?))
|
23
|
+
@cache = Geokit::Geocoders::cache
|
22
24
|
Geokit::Geocoders::hydra.cache_setter do |request|
|
23
25
|
@cache.set(request.cache_key, request.response, request.cache_timeout)
|
24
26
|
end
|
@@ -28,18 +30,21 @@ module Geokit
|
|
28
30
|
end
|
29
31
|
return true
|
30
32
|
end
|
31
|
-
end
|
33
|
+
end
|
32
34
|
|
33
35
|
# Wraps the geocoder call around a proxy if necessary.
|
34
36
|
# Use typhoeus and memcache if defined
|
35
37
|
def self.do_get(url)
|
36
38
|
uri = URI.parse(url)
|
37
39
|
if (cache_query)
|
38
|
-
req = Typhoeus::Request.new(url,
|
40
|
+
req = Typhoeus::Request.new(url,
|
41
|
+
:timeout => Geokit::Geocoders::typhoeus_timeout, # milliseconds
|
42
|
+
:cache_timeout => Geokit::Geocoders::typhoeus_cache_timeout)
|
43
|
+
# :headers => {"Authorization" => "Basic #{Base64.b64encode("#{uri.user}:#{uri.password}")}"})
|
39
44
|
Geokit::Geocoders::hydra.queue(req)
|
40
45
|
Geokit::Geocoders::hydra.run
|
41
46
|
return req.response
|
42
|
-
else
|
47
|
+
else
|
43
48
|
req = Net::HTTP::Get.new(url)
|
44
49
|
req.basic_auth(uri.user, uri.password) if uri.userinfo
|
45
50
|
res = Net::HTTP::Proxy(GeoKit::Geocoders::proxy_addr,
|
@@ -3,47 +3,54 @@
|
|
3
3
|
module Geokit
|
4
4
|
module Geocoders
|
5
5
|
class GoogleV3Geocoder < Geocoder
|
6
|
-
private
|
7
|
-
|
8
|
-
def self.do_geocode(address, options = {})
|
9
|
-
geo_url = self.get_url(address, options)
|
10
|
-
logger.debug "Making Geocode request to: #{geo_url}"
|
11
|
-
res = self.call_geocoder_service(geo_url)
|
12
6
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
7
|
+
private
|
8
|
+
|
9
|
+
def self.success_response?(res)
|
10
|
+
if (defined?(Typhoeus) && res.is_a?(Typhoeus::Response))
|
11
|
+
return res.success?
|
12
|
+
else
|
13
|
+
return res.is_a?(Net::HTTPSuccess)
|
14
|
+
end
|
17
15
|
end
|
18
|
-
|
16
|
+
|
19
17
|
def self.get_url(address, options={})
|
20
18
|
bias = options[:bias] || ''
|
21
19
|
address_str = address.is_a?(GeoLoc) ? address.to_geocodeable_s : address
|
22
20
|
return "http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=#{Geokit::Inflector::url_escape(address_str)}®ion=#{bias.to_s.downcase}"
|
23
21
|
end
|
24
22
|
|
25
|
-
def self.
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
23
|
+
def self.do_geocode(address, options = {})
|
24
|
+
geo_url = self.get_url(address, options)
|
25
|
+
logger.debug "Making Geocode request to: #{geo_url}"
|
26
|
+
res = self.call_geocoder_service(geo_url)
|
27
|
+
logger.debug "Google V3 geocoding. Address: #{address}. Result: #{res}"
|
28
|
+
|
29
|
+
if success_response?(res)
|
30
|
+
return self.parse_body(Yajl::Parser.parse(res.body))
|
31
|
+
else
|
30
32
|
return GeoLoc.new
|
31
33
|
end
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
rescue Exception => e
|
35
|
+
logger.info "Caught an error during Google V3 geocoding call: #{e.inspect}"
|
36
|
+
return GeoLoc.new
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.parse_body(body)
|
40
|
+
if body['status'] != "OK"
|
41
|
+
if body['status' ] == 'OVER_QUERY_LIMIT'
|
42
|
+
raise Geokit::TooManyQueriesError "Google returned OVER_QUERY_LIMIT: #{body}"
|
43
|
+
elsif body['status'] == 'ZERO_RESULTS'
|
37
44
|
logger.info "Found no results from google v3"
|
38
45
|
return GeoLoc.new
|
39
46
|
end
|
40
|
-
logger.error "Got an error from google, response: #{
|
47
|
+
logger.error "Got an error from google, response: #{body}"
|
41
48
|
# Otherwise, we don't know what to do
|
42
49
|
return GeoLoc.new
|
43
50
|
end
|
44
51
|
|
45
52
|
begin
|
46
|
-
results =
|
53
|
+
results = body['results']
|
47
54
|
geoloc = nil
|
48
55
|
results.each do |result|
|
49
56
|
extracted_geoloc = self.extract_location(result)
|
@@ -1,8 +1,17 @@
|
|
1
1
|
module Geokit
|
2
2
|
module Geocoders
|
3
3
|
class YahooPlaceFinderGeocoder < Geocoder
|
4
|
+
|
4
5
|
private
|
5
6
|
|
7
|
+
def self.success_response?(res)
|
8
|
+
if (defined?(Typhoeus) && res.is_a?(Typhoeus::Response))
|
9
|
+
return res.success?
|
10
|
+
else
|
11
|
+
return res.is_a?(Net::HTTPSuccess)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
6
15
|
def self.get_url(address, options={})
|
7
16
|
if (options[:reverse])
|
8
17
|
latlng=LatLng.normalize(address)
|
@@ -17,16 +26,24 @@ module Geokit
|
|
17
26
|
def self.do_reverse_geocode(latlng)
|
18
27
|
res = self.call_geocoder_service(self.get_url(latlng, :reverse => true))
|
19
28
|
logger.debug "Yahoo PlaceFinder reverse-geocoding. LL: #{latlng}. Result: #{res}"
|
20
|
-
|
29
|
+
|
30
|
+
if success_response?(res)
|
31
|
+
return self.parse_body(Yajl::Parser.parse(res.body))
|
32
|
+
else
|
33
|
+
return GeoLoc.new
|
34
|
+
end
|
21
35
|
end
|
22
36
|
|
23
37
|
def self.do_geocode(address, options={})
|
24
38
|
address_str = address.is_a?(GeoLoc) ? address.to_geocodeable_s : address
|
25
39
|
res = self.call_geocoder_service(self.get_url(address, options))
|
26
|
-
# return GeoLoc.new if !res.is_a?(Net::HTTPSuccess)
|
27
40
|
logger.debug "Yahoo PlaceFinder geocoding. Address: #{address}. Result: #{res}"
|
28
41
|
|
29
|
-
|
42
|
+
if success_response?(res)
|
43
|
+
return self.parse_body(Yajl::Parser.parse(res.body))
|
44
|
+
else
|
45
|
+
return GeoLoc.new
|
46
|
+
end
|
30
47
|
rescue
|
31
48
|
logger.info "Caught an error during Yahoo PlaceFinder geocoding call: "+$!
|
32
49
|
return GeoLoc.new
|
@@ -63,7 +80,7 @@ module Geokit
|
|
63
80
|
geoloc.lat = result['latitude']
|
64
81
|
geoloc.lng = result['longitude']
|
65
82
|
geoloc.country_code = result['countrycode']
|
66
|
-
geoloc.provider = '
|
83
|
+
geoloc.provider = 'yahoo_place_finder'
|
67
84
|
|
68
85
|
# extended -- false if not not available
|
69
86
|
geoloc.street_address = result['line1']
|
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geocoder_plus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 23
|
5
4
|
prerelease:
|
6
|
-
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
- 0
|
10
|
-
version: 0.2.0
|
5
|
+
version: 0.2.3
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Fajar A B
|
@@ -15,115 +10,86 @@ autorequire:
|
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
12
|
|
18
|
-
date: 2011-04-
|
13
|
+
date: 2011-04-13 00:00:00 +07:00
|
19
14
|
default_executable:
|
20
15
|
dependencies:
|
21
16
|
- !ruby/object:Gem::Dependency
|
17
|
+
name: geokit
|
22
18
|
requirement: &id001 !ruby/object:Gem::Requirement
|
23
19
|
none: false
|
24
20
|
requirements:
|
25
21
|
- - ">="
|
26
22
|
- !ruby/object:Gem::Version
|
27
|
-
hash: 3
|
28
|
-
segments:
|
29
|
-
- 1
|
30
|
-
- 5
|
31
|
-
- 0
|
32
23
|
version: 1.5.0
|
33
|
-
version_requirements: *id001
|
34
|
-
name: geokit
|
35
|
-
prerelease: false
|
36
24
|
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: *id001
|
37
27
|
- !ruby/object:Gem::Dependency
|
28
|
+
name: yajl-ruby
|
38
29
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
30
|
none: false
|
40
31
|
requirements:
|
41
32
|
- - ">="
|
42
33
|
- !ruby/object:Gem::Version
|
43
|
-
hash: 59
|
44
|
-
segments:
|
45
|
-
- 0
|
46
|
-
- 8
|
47
|
-
- 2
|
48
34
|
version: 0.8.2
|
49
|
-
version_requirements: *id002
|
50
|
-
name: yajl-ruby
|
51
|
-
prerelease: false
|
52
35
|
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: *id002
|
53
38
|
- !ruby/object:Gem::Dependency
|
39
|
+
name: shoulda
|
54
40
|
requirement: &id003 !ruby/object:Gem::Requirement
|
55
41
|
none: false
|
56
42
|
requirements:
|
57
43
|
- - ">="
|
58
44
|
- !ruby/object:Gem::Version
|
59
|
-
hash: 3
|
60
|
-
segments:
|
61
|
-
- 0
|
62
45
|
version: "0"
|
63
|
-
version_requirements: *id003
|
64
|
-
name: shoulda
|
65
|
-
prerelease: false
|
66
46
|
type: :development
|
47
|
+
prerelease: false
|
48
|
+
version_requirements: *id003
|
67
49
|
- !ruby/object:Gem::Dependency
|
50
|
+
name: mocha
|
68
51
|
requirement: &id004 !ruby/object:Gem::Requirement
|
69
52
|
none: false
|
70
53
|
requirements:
|
71
54
|
- - ">="
|
72
55
|
- !ruby/object:Gem::Version
|
73
|
-
hash: 3
|
74
|
-
segments:
|
75
|
-
- 0
|
76
56
|
version: "0"
|
77
|
-
version_requirements: *id004
|
78
|
-
name: mocha
|
79
|
-
prerelease: false
|
80
57
|
type: :development
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: *id004
|
81
60
|
- !ruby/object:Gem::Dependency
|
61
|
+
name: bundler
|
82
62
|
requirement: &id005 !ruby/object:Gem::Requirement
|
83
63
|
none: false
|
84
64
|
requirements:
|
85
65
|
- - ~>
|
86
66
|
- !ruby/object:Gem::Version
|
87
|
-
hash: 23
|
88
|
-
segments:
|
89
|
-
- 1
|
90
|
-
- 0
|
91
|
-
- 0
|
92
67
|
version: 1.0.0
|
93
|
-
version_requirements: *id005
|
94
|
-
name: bundler
|
95
|
-
prerelease: false
|
96
68
|
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: *id005
|
97
71
|
- !ruby/object:Gem::Dependency
|
72
|
+
name: jeweler
|
98
73
|
requirement: &id006 !ruby/object:Gem::Requirement
|
99
74
|
none: false
|
100
75
|
requirements:
|
101
76
|
- - ~>
|
102
77
|
- !ruby/object:Gem::Version
|
103
|
-
hash: 7
|
104
|
-
segments:
|
105
|
-
- 1
|
106
|
-
- 5
|
107
|
-
- 2
|
108
78
|
version: 1.5.2
|
109
|
-
version_requirements: *id006
|
110
|
-
name: jeweler
|
111
|
-
prerelease: false
|
112
79
|
type: :development
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: *id006
|
113
82
|
- !ruby/object:Gem::Dependency
|
83
|
+
name: rcov
|
114
84
|
requirement: &id007 !ruby/object:Gem::Requirement
|
115
85
|
none: false
|
116
86
|
requirements:
|
117
87
|
- - ">="
|
118
88
|
- !ruby/object:Gem::Version
|
119
|
-
hash: 3
|
120
|
-
segments:
|
121
|
-
- 0
|
122
89
|
version: "0"
|
123
|
-
version_requirements: *id007
|
124
|
-
name: rcov
|
125
|
-
prerelease: false
|
126
90
|
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: *id007
|
127
93
|
description: This gem consists two additional geocoders for geokit, Yahoo! PlaceFinder and Google V3
|
128
94
|
email: fajar.ab@gmail.com
|
129
95
|
executables: []
|
@@ -160,7 +126,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
160
126
|
requirements:
|
161
127
|
- - ">="
|
162
128
|
- !ruby/object:Gem::Version
|
163
|
-
hash:
|
129
|
+
hash: -4398613690650561579
|
164
130
|
segments:
|
165
131
|
- 0
|
166
132
|
version: "0"
|
@@ -169,9 +135,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
135
|
requirements:
|
170
136
|
- - ">="
|
171
137
|
- !ruby/object:Gem::Version
|
172
|
-
hash: 3
|
173
|
-
segments:
|
174
|
-
- 0
|
175
138
|
version: "0"
|
176
139
|
requirements: []
|
177
140
|
|