geocode 0.1.0 → 0.2.0
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/CHANGELOG.rdoc +15 -0
- data/README.rdoc +105 -1
- data/bin/geocode +47 -5
- data/lib/google_geocode.rb +11 -1
- metadata +6 -4
data/CHANGELOG.rdoc
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
= Version 0.2.0 - 2009-11-25
|
2
|
+
* Added --viewport (map extents)
|
3
|
+
* Added --accuracy
|
4
|
+
* Changed dump to YAML (MUCH more readable!)
|
5
|
+
* Added field labels
|
6
|
+
* Added --quiet to turn off said labels
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
= Version 0.1.0 - 2009-11-17
|
11
|
+
* Initial release
|
12
|
+
* geocode --latlng to get lat,lng
|
13
|
+
* geocode --reverse to get address
|
14
|
+
* google service only
|
15
|
+
|
data/README.rdoc
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
Yet another geoding library. Initial version geocodes using Google
|
4
4
|
only but I plan to extend it to use Yahoo and possibly Tiger/Line.
|
5
5
|
|
6
|
+
|
6
7
|
= Examples
|
7
8
|
|
8
9
|
== Command-Line
|
@@ -30,10 +31,67 @@ result1 and result2 are hashes with the following extension functions added in:
|
|
30
31
|
result.latlng # array of 2 floats, [latitude, longitude], returned by geocode.
|
31
32
|
result.address # string containing the address returned by reverse_geocode.
|
32
33
|
|
34
|
+
|
35
|
+
= Options
|
36
|
+
|
37
|
+
== --help, -h
|
38
|
+
Get the most up to date help.
|
39
|
+
|
40
|
+
== --service, -s
|
41
|
+
Which service to use. Can be configured in geocode.yml. Currently only
|
42
|
+
google is supported.
|
43
|
+
|
44
|
+
== --google-api-key, -g
|
45
|
+
Your google API key. Can be configured in geocode.yml.
|
46
|
+
|
47
|
+
== --latlng, -l
|
48
|
+
Displays the lat/lng of the given address.
|
49
|
+
|
50
|
+
Default information to display, on by default if no other display mode
|
51
|
+
is selected.
|
52
|
+
|
53
|
+
== --viewport, -v
|
54
|
+
Displays the map viewport extends (bounding box) of the given address.
|
55
|
+
|
56
|
+
== --accuracy, -a
|
57
|
+
Displays the geocoding accuracy.
|
58
|
+
|
59
|
+
== --reverse, -r
|
60
|
+
Reverse geocodes a lat/lng to an address. Not compatible with
|
61
|
+
--latlng, --viewport or --accuracy; if any of those options are also
|
62
|
+
set they will be disabled.
|
63
|
+
|
64
|
+
Note: If you input a negative latitude from the command line, Trollop
|
65
|
+
tries to interpret this as an argument to the program. You should move
|
66
|
+
to the Northern Hemisphere. As a temporary workaround, however, you
|
67
|
+
can use '--' to tell Trollop to stop processing arguments, e.g.
|
68
|
+
|
69
|
+
$ geocode -r -- -23.548943,-46.638818
|
70
|
+
Address: Av. Vinte e Tr�s de Maio, 149-165 - Rep�blica, S�o Paulo - SP, 01316-060, Brazil
|
71
|
+
|
72
|
+
== --dump, -d
|
73
|
+
Geocodes (or reverse geocodes) the address and then dumps the returned
|
74
|
+
object. Use this to noodle around in the geocode result object for
|
75
|
+
other data.
|
76
|
+
|
77
|
+
== --quiet, -q
|
78
|
+
Turns off label printing. Useful when geocode is part of an external
|
79
|
+
toolchain, e.g.
|
80
|
+
|
81
|
+
$ echo The President lives at $(geocode -q 1600 Pennsylvania Ave, Charleston, WV 25302)
|
82
|
+
|
83
|
+
For example, I produced that full address with:
|
84
|
+
|
85
|
+
$ geocode -r $(geocode -q 1600 Pennsylvania Ave)
|
86
|
+
|
33
87
|
= Installation
|
34
88
|
|
35
89
|
gem install geocode
|
36
90
|
|
91
|
+
Ideally, then create ~/.geocode and in it, write a geocode.yml file
|
92
|
+
containing your google API key. See Configuration below for details.
|
93
|
+
|
94
|
+
|
37
95
|
= Configuration (Command-Line)
|
38
96
|
|
39
97
|
You can create a configuration file in ~/.geocode called geocode.yml.
|
@@ -53,10 +111,56 @@ bound by their Terms of Service. Most notably, this says that you MAY
|
|
53
111
|
NOT "use or display the Content without a corresponding Google map".
|
54
112
|
There are specific exceptions to this rule but be aware.
|
55
113
|
|
114
|
+
|
56
115
|
= Authors
|
57
116
|
|
58
117
|
* David Brady <github@shinybit.com>
|
59
118
|
|
119
|
+
|
60
120
|
= License
|
61
121
|
|
62
|
-
MIT.
|
122
|
+
MIT. See MIT-LICENSE file for details.
|
123
|
+
|
124
|
+
|
125
|
+
= TODO
|
126
|
+
|
127
|
+
== Caching
|
128
|
+
Google STRONGLY recommends caching geocoded data. For now, caching is
|
129
|
+
the responsibility of the client using the geocode library. Eventually
|
130
|
+
I'd like to just include a caching strategy and/or caching object to
|
131
|
+
Geocode.new_geocoder(). This hides the caching strategy from the
|
132
|
+
geocoding client.
|
133
|
+
|
134
|
+
Possible implementations might include defining internal strategies
|
135
|
+
(give me a sqlite3 file, or an ActiveRecord connection, or the address
|
136
|
+
of a memcached server, etc) or creating a cache object API and passing
|
137
|
+
that in.
|
138
|
+
|
139
|
+
UPDATE: As a command-line introspection/visualizing tool, caching is
|
140
|
+
pretty much useless. I'm burying this for now until and unless
|
141
|
+
somebody decides they want to use this as part of a toolchain or as a
|
142
|
+
library.
|
143
|
+
|
144
|
+
== Helpful Creation of geocode.yml
|
145
|
+
It is not unreasonable to expect a new geocode user to do this:
|
146
|
+
|
147
|
+
$ sudo gem install geocode
|
148
|
+
$ geocode 123 Some Address
|
149
|
+
|
150
|
+
This will fail because there's no Google API configured. It would be
|
151
|
+
nice to throw up an error message telling the user to create the
|
152
|
+
geocode.yml file. Optionally it should even offer to create ~/.geocode
|
153
|
+
and write the file there with a default API key.
|
154
|
+
|
155
|
+
== Better error handling
|
156
|
+
Remember the user from the step above? So he runs it and it creates
|
157
|
+
the default settings file with a sample API key. So he runs it again
|
158
|
+
without editing the file. The app should make it clear that the sample
|
159
|
+
API key needs to be edited. Or at the very least it should report
|
160
|
+
whatever error Google returns when an invalid API key is used.
|
161
|
+
|
162
|
+
== Open A Map
|
163
|
+
As I use geocode as a debugging and introspection tool, I keep wanting
|
164
|
+
to jump to a map to visualize the results. Consider emitting the uri
|
165
|
+
to a map using the Google static map API.
|
166
|
+
|
data/bin/geocode
CHANGED
@@ -7,26 +7,68 @@ config_file = ["./geocode.yml", "~/.geocode/geocode.yml"].map {|p| File.expand_p
|
|
7
7
|
config = config_file ? YAML::load_file(config_file) : {}
|
8
8
|
config.each { |k,v| config[k.to_sym] = v}
|
9
9
|
|
10
|
+
|
11
|
+
# Notes:
|
12
|
+
# - If you specify --reverse, all of the following will be turned off: --latlng --viewport --accuracy
|
13
|
+
# - If you specify none of --reverse, --latlng, --viewport, or --accuracy, --latlng will be assumed.
|
10
14
|
opts = Trollop.options do
|
11
15
|
opt :google_api_key, "API KEY to use", :default => nil
|
12
16
|
opt :service, "Geocoding Service to use", :default => nil
|
13
17
|
opt :reverse, "Reverse geocode", :type => :boolean, :default => false
|
14
|
-
opt :latlng, "Geocode to lat,lng (default)", :type => :boolean, :default =>
|
18
|
+
opt :latlng, "Geocode to lat,lng (default)", :type => :boolean, :default => false
|
19
|
+
opt :viewport, "Show viewport (map extents) of location", :type => :boolean, :default => false
|
20
|
+
opt :accuracy, "Show accuracy level of geocoded location", :type => :boolean, :default => false
|
21
|
+
opt :dump, "Dump the geocoded results", :type => :boolean, :default => false
|
22
|
+
opt :quiet, "Don't show labels", :type => :boolean, :default => false
|
15
23
|
end
|
16
24
|
|
17
25
|
opts[:google_api_key] ||= config[:google_api_key] || ""
|
18
26
|
opts[:service] ||= config[:service] || "google"
|
19
27
|
opts[:service] = opts[:service].to_sym
|
20
28
|
|
21
|
-
|
29
|
+
|
30
|
+
# reverse geocoding is not compatible with latlng / viewport / accuracy.
|
22
31
|
if opts[:reverse] && opts[:latlng]
|
23
32
|
opts[:latlng] = false
|
33
|
+
opts[:viewport] = false
|
34
|
+
opts[:accuracy] = false
|
24
35
|
end
|
25
36
|
|
37
|
+
# Default latlng to true if no other options have been given
|
38
|
+
opts[:latlng] = true unless [:reverse, :viewport, :accuracy].any? { |option| opts[option] }
|
39
|
+
|
40
|
+
|
26
41
|
# geocode the address or lat/lng given
|
27
42
|
g = Geocode.new_geocoder(opts[:service], opts)
|
43
|
+
|
44
|
+
geo = if opts[:reverse]
|
45
|
+
g.reverse_geocode(ARGV * ' ')
|
46
|
+
else
|
47
|
+
g.geocode(ARGV * ' ')
|
48
|
+
end
|
49
|
+
|
28
50
|
if opts[:latlng]
|
29
|
-
|
30
|
-
|
31
|
-
|
51
|
+
print 'Location: ' unless opts[:quiet]
|
52
|
+
puts "%f,%f" % geo.latlng
|
53
|
+
end
|
54
|
+
|
55
|
+
if opts[:viewport]
|
56
|
+
print 'Viewport: ' unless opts[:quiet]
|
57
|
+
vp = geo.viewport
|
58
|
+
puts "%f,%f %f,%f" % vp
|
59
|
+
end
|
60
|
+
|
61
|
+
if opts[:accuracy]
|
62
|
+
print 'Accuracy: ' unless opts[:quiet]
|
63
|
+
puts geo.accuracy
|
64
|
+
end
|
65
|
+
|
66
|
+
if opts[:reverse]
|
67
|
+
print 'Address: ' unless opts[:quiet]
|
68
|
+
puts geo.address
|
69
|
+
end
|
70
|
+
|
71
|
+
if opts[:dump]
|
72
|
+
puts 'Dump: ' unless opts[:quiet]
|
73
|
+
puts geo.dump
|
32
74
|
end
|
data/lib/google_geocode.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
require 'json'
|
3
|
+
require 'yaml'
|
3
4
|
|
4
5
|
class GoogleGeocode
|
5
6
|
attr_reader :api_key
|
@@ -23,7 +24,7 @@ class GoogleGeocode
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def dump
|
26
|
-
|
27
|
+
self.to_yaml
|
27
28
|
end
|
28
29
|
|
29
30
|
def latlng
|
@@ -33,6 +34,15 @@ class GoogleGeocode
|
|
33
34
|
def address
|
34
35
|
self["Placemark"][0]["address"]
|
35
36
|
end
|
37
|
+
|
38
|
+
def accuracy
|
39
|
+
self["Placemark"][0]["AddressDetails"]["Accuracy"]
|
40
|
+
end
|
41
|
+
|
42
|
+
# returns viewport in tlbr format
|
43
|
+
def viewport
|
44
|
+
vp = [:north, :west, :south, :east].map {|dir| self["Placemark"][0]["ExtendedData"]["LatLonBox"][dir.to_s] }
|
45
|
+
end
|
36
46
|
end
|
37
47
|
result
|
38
48
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geocode
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Brady
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-11-
|
12
|
+
date: 2009-11-25 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -41,12 +41,14 @@ extensions: []
|
|
41
41
|
extra_rdoc_files:
|
42
42
|
- README.rdoc
|
43
43
|
- MIT-LICENSE
|
44
|
+
- CHANGELOG.rdoc
|
44
45
|
files:
|
46
|
+
- CHANGELOG.rdoc
|
47
|
+
- MIT-LICENSE
|
48
|
+
- README.rdoc
|
45
49
|
- bin/geocode
|
46
50
|
- lib/geocode.rb
|
47
51
|
- lib/google_geocode.rb
|
48
|
-
- README.rdoc
|
49
|
-
- MIT-LICENSE
|
50
52
|
has_rdoc: true
|
51
53
|
homepage: http://github.com/dbrady/geocode/
|
52
54
|
licenses: []
|