Module: Ym4r::GoogleMaps::Geocoding
- Defined in:
- lib/ym4r/google_maps/geocoding.rb
Defined Under Namespace
Classes: ConnectionException, Placemark, Placemarks
Constant Summary collapse
- GEO_SUCCESS =
200- GEO_MISSING_ADDRESS =
601- GEO_UNKNOWN_ADDRESS =
602- GEO_UNAVAILABLE_ADDRESS =
603- GEO_BAD_KEY =
610- GEO_TOO_MANY_QUERIES =
620- GEO_SERVER_ERROR =
500
Class Method Summary collapse
- .accuracy(code) ⇒ Object
-
.get(request, options = {}) ⇒ Object
Gets placemarks by querying the Google Maps Geocoding service with the
requeststring.
Class Method Details
.accuracy(code) ⇒ Object
116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/ym4r/google_maps/geocoding.rb', line 116 def self.accuracy(code) {0 => "Unknown location", 1 => "Country level accuracy", 2 => "Region (state, province, prefecture, etc.) level accuracy", 3 => "Sub-region (county, municipality, etc.) level accuracy", 4 => "Town (city, village) level accuracy", 5 => "Post code (zip code) level accuracy", 6 => "Street level accuracy", 7 => "Intersection level accuracy", 8 => "Address level accuracy"}[code] end |
.get(request, options = {}) ⇒ Object
Gets placemarks by querying the Google Maps Geocoding service with the request string. Options can either an explicity GMaps API key (:key) or a host, (:host).
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/ym4r/google_maps/geocoding.rb', line 18 def self.get(request, = {}) api_key = [:key] output = [:output] || "kml" url = "http://maps.google.com/maps/geo?q=#{URI.encode(request)}&key=#{api_key}&output=#{output}" res = open(url).read case output.to_sym when :json res = eval(res.gsub(":","=>")) #!!!EVAL EVAL EVAL EVAL!!! hopefully we can trust google... placemarks = Placemarks.new(res['name'],res['Status']['code']) if res['Placemark'] placemark = res['Placemark'] placemark.each do |data| data_country = data['Country']['CountryNameCode'] rescue "" data_administrative = data['Country']['AdministrativeArea']['AdministrativeAreaName'] rescue "" data_sub_administrative = data['Country']['AdministrativeArea']['SubAdministrativeArea']['SubAdministrativeAreaName'] rescue "" data_locality = data['Country']['AdministrativeArea']['SubAdministrativeArea']['Locality']['LocalityName'] rescue "" data_dependent_locality = data['Country']['AdministrativeArea']['SubAdministrativeArea']['Locality']['DependentLocality']['DependentLocalityName'] rescue "" data_thoroughfare = data['Country']['AdministrativeArea']['SubAdministrativeArea']['Locality']['DependentLocality']['Thoroughfare']['ThoroughfareName'] rescue "" data_postal_code = data['Country']['AdministrativeArea']['SubAdministrativeArea']['Locality']['DependentLocality']['Thoroughfare']['PostalCode']['PostalCodeNumber'] rescue "" lon, lat = data['Point']['coordinates'][0,2] data_accuracy = data['Accuracy'] unless data_accuracy.nil? data_accuracy = data_accuracy.to_i end placemarks << Geocoding::Placemark.new(data['address'], data_country, data_administrative, data_sub_administrative, data_locality, data_dependent_locality, data_thoroughfare, data_postal_code, lon, lat, data_accuracy) end end when :kml, :xml doc = REXML::Document.new(res) response = doc.elements['//Response'] placemarks = Placemarks.new(response.elements['name'].text,response.elements['Status/code'].text.to_i) response.elements.each(".//Placemark") do |placemark| data = placemark.elements data_country = data['.//CountryNameCode'] data_administrative = data['.//AdministrativeAreaName'] data_sub_administrative = data['.//SubAdministrativeAreaName'] data_locality = data['.//LocalityName'] data_dependent_locality = data['.//DependentLocalityName'] data_thoroughfare = data['.//ThoroughfareName'] data_postal_code = data['.//PostalCodeNumber'] lon, lat = data['.//coordinates'].text.split(",")[0..1].collect {|l| l.to_f } data_accuracy = data['.//*[local-name()="AddressDetails"]'].attributes['Accuracy'] unless data_accuracy.nil? data_accuracy = data_accuracy.to_i end placemarks << Geocoding::Placemark.new(data['address'].text, data_country.nil? ? "" : data_country.text, data_administrative.nil? ? "" : data_administrative.text, data_sub_administrative.nil? ? "" : data_sub_administrative.text, data_locality.nil? ? "" : data_locality.text, data_dependent_locality.nil? ? "" : data_dependent_locality.text, data_thoroughfare.nil? ? "" : data_thoroughfare.text, data_postal_code.nil? ? "" : data_postal_code.text, lon, lat, data_accuracy ) end end placemarks end |