geocode 0.1.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/MIT-LICENSE +22 -0
- data/README.rdoc +62 -0
- data/bin/geocode +32 -0
- data/lib/geocode.rb +20 -0
- data/lib/google_geocode.rb +50 -0
- metadata +84 -0
data/MIT-LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2008-2009 David Brady github@shinybit.com
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
= geocode
|
2
|
+
|
3
|
+
Yet another geoding library. Initial version geocodes using Google
|
4
|
+
only but I plan to extend it to use Yahoo and possibly Tiger/Line.
|
5
|
+
|
6
|
+
= Examples
|
7
|
+
|
8
|
+
== Command-Line
|
9
|
+
|
10
|
+
Geocode an address using google:
|
11
|
+
|
12
|
+
geocode -s google -g abcd1234_SAMPLE_GOOGLE_API_KEY_etc 1600 Amphitheatre Parkway, Mountain View, CA
|
13
|
+
# => 37.421759,-122.08437
|
14
|
+
|
15
|
+
Reverse geocode a lat/lng (with google api key set in configuration file):
|
16
|
+
|
17
|
+
geocode -r 37.421759,-122.08437
|
18
|
+
# => 1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA
|
19
|
+
|
20
|
+
== Ruby
|
21
|
+
|
22
|
+
g = Geocode.new_geocoder :google, {:google_api_key => "abcd1234_SAMPLE_GOOGLE_API_KEY_etc"}
|
23
|
+
result1 = g.geocode "1600 Amphitheatre Parkway, Mountain View, CA"
|
24
|
+
result2 = g.reverse_geocode "37.421759,-122.08437"
|
25
|
+
|
26
|
+
result1 and result2 are hashes with the following extension functions added in:
|
27
|
+
|
28
|
+
result.success? # true if the geocode/reverse_geocode succeeded.
|
29
|
+
result.error? # opposite of success.
|
30
|
+
result.latlng # array of 2 floats, [latitude, longitude], returned by geocode.
|
31
|
+
result.address # string containing the address returned by reverse_geocode.
|
32
|
+
|
33
|
+
= Installation
|
34
|
+
|
35
|
+
gem install geocode
|
36
|
+
|
37
|
+
= Configuration (Command-Line)
|
38
|
+
|
39
|
+
You can create a configuration file in ~/.geocode called geocode.yml.
|
40
|
+
It's a handy place to put your Google API key, for example. You can
|
41
|
+
also place geocode.yml in the current directory if you don't want to
|
42
|
+
place it in your home folder. A sample file would look like:
|
43
|
+
|
44
|
+
---
|
45
|
+
service: google
|
46
|
+
google_api_key: abcd1234_SAMPLE_GOOGLE_API_KEY_etc
|
47
|
+
|
48
|
+
|
49
|
+
= TOS WARNING
|
50
|
+
|
51
|
+
The Google geocoding service uses the Google Map API and thus you are
|
52
|
+
bound by their Terms of Service. Most notably, this says that you MAY
|
53
|
+
NOT "use or display the Content without a corresponding Google map".
|
54
|
+
There are specific exceptions to this rule but be aware.
|
55
|
+
|
56
|
+
= Authors
|
57
|
+
|
58
|
+
* David Brady <github@shinybit.com>
|
59
|
+
|
60
|
+
= License
|
61
|
+
|
62
|
+
MIT.
|
data/bin/geocode
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'trollop'
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'geocode'))
|
4
|
+
|
5
|
+
config_file = ["./geocode.yml", "~/.geocode/geocode.yml"].map {|p| File.expand_path(p)}.find {|p| File.exists? p}
|
6
|
+
|
7
|
+
config = config_file ? YAML::load_file(config_file) : {}
|
8
|
+
config.each { |k,v| config[k.to_sym] = v}
|
9
|
+
|
10
|
+
opts = Trollop.options do
|
11
|
+
opt :google_api_key, "API KEY to use", :default => nil
|
12
|
+
opt :service, "Geocoding Service to use", :default => nil
|
13
|
+
opt :reverse, "Reverse geocode", :type => :boolean, :default => false
|
14
|
+
opt :latlng, "Geocode to lat,lng (default)", :type => :boolean, :default => true
|
15
|
+
end
|
16
|
+
|
17
|
+
opts[:google_api_key] ||= config[:google_api_key] || ""
|
18
|
+
opts[:service] ||= config[:service] || "google"
|
19
|
+
opts[:service] = opts[:service].to_sym
|
20
|
+
|
21
|
+
# reverse geocoding is not compatible with latlng
|
22
|
+
if opts[:reverse] && opts[:latlng]
|
23
|
+
opts[:latlng] = false
|
24
|
+
end
|
25
|
+
|
26
|
+
# geocode the address or lat/lng given
|
27
|
+
g = Geocode.new_geocoder(opts[:service], opts)
|
28
|
+
if opts[:latlng]
|
29
|
+
puts g.geocode(ARGV * ' ').latlng * ','
|
30
|
+
else opts[:reverse]
|
31
|
+
puts g.reverse_geocode(ARGV * ' ').address
|
32
|
+
end
|
data/lib/geocode.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'google_geocode'))
|
2
|
+
|
3
|
+
class Geocode
|
4
|
+
def self.new_geocoder(service, options)
|
5
|
+
case service
|
6
|
+
when :google
|
7
|
+
GoogleGeocode.new options[:google_api_key]
|
8
|
+
else
|
9
|
+
raise "Unsupported geocode service: #{service}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def geocode()
|
14
|
+
raise "geocode(): Unimplemented method! Child class must override!"
|
15
|
+
end
|
16
|
+
|
17
|
+
def reverse_geocode()
|
18
|
+
raise "reverse_geocode(): Unimplemented method! Child class must override!"
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
class GoogleGeocode
|
5
|
+
attr_reader :api_key
|
6
|
+
def initialize(api_key)
|
7
|
+
@api_key = api_key
|
8
|
+
end
|
9
|
+
|
10
|
+
def do_geocode(location)
|
11
|
+
url = "http://maps.google.com/maps/geo?sensor=false&key=#{@api_key}&output=json&q=#{location}"
|
12
|
+
resp = Net::HTTP.get_response(URI.parse(url))
|
13
|
+
data = resp.body
|
14
|
+
|
15
|
+
result = JSON.parse(data)
|
16
|
+
class << result
|
17
|
+
def success?
|
18
|
+
self["Status"]["code"] == 200
|
19
|
+
end
|
20
|
+
|
21
|
+
def error?
|
22
|
+
!success?
|
23
|
+
end
|
24
|
+
|
25
|
+
def dump
|
26
|
+
inspect
|
27
|
+
end
|
28
|
+
|
29
|
+
def latlng
|
30
|
+
self["Placemark"][0]["Point"]["coordinates"][0..1].reverse
|
31
|
+
end
|
32
|
+
|
33
|
+
def address
|
34
|
+
self["Placemark"][0]["address"]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
result
|
38
|
+
end
|
39
|
+
|
40
|
+
def geocode(location)
|
41
|
+
# change whitespace to %20 for the URL
|
42
|
+
result = do_geocode location.gsub(/\s+/, '%20')
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def reverse_geocode(location)
|
47
|
+
# reverse geocodes should not have any spaces in them
|
48
|
+
result = do_geocode location.gsub(/\s+/, '')
|
49
|
+
end
|
50
|
+
end
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: geocode
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- David Brady
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-17 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: trollop
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: json
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
description: geocode, a ruby library and command-line tool for geocoding addresses and reverse geocoding coordinates.
|
36
|
+
email: github@shinybit.com
|
37
|
+
executables:
|
38
|
+
- geocode
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- README.rdoc
|
43
|
+
- MIT-LICENSE
|
44
|
+
files:
|
45
|
+
- bin/geocode
|
46
|
+
- lib/geocode.rb
|
47
|
+
- lib/google_geocode.rb
|
48
|
+
- README.rdoc
|
49
|
+
- MIT-LICENSE
|
50
|
+
has_rdoc: true
|
51
|
+
homepage: http://github.com/dbrady/geocode/
|
52
|
+
licenses: []
|
53
|
+
|
54
|
+
post_install_message:
|
55
|
+
rdoc_options:
|
56
|
+
- --line-numbers
|
57
|
+
- --inline-source
|
58
|
+
- --main
|
59
|
+
- README.rdoc
|
60
|
+
- --title
|
61
|
+
- geocode
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: "0"
|
69
|
+
version:
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: "0"
|
75
|
+
version:
|
76
|
+
requirements: []
|
77
|
+
|
78
|
+
rubyforge_project:
|
79
|
+
rubygems_version: 1.3.5
|
80
|
+
signing_key:
|
81
|
+
specification_version: 3
|
82
|
+
summary: Geocoding library and CLI tool
|
83
|
+
test_files: []
|
84
|
+
|