graticule 0.1.3 → 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.txt +11 -0
- data/Manifest.txt +26 -11
- data/README.txt +1 -1
- data/bin/geocode +1 -1
- data/lib/graticule.rb +10 -8
- data/lib/graticule/cli.rb +1 -0
- data/lib/graticule/geocoder.rb +1 -12
- data/lib/graticule/geocoder/bogus.rb +15 -0
- data/lib/graticule/geocoder/geocoder_ca.rb +52 -0
- data/lib/graticule/geocoder/geocoder_us.rb +47 -0
- data/lib/graticule/geocoder/google.rb +106 -0
- data/lib/graticule/geocoder/host_ip.rb +50 -0
- data/lib/graticule/geocoder/local_search_maps.rb +45 -0
- data/lib/graticule/geocoder/meta_carta.rb +38 -0
- data/lib/graticule/geocoder/postcode_anywhere.rb +63 -0
- data/lib/graticule/geocoder/rest.rb +110 -0
- data/lib/graticule/geocoder/yahoo.rb +96 -0
- data/lib/graticule/location.rb +19 -7
- data/lib/graticule/version.rb +2 -2
- data/test/fixtures/responses/host_ip/private.txt +4 -0
- data/test/fixtures/responses/host_ip/success.txt +4 -0
- data/test/fixtures/responses/host_ip/unknown.txt +4 -0
- data/test/fixtures/responses/local_search_maps/success.txt +1 -0
- data/test/fixtures/responses/postcode_anywhere/badkey.xml +9 -0
- data/test/fixtures/responses/postcode_anywhere/canada.xml +16 -0
- data/test/fixtures/responses/postcode_anywhere/empty.xml +16 -0
- data/test/fixtures/responses/postcode_anywhere/success.xml +16 -0
- data/test/fixtures/responses/postcode_anywhere/uk.xml +18 -0
- data/test/test_helper.rb +4 -2
- data/test/unit/graticule/geocoder/geocoder_us_test.rb +43 -0
- data/test/unit/graticule/geocoder/google_test.rb +66 -0
- data/test/unit/graticule/geocoder/host_ip_test.rb +39 -0
- data/test/unit/graticule/geocoder/local_search_maps_test.rb +30 -0
- data/test/unit/graticule/geocoder/meta_carta_test.rb +44 -0
- data/test/unit/graticule/geocoder/postcode_anywhere_test.rb +50 -0
- data/test/unit/graticule/geocoder/yahoo_test.rb +48 -0
- data/test/unit/graticule/geocoder_test.rb +5 -9
- data/test/unit/graticule/location_test.rb +22 -7
- metadata +37 -18
- data/lib/graticule/geocoders/bogus.rb +0 -11
- data/lib/graticule/geocoders/geocoder_us.rb +0 -45
- data/lib/graticule/geocoders/google.rb +0 -99
- data/lib/graticule/geocoders/meta_carta.rb +0 -102
- data/lib/graticule/geocoders/rest.rb +0 -98
- data/lib/graticule/geocoders/yahoo.rb +0 -101
- data/test/unit/graticule/geocoders/geocoder_us_test.rb +0 -42
- data/test/unit/graticule/geocoders/geocoders.rb +0 -56
- data/test/unit/graticule/geocoders/google_test.rb +0 -22
- data/test/unit/graticule/geocoders/meta_carta_test.rb +0 -70
- data/test/unit/graticule/geocoders/yahoo_test.rb +0 -49
data/CHANGELOG.txt
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
0.2.0
|
2
|
+
* changed city to locality, state to region, and zip to postal_code
|
3
|
+
* added support for PostcodeAnywhere
|
4
|
+
* added support for Local Search Maps (James Stewart)
|
5
|
+
* added IP-based geocoder
|
6
|
+
* moved geocoders to Graticule::Geocoder namespace
|
7
|
+
* fixed Google geocoder (again)
|
8
|
+
* made Yahoo geocoder consistent with others by returning 1 result
|
9
|
+
* geocoders can how take a Hash (:street, :locality, :region, :postal_code, :country)
|
10
|
+
or a Graticule::Location for the #locate call
|
11
|
+
|
1
12
|
0.1.3 (2007-02-14)
|
2
13
|
* fixed Google geocoder
|
3
14
|
* fixed CLI
|
data/Manifest.txt
CHANGED
@@ -12,12 +12,16 @@ lib/graticule/distance/haversine.rb
|
|
12
12
|
lib/graticule/distance/spherical.rb
|
13
13
|
lib/graticule/distance/vincenty.rb
|
14
14
|
lib/graticule/geocoder.rb
|
15
|
-
lib/graticule/
|
16
|
-
lib/graticule/
|
17
|
-
lib/graticule/
|
18
|
-
lib/graticule/
|
19
|
-
lib/graticule/
|
20
|
-
lib/graticule/
|
15
|
+
lib/graticule/geocoder/bogus.rb
|
16
|
+
lib/graticule/geocoder/geocoder_ca.rb
|
17
|
+
lib/graticule/geocoder/geocoder_us.rb
|
18
|
+
lib/graticule/geocoder/google.rb
|
19
|
+
lib/graticule/geocoder/host_ip.rb
|
20
|
+
lib/graticule/geocoder/local_search_maps.rb
|
21
|
+
lib/graticule/geocoder/meta_carta.rb
|
22
|
+
lib/graticule/geocoder/postcode_anywhere.rb
|
23
|
+
lib/graticule/geocoder/rest.rb
|
24
|
+
lib/graticule/geocoder/yahoo.rb
|
21
25
|
lib/graticule/location.rb
|
22
26
|
lib/graticule/version.rb
|
23
27
|
test/fixtures/responses/geocoder_us/success.xml
|
@@ -29,18 +33,29 @@ test/fixtures/responses/google/server_error.xml
|
|
29
33
|
test/fixtures/responses/google/success.xml
|
30
34
|
test/fixtures/responses/google/unavailable.xml
|
31
35
|
test/fixtures/responses/google/unknown_address.xml
|
36
|
+
test/fixtures/responses/host_ip/private.txt
|
37
|
+
test/fixtures/responses/host_ip/success.txt
|
38
|
+
test/fixtures/responses/host_ip/unknown.txt
|
39
|
+
test/fixtures/responses/local_search_maps/success.txt
|
32
40
|
test/fixtures/responses/meta_carta/bad_address.xml
|
33
41
|
test/fixtures/responses/meta_carta/multiple.xml
|
34
42
|
test/fixtures/responses/meta_carta/success.xml
|
43
|
+
test/fixtures/responses/postcode_anywhere/badkey.xml
|
44
|
+
test/fixtures/responses/postcode_anywhere/canada.xml
|
45
|
+
test/fixtures/responses/postcode_anywhere/empty.xml
|
46
|
+
test/fixtures/responses/postcode_anywhere/success.xml
|
47
|
+
test/fixtures/responses/postcode_anywhere/uk.xml
|
35
48
|
test/fixtures/responses/yahoo/success.xml
|
36
49
|
test/fixtures/responses/yahoo/unknown_address.xml
|
37
50
|
test/mocks/uri.rb
|
38
51
|
test/test_helper.rb
|
39
52
|
test/unit/graticule/distance_test.rb
|
53
|
+
test/unit/graticule/geocoder/geocoder_us_test.rb
|
54
|
+
test/unit/graticule/geocoder/google_test.rb
|
55
|
+
test/unit/graticule/geocoder/host_ip_test.rb
|
56
|
+
test/unit/graticule/geocoder/local_search_maps_test.rb
|
57
|
+
test/unit/graticule/geocoder/meta_carta_test.rb
|
58
|
+
test/unit/graticule/geocoder/postcode_anywhere_test.rb
|
59
|
+
test/unit/graticule/geocoder/yahoo_test.rb
|
40
60
|
test/unit/graticule/geocoder_test.rb
|
41
|
-
test/unit/graticule/geocoders/geocoder_us_test.rb
|
42
|
-
test/unit/graticule/geocoders/geocoders.rb
|
43
|
-
test/unit/graticule/geocoders/google_test.rb
|
44
|
-
test/unit/graticule/geocoders/meta_carta_test.rb
|
45
|
-
test/unit/graticule/geocoders/yahoo_test.rb
|
46
61
|
test/unit/graticule/location_test.rb
|
data/README.txt
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= Graticule
|
2
2
|
|
3
|
-
Graticule is a geocoding API for looking up address coordinates. It supports
|
3
|
+
Graticule is a geocoding API for looking up address coordinates. It supports many popular APIs, including Yahoo, Google, Geocoder.ca, Geocoder.us, PostcodeAnywhere and MetaCarta.
|
4
4
|
|
5
5
|
= Usage
|
6
6
|
|
data/bin/geocode
CHANGED
data/lib/graticule.rb
CHANGED
@@ -4,15 +4,17 @@ require 'active_support'
|
|
4
4
|
|
5
5
|
require 'graticule/location'
|
6
6
|
require 'graticule/geocoder'
|
7
|
-
require 'graticule/
|
8
|
-
require 'graticule/
|
9
|
-
require 'graticule/
|
10
|
-
require 'graticule/
|
11
|
-
require 'graticule/
|
12
|
-
require 'graticule/
|
7
|
+
require 'graticule/geocoder/bogus'
|
8
|
+
require 'graticule/geocoder/rest'
|
9
|
+
require 'graticule/geocoder/google'
|
10
|
+
require 'graticule/geocoder/host_ip'
|
11
|
+
require 'graticule/geocoder/yahoo'
|
12
|
+
require 'graticule/geocoder/geocoder_ca'
|
13
|
+
require 'graticule/geocoder/geocoder_us'
|
14
|
+
require 'graticule/geocoder/local_search_maps'
|
15
|
+
require 'graticule/geocoder/meta_carta'
|
16
|
+
require 'graticule/geocoder/postcode_anywhere'
|
13
17
|
require 'graticule/distance'
|
14
18
|
require 'graticule/distance/haversine'
|
15
19
|
require 'graticule/distance/spherical'
|
16
20
|
require 'graticule/distance/vincenty'
|
17
|
-
|
18
|
-
require 'graticule/cli'
|
data/lib/graticule/cli.rb
CHANGED
data/lib/graticule/geocoder.rb
CHANGED
@@ -8,18 +8,7 @@ module Graticule
|
|
8
8
|
# See the documentation for your specific geocoder for more information
|
9
9
|
#
|
10
10
|
def self.service(name)
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
# The Geocode class is the base class for all geocoder implementations. The
|
15
|
-
# geocoders must implement:
|
16
|
-
#
|
17
|
-
# * locate(address)
|
18
|
-
#
|
19
|
-
class Geocoder
|
20
|
-
def initialize
|
21
|
-
raise NotImplementedError
|
22
|
-
end
|
11
|
+
Geocoder.const_get name.to_s.camelize
|
23
12
|
end
|
24
13
|
|
25
14
|
# Base error class
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Graticule #:nodoc:
|
2
|
+
module Geocoder #:nodoc:
|
3
|
+
|
4
|
+
# Bogus geocoder that can be used for test purposes
|
5
|
+
class Bogus
|
6
|
+
|
7
|
+
# returns a new location with the address set to the original query string
|
8
|
+
def locate(address)
|
9
|
+
Location.new :street => address
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Graticule #:nodoc:
|
2
|
+
module Geocoder #:nodoc:
|
3
|
+
|
4
|
+
# TODO: Reverse Geocoding
|
5
|
+
class GeocoderCa < Rest
|
6
|
+
|
7
|
+
def initialize(auth = nil)
|
8
|
+
@url = URI.parse 'http://geocoder.ca/'
|
9
|
+
@auth = auth
|
10
|
+
end
|
11
|
+
|
12
|
+
def locate(address)
|
13
|
+
get :locate => address.is_a?(String) ? address : location_from_params(address).to_s(:country => false)
|
14
|
+
end
|
15
|
+
|
16
|
+
def parse_response(xml) #:nodoc:
|
17
|
+
returning Location.new do |location|
|
18
|
+
location.latitude = xml.elements['geodata/latt'].text.to_f
|
19
|
+
location.longitude = xml.elements['geodata/longt'].text.to_f
|
20
|
+
location.street = xml.elements['geodata/standard/staddress'].text
|
21
|
+
location.locality = xml.elements['geodata/standard/city'].text
|
22
|
+
location.region = xml.elements['geodata/standard/prov'].text
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def check_error(xml) #:nodoc:
|
27
|
+
error = xml.elements['geodata/error']
|
28
|
+
if error
|
29
|
+
code = error.elements['code'].text.to_i
|
30
|
+
message = error.elements['description'].text
|
31
|
+
if (1..3).include?(code)
|
32
|
+
raise CredentialsError, message
|
33
|
+
elsif (4..8).include?(code)
|
34
|
+
raise AddressError, message
|
35
|
+
else
|
36
|
+
raise Error, message
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def make_url(params) #:nodoc:
|
42
|
+
params[:auth] = @auth if @auth
|
43
|
+
params[:standard] = 1
|
44
|
+
params[:showpostal] = 1
|
45
|
+
params[:geoit] = 'XML'
|
46
|
+
super params
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Graticule #:nodoc:
|
2
|
+
module Geocoder #:nodoc:
|
3
|
+
|
4
|
+
# A library for lookup up coordinates with geocoder.us' API.
|
5
|
+
#
|
6
|
+
# http://geocoder.us/help/
|
7
|
+
class GeocoderUs < Rest
|
8
|
+
|
9
|
+
# Creates a new GeocoderUs object optionally using +username+ and
|
10
|
+
# +password+.
|
11
|
+
#
|
12
|
+
# You can sign up for a geocoder.us account here:
|
13
|
+
#
|
14
|
+
# http://geocoder.us/user/signup
|
15
|
+
def initialize(user = nil, password = nil)
|
16
|
+
if user and password then
|
17
|
+
@url = URI.parse 'http://geocoder.us/member/service/rest/geocode'
|
18
|
+
@url.user = user
|
19
|
+
@url.password = password
|
20
|
+
else
|
21
|
+
@url = URI.parse 'http://rpc.geocoder.us/service/rest/geocode'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Locates +address+ and returns the address' latitude and longitude or
|
26
|
+
# raises an AddressError.
|
27
|
+
def locate(address)
|
28
|
+
get :address => address.is_a?(String) ? address : location_from_params(address).to_s(:country => false)
|
29
|
+
end
|
30
|
+
|
31
|
+
def parse_response(xml) #:nodoc:
|
32
|
+
location = Location.new
|
33
|
+
location.street = xml.elements['rdf:RDF/geo:Point/dc:description'].text
|
34
|
+
|
35
|
+
location.latitude = xml.elements['rdf:RDF/geo:Point/geo:lat'].text.to_f
|
36
|
+
location.longitude = xml.elements['rdf:RDF/geo:Point/geo:long'].text.to_f
|
37
|
+
|
38
|
+
return location
|
39
|
+
end
|
40
|
+
|
41
|
+
def check_error(xml) #:nodoc:
|
42
|
+
raise AddressError, xml.text if xml.text == 'couldn\'t find this address! sorry'
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
|
2
|
+
module Graticule #:nodoc:
|
3
|
+
module Geocoder #:nodoc:
|
4
|
+
|
5
|
+
# First you need a Google Maps API key. You can register for one here:
|
6
|
+
# http://www.google.com/apis/maps/signup.html
|
7
|
+
#
|
8
|
+
# Then you create a GoogleGeocode object and start locating addresses:
|
9
|
+
#
|
10
|
+
# require 'rubygems'
|
11
|
+
# require 'graticule'
|
12
|
+
#
|
13
|
+
# gg = Graticule.service(:google).new(:key => MAPS_API_KEY)
|
14
|
+
# location = gg.locate '1600 Amphitheater Pkwy, Mountain View, CA'
|
15
|
+
# p location.coordinates
|
16
|
+
#
|
17
|
+
class Google < Rest
|
18
|
+
# http://www.google.com/apis/maps/documentation/#Geocoding_HTTP_Request
|
19
|
+
|
20
|
+
# http://www.google.com/apis/maps/documentation/reference.html#GGeoAddressAccuracy
|
21
|
+
PRECISION = {
|
22
|
+
0 => :unknown, # Unknown location. (Since 2.59)
|
23
|
+
1 => :country, # Country level accuracy. (Since 2.59)
|
24
|
+
2 => :state, # Region (state, province, prefecture, etc.) level accuracy. (Since 2.59)
|
25
|
+
3 => :state, # Sub-region (county, municipality, etc.) level accuracy. (Since 2.59)
|
26
|
+
4 => :city, # Town (city, village) level accuracy. (Since 2.59)
|
27
|
+
5 => :zip, # Post code (zip code) level accuracy. (Since 2.59)
|
28
|
+
6 => :street, # Street level accuracy. (Since 2.59)
|
29
|
+
7 => :street, # Intersection level accuracy. (Since 2.59)
|
30
|
+
8 => :address # Address level accuracy. (Since 2.59)
|
31
|
+
}
|
32
|
+
|
33
|
+
# Creates a new GoogleGeocode that will use Google Maps API key +key+. You
|
34
|
+
# can sign up for an API key here:
|
35
|
+
#
|
36
|
+
# http://www.google.com/apis/maps/signup.html
|
37
|
+
def initialize(key)
|
38
|
+
@key = key
|
39
|
+
@url = URI.parse 'http://maps.google.com/maps/geo'
|
40
|
+
end
|
41
|
+
|
42
|
+
# Locates +address+ returning a Location
|
43
|
+
def locate(address)
|
44
|
+
get :q => address.is_a?(String) ? address : location_from_params(address).to_s
|
45
|
+
end
|
46
|
+
|
47
|
+
# Extracts a Location from +xml+.
|
48
|
+
def parse_response(xml) #:nodoc:
|
49
|
+
address = REXML::XPath.first(xml, '//xal:AddressDetails', 'xal' => "urn:oasis:names:tc:ciq:xsdschema:xAL:2.0")
|
50
|
+
|
51
|
+
longitude, latitude, = xml.elements['/kml/Response/Placemark/Point/coordinates'].text.split(',').map { |v| v.to_f }
|
52
|
+
|
53
|
+
Location.new \
|
54
|
+
:street => value(address.elements['Country/AdministrativeArea/SubAdministrativeArea/Locality/Thoroughfare/ThoroughfareName/text()']),
|
55
|
+
:locality => value(address.elements['Country/AdministrativeArea/SubAdministrativeArea/Locality/LocalityName/text()']),
|
56
|
+
:region => value(address.elements['Country/AdministrativeArea/AdministrativeAreaName/text()']),
|
57
|
+
:postal_code => value(address.elements['Country/AdministrativeArea/SubAdministrativeArea/Locality/PostalCode/PostalCodeNumber/text()']),
|
58
|
+
:country => value(address.elements['Country/CountryNameCode/text()']),
|
59
|
+
:latitude => latitude,
|
60
|
+
:longitude => longitude,
|
61
|
+
:precision => PRECISION[address.attribute('Accuracy').value.to_i] || :unknown
|
62
|
+
end
|
63
|
+
|
64
|
+
# Extracts and raises an error from +xml+, if any.
|
65
|
+
def check_error(xml) #:nodoc:
|
66
|
+
status = xml.elements['/kml/Response/Status/code'].text.to_i
|
67
|
+
case status
|
68
|
+
when 200 then # ignore, ok
|
69
|
+
when 500 then
|
70
|
+
raise Error, 'server error'
|
71
|
+
when 601 then
|
72
|
+
raise AddressError, 'missing address'
|
73
|
+
when 602 then
|
74
|
+
raise AddressError, 'unknown address'
|
75
|
+
when 603 then
|
76
|
+
raise AddressError, 'unavailable address'
|
77
|
+
when 610 then
|
78
|
+
raise CredentialsError, 'invalid key'
|
79
|
+
when 620 then
|
80
|
+
raise CredentialsError, 'too many queries'
|
81
|
+
else
|
82
|
+
raise Error, "unknown error #{status}"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Creates a URL from the Hash +params+. Automatically adds the key and
|
87
|
+
# sets the output type to 'xml'.
|
88
|
+
def make_url(params) #:nodoc:
|
89
|
+
params[:key] = @key
|
90
|
+
params[:output] = 'xml'
|
91
|
+
|
92
|
+
super params
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
def value(element)
|
98
|
+
element.value if element
|
99
|
+
end
|
100
|
+
|
101
|
+
def text(element)
|
102
|
+
element.text if element
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Graticule #:nodoc:
|
4
|
+
module Geocoder #:nodoc:
|
5
|
+
|
6
|
+
class HostIp
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@url = URI.parse 'http://api.hostip.info/get_html.php'
|
10
|
+
end
|
11
|
+
|
12
|
+
# Geocode an IP address using http://hostip.info
|
13
|
+
def locate(address)
|
14
|
+
make_url(:ip => address, :position => true).open do |response|
|
15
|
+
# add new line so YAML.load doesn't puke
|
16
|
+
result = response.read + "\n"
|
17
|
+
check_error(result)
|
18
|
+
parse_response(YAML.load(result))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def parse_response(response) #:nodoc:
|
25
|
+
returning Location.new do |location|
|
26
|
+
location.latitude = response['Latitude']
|
27
|
+
location.longitude = response['Longitude']
|
28
|
+
location.locality, location.region = response['City'].split(', ')
|
29
|
+
country = response['Country'].match(/\((\w+)\)$/)
|
30
|
+
location.country = country[1] if country
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def check_error(response) #:nodoc:
|
35
|
+
raise AddressError, 'Unknown' if response =~ /Unknown City/
|
36
|
+
raise AddressError, 'Private Address' if response =~ /Private Address/
|
37
|
+
end
|
38
|
+
|
39
|
+
def make_url(params) #:nodoc:
|
40
|
+
returning @url.dup do |url|
|
41
|
+
url.query = params.map do |k,v|
|
42
|
+
"#{URI.escape k.to_s}=#{URI.escape v.to_s}"
|
43
|
+
end.join('&')
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Graticule #:nodoc:
|
2
|
+
module Geocoder #:nodoc:
|
3
|
+
|
4
|
+
# A library for lookup of coordinates with http://geo.localsearchmaps.com/
|
5
|
+
#
|
6
|
+
# See http://emad.fano.us/blog/?p=277
|
7
|
+
class LocalSearchMaps < Rest
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@url = URI.parse 'http://geo.localsearchmaps.com/'
|
11
|
+
end
|
12
|
+
|
13
|
+
# This web service will handle some addresses outside the US
|
14
|
+
# if given more structured arguments than just a string address
|
15
|
+
# So allow input as a hash for the different arguments (:city, :country, :zip)
|
16
|
+
def locate(params)
|
17
|
+
get params.is_a?(String) ? {:loc => params} : map_attributes(location_from_params(params))
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def map_attributes(location)
|
23
|
+
#mapping = {:street => :address, :locality => :city, :region => :state, :postal_code => :zip}
|
24
|
+
mapping = {}
|
25
|
+
mapping.keys.inject({}) do |result,attribute|
|
26
|
+
result[mapping[attribute]] = location.attributes[attribute]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def check_error(js)
|
31
|
+
raise AddressError, "Empty Response" if js.nil? or js.text.nil?
|
32
|
+
raise AddressError, 'Location not found' if js.text =~ /location not found/
|
33
|
+
end
|
34
|
+
|
35
|
+
def parse_response(js)
|
36
|
+
returning Location.new do |location|
|
37
|
+
coordinates = js.text.match(/map.centerAndZoom\(new GPoint\((.+?), (.+?)\)/)
|
38
|
+
location.longitude = coordinates[1].to_f
|
39
|
+
location.latitude = coordinates[2].to_f
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|