geokit 1.2.5
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/.project +17 -0
- data/History.txt +29 -0
- data/Manifest.txt +22 -0
- data/README.markdown +190 -0
- data/Rakefile +13 -0
- data/geokit.gemspec +28 -0
- data/lib/geokit.rb +30 -0
- data/lib/geokit/geocoders.rb +563 -0
- data/lib/geokit/mappable.rb +478 -0
- data/test/test_base_geocoder.rb +56 -0
- data/test/test_bounds.rb +74 -0
- data/test/test_ca_geocoder.rb +41 -0
- data/test/test_geoloc.rb +64 -0
- data/test/test_geoplugin_geocoder.rb +59 -0
- data/test/test_google_geocoder.rb +116 -0
- data/test/test_google_reverse_geocoder.rb +49 -0
- data/test/test_inflector.rb +22 -0
- data/test/test_ipgeocoder.rb +88 -0
- data/test/test_latlng.rb +132 -0
- data/test/test_multi_geocoder.rb +44 -0
- data/test/test_us_geocoder.rb +56 -0
- data/test/test_yahoo_geocoder.rb +87 -0
- metadata +98 -0
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'net/http'
|
3
|
+
require 'rubygems'
|
4
|
+
require 'mocha'
|
5
|
+
require 'lib/geokit'
|
6
|
+
|
7
|
+
class MockSuccess < Net::HTTPSuccess #:nodoc: all
|
8
|
+
def initialize
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class MockFailure < Net::HTTPServiceUnavailable #:nodoc: all
|
13
|
+
def initialize
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Base class for testing geocoders.
|
18
|
+
class BaseGeocoderTest < Test::Unit::TestCase #:nodoc: all
|
19
|
+
|
20
|
+
# Defines common test fixtures.
|
21
|
+
def setup
|
22
|
+
@address = 'San Francisco, CA'
|
23
|
+
@full_address = '100 Spear St, San Francisco, CA, 94105-1522, US'
|
24
|
+
@full_address_short_zip = '100 Spear St, San Francisco, CA, 94105, US'
|
25
|
+
|
26
|
+
@success = Geokit::GeoLoc.new({:city=>"SAN FRANCISCO", :state=>"CA", :country_code=>"US", :lat=>37.7742, :lng=>-122.417068})
|
27
|
+
@success.success = true
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_timeout_call_web_service
|
31
|
+
Geokit::Geocoders::Geocoder.class_eval do
|
32
|
+
def self.do_get(url)
|
33
|
+
sleep(2)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
url = "http://www.anything.com"
|
37
|
+
Geokit::Geocoders::timeout = 1
|
38
|
+
assert_nil Geokit::Geocoders::Geocoder.call_geocoder_service(url)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_successful_call_web_service
|
42
|
+
url = "http://www.anything.com"
|
43
|
+
Geokit::Geocoders::Geocoder.expects(:do_get).with(url).returns("SUCCESS")
|
44
|
+
assert_equal "SUCCESS", Geokit::Geocoders::Geocoder.call_geocoder_service(url)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_find_geocoder_methods
|
48
|
+
public_methods = Geokit::Geocoders::Geocoder.public_methods.map { |m| m.to_s }
|
49
|
+
assert public_methods.include?("yahoo_geocoder")
|
50
|
+
assert public_methods.include?("google_geocoder")
|
51
|
+
assert public_methods.include?("ca_geocoder")
|
52
|
+
assert public_methods.include?("us_geocoder")
|
53
|
+
assert public_methods.include?("multi_geocoder")
|
54
|
+
assert public_methods.include?("ip_geocoder")
|
55
|
+
end
|
56
|
+
end
|
data/test/test_bounds.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'lib/geokit'
|
3
|
+
|
4
|
+
class BoundsTest < Test::Unit::TestCase #:nodoc: all
|
5
|
+
|
6
|
+
def setup
|
7
|
+
# This is the area in Texas
|
8
|
+
@sw = Geokit::LatLng.new(32.91663,-96.982841)
|
9
|
+
@ne = Geokit::LatLng.new(32.96302,-96.919495)
|
10
|
+
@bounds=Geokit::Bounds.new(@sw,@ne)
|
11
|
+
@loc_a=Geokit::LatLng.new(32.918593,-96.958444) # inside bounds
|
12
|
+
@loc_b=Geokit::LatLng.new(32.914144,-96.958444) # outside bouds
|
13
|
+
|
14
|
+
# this is a cross-meridan area
|
15
|
+
@cross_meridian=Geokit::Bounds.normalize([30,170],[40,-170])
|
16
|
+
@inside_cm=Geokit::LatLng.new(35,175)
|
17
|
+
@inside_cm_2=Geokit::LatLng.new(35,-175)
|
18
|
+
@east_of_cm=Geokit::LatLng.new(35,-165)
|
19
|
+
@west_of_cm=Geokit::LatLng.new(35,165)
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_equality
|
24
|
+
assert_equal Geokit::Bounds.new(@sw,@ne), Geokit::Bounds.new(@sw,@ne)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_normalize
|
28
|
+
res=Geokit::Bounds.normalize(@sw,@ne)
|
29
|
+
assert_equal res,Geokit::Bounds.new(@sw,@ne)
|
30
|
+
res=Geokit::Bounds.normalize([@sw,@ne])
|
31
|
+
assert_equal res,Geokit::Bounds.new(@sw,@ne)
|
32
|
+
res=Geokit::Bounds.normalize([@sw.lat,@sw.lng],[@ne.lat,@ne.lng])
|
33
|
+
assert_equal res,Geokit::Bounds.new(@sw,@ne)
|
34
|
+
res=Geokit::Bounds.normalize([[@sw.lat,@sw.lng],[@ne.lat,@ne.lng]])
|
35
|
+
assert_equal res,Geokit::Bounds.new(@sw,@ne)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_point_inside_bounds
|
39
|
+
assert @bounds.contains?(@loc_a)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_point_outside_bounds
|
43
|
+
assert !@bounds.contains?(@loc_b)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_point_inside_bounds_cross_meridian
|
47
|
+
assert @cross_meridian.contains?(@inside_cm)
|
48
|
+
assert @cross_meridian.contains?(@inside_cm_2)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_point_outside_bounds_cross_meridian
|
52
|
+
assert !@cross_meridian.contains?(@east_of_cm)
|
53
|
+
assert !@cross_meridian.contains?(@west_of_cm)
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_center
|
57
|
+
assert_in_delta 32.939828,@bounds.center.lat,0.00005
|
58
|
+
assert_in_delta(-96.9511763,@bounds.center.lng,0.00005)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_center_cross_meridian
|
62
|
+
assert_in_delta 35.41160, @cross_meridian.center.lat,0.00005
|
63
|
+
assert_in_delta 179.38112, @cross_meridian.center.lng,0.00005
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_creation_from_circle
|
67
|
+
bounds=Geokit::Bounds.from_point_and_radius([32.939829, -96.951176],2.5)
|
68
|
+
inside=Geokit::LatLng.new 32.9695270000,-96.9901590000
|
69
|
+
outside=Geokit::LatLng.new 32.8951550000,-96.9584440000
|
70
|
+
assert bounds.contains?(inside)
|
71
|
+
assert !bounds.contains?(outside)
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_base_geocoder')
|
2
|
+
|
3
|
+
Geokit::Geocoders::geocoder_ca = "SOMEKEYVALUE"
|
4
|
+
|
5
|
+
class CaGeocoderTest < BaseGeocoderTest #:nodoc: all
|
6
|
+
|
7
|
+
CA_SUCCESS=<<-EOF
|
8
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
9
|
+
<geodata><latt>49.243086</latt><longt>-123.153684</longt></geodata>
|
10
|
+
EOF
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@ca_full_hash = {:street_address=>"2105 West 32nd Avenue",:city=>"Vancouver", :state=>"BC"}
|
14
|
+
@ca_full_loc = Geokit::GeoLoc.new(@ca_full_hash)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_geocoder_with_geo_loc_with_account
|
18
|
+
response = MockSuccess.new
|
19
|
+
response.expects(:body).returns(CA_SUCCESS)
|
20
|
+
url = "http://geocoder.ca/?stno=2105&addresst=West+32nd+Avenue&city=Vancouver&prov=BC&auth=SOMEKEYVALUE&geoit=xml"
|
21
|
+
Geokit::Geocoders::CaGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
22
|
+
verify(Geokit::Geocoders::CaGeocoder.geocode(@ca_full_loc))
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_service_unavailable
|
26
|
+
response = MockFailure.new
|
27
|
+
#Net::HTTP.expects(:get_response).with(URI.parse("http://geocoder.ca/?stno=2105&addresst=West+32nd+Avenue&city=Vancouver&prov=BC&auth=SOMEKEYVALUE&geoit=xml")).returns(response)
|
28
|
+
url = "http://geocoder.ca/?stno=2105&addresst=West+32nd+Avenue&city=Vancouver&prov=BC&auth=SOMEKEYVALUE&geoit=xml"
|
29
|
+
Geokit::Geocoders::CaGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
30
|
+
assert !Geokit::Geocoders::CaGeocoder.geocode(@ca_full_loc).success
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def verify(location)
|
36
|
+
assert_equal "BC", location.state
|
37
|
+
assert_equal "Vancouver", location.city
|
38
|
+
assert_equal "49.243086,-123.153684", location.ll
|
39
|
+
assert !location.is_us?
|
40
|
+
end
|
41
|
+
end
|
data/test/test_geoloc.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'lib/geokit'
|
3
|
+
|
4
|
+
class GeoLocTest < Test::Unit::TestCase #:nodoc: all
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@loc = Geokit::GeoLoc.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_is_us
|
11
|
+
assert !@loc.is_us?
|
12
|
+
@loc.country_code = 'US'
|
13
|
+
assert @loc.is_us?
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_street_number
|
17
|
+
@loc.street_address = '123 Spear St.'
|
18
|
+
assert_equal '123', @loc.street_number
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_street_name
|
22
|
+
@loc.street_address = '123 Spear St.'
|
23
|
+
assert_equal 'Spear St.', @loc.street_name
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_city
|
27
|
+
@loc.city = "san francisco"
|
28
|
+
assert_equal 'San Francisco', @loc.city
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_full_address
|
32
|
+
@loc.city = 'San Francisco'
|
33
|
+
@loc.state = 'CA'
|
34
|
+
@loc.zip = '94105'
|
35
|
+
@loc.country_code = 'US'
|
36
|
+
assert_equal 'San Francisco, CA, 94105, US', @loc.full_address
|
37
|
+
@loc.full_address = 'Irving, TX, 75063, US'
|
38
|
+
assert_equal 'Irving, TX, 75063, US', @loc.full_address
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_hash
|
42
|
+
@loc.city = 'San Francisco'
|
43
|
+
@loc.state = 'CA'
|
44
|
+
@loc.zip = '94105'
|
45
|
+
@loc.country_code = 'US'
|
46
|
+
@another = Geokit::GeoLoc.new @loc.to_hash
|
47
|
+
assert_equal @loc, @another
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_all
|
51
|
+
assert_equal [@loc], @loc.all
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_to_yaml
|
55
|
+
@loc.city = 'San Francisco'
|
56
|
+
@loc.state = 'CA'
|
57
|
+
@loc.zip = '94105'
|
58
|
+
@loc.country_code = 'US'
|
59
|
+
assert_equal(
|
60
|
+
"--- !ruby/object:Geokit::GeoLoc \ncity: San Francisco\ncountry_code: US\nfull_address: \nlat: \nlng: \nprecision: unknown\nstate: CA\nstreet_address: \nsuccess: false\nzip: \"94105\"\n",
|
61
|
+
@loc.to_yaml)
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require File.join(File.dirname(__FILE__), 'test_base_geocoder')
|
3
|
+
|
4
|
+
class IpGeocoderTest < BaseGeocoderTest #:nodoc: all
|
5
|
+
|
6
|
+
IP_SUCCESS=<<-EOF
|
7
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
8
|
+
<geoPlugin>
|
9
|
+
<geoplugin_city>Belo Horizonte</geoplugin_city>
|
10
|
+
<geoplugin_region>Minas Gerais</geoplugin_region>
|
11
|
+
<geoplugin_areaCode>0</geoplugin_areaCode>
|
12
|
+
<geoplugin_dmaCode>0</geoplugin_dmaCode>
|
13
|
+
<geoplugin_countryCode>BR</geoplugin_countryCode>
|
14
|
+
<geoplugin_countryName>Brazil</geoplugin_countryName>
|
15
|
+
<geoplugin_continentCode>SA</geoplugin_continentCode>
|
16
|
+
<geoplugin_latitude>-19.916700</geoplugin_latitude>
|
17
|
+
<geoplugin_longitude>-43.933300</geoplugin_longitude>
|
18
|
+
<geoplugin_currencyCode>BRL</geoplugin_currencyCode>
|
19
|
+
<geoplugin_currencySymbol>R$</geoplugin_currencySymbol>
|
20
|
+
<geoplugin_currencyConverter>2.2575001717</geoplugin_currencyConverter>
|
21
|
+
</geoPlugin>
|
22
|
+
EOF
|
23
|
+
|
24
|
+
def setup
|
25
|
+
super
|
26
|
+
@success.provider = "geoPlugin"
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_successful_lookup
|
30
|
+
success = MockSuccess.new
|
31
|
+
success.expects(:body).returns(IP_SUCCESS)
|
32
|
+
url = 'http://www.geoplugin.net/xml.gp?ip=200.150.38.66'
|
33
|
+
GeoKit::Geocoders::GeoPluginGeocoder.expects(:call_geocoder_service).with(url).returns(success)
|
34
|
+
location = GeoKit::Geocoders::GeoPluginGeocoder.geocode('200.150.38.66')
|
35
|
+
assert_not_nil location
|
36
|
+
assert_equal -19.916700, location.lat
|
37
|
+
assert_equal -43.933300, location.lng
|
38
|
+
assert_equal "Belo Horizonte", location.city
|
39
|
+
assert_equal "Minas Gerais", location.state
|
40
|
+
assert_equal "BR", location.country_code
|
41
|
+
assert_equal "geoPlugin", location.provider
|
42
|
+
assert location.success
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_invalid_ip
|
46
|
+
location = GeoKit::Geocoders::GeoPluginGeocoder.geocode("pixrum")
|
47
|
+
assert_not_nil location
|
48
|
+
assert !location.success
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_service_unavailable
|
52
|
+
failure = MockFailure.new
|
53
|
+
url = 'http://www.geoplugin.net/xml.gp?ip=10.10.10.10'
|
54
|
+
GeoKit::Geocoders::GeoPluginGeocoder.expects(:call_geocoder_service).with(url).returns(failure)
|
55
|
+
location = GeoKit::Geocoders::GeoPluginGeocoder.geocode("10.10.10.10")
|
56
|
+
assert_not_nil location
|
57
|
+
assert !location.success
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_base_geocoder')
|
2
|
+
|
3
|
+
Geokit::Geocoders::google = 'Google'
|
4
|
+
|
5
|
+
class GoogleGeocoderTest < BaseGeocoderTest #:nodoc: all
|
6
|
+
|
7
|
+
GOOGLE_FULL=<<-EOF.strip
|
8
|
+
<?xml version="1.0" encoding="UTF-8"?><kml xmlns="http://earth.google.com/kml/2.0"><Response><name>100 spear st, san francisco, ca</name><Status><code>200</code><request>geocode</request></Status><Placemark><address>100 Spear St, San Francisco, CA 94105, USA</address><AddressDetails Accuracy="8" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>US</CountryNameCode><AdministrativeArea><AdministrativeAreaName>CA</AdministrativeAreaName><SubAdministrativeArea><SubAdministrativeAreaName>San Francisco</SubAdministrativeAreaName><Locality><LocalityName>San Francisco</LocalityName><Thoroughfare><ThoroughfareName>100 Spear St</ThoroughfareName></Thoroughfare><PostalCode><PostalCodeNumber>94105</PostalCodeNumber></PostalCode></Locality></SubAdministrativeArea></AdministrativeArea></Country></AddressDetails><Point><coordinates>-122.393985,37.792501,0</coordinates></Point></Placemark></Response></kml>
|
9
|
+
EOF
|
10
|
+
|
11
|
+
GOOGLE_CITY=<<-EOF.strip
|
12
|
+
<?xml version="1.0" encoding="UTF-8"?><kml xmlns="http://earth.google.com/kml/2.0"><Response><name>San Francisco</name><Status><code>200</code><request>geocode</request></Status><Placemark><address>San Francisco, CA, USA</address><AddressDetails Accuracy="4" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>US</CountryNameCode><AdministrativeArea><AdministrativeAreaName>CA</AdministrativeAreaName><Locality><LocalityName>San Francisco</LocalityName></Locality></AdministrativeArea></Country></AddressDetails><Point><coordinates>-122.418333,37.775000,0</coordinates></Point></Placemark></Response></kml>
|
13
|
+
EOF
|
14
|
+
|
15
|
+
GOOGLE_MULTI="<?xml version='1.0' encoding='UTF-8'?>\n<kml xmlns='http://earth.google.com/kml/2.0'><Response>\n <name>via Sandro Pertini 8, Ossona, MI</name>\n <Status>\n <code>200</code>\n <request>geocode</request>\n </Status>\n <Placemark id='p1'>\n <address>Via Sandro Pertini, 8, 20010 Mesero MI, Italy</address>\n <AddressDetails Accuracy='8' xmlns='urn:oasis:names:tc:ciq:xsdschema:xAL:2.0'><Country><CountryNameCode>IT</CountryNameCode><CountryName>Italy</CountryName><AdministrativeArea><AdministrativeAreaName>Lombardy</AdministrativeAreaName><SubAdministrativeArea><SubAdministrativeAreaName>Milan</SubAdministrativeAreaName><Locality><LocalityName>Mesero</LocalityName><Thoroughfare><ThoroughfareName>8 Via Sandro Pertini</ThoroughfareName></Thoroughfare><PostalCode><PostalCodeNumber>20010</PostalCodeNumber></PostalCode></Locality></SubAdministrativeArea></AdministrativeArea></Country></AddressDetails>\n <Point><coordinates>8.8527131,45.4966243,0</coordinates></Point>\n </Placemark>\n <Placemark id='p2'>\n <address>Via Sandro Pertini, 20010 Ossona MI, Italy</address>\n <AddressDetails Accuracy='6' xmlns='urn:oasis:names:tc:ciq:xsdschema:xAL:2.0'><Country><CountryNameCode>IT</CountryNameCode><CountryName>Italy</CountryName><AdministrativeArea><AdministrativeAreaName>Lombardy</AdministrativeAreaName><SubAdministrativeArea><SubAdministrativeAreaName>Milan</SubAdministrativeAreaName><Locality><LocalityName>Ossona</LocalityName><Thoroughfare><ThoroughfareName>Via Sandro Pertini</ThoroughfareName></Thoroughfare><PostalCode><PostalCodeNumber>20010</PostalCodeNumber></PostalCode></Locality></SubAdministrativeArea></AdministrativeArea></Country></AddressDetails>\n <Point><coordinates>8.9023200,45.5074444,0</coordinates></Point>\n </Placemark>\n</Response></kml>\n"
|
16
|
+
|
17
|
+
def setup
|
18
|
+
super
|
19
|
+
@google_full_hash = {:street_address=>"100 Spear St", :city=>"San Francisco", :state=>"CA", :zip=>"94105", :country_code=>"US"}
|
20
|
+
@google_city_hash = {:city=>"San Francisco", :state=>"CA"}
|
21
|
+
|
22
|
+
@google_full_loc = Geokit::GeoLoc.new(@google_full_hash)
|
23
|
+
@google_city_loc = Geokit::GeoLoc.new(@google_city_hash)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_google_full_address
|
27
|
+
response = MockSuccess.new
|
28
|
+
response.expects(:body).returns(GOOGLE_FULL)
|
29
|
+
url = "http://maps.google.com/maps/geo?q=#{Geokit::Inflector.url_escape(@address)}&output=xml&key=Google&oe=utf-8"
|
30
|
+
Geokit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
31
|
+
res=Geokit::Geocoders::GoogleGeocoder.geocode(@address)
|
32
|
+
assert_equal "CA", res.state
|
33
|
+
assert_equal "San Francisco", res.city
|
34
|
+
assert_equal "37.792501,-122.393985", res.ll # slightly dif from yahoo
|
35
|
+
assert res.is_us?
|
36
|
+
assert_equal "100 Spear St, San Francisco, CA 94105, USA", res.full_address #slightly different from yahoo
|
37
|
+
assert_equal "google", res.provider
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_google_full_address_with_geo_loc
|
41
|
+
response = MockSuccess.new
|
42
|
+
response.expects(:body).returns(GOOGLE_FULL)
|
43
|
+
url = "http://maps.google.com/maps/geo?q=#{Geokit::Inflector.url_escape(@full_address_short_zip)}&output=xml&key=Google&oe=utf-8"
|
44
|
+
Geokit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
45
|
+
res=Geokit::Geocoders::GoogleGeocoder.geocode(@google_full_loc)
|
46
|
+
assert_equal "CA", res.state
|
47
|
+
assert_equal "San Francisco", res.city
|
48
|
+
assert_equal "37.792501,-122.393985", res.ll # slightly dif from yahoo
|
49
|
+
assert res.is_us?
|
50
|
+
assert_equal "100 Spear St, San Francisco, CA 94105, USA", res.full_address #slightly different from yahoo
|
51
|
+
assert_equal "google", res.provider
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_google_city
|
55
|
+
response = MockSuccess.new
|
56
|
+
response.expects(:body).returns(GOOGLE_CITY)
|
57
|
+
url = "http://maps.google.com/maps/geo?q=#{Geokit::Inflector.url_escape(@address)}&output=xml&key=Google&oe=utf-8"
|
58
|
+
Geokit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
59
|
+
res=Geokit::Geocoders::GoogleGeocoder.geocode(@address)
|
60
|
+
assert_equal "CA", res.state
|
61
|
+
assert_equal "San Francisco", res.city
|
62
|
+
assert_equal "37.775,-122.418333", res.ll
|
63
|
+
assert res.is_us?
|
64
|
+
assert_equal "San Francisco, CA, USA", res.full_address
|
65
|
+
assert_nil res.street_address
|
66
|
+
assert_equal "google", res.provider
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_google_city_with_geo_loc
|
70
|
+
response = MockSuccess.new
|
71
|
+
response.expects(:body).returns(GOOGLE_CITY)
|
72
|
+
url = "http://maps.google.com/maps/geo?q=#{Geokit::Inflector.url_escape(@address)}&output=xml&key=Google&oe=utf-8"
|
73
|
+
Geokit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
74
|
+
res=Geokit::Geocoders::GoogleGeocoder.geocode(@google_city_loc)
|
75
|
+
assert_equal "CA", res.state
|
76
|
+
assert_equal "San Francisco", res.city
|
77
|
+
assert_equal "37.775,-122.418333", res.ll
|
78
|
+
assert res.is_us?
|
79
|
+
assert_equal "San Francisco, CA, USA", res.full_address
|
80
|
+
assert_nil res.street_address
|
81
|
+
assert_equal "google", res.provider
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_service_unavailable
|
85
|
+
response = MockFailure.new
|
86
|
+
url = "http://maps.google.com/maps/geo?q=#{Geokit::Inflector.url_escape(@address)}&output=xml&key=Google&oe=utf-8"
|
87
|
+
Geokit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
88
|
+
assert !Geokit::Geocoders::GoogleGeocoder.geocode(@google_city_loc).success
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_multiple_results
|
92
|
+
#Geokit::Geocoders::GoogleGeocoder.do_geocode('via Sandro Pertini 8, Ossona, MI')
|
93
|
+
response = MockSuccess.new
|
94
|
+
response.expects(:body).returns(GOOGLE_MULTI)
|
95
|
+
url = "http://maps.google.com/maps/geo?q=#{Geokit::Inflector.url_escape('via Sandro Pertini 8, Ossona, MI')}&output=xml&key=Google&oe=utf-8"
|
96
|
+
Geokit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
97
|
+
res=Geokit::Geocoders::GoogleGeocoder.geocode('via Sandro Pertini 8, Ossona, MI')
|
98
|
+
assert_equal "Lombardy", res.state
|
99
|
+
assert_equal "Mesero", res.city
|
100
|
+
assert_equal "45.4966243,8.8527131", res.ll
|
101
|
+
assert !res.is_us?
|
102
|
+
assert_equal "Via Sandro Pertini, 8, 20010 Mesero MI, Italy", res.full_address
|
103
|
+
assert_equal "8 Via Sandro Pertini", res.street_address
|
104
|
+
assert_equal "google", res.provider
|
105
|
+
|
106
|
+
assert_equal 2, res.all.size
|
107
|
+
res = res.all[1]
|
108
|
+
assert_equal "Lombardy", res.state
|
109
|
+
assert_equal "Ossona", res.city
|
110
|
+
assert_equal "45.5074444,8.90232", res.ll
|
111
|
+
assert !res.is_us?
|
112
|
+
assert_equal "Via Sandro Pertini, 20010 Ossona MI, Italy", res.full_address
|
113
|
+
assert_equal "Via Sandro Pertini", res.street_address
|
114
|
+
assert_equal "google", res.provider
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_base_geocoder')
|
2
|
+
|
3
|
+
Geokit::Geocoders::google = 'Google'
|
4
|
+
|
5
|
+
class GoogleReverseGeocoderTest < BaseGeocoderTest #:nodoc: all
|
6
|
+
|
7
|
+
GOOGLE_REVERSE_FULL=<<-EOF.strip
|
8
|
+
<?xml version="1.0" encoding="UTF-8" ?><kml xmlns="http://earth.google.com/kml/2.0"><Response><name>51.457833,7.016685</name><Status><code>200</code><request>geocode</request></Status><Placemark id="p1"><address>Porscheplatz 1, 45127 Essen, Deutschland</address><AddressDetails Accuracy="8" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>DE</CountryNameCode><CountryName>Deutschland</CountryName><AdministrativeArea><AdministrativeAreaName>Nordrhein-Westfalen</AdministrativeAreaName><SubAdministrativeArea><SubAdministrativeAreaName>Essen</SubAdministrativeAreaName><Locality><LocalityName>Essen</LocalityName><DependentLocality><DependentLocalityName>Stadtkern</DependentLocalityName><Thoroughfare><ThoroughfareName>Porscheplatz 1</ThoroughfareName></Thoroughfare><PostalCode><PostalCodeNumber>45127</PostalCodeNumber></PostalCode></DependentLocality></Locality></SubAdministrativeArea></AdministrativeArea></Country></AddressDetails><ExtendedData><LatLonBox north="51.4609805" south="51.4546853" east="7.0198324" west="7.0135372" /></ExtendedData><Point><coordinates>7.0166848,51.4578329,0</coordinates></Point></Placemark><Placemark id="p2"><address>Stadtkern, Essen, Deutschland</address><AddressDetails Accuracy="4" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>DE</CountryNameCode><CountryName>Deutschland</CountryName><AdministrativeArea><AdministrativeAreaName>Nordrhein-Westfalen</AdministrativeAreaName><SubAdministrativeArea><SubAdministrativeAreaName>Essen</SubAdministrativeAreaName><Locality><LocalityName>Essen</LocalityName><DependentLocality><DependentLocalityName>Stadtkern</DependentLocalityName></DependentLocality></Locality></SubAdministrativeArea></AdministrativeArea></Country></AddressDetails><ExtendedData><LatLonBox north="51.4630710" south="51.4506320" east="7.0193200" west="7.0026170" /></ExtendedData><Point><coordinates>7.0124328,51.4568201,0</coordinates></Point></Placemark><Placemark id="p3"><address>45127 Essen, Deutschland</address><AddressDetails Accuracy="5" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>DE</CountryNameCode><CountryName>Deutschland</CountryName><AdministrativeArea><AdministrativeAreaName>Nordrhein-Westfalen</AdministrativeAreaName><SubAdministrativeArea><SubAdministrativeAreaName>Essen</SubAdministrativeAreaName><Locality><LocalityName>Essen</LocalityName><PostalCode><PostalCodeNumber>45127</PostalCodeNumber></PostalCode></Locality></SubAdministrativeArea></AdministrativeArea></Country></AddressDetails><ExtendedData><LatLonBox north="51.4637808" south="51.4503125" east="7.0231080" west="6.9965454" /></ExtendedData><Point><coordinates>7.0104543,51.4556194,0</coordinates></Point></Placemark><Placemark id="p4"><address>Essen, Deutschland</address><AddressDetails Accuracy="4" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>DE</CountryNameCode><CountryName>Deutschland</CountryName><AdministrativeArea><AdministrativeAreaName>Nordrhein-Westfalen</AdministrativeAreaName><SubAdministrativeArea><SubAdministrativeAreaName>Essen</SubAdministrativeAreaName><Locality><LocalityName>Essen</LocalityName></Locality></SubAdministrativeArea></AdministrativeArea></Country></AddressDetails><ExtendedData><LatLonBox north="51.5342070" south="51.3475730" east="7.1376530" west="6.8943470" /></ExtendedData><Point><coordinates>7.0147614,51.4580686,0</coordinates></Point></Placemark><Placemark id="p5"><address>Essen, Deutschland</address><AddressDetails Accuracy="3" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>DE</CountryNameCode><CountryName>Deutschland</CountryName><AdministrativeArea><AdministrativeAreaName>Nordrhein-Westfalen</AdministrativeAreaName><SubAdministrativeArea><SubAdministrativeAreaName>Essen</SubAdministrativeAreaName></SubAdministrativeArea></AdministrativeArea></Country></AddressDetails><ExtendedData><LatLonBox north="51.5342070" south="51.3475730" east="7.1376530" west="6.8943470" /></ExtendedData><Point><coordinates>7.0461136,51.4508381,0</coordinates></Point></Placemark><Placemark id="p6"><address>Nordrhein-Westfalen, Deutschland</address><AddressDetails Accuracy="2" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>DE</CountryNameCode><CountryName>Deutschland</CountryName><AdministrativeArea><AdministrativeAreaName>Nordrhein-Westfalen</AdministrativeAreaName></AdministrativeArea></Country></AddressDetails><ExtendedData><LatLonBox north="52.5314170" south="50.3225720" east="9.4615950" west="5.8663566" /></ExtendedData><Point><coordinates>7.6615938,51.4332367,0</coordinates></Point></Placemark><Placemark id="p7"><address>Deutschland</address><AddressDetails Accuracy="1" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>DE</CountryNameCode><CountryName>Deutschland</CountryName></Country></AddressDetails><ExtendedData><LatLonBox north="55.0568230" south="47.2701270" east="15.0418536" west="5.8663566" /></ExtendedData><Point><coordinates>10.4515260,51.1656910,0</coordinates></Point></Placemark></Response></kml>
|
9
|
+
EOF
|
10
|
+
|
11
|
+
|
12
|
+
def test_google_full_address
|
13
|
+
response = MockSuccess.new
|
14
|
+
response.expects(:body).returns(GOOGLE_REVERSE_FULL)
|
15
|
+
|
16
|
+
|
17
|
+
# http://maps.google.com/maps/geo?output=xml&oe=utf-8&ll=51.4578329,7.0166848&key=asdad
|
18
|
+
|
19
|
+
# #<Geokit::GeoLoc:0x10ec7ec
|
20
|
+
# @city="Essen",
|
21
|
+
# @country_code="DE",
|
22
|
+
# @full_address="Porscheplatz 1, 45127 Essen, Germany",
|
23
|
+
# @lat=51.4578329,
|
24
|
+
# @lng=7.0166848,
|
25
|
+
# @precision="address",
|
26
|
+
# @provider="google",
|
27
|
+
# @state="Nordrhein-Westfalen",
|
28
|
+
# @street_address="Porscheplatz 1",
|
29
|
+
# @success=true,
|
30
|
+
# @zip="45127">
|
31
|
+
#
|
32
|
+
|
33
|
+
|
34
|
+
@latlng = "51.4578329,7.0166848"
|
35
|
+
|
36
|
+
url = "http://maps.google.com/maps/geo?ll=#{Geokit::Inflector.url_escape(@latlng)}&output=xml&key=Google&oe=utf-8"
|
37
|
+
Geokit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
38
|
+
res=Geokit::Geocoders::GoogleGeocoder.reverse_geocode(@latlng)
|
39
|
+
assert_equal "Nordrhein-Westfalen", res.state
|
40
|
+
assert_equal "Essen", res.city
|
41
|
+
assert_equal "45127", res.zip
|
42
|
+
assert_equal "51.4578329,7.0166848", res.ll # slightly dif from yahoo
|
43
|
+
assert res.is_us? == false
|
44
|
+
assert_equal "Porscheplatz 1, 45127 Essen, Deutschland", res.full_address #slightly different from yahoo
|
45
|
+
assert_equal "google", res.provider
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
end
|