geokit 1.8.4 → 1.8.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.
Files changed (47) hide show
  1. data/.travis.yml +4 -6
  2. data/CHANGELOG.md +9 -0
  3. data/README.markdown +27 -3
  4. data/fixtures/vcr_cassettes/bing_au.yml +86 -0
  5. data/fixtures/vcr_cassettes/bing_full.yml +61 -68
  6. data/fixtures/vcr_cassettes/bing_full_au.yml +43 -39
  7. data/fixtures/vcr_cassettes/bing_full_de.yml +43 -39
  8. data/fixtures/vcr_cassettes/fcc_reverse_geocode.yml +9 -7
  9. data/fixtures/vcr_cassettes/geocodio_geocode.yml +43 -0
  10. data/fixtures/vcr_cassettes/google_city.yml +8 -6
  11. data/fixtures/vcr_cassettes/google_country_code_biased_result.yml +27 -25
  12. data/fixtures/vcr_cassettes/google_full.yml +13 -16
  13. data/fixtures/vcr_cassettes/google_full_short.yml +8 -6
  14. data/fixtures/vcr_cassettes/google_language_response_fr.yml +23 -21
  15. data/fixtures/vcr_cassettes/google_multi.yml +7 -5
  16. data/fixtures/vcr_cassettes/google_reverse_madrid.yml +281 -278
  17. data/fixtures/vcr_cassettes/google_reverse_madrid_es.yml +26 -32
  18. data/fixtures/vcr_cassettes/map_quest_full.yml +53 -0
  19. data/fixtures/vcr_cassettes/map_quest_reverse_madrid.yml +52 -0
  20. data/fixtures/vcr_cassettes/ripe_geocode_45.yml +45 -0
  21. data/fixtures/vcr_cassettes/yahoo_city.yml +1 -1
  22. data/fixtures/vcr_cassettes/yahoo_full.yml +1 -1
  23. data/fixtures/vcr_cassettes/yahoo_no_results.yml +1 -1
  24. data/lib/geokit/geocoders.rb +16 -1
  25. data/lib/geokit/geocoders/bing.rb +22 -18
  26. data/lib/geokit/geocoders/fcc.rb +2 -1
  27. data/lib/geokit/geocoders/geocodio.rb +59 -0
  28. data/lib/geokit/geocoders/google.rb +7 -3
  29. data/lib/geokit/geocoders/mapquest.rb +3 -2
  30. data/lib/geokit/geocoders/ripe.rb +8 -5
  31. data/lib/geokit/geocoders/yahoo.rb +2 -1
  32. data/lib/geokit/lat_lng.rb +13 -3
  33. data/lib/geokit/mappable.rb +13 -0
  34. data/lib/geokit/multi_geocoder.rb +13 -2
  35. data/lib/geokit/net_adapter/net_http.rb +6 -1
  36. data/lib/geokit/version.rb +1 -1
  37. data/test/helper.rb +2 -1
  38. data/test/test_bing_geocoder.rb +23 -3
  39. data/test/test_fcc_geocoder.rb +1 -1
  40. data/test/test_geocodio_geocoder.rb +33 -0
  41. data/test/test_google_geocoder.rb +31 -17
  42. data/test/test_latlng.rb +18 -0
  43. data/test/test_map_quest.rb +56 -0
  44. data/test/test_multi_geocoder.rb +7 -0
  45. data/test/test_ripe_geocoder.rb +19 -12
  46. data/test/test_yahoo_geocoder.rb +7 -7
  47. metadata +12 -8
@@ -2,48 +2,42 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: http://maps.google.com/maps/api/geocode/json?language=es&latlng=40.416,-3.703&sensor=false
5
+ uri: https://maps.google.com/maps/api/geocode/json?language=es&latlng=40.416,-3.703&sensor=false
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
9
9
  headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
10
12
  Accept:
11
- - ! '*/*'
13
+ - '*/*'
12
14
  User-Agent:
13
15
  - Ruby
14
16
  response:
15
17
  status:
16
18
  code: 200
17
- message: !binary |-
18
- T0s=
19
+ message: OK
19
20
  headers:
20
- !binary "Q29udGVudC1UeXBl":
21
- - !binary |-
22
- YXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOA==
23
- !binary "RGF0ZQ==":
24
- - !binary |-
25
- RnJpLCAyNyBEZWMgMjAxMyAxMToyNDoyMyBHTVQ=
26
- !binary "RXhwaXJlcw==":
27
- - !binary |-
28
- U2F0LCAyOCBEZWMgMjAxMyAxMToyNDoyMyBHTVQ=
29
- !binary "Q2FjaGUtQ29udHJvbA==":
30
- - !binary |-
31
- cHVibGljLCBtYXgtYWdlPTg2NDAw
32
- !binary "QWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2lu":
33
- - !binary |-
34
- Kg==
35
- !binary "U2VydmVy":
36
- - !binary |-
37
- bWFmZQ==
38
- !binary "WC1Yc3MtUHJvdGVjdGlvbg==":
39
- - !binary |-
40
- MTsgbW9kZT1ibG9jaw==
41
- !binary "WC1GcmFtZS1PcHRpb25z":
42
- - !binary |-
43
- U0FNRU9SSUdJTg==
44
- !binary "VHJhbnNmZXItRW5jb2Rpbmc=":
45
- - !binary |-
46
- Y2h1bmtlZA==
21
+ Content-Type:
22
+ - application/json; charset=UTF-8
23
+ Date:
24
+ - Sun, 26 Jan 2014 05:46:39 GMT
25
+ Expires:
26
+ - Mon, 27 Jan 2014 05:46:39 GMT
27
+ Cache-Control:
28
+ - public, max-age=86400
29
+ Access-Control-Allow-Origin:
30
+ - '*'
31
+ Server:
32
+ - mafe
33
+ X-Xss-Protection:
34
+ - 1; mode=block
35
+ X-Frame-Options:
36
+ - SAMEORIGIN
37
+ Alternate-Protocol:
38
+ - 443:quic
39
+ Transfer-Encoding:
40
+ - chunked
47
41
  body:
48
42
  encoding: ASCII-8BIT
49
43
  string: !binary |-
@@ -459,5 +453,5 @@ http_interactions:
459
453
  dHlwZXMiIDogWyAiY291bnRyeSIsICJwb2xpdGljYWwiIF0KICAgICAgfQog
460
454
  ICBdLAogICAic3RhdHVzIiA6ICJPSyIKfQo=
461
455
  http_version:
462
- recorded_at: Fri, 27 Dec 2013 11:24:21 GMT
456
+ recorded_at: Sun, 26 Jan 2014 05:46:40 GMT
463
457
  recorded_with: VCR 2.8.0
@@ -0,0 +1,53 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://www.mapquestapi.com/geocoding/v1/address?key=Fmjtd%7Cluur2d0125,2s=o5-9a8lhz&location=100%20Spear%20St%20Apt.%205,%20San%20Francisco,%20CA,%2094105,%20US
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - Apache-Coyote/1.1
23
+ Set-Cookie:
24
+ - JSESSIONID=A737A4684852AE01983F5AA9FA4321C4; Path=/; HttpOnly
25
+ Expires:
26
+ - Mon, 20 Dec 1998 01:00:00 GMT
27
+ Last-Modified:
28
+ - Thu, 29 May 2014 13:38:05 GMT
29
+ Cache-Control:
30
+ - no-cache, must-revalidate
31
+ Pragma:
32
+ - no-cache
33
+ Access-Control-Allow-Origin:
34
+ - "*"
35
+ Access-Control-Allow-Methods:
36
+ - OPTIONS,GET,POST
37
+ Content-Type:
38
+ - application/json;charset=UTF-8
39
+ Transfer-Encoding:
40
+ - chunked
41
+ Date:
42
+ - Thu, 29 May 2014 13:38:04 GMT
43
+ body:
44
+ encoding: UTF-8
45
+ string: "{\"info\":{\"statuscode\":0,\"copyright\":{\"text\":\"\\u00A9 2014
46
+ MapQuest, Inc.\",\"imageUrl\":\"https://api.mqcdn.com/res/mqlogo.gif\",\"imageAltText\":\"\\u00A9
47
+ 2014 MapQuest, Inc.\"},\"messages\":[]},\"options\":{\"maxResults\":-1,\"thumbMaps\":true,\"ignoreLatLngInput\":false},\"results\":[{\"providedLocation\":{\"location\":\"100
48
+ Spear St Apt. 5, San Francisco, CA, 94105, US\"},\"locations\":[{\"street\":\"100
49
+ Spear St, APT 5\",\"adminArea5\":\"San Francisco\",\"adminArea5Type\":\"City\",\"adminArea4\":\"San
50
+ Francisco\",\"adminArea4Type\":\"County\",\"adminArea3\":\"CA\",\"adminArea3Type\":\"State\",\"adminArea1\":\"US\",\"adminArea1Type\":\"Country\",\"postalCode\":\"94105-1500\",\"geocodeQualityCode\":\"P1AAA\",\"geocodeQuality\":\"POINT\",\"dragPoint\":false,\"sideOfStreet\":\"R\",\"linkId\":\"68400005996374\",\"unknownInput\":\"\",\"type\":\"s\",\"latLng\":{\"lat\":37.792305,\"lng\":-122.393776},\"displayLatLng\":{\"lat\":37.79215,\"lng\":-122.394},\"mapUrl\":\"https://www.mapquestapi.com/staticmap/v4/getmap?key=Fmjtd|luur2d0125,2s=o5-9a8lhz&type=map&size=225,160&pois=purple-1,37.792305,-122.393776,0,0,|&center=37.792305,-122.393776&zoom=15&rand=-150371976\"}]}]}"
51
+ http_version:
52
+ recorded_at: Thu, 29 May 2014 13:38:05 GMT
53
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,52 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://www.mapquestapi.com/geocoding/v1/reverse?key=Fmjtd%7Cluur2d0125,2s=o5-9a8lhz&location=40.4167413,-3.7032498
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Server:
22
+ - Apache-Coyote/1.1
23
+ Set-Cookie:
24
+ - JSESSIONID=3BC67F1FAE87C7DA0C84F86919DF3E1E; Path=/; HttpOnly
25
+ Expires:
26
+ - Mon, 20 Dec 1998 01:00:00 GMT
27
+ Last-Modified:
28
+ - Thu, 29 May 2014 13:38:06 GMT
29
+ Cache-Control:
30
+ - no-cache, must-revalidate
31
+ Pragma:
32
+ - no-cache
33
+ Access-Control-Allow-Origin:
34
+ - "*"
35
+ Access-Control-Allow-Methods:
36
+ - OPTIONS,GET,POST
37
+ Content-Type:
38
+ - application/json;charset=UTF-8
39
+ Transfer-Encoding:
40
+ - chunked
41
+ Date:
42
+ - Thu, 29 May 2014 13:38:06 GMT
43
+ body:
44
+ encoding: UTF-8
45
+ string: "{\"info\":{\"statuscode\":0,\"copyright\":{\"text\":\"\\u00A9 2014
46
+ MapQuest, Inc.\",\"imageUrl\":\"https://api.mqcdn.com/res/mqlogo.gif\",\"imageAltText\":\"\\u00A9
47
+ 2014 MapQuest, Inc.\"},\"messages\":[]},\"options\":{\"maxResults\":1,\"thumbMaps\":true,\"ignoreLatLngInput\":false},\"results\":[{\"providedLocation\":{\"latLng\":{\"lat\":40.4167413,\"lng\":-3.7032498}},\"locations\":[{\"street\":\"\",\"adminArea5\":\"Madrid\",\"adminArea5Type\":\"City\",\"adminArea4\":\"\\u00C1rea
48
+ metropolitana de Madrid y Corredor del Henares\",\"adminArea4Type\":\"County\",\"adminArea3\":\"Comunidad
49
+ de Madrid\",\"adminArea3Type\":\"State\",\"adminArea1\":\"ES\",\"adminArea1Type\":\"Country\",\"postalCode\":\"28014\",\"geocodeQualityCode\":\"Z1XAA\",\"geocodeQuality\":\"ZIP\",\"dragPoint\":false,\"sideOfStreet\":\"N\",\"linkId\":\"0\",\"unknownInput\":\"\",\"type\":\"s\",\"latLng\":{\"lat\":40.41686,\"lng\":-3.70348},\"displayLatLng\":{\"lat\":40.41686,\"lng\":-3.70348},\"mapUrl\":\"https://www.mapquestapi.com/staticmap/v4/getmap?key=Fmjtd|luur2d0125,2s=o5-9a8lhz&type=map&size=225,160&pois=purple-1,40.41685975,-3.70348049982096,0,0,|&center=40.41685975,-3.70348049982096&zoom=15&rand=-639817840\"}]}]}"
50
+ http_version:
51
+ recorded_at: Thu, 29 May 2014 13:38:06 GMT
52
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,45 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://stat.ripe.net/data/geoloc/data.json?resource=45.45.45.45
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Vary:
22
+ - Cookie, Accept-Encoding
23
+ Content-Length:
24
+ - '274'
25
+ Content-Type:
26
+ - application/json; charset=utf-8
27
+ Set-Cookie:
28
+ - stat-session=31cebc7bc2ff5c195bcad049a37ab4b2; expires=Wed, 11-Jun-2014 10:59:59
29
+ GMT; httponly; Max-Age=1209600; Path=/
30
+ Date:
31
+ - Wed, 28 May 2014 10:59:59 GMT
32
+ Server:
33
+ - lighttpd/1.4.32
34
+ body:
35
+ encoding: UTF-8
36
+ string: "{\n \"cached\": true, \n \"data\": {\n \"locations\":
37
+ [], \n \"query_time\": \"2014-05-01T00:00:00\", \n \"resource\":
38
+ \"45.45.45.45\", \n \"unknown_percentage\": 100.0\n }, \n \"data_call_status\":
39
+ \"supported\", \n \"messages\": [], \n \"process_time\": 7, \n \"query_id\":
40
+ \"35d010ee-e657-11e3-adde-782bcb346712\", \n \"see_also\": [], \n \"server_id\":
41
+ \"stat-app2\", \n \"status\": \"ok\", \n \"status_code\": 200, \n \"time\":
42
+ \"2014-05-28T10:59:59.069345\", \n \"version\": \"2.0\"\n}"
43
+ http_version:
44
+ recorded_at: Wed, 28 May 2014 10:59:59 GMT
45
+ recorded_with: VCR 2.8.0
@@ -2,7 +2,7 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: http://yboss.yahooapis.com/geo/placefinder?flags=J&oauth_consumer_key=dj0yJmk9cXByQVN2WHZmTVhDJmQ9WVdrOVZscG1WVWhOTldrbWNHbzlNakF6TlRJME16UTJNZy0tJnM9Y29uc3VtZXJzZWNyZXQmeD0zNg--&oauth_nonce=731410e6df&oauth_signature=%2Bde/2eYXvMPhoRu5MUdjhPct3xY=&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1384355278&oauth_version=1.0&q=San%20Francisco,%20CA
5
+ uri: https://yboss.yahooapis.com/geo/placefinder?flags=J&oauth_consumer_key=dj0yJmk9cXByQVN2WHZmTVhDJmQ9WVdrOVZscG1WVWhOTldrbWNHbzlNakF6TlRJME16UTJNZy0tJnM9Y29uc3VtZXJzZWNyZXQmeD0zNg--&oauth_nonce=731410e6df&oauth_signature=%2Bde/2eYXvMPhoRu5MUdjhPct3xY=&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1384355278&oauth_version=1.0&q=San%20Francisco,%20CA
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
@@ -2,7 +2,7 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: http://yboss.yahooapis.com/geo/placefinder?flags=J&oauth_consumer_key=dj0yJmk9cXByQVN2WHZmTVhDJmQ9WVdrOVZscG1WVWhOTldrbWNHbzlNakF6TlRJME16UTJNZy0tJnM9Y29uc3VtZXJzZWNyZXQmeD0zNg--&oauth_nonce=7a0ce94e38&oauth_signature=aTamhmDusxM4xYZXWocDEb5YmyE=&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1384355278&oauth_version=1.0&q=100%20Spear%20St,%20San%20Francisco,%20CA,%2094105-1522,%20US
5
+ uri: https://yboss.yahooapis.com/geo/placefinder?flags=J&oauth_consumer_key=dj0yJmk9cXByQVN2WHZmTVhDJmQ9WVdrOVZscG1WVWhOTldrbWNHbzlNakF6TlRJME16UTJNZy0tJnM9Y29uc3VtZXJzZWNyZXQmeD0zNg--&oauth_nonce=7a0ce94e38&oauth_signature=aTamhmDusxM4xYZXWocDEb5YmyE=&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1384355278&oauth_version=1.0&q=100%20Spear%20St,%20San%20Francisco,%20CA,%2094105-1522,%20US
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
@@ -2,7 +2,7 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: http://yboss.yahooapis.com/geo/placefinder?flags=J&oauth_consumer_key=dj0yJmk9cXByQVN2WHZmTVhDJmQ9WVdrOVZscG1WVWhOTldrbWNHbzlNakF6TlRJME16UTJNZy0tJnM9Y29uc3VtZXJzZWNyZXQmeD0zNg--&oauth_nonce=2c5ad2f846&oauth_signature=h2eR3b0GSWsgqU2nJhd1jPP8ihI=&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1384355895&oauth_version=1.0&q=ZZ,%20ZZ,%20ZZ
5
+ uri: https://yboss.yahooapis.com/geo/placefinder?flags=J&oauth_consumer_key=dj0yJmk9cXByQVN2WHZmTVhDJmQ9WVdrOVZscG1WVWhOTldrbWNHbzlNakF6TlRJME16UTJNZy0tJnM9Y29uc3VtZXJzZWNyZXQmeD0zNg--&oauth_nonce=2c5ad2f846&oauth_signature=h2eR3b0GSWsgqU2nJhd1jPP8ihI=&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1384355895&oauth_version=1.0&q=ZZ,%20ZZ,%20ZZ
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
@@ -40,6 +40,8 @@ module Geokit
40
40
  @@logger.level=Logger::INFO
41
41
  @@domain = nil
42
42
  @@net_adapter = Geokit::NetAdapter::NetHttp
43
+ @@secure = true
44
+ @@ssl_verify_mode = OpenSSL::SSL::VERIFY_PEER
43
45
 
44
46
  def self.__define_accessors
45
47
  class_variables.each do |v|
@@ -87,8 +89,9 @@ module Geokit
87
89
  do_geocode(address, *args) || GeoLoc.new
88
90
  rescue TooManyQueriesError, GeocodeError
89
91
  raise
90
- rescue
92
+ rescue => e
91
93
  logger.error "Caught an error during #{provider_name} geocoding call: #{$!}"
94
+ logger.error e.backtrace.join("\n")
92
95
  GeoLoc.new
93
96
  end
94
97
  # Main method which calls the do_reverse_geocode template method which subclasses
@@ -121,6 +124,10 @@ module Geokit
121
124
  end
122
125
  end
123
126
 
127
+ def self.inherited(base)
128
+ base.config :secure
129
+ end
130
+
124
131
  def self.new_loc
125
132
  loc = GeoLoc.new
126
133
  loc.provider = Geokit::Inflector.underscore(provider_name)
@@ -142,6 +149,14 @@ module Geokit
142
149
  GeoLoc.new
143
150
  end
144
151
 
152
+ def self.use_https?
153
+ self.secure && Geokit::Geocoders.secure
154
+ end
155
+
156
+ def self.protocol
157
+ use_https? ? 'https' : 'http'
158
+ end
159
+
145
160
  # Wraps the geocoder call around a proxy if necessary.
146
161
  def self.do_get(url)
147
162
  net_adapter.do_get(url)
@@ -4,6 +4,7 @@ module Geokit
4
4
  # contain a Bing Maps API key. Conforms to the interface set by the Geocoder class.
5
5
  class BingGeocoder < Geocoder
6
6
  config :key, :options
7
+ self.secure = true
7
8
 
8
9
  private
9
10
 
@@ -20,7 +21,7 @@ module Geokit
20
21
  culture = options && options[:culture]
21
22
  culture_string = culture ? "&c=#{culture}" : ''
22
23
  address_str = address.is_a?(GeoLoc) ? address.to_geocodeable_s : address
23
- "http://dev.virtualearth.net/REST/v1/Locations/#{URI.escape(address_str)}?key=#{key}#{culture_string}&o=xml"
24
+ "#{protocol}://dev.virtualearth.net/REST/v1/Locations/#{URI.escape(address_str)}?key=#{key}#{culture_string}&o=xml"
24
25
  end
25
26
 
26
27
  def self.parse_xml(xml)
@@ -61,28 +62,31 @@ module Geokit
61
62
  set_mappings(loc, xml, XML_MAPPINGS)
62
63
  end
63
64
 
65
+ ACCURACY_MAP = {
66
+ 'High' => 8,
67
+ 'Medium' => 5,
68
+ 'Low' => 2
69
+ }
70
+
71
+ PRECISION_MAP = {
72
+ 'Sovereign' => 'country',
73
+ 'CountryRegion' => 'country',
74
+ 'AdminDivision1' => 'state',
75
+ 'AdminDivision2' => 'state',
76
+ 'PopulatedPlace' => 'city',
77
+ 'Postcode1' => 'zip',
78
+ 'Postcode2' => 'zip',
79
+ 'RoadBlock' => 'street',
80
+ 'Address' => 'address'
81
+ }
82
+
64
83
  def self.set_precision(loc, xml)
65
84
  if xml.elements['.//Confidence']
66
- loc.accuracy = case xml.elements['.//Confidence'].text
67
- when 'High' then 8
68
- when 'Medium' then 5
69
- when 'Low' then 2
70
- else 0
71
- end
85
+ loc.accuracy = ACCURACY_MAP[xml.elements['.//Confidence'].text] || 0
72
86
  end
73
87
 
74
88
  if xml.elements['.//EntityType']
75
- loc.precision = case xml.elements['.//EntityType'].text
76
- when 'Sovereign' then 'country'
77
- when 'AdminDivision1' then 'state'
78
- when 'AdminDivision2' then 'state'
79
- when 'PopulatedPlace' then 'city'
80
- when 'Postcode1' then 'zip'
81
- when 'Postcode2' then 'zip'
82
- when 'RoadBlock' then 'street'
83
- when 'Address' then 'address'
84
- else 'unkown'
85
- end
89
+ loc.precision = PRECISION_MAP[xml.elements['.//EntityType'].text] || 'unknown'
86
90
  end
87
91
  end
88
92
 
@@ -1,12 +1,13 @@
1
1
  module Geokit
2
2
  module Geocoders
3
3
  class FCCGeocoder < Geocoder
4
+ self.secure = true
4
5
 
5
6
  private
6
7
  # Template method which does the reverse-geocode lookup.
7
8
  def self.do_reverse_geocode(latlng)
8
9
  latlng=LatLng.normalize(latlng)
9
- url = "http://data.fcc.gov/api/block/find?format=json&latitude=#{Geokit::Inflector::url_escape(latlng.lat.to_s)}&longitude=#{Geokit::Inflector::url_escape(latlng.lng.to_s)}"
10
+ url = "#{protocol}://data.fcc.gov/api/block/find?format=json&latitude=#{Geokit::Inflector::url_escape(latlng.lat.to_s)}&longitude=#{Geokit::Inflector::url_escape(latlng.lng.to_s)}"
10
11
  process :json, url
11
12
  end
12
13
 
@@ -0,0 +1,59 @@
1
+ module Geokit
2
+ module Geocoders
3
+ class GeocodioGeocoder < Geocoder
4
+ config :key
5
+
6
+ private
7
+
8
+ def self.do_geocode(address)
9
+ process :json, submit_url(address)
10
+ end
11
+
12
+ def self.submit_url(address)
13
+ params = [
14
+ "q=#{Geokit::Inflector::url_escape(address)}",
15
+ "api_key=#{key}"
16
+ ].join('&')
17
+
18
+ ['http://api.geocod.io/v1/geocode', params].join('?')
19
+ end
20
+
21
+ def self.parse_json(json)
22
+ loc = nil
23
+
24
+ json['results'].each do |address|
25
+ if loc.nil?
26
+ loc = create_new_loc(address)
27
+ else
28
+ loc.all.push(create_new_loc(address))
29
+ end
30
+ end
31
+
32
+ loc
33
+ end
34
+
35
+ def self.create_new_loc(json)
36
+ loc = new_loc
37
+ set_address_components(json, loc)
38
+ set_coordinates(json, loc)
39
+ loc
40
+ end
41
+
42
+ def self.set_address_components(json, loc)
43
+ loc.street_address = json['address_components']['street']
44
+ loc.street_number = json['address_components']['number']
45
+ loc.sub_premise = json['address_components']['suffix']
46
+ loc.street_name = json['address_components']['street']
47
+ loc.city = json['address_components']['city']
48
+ loc.state = json['address_components']['state']
49
+ loc.zip = json['address_components']['zip']
50
+ loc.full_address = json['formatted_address']
51
+ end
52
+
53
+ def self.set_coordinates(json, loc)
54
+ loc.lat = json['location']['lat']
55
+ loc.lng = json['location']['lng']
56
+ end
57
+ end
58
+ end
59
+ end