module Ym4r::GoogleMaps::Geocoding

Constants

GEO_BAD_KEY
GEO_MISSING_ADDRESS
GEO_SERVER_ERROR
GEO_SUCCESS
GEO_TOO_MANY_QUERIES
GEO_UNAVAILABLE_ADDRESS
GEO_UNKNOWN_ADDRESS

Public Class Methods

accuracy(code) click to toggle source
# 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 = {}) click to toggle source

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).

# File lib/ym4r/google_maps/geocoding.rb, line 18
def self.get(request,options = {})
  api_key = options[:key]
  output =  options[: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