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

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,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