greatseth-google-geo 2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +3 -0
- data/LICENSE +19 -0
- data/Manifest +67 -0
- data/README +35 -0
- data/Rakefile +10 -0
- data/google-geo.gemspec +139 -0
- data/lib/google/geo.rb +194 -0
- data/test/fixtures/invalid_map_key.xml +10 -0
- data/test/fixtures/missing_address.xml +10 -0
- data/test/fixtures/server_error.xml +10 -0
- data/test/fixtures/success.xml +36 -0
- data/test/fixtures/success_with_multiple_addresses.xml +62 -0
- data/test/fixtures/too_many_queries.xml +10 -0
- data/test/fixtures/unavailable_address.xml +10 -0
- data/test/fixtures/unknown_address.xml +10 -0
- data/test/geo_test.rb +102 -0
- data/vendor/mocha-0.4.0/COPYING +3 -0
- data/vendor/mocha-0.4.0/MIT-LICENSE +7 -0
- data/vendor/mocha-0.4.0/README +35 -0
- data/vendor/mocha-0.4.0/RELEASE +98 -0
- data/vendor/mocha-0.4.0/Rakefile +126 -0
- data/vendor/mocha-0.4.0/examples/misc.rb +36 -0
- data/vendor/mocha-0.4.0/examples/mocha.rb +26 -0
- data/vendor/mocha-0.4.0/examples/stubba.rb +65 -0
- data/vendor/mocha-0.4.0/lib/mocha/any_instance_method.rb +35 -0
- data/vendor/mocha-0.4.0/lib/mocha/auto_verify.rb +113 -0
- data/vendor/mocha-0.4.0/lib/mocha/central.rb +35 -0
- data/vendor/mocha-0.4.0/lib/mocha/class_method.rb +62 -0
- data/vendor/mocha-0.4.0/lib/mocha/expectation.rb +295 -0
- data/vendor/mocha-0.4.0/lib/mocha/expectation_error.rb +6 -0
- data/vendor/mocha-0.4.0/lib/mocha/infinite_range.rb +27 -0
- data/vendor/mocha-0.4.0/lib/mocha/inspect.rb +37 -0
- data/vendor/mocha-0.4.0/lib/mocha/instance_method.rb +8 -0
- data/vendor/mocha-0.4.0/lib/mocha/metaclass.rb +7 -0
- data/vendor/mocha-0.4.0/lib/mocha/mock.rb +20 -0
- data/vendor/mocha-0.4.0/lib/mocha/mock_methods.rb +122 -0
- data/vendor/mocha-0.4.0/lib/mocha/object.rb +100 -0
- data/vendor/mocha-0.4.0/lib/mocha/pretty_parameters.rb +28 -0
- data/vendor/mocha-0.4.0/lib/mocha/setup_and_teardown.rb +23 -0
- data/vendor/mocha-0.4.0/lib/mocha/standalone.rb +30 -0
- data/vendor/mocha-0.4.0/lib/mocha/test_case_adapter.rb +49 -0
- data/vendor/mocha-0.4.0/lib/mocha.rb +19 -0
- data/vendor/mocha-0.4.0/lib/mocha_standalone.rb +2 -0
- data/vendor/mocha-0.4.0/lib/stubba.rb +2 -0
- data/vendor/mocha-0.4.0/test/active_record_test_case.rb +36 -0
- data/vendor/mocha-0.4.0/test/all_tests.rb +75 -0
- data/vendor/mocha-0.4.0/test/execution_point.rb +34 -0
- data/vendor/mocha-0.4.0/test/method_definer.rb +18 -0
- data/vendor/mocha-0.4.0/test/mocha/any_instance_method_test.rb +124 -0
- data/vendor/mocha-0.4.0/test/mocha/auto_verify_test.rb +163 -0
- data/vendor/mocha-0.4.0/test/mocha/central_test.rb +124 -0
- data/vendor/mocha-0.4.0/test/mocha/class_method_test.rb +196 -0
- data/vendor/mocha-0.4.0/test/mocha/expectation_test.rb +357 -0
- data/vendor/mocha-0.4.0/test/mocha/infinite_range_test.rb +50 -0
- data/vendor/mocha-0.4.0/test/mocha/inspect_test.rb +90 -0
- data/vendor/mocha-0.4.0/test/mocha/metaclass_test.rb +22 -0
- data/vendor/mocha-0.4.0/test/mocha/mock_methods_test.rb +235 -0
- data/vendor/mocha-0.4.0/test/mocha/mock_test.rb +84 -0
- data/vendor/mocha-0.4.0/test/mocha/object_test.rb +165 -0
- data/vendor/mocha-0.4.0/test/mocha/pretty_parameters_test.rb +32 -0
- data/vendor/mocha-0.4.0/test/mocha/setup_and_teardown_test.rb +76 -0
- data/vendor/mocha-0.4.0/test/mocha_acceptance_test.rb +98 -0
- data/vendor/mocha-0.4.0/test/mocha_test_result_integration_test.rb +105 -0
- data/vendor/mocha-0.4.0/test/standalone_acceptance_test.rb +110 -0
- data/vendor/mocha-0.4.0/test/stubba_acceptance_test.rb +102 -0
- data/vendor/mocha-0.4.0/test/stubba_integration_test.rb +89 -0
- data/vendor/mocha-0.4.0/test/stubba_test_result_integration_test.rb +85 -0
- data/vendor/mocha-0.4.0/test/test_helper.rb +4 -0
- metadata +136 -0
data/CHANGELOG
ADDED
@@ -0,0 +1,3 @@
|
|
1
|
+
v2.0. Multiple Addresses (and tests you can actually run!); Not insignificant API change: *** Google::Geo#locate ALWAYS RETURNS AN ARRAY ***; There are now some nice examples in the README; Updated to include the fixtures and vendor dependencies for tests, yeknow, so you can actually run them; No namby pamby point releases. This is serious, folks.
|
2
|
+
|
3
|
+
v1.0. Initial Release
|
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
This program is free software. It comes without any warranty, to
|
2
|
+
the extent permitted by applicable law. You can redistribute it
|
3
|
+
and/or modify it under the terms of the Do What The Fuck You Want
|
4
|
+
To Public License, Version 2, as published by Sam Hocevar. See
|
5
|
+
http://sam.zoy.org/wtfpl/COPYING for more details.
|
6
|
+
|
7
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
8
|
+
Version 2, December 2004
|
9
|
+
|
10
|
+
Copyright (C) 2004 Sam Hocevar
|
11
|
+
14 rue de Plaisance, 75014 Paris, France
|
12
|
+
Everyone is permitted to copy and distribute verbatim or modified
|
13
|
+
copies of this license document, and changing it is allowed as long
|
14
|
+
as the name is changed.
|
15
|
+
|
16
|
+
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
17
|
+
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
18
|
+
|
19
|
+
0. You just DO WHAT THE FUCK YOU WANT TO.
|
data/Manifest
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
CHANGELOG
|
2
|
+
lib/google/geo.rb
|
3
|
+
LICENSE
|
4
|
+
Rakefile
|
5
|
+
README
|
6
|
+
test/fixtures/invalid_map_key.xml
|
7
|
+
test/fixtures/missing_address.xml
|
8
|
+
test/fixtures/server_error.xml
|
9
|
+
test/fixtures/success.xml
|
10
|
+
test/fixtures/success_with_multiple_addresses.xml
|
11
|
+
test/fixtures/too_many_queries.xml
|
12
|
+
test/fixtures/unavailable_address.xml
|
13
|
+
test/fixtures/unknown_address.xml
|
14
|
+
test/geo_test.rb
|
15
|
+
vendor/mocha-0.4.0/COPYING
|
16
|
+
vendor/mocha-0.4.0/examples/misc.rb
|
17
|
+
vendor/mocha-0.4.0/examples/mocha.rb
|
18
|
+
vendor/mocha-0.4.0/examples/stubba.rb
|
19
|
+
vendor/mocha-0.4.0/lib/mocha/any_instance_method.rb
|
20
|
+
vendor/mocha-0.4.0/lib/mocha/auto_verify.rb
|
21
|
+
vendor/mocha-0.4.0/lib/mocha/central.rb
|
22
|
+
vendor/mocha-0.4.0/lib/mocha/class_method.rb
|
23
|
+
vendor/mocha-0.4.0/lib/mocha/expectation.rb
|
24
|
+
vendor/mocha-0.4.0/lib/mocha/expectation_error.rb
|
25
|
+
vendor/mocha-0.4.0/lib/mocha/infinite_range.rb
|
26
|
+
vendor/mocha-0.4.0/lib/mocha/inspect.rb
|
27
|
+
vendor/mocha-0.4.0/lib/mocha/instance_method.rb
|
28
|
+
vendor/mocha-0.4.0/lib/mocha/metaclass.rb
|
29
|
+
vendor/mocha-0.4.0/lib/mocha/mock.rb
|
30
|
+
vendor/mocha-0.4.0/lib/mocha/mock_methods.rb
|
31
|
+
vendor/mocha-0.4.0/lib/mocha/object.rb
|
32
|
+
vendor/mocha-0.4.0/lib/mocha/pretty_parameters.rb
|
33
|
+
vendor/mocha-0.4.0/lib/mocha/setup_and_teardown.rb
|
34
|
+
vendor/mocha-0.4.0/lib/mocha/standalone.rb
|
35
|
+
vendor/mocha-0.4.0/lib/mocha/test_case_adapter.rb
|
36
|
+
vendor/mocha-0.4.0/lib/mocha.rb
|
37
|
+
vendor/mocha-0.4.0/lib/mocha_standalone.rb
|
38
|
+
vendor/mocha-0.4.0/lib/stubba.rb
|
39
|
+
vendor/mocha-0.4.0/MIT-LICENSE
|
40
|
+
vendor/mocha-0.4.0/Rakefile
|
41
|
+
vendor/mocha-0.4.0/README
|
42
|
+
vendor/mocha-0.4.0/RELEASE
|
43
|
+
vendor/mocha-0.4.0/test/active_record_test_case.rb
|
44
|
+
vendor/mocha-0.4.0/test/all_tests.rb
|
45
|
+
vendor/mocha-0.4.0/test/execution_point.rb
|
46
|
+
vendor/mocha-0.4.0/test/method_definer.rb
|
47
|
+
vendor/mocha-0.4.0/test/mocha/any_instance_method_test.rb
|
48
|
+
vendor/mocha-0.4.0/test/mocha/auto_verify_test.rb
|
49
|
+
vendor/mocha-0.4.0/test/mocha/central_test.rb
|
50
|
+
vendor/mocha-0.4.0/test/mocha/class_method_test.rb
|
51
|
+
vendor/mocha-0.4.0/test/mocha/expectation_test.rb
|
52
|
+
vendor/mocha-0.4.0/test/mocha/infinite_range_test.rb
|
53
|
+
vendor/mocha-0.4.0/test/mocha/inspect_test.rb
|
54
|
+
vendor/mocha-0.4.0/test/mocha/metaclass_test.rb
|
55
|
+
vendor/mocha-0.4.0/test/mocha/mock_methods_test.rb
|
56
|
+
vendor/mocha-0.4.0/test/mocha/mock_test.rb
|
57
|
+
vendor/mocha-0.4.0/test/mocha/object_test.rb
|
58
|
+
vendor/mocha-0.4.0/test/mocha/pretty_parameters_test.rb
|
59
|
+
vendor/mocha-0.4.0/test/mocha/setup_and_teardown_test.rb
|
60
|
+
vendor/mocha-0.4.0/test/mocha_acceptance_test.rb
|
61
|
+
vendor/mocha-0.4.0/test/mocha_test_result_integration_test.rb
|
62
|
+
vendor/mocha-0.4.0/test/standalone_acceptance_test.rb
|
63
|
+
vendor/mocha-0.4.0/test/stubba_acceptance_test.rb
|
64
|
+
vendor/mocha-0.4.0/test/stubba_integration_test.rb
|
65
|
+
vendor/mocha-0.4.0/test/stubba_test_result_integration_test.rb
|
66
|
+
vendor/mocha-0.4.0/test/test_helper.rb
|
67
|
+
Manifest
|
data/README
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
= Google::Geo
|
2
|
+
|
3
|
+
A simple, elegant library for getting geocoding information from Google Maps. Very much inspired by the google-geocode gem, but completely dependency free!
|
4
|
+
|
5
|
+
== Examples
|
6
|
+
|
7
|
+
geo = Google::Geo.new API_KEY
|
8
|
+
|
9
|
+
addresses = geo.locate '1600 Amphitheatre Parkway, Mountain View, CA'
|
10
|
+
|
11
|
+
addresses.size # 1, :locate always returns an Array
|
12
|
+
|
13
|
+
address = addresses.first
|
14
|
+
|
15
|
+
address.country # 'US'
|
16
|
+
address.city # 'Mountain View'
|
17
|
+
address.full_address # '1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA'
|
18
|
+
|
19
|
+
address.query # '1600 Amphitheatre Parkway, Mountain View, CA'
|
20
|
+
address.accuracy # 8
|
21
|
+
|
22
|
+
In the case of sufficiently vague queries, Google::Geo will return more than one:
|
23
|
+
|
24
|
+
addresses = geo.locate 'hell'
|
25
|
+
|
26
|
+
addresses.size # 2
|
27
|
+
addresses.map { |a| a.state } # ['PA', 'NC']
|
28
|
+
|
29
|
+
== Contributors
|
30
|
+
|
31
|
+
Seth Thomas Rasmussen - http://greatseth.com - sethrasmussen@gmail.com
|
32
|
+
|
33
|
+
== License
|
34
|
+
|
35
|
+
(c) 2007-2008 Seth Thomas Rasmussen and released under the WTFPL. See the LICENSE file for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
README = File.readlines "#{File.dirname __FILE__}/README"
|
2
|
+
|
3
|
+
require "echoe"
|
4
|
+
|
5
|
+
Echoe.new "google-geo" do |p|
|
6
|
+
p.author = "Seth Thomas Rasmussen"
|
7
|
+
p.email = "sethrasmussen@gmail.com"
|
8
|
+
p.url = "http://github.com/greatseth/google-geo"
|
9
|
+
p.summary = README[2]
|
10
|
+
end
|
data/google-geo.gemspec
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
|
2
|
+
# Gem::Specification for Google-geo-2.0
|
3
|
+
# Originally generated by Echoe
|
4
|
+
|
5
|
+
--- !ruby/object:Gem::Specification
|
6
|
+
name: google-geo
|
7
|
+
version: !ruby/object:Gem::Version
|
8
|
+
version: "2.0"
|
9
|
+
platform: ruby
|
10
|
+
authors:
|
11
|
+
- Seth Thomas Rasmussen
|
12
|
+
autorequire:
|
13
|
+
bindir: bin
|
14
|
+
|
15
|
+
date: 2008-08-06 00:00:00 -07:00
|
16
|
+
default_executable:
|
17
|
+
dependencies:
|
18
|
+
- !ruby/object:Gem::Dependency
|
19
|
+
name: echoe
|
20
|
+
type: :development
|
21
|
+
version_requirement:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: "0"
|
27
|
+
version:
|
28
|
+
description: A simple, elegant library for getting geocoding information from Google Maps. Very much inspired by the google-geocode gem, but completely dependency free!
|
29
|
+
email: sethrasmussen@gmail.com
|
30
|
+
executables: []
|
31
|
+
|
32
|
+
extensions: []
|
33
|
+
|
34
|
+
extra_rdoc_files:
|
35
|
+
- CHANGELOG
|
36
|
+
- lib/google/geo.rb
|
37
|
+
- LICENSE
|
38
|
+
- README
|
39
|
+
files:
|
40
|
+
- CHANGELOG
|
41
|
+
- lib/google/geo.rb
|
42
|
+
- LICENSE
|
43
|
+
- Rakefile
|
44
|
+
- README
|
45
|
+
- test/fixtures/invalid_map_key.xml
|
46
|
+
- test/fixtures/missing_address.xml
|
47
|
+
- test/fixtures/server_error.xml
|
48
|
+
- test/fixtures/success.xml
|
49
|
+
- test/fixtures/success_with_multiple_addresses.xml
|
50
|
+
- test/fixtures/too_many_queries.xml
|
51
|
+
- test/fixtures/unavailable_address.xml
|
52
|
+
- test/fixtures/unknown_address.xml
|
53
|
+
- test/geo_test.rb
|
54
|
+
- vendor/mocha-0.4.0/COPYING
|
55
|
+
- vendor/mocha-0.4.0/examples/misc.rb
|
56
|
+
- vendor/mocha-0.4.0/examples/mocha.rb
|
57
|
+
- vendor/mocha-0.4.0/examples/stubba.rb
|
58
|
+
- vendor/mocha-0.4.0/lib/mocha/any_instance_method.rb
|
59
|
+
- vendor/mocha-0.4.0/lib/mocha/auto_verify.rb
|
60
|
+
- vendor/mocha-0.4.0/lib/mocha/central.rb
|
61
|
+
- vendor/mocha-0.4.0/lib/mocha/class_method.rb
|
62
|
+
- vendor/mocha-0.4.0/lib/mocha/expectation.rb
|
63
|
+
- vendor/mocha-0.4.0/lib/mocha/expectation_error.rb
|
64
|
+
- vendor/mocha-0.4.0/lib/mocha/infinite_range.rb
|
65
|
+
- vendor/mocha-0.4.0/lib/mocha/inspect.rb
|
66
|
+
- vendor/mocha-0.4.0/lib/mocha/instance_method.rb
|
67
|
+
- vendor/mocha-0.4.0/lib/mocha/metaclass.rb
|
68
|
+
- vendor/mocha-0.4.0/lib/mocha/mock.rb
|
69
|
+
- vendor/mocha-0.4.0/lib/mocha/mock_methods.rb
|
70
|
+
- vendor/mocha-0.4.0/lib/mocha/object.rb
|
71
|
+
- vendor/mocha-0.4.0/lib/mocha/pretty_parameters.rb
|
72
|
+
- vendor/mocha-0.4.0/lib/mocha/setup_and_teardown.rb
|
73
|
+
- vendor/mocha-0.4.0/lib/mocha/standalone.rb
|
74
|
+
- vendor/mocha-0.4.0/lib/mocha/test_case_adapter.rb
|
75
|
+
- vendor/mocha-0.4.0/lib/mocha.rb
|
76
|
+
- vendor/mocha-0.4.0/lib/mocha_standalone.rb
|
77
|
+
- vendor/mocha-0.4.0/lib/stubba.rb
|
78
|
+
- vendor/mocha-0.4.0/MIT-LICENSE
|
79
|
+
- vendor/mocha-0.4.0/Rakefile
|
80
|
+
- vendor/mocha-0.4.0/README
|
81
|
+
- vendor/mocha-0.4.0/RELEASE
|
82
|
+
- vendor/mocha-0.4.0/test/active_record_test_case.rb
|
83
|
+
- vendor/mocha-0.4.0/test/all_tests.rb
|
84
|
+
- vendor/mocha-0.4.0/test/execution_point.rb
|
85
|
+
- vendor/mocha-0.4.0/test/method_definer.rb
|
86
|
+
- vendor/mocha-0.4.0/test/mocha/any_instance_method_test.rb
|
87
|
+
- vendor/mocha-0.4.0/test/mocha/auto_verify_test.rb
|
88
|
+
- vendor/mocha-0.4.0/test/mocha/central_test.rb
|
89
|
+
- vendor/mocha-0.4.0/test/mocha/class_method_test.rb
|
90
|
+
- vendor/mocha-0.4.0/test/mocha/expectation_test.rb
|
91
|
+
- vendor/mocha-0.4.0/test/mocha/infinite_range_test.rb
|
92
|
+
- vendor/mocha-0.4.0/test/mocha/inspect_test.rb
|
93
|
+
- vendor/mocha-0.4.0/test/mocha/metaclass_test.rb
|
94
|
+
- vendor/mocha-0.4.0/test/mocha/mock_methods_test.rb
|
95
|
+
- vendor/mocha-0.4.0/test/mocha/mock_test.rb
|
96
|
+
- vendor/mocha-0.4.0/test/mocha/object_test.rb
|
97
|
+
- vendor/mocha-0.4.0/test/mocha/pretty_parameters_test.rb
|
98
|
+
- vendor/mocha-0.4.0/test/mocha/setup_and_teardown_test.rb
|
99
|
+
- vendor/mocha-0.4.0/test/mocha_acceptance_test.rb
|
100
|
+
- vendor/mocha-0.4.0/test/mocha_test_result_integration_test.rb
|
101
|
+
- vendor/mocha-0.4.0/test/standalone_acceptance_test.rb
|
102
|
+
- vendor/mocha-0.4.0/test/stubba_acceptance_test.rb
|
103
|
+
- vendor/mocha-0.4.0/test/stubba_integration_test.rb
|
104
|
+
- vendor/mocha-0.4.0/test/stubba_test_result_integration_test.rb
|
105
|
+
- vendor/mocha-0.4.0/test/test_helper.rb
|
106
|
+
- Manifest
|
107
|
+
- google-geo.gemspec
|
108
|
+
has_rdoc: true
|
109
|
+
homepage: http://github.com/greatseth/google-geo
|
110
|
+
post_install_message:
|
111
|
+
rdoc_options:
|
112
|
+
- --line-numbers
|
113
|
+
- --inline-source
|
114
|
+
- --title
|
115
|
+
- Google-geo
|
116
|
+
- --main
|
117
|
+
- README
|
118
|
+
require_paths:
|
119
|
+
- lib
|
120
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: "0"
|
125
|
+
version:
|
126
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "="
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: "1.2"
|
131
|
+
version:
|
132
|
+
requirements: []
|
133
|
+
|
134
|
+
rubyforge_project: google-geo
|
135
|
+
rubygems_version: 1.2.0
|
136
|
+
specification_version: 2
|
137
|
+
summary: A simple, elegant library for getting geocoding information from Google Maps. Very much inspired by the google-geocode gem, but completely dependency free!
|
138
|
+
test_files:
|
139
|
+
- test/geo_test.rb
|
data/lib/google/geo.rb
ADDED
@@ -0,0 +1,194 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
|
3
|
+
module Google
|
4
|
+
|
5
|
+
# = Google::Geo
|
6
|
+
#
|
7
|
+
# A simple, elegant library for getting geocoding information from Google Maps. Very much inspired by the google-geocode gem, but completely dependency free!
|
8
|
+
#
|
9
|
+
# == Examples
|
10
|
+
#
|
11
|
+
# geo = Google::Geo.new API_KEY
|
12
|
+
#
|
13
|
+
# addresses = geo.locate '1600 Amphitheatre Parkway, Mountain View, CA'
|
14
|
+
#
|
15
|
+
# addresses.size # 1, :locate always returns an Array
|
16
|
+
#
|
17
|
+
# address = addresses.first
|
18
|
+
#
|
19
|
+
# address.country # 'US'
|
20
|
+
# address.city # 'Mountain View'
|
21
|
+
# address.full_address # '1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA'
|
22
|
+
#
|
23
|
+
# address.query # '1600 Amphitheatre Parkway, Mountain View, CA'
|
24
|
+
# address.accuracy # 8
|
25
|
+
#
|
26
|
+
# In the case of sufficiently vague queries, Google will return more than one address:
|
27
|
+
#
|
28
|
+
# addresses = geo.locate 'heaven'
|
29
|
+
#
|
30
|
+
# addresses.size # 2
|
31
|
+
# addresses.map { |a| a.state } # ['PA', 'NC']
|
32
|
+
#
|
33
|
+
# == Contributors
|
34
|
+
#
|
35
|
+
# Seth Thomas Rasmussen - http://greatseth.com - sethrasmussen@gmail.com
|
36
|
+
class Geo
|
37
|
+
# API key provided by Google allowing access to the Geocode API
|
38
|
+
attr_accessor :key
|
39
|
+
|
40
|
+
def initialize(key)
|
41
|
+
@key = key
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns an array of Address objects, each with accessors for all the components of a location.
|
45
|
+
# The query argument should be a string.
|
46
|
+
def locate(query)
|
47
|
+
xml = open(uri(query)).read
|
48
|
+
res = Response.new(xml, key)
|
49
|
+
|
50
|
+
res.placemarks.map { |place| Address.new place, res.query }
|
51
|
+
end
|
52
|
+
|
53
|
+
# Generate a request URI from a given search string.
|
54
|
+
def uri(address) #:nodoc:
|
55
|
+
"http://maps.google.com/maps/geo?q=#{URI.escape address}&key=#{key}&output=xml"
|
56
|
+
end
|
57
|
+
private :uri
|
58
|
+
|
59
|
+
###
|
60
|
+
|
61
|
+
module Parser #:nodoc:
|
62
|
+
# Fetch contents of an XML element of the response.
|
63
|
+
def fetch(element) #:nodoc:
|
64
|
+
@xml.slice %r{<#{element}>(.+?)</#{element}>}, 1
|
65
|
+
end
|
66
|
+
|
67
|
+
# Like fetch, but for the only piece of data locked away in an attribute.
|
68
|
+
def fetch_accuracy #:nodoc:
|
69
|
+
@xml.slice(%r{Accuracy="([^"]+)">}, 1).to_i
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
###
|
74
|
+
|
75
|
+
# Represents locations returned in response to geocoding queries.
|
76
|
+
class Address
|
77
|
+
include Parser
|
78
|
+
|
79
|
+
attr_reader :street
|
80
|
+
alias :thoroughfare :street
|
81
|
+
|
82
|
+
attr_reader :city
|
83
|
+
alias :locality :city
|
84
|
+
|
85
|
+
attr_reader :zip
|
86
|
+
alias :postal_code :zip
|
87
|
+
|
88
|
+
attr_reader :county
|
89
|
+
alias :subadministrative_area :county
|
90
|
+
|
91
|
+
attr_reader :state
|
92
|
+
alias :administrative_area :state
|
93
|
+
|
94
|
+
attr_reader :country
|
95
|
+
alias :country_code :country
|
96
|
+
|
97
|
+
# An array containing the standard three elements of a coordinate triple: latitude, longitude, elevation.
|
98
|
+
attr_reader :coordinates
|
99
|
+
|
100
|
+
# A float, the standard first element of a coordinate triple.
|
101
|
+
attr_reader :longitude
|
102
|
+
alias :lng :longitude
|
103
|
+
|
104
|
+
# A float, the standard second element of a coordinate triple.
|
105
|
+
attr_reader :latitude
|
106
|
+
alias :lat :latitude
|
107
|
+
|
108
|
+
# A float, the standard third element of a coordinate triple.
|
109
|
+
attr_reader :elevation
|
110
|
+
|
111
|
+
# An integer, Google's rating of the accuracy of the supplied address.
|
112
|
+
attr_reader :accuracy
|
113
|
+
|
114
|
+
# All address attributes as one string, formatted by the service.
|
115
|
+
attr_reader :full_address
|
116
|
+
alias :to_s :full_address
|
117
|
+
|
118
|
+
# The address query sent to the service. i.e. The user input.
|
119
|
+
attr_reader :query
|
120
|
+
|
121
|
+
def initialize(placemark, query) #:nodoc
|
122
|
+
@xml = placemark
|
123
|
+
@query = query
|
124
|
+
|
125
|
+
{
|
126
|
+
:@street => :ThoroughfareName,
|
127
|
+
:@city => :LocalityName,
|
128
|
+
:@zip => :PostalCodeNumber,
|
129
|
+
:@county => :SubAdministrativeAreaName,
|
130
|
+
:@state => :AdministrativeAreaName,
|
131
|
+
:@country => :CountryNameCode,
|
132
|
+
|
133
|
+
:@full_address => :address
|
134
|
+
}.each do |attribute, element|
|
135
|
+
instance_variable_set(attribute, (fetch(element) rescue nil))
|
136
|
+
end
|
137
|
+
|
138
|
+
@longitude, @latitude, @elevation = @coordinates = fetch(:coordinates).split(',').map { |x| x.to_f }
|
139
|
+
|
140
|
+
@accuracy = fetch_accuracy
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
###
|
145
|
+
|
146
|
+
class Response #:nodoc:
|
147
|
+
include Parser
|
148
|
+
|
149
|
+
attr_reader :query, :status, :placemarks
|
150
|
+
|
151
|
+
def initialize(xml, geo_key) #:nodoc
|
152
|
+
@xml, @geo_key = xml, geo_key
|
153
|
+
|
154
|
+
@query = fetch(:name)
|
155
|
+
@status = fetch(:code).to_i
|
156
|
+
|
157
|
+
check_for_errors
|
158
|
+
|
159
|
+
@placemarks = @xml.scan %r{<Placemark(?: id="p\d+")?>.+?</Placemark>}m
|
160
|
+
end
|
161
|
+
|
162
|
+
def check_for_errors #:nodoc:
|
163
|
+
case status
|
164
|
+
when 200 then # Success
|
165
|
+
when 500 then raise ServerError, "Unknown error from Google's server"
|
166
|
+
when 601 then raise MissingAddressError, "Missing address"
|
167
|
+
when 602 then raise UnknownAddressError, "Unknown address: #{@query}"
|
168
|
+
when 603 then raise UnavailableAddressError, "Unavailable address: #{@query}"
|
169
|
+
when 610 then raise InvalidMapKeyError, "Invalid map key: #{@geo_key}"
|
170
|
+
when 620 then raise TooManyQueriesError, "Too many queries for map key: #{@geo_key}"
|
171
|
+
else raise UnknownError, "Unknown error: #{@status}"
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
###
|
177
|
+
|
178
|
+
class Error < Exception; end
|
179
|
+
|
180
|
+
class ServerError < Error; end
|
181
|
+
|
182
|
+
class AddressError < Error; end
|
183
|
+
class MissingAddressError < AddressError; end
|
184
|
+
class UnknownAddressError < AddressError; end
|
185
|
+
class UnavailableAddressError < AddressError; end
|
186
|
+
|
187
|
+
class MapKeyError < Error; end
|
188
|
+
class InvalidMapKeyError < MapKeyError; end
|
189
|
+
class TooManyQueriesError < MapKeyError; end
|
190
|
+
|
191
|
+
class UnknownError < Error; end
|
192
|
+
end
|
193
|
+
|
194
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<kml xmlns="http://earth.google.com/kml/2.1">
|
3
|
+
<Response>
|
4
|
+
<name>1600 Amphitheatre Parkway, Mountain View, CA</name>
|
5
|
+
<Status>
|
6
|
+
<code>200</code>
|
7
|
+
<request>geocode</request>
|
8
|
+
</Status>
|
9
|
+
<Placemark>
|
10
|
+
<address>1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA</address>
|
11
|
+
<AddressDetails xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" Accuracy="8">
|
12
|
+
<Country>
|
13
|
+
<CountryNameCode>US</CountryNameCode>
|
14
|
+
<AdministrativeArea>
|
15
|
+
<AdministrativeAreaName>CA</AdministrativeAreaName>
|
16
|
+
<SubAdministrativeArea>
|
17
|
+
<SubAdministrativeAreaName>Santa Clara</SubAdministrativeAreaName>
|
18
|
+
<Locality>
|
19
|
+
<LocalityName>Mountain View</LocalityName>
|
20
|
+
<Thoroughfare>
|
21
|
+
<ThoroughfareName>1600 Amphitheatre Pkwy</ThoroughfareName>
|
22
|
+
</Thoroughfare>
|
23
|
+
<PostalCode>
|
24
|
+
<PostalCodeNumber>94043</PostalCodeNumber>
|
25
|
+
</PostalCode>
|
26
|
+
</Locality>
|
27
|
+
</SubAdministrativeArea>
|
28
|
+
</AdministrativeArea>
|
29
|
+
</Country>
|
30
|
+
</AddressDetails>
|
31
|
+
<Point>
|
32
|
+
<coordinates>-122.083739,37.423021,0</coordinates>
|
33
|
+
</Point>
|
34
|
+
</Placemark>
|
35
|
+
</Response>
|
36
|
+
</kml>
|
@@ -0,0 +1,62 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<kml xmlns="http://earth.google.com/kml/2.0">
|
3
|
+
<Response>
|
4
|
+
<name>heaven</name>
|
5
|
+
<Status>
|
6
|
+
<code>200</code>
|
7
|
+
<request>geocode</request>
|
8
|
+
</Status>
|
9
|
+
<Placemark id="p1">
|
10
|
+
<address>Heaven, Pottsville, PA 17901, USA</address>
|
11
|
+
<AddressDetails xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" Accuracy="6">
|
12
|
+
<Country>
|
13
|
+
<CountryNameCode>US</CountryNameCode>
|
14
|
+
<AdministrativeArea>
|
15
|
+
<AdministrativeAreaName>PA</AdministrativeAreaName>
|
16
|
+
<SubAdministrativeArea>
|
17
|
+
<SubAdministrativeAreaName>Schuylkill</SubAdministrativeAreaName>
|
18
|
+
<Locality>
|
19
|
+
<LocalityName>Pottsville</LocalityName>
|
20
|
+
<Thoroughfare>
|
21
|
+
<ThoroughfareName>Heaven</ThoroughfareName>
|
22
|
+
</Thoroughfare>
|
23
|
+
<PostalCode>
|
24
|
+
<PostalCodeNumber>17901</PostalCodeNumber>
|
25
|
+
</PostalCode>
|
26
|
+
</Locality>
|
27
|
+
</SubAdministrativeArea>
|
28
|
+
</AdministrativeArea>
|
29
|
+
</Country>
|
30
|
+
</AddressDetails>
|
31
|
+
<Point>
|
32
|
+
<coordinates>-76.169968,40.650970,0</coordinates>
|
33
|
+
</Point>
|
34
|
+
</Placemark>
|
35
|
+
<Placemark id="p2">
|
36
|
+
<address>Heaven, Oakboro, NC 28129, USA</address>
|
37
|
+
<AddressDetails xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" Accuracy="6">
|
38
|
+
<Country>
|
39
|
+
<CountryNameCode>US</CountryNameCode>
|
40
|
+
<AdministrativeArea>
|
41
|
+
<AdministrativeAreaName>NC</AdministrativeAreaName>
|
42
|
+
<SubAdministrativeArea>
|
43
|
+
<SubAdministrativeAreaName>Stanly</SubAdministrativeAreaName>
|
44
|
+
<Locality>
|
45
|
+
<LocalityName>Oakboro</LocalityName>
|
46
|
+
<Thoroughfare>
|
47
|
+
<ThoroughfareName>Heaven</ThoroughfareName>
|
48
|
+
</Thoroughfare>
|
49
|
+
<PostalCode>
|
50
|
+
<PostalCodeNumber>28129</PostalCodeNumber>
|
51
|
+
</PostalCode>
|
52
|
+
</Locality>
|
53
|
+
</SubAdministrativeArea>
|
54
|
+
</AdministrativeArea>
|
55
|
+
</Country>
|
56
|
+
</AddressDetails>
|
57
|
+
<Point>
|
58
|
+
<coordinates>-80.330399,35.254227,0</coordinates>
|
59
|
+
</Point>
|
60
|
+
</Placemark>
|
61
|
+
</Response>
|
62
|
+
</kml>
|