ym4r 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/ym4r/google_maps/geocoding.rb +116 -62
  2. data/rakefile.rb +3 -3
  3. metadata +44 -37
@@ -4,73 +4,127 @@ require 'rexml/document'
4
4
 
5
5
  module Ym4r
6
6
  module GoogleMaps
7
- module Geocoding
7
+ module Geocoding
8
8
 
9
- GEO_SUCCESS = 200
10
- GEO_MISSING_ADDRESS = 601
11
- GEO_UNKNOWN_ADDRESS = 602
12
- GEO_UNAVAILABLE_ADDRESS = 603
13
- GEO_BAD_KEY = 610
14
- GEO_TOO_MANY_QUERIES = 620
15
- GEO_SERVER_ERROR = 500
16
-
17
- #Gets placemarks by querying the Google Maps Geocoding service with the +request+ string
18
- def self.get(request)
19
-
20
- url = "http://maps.google.com/maps/geo?q=#{request}&key=#{API_KEY}&output=xml"
21
- begin
22
- xml = open(URI.encode(url)).read
23
- rescue
24
- raise ConnectionException.new("Unable to connect to Google Maps Geocoding service")
25
- end
26
-
27
- doc = REXML::Document.new(xml)
28
-
29
- response = doc.elements['//Response']
30
- placemarks = Placemarks.new(response.elements['name'].text,response.elements['Status/code'].text.to_i)
31
- response.elements.each("Placemark") do |placemark|
32
- data = placemark.elements
33
- data_country = data['descendant::CountryNameCode']
34
- data_administrative = data['descendant::AdministrativeAreaName']
35
- data_sub_administrative = data['descendant::SubAdministrativeAreaName']
36
- data_locality = data['descendant::LocalityName']
37
- data_dependent_locality = data['descendant::DependentLocalityName']
38
- data_thoroughfare = data['descendant::ThoroughfareName']
39
- data_postal_code = data['descendant::PostalCodeNumber']
40
- placemarks << Geocoding::Placemark.new(data['address'].text,
41
- data_country.nil? ? "" : data_country.text,
42
- data_administrative.nil? ? "" : data_administrative.text,
43
- data_sub_administrative.nil? ? "" : data_sub_administrative.text,
44
- data_locality.nil? ? "" : data_locality.text,
45
- data_dependent_locality.nil? ? "" : data_dependent_locality.text,
46
- data_thoroughfare.nil? ? "" : data_thoroughfare.text,
47
- data_postal_code.nil? ? "" : data_postal_code.text,
48
- *(data['descendant::coordinates'].text.split(",")[0..1].collect {|l| l.to_f }))
49
- end
50
- placemarks
51
- end
9
+ GEO_SUCCESS = 200
10
+ GEO_MISSING_ADDRESS = 601
11
+ GEO_UNKNOWN_ADDRESS = 602
12
+ GEO_UNAVAILABLE_ADDRESS = 603
13
+ GEO_BAD_KEY = 610
14
+ GEO_TOO_MANY_QUERIES = 620
15
+ GEO_SERVER_ERROR = 500
16
+
17
+ #Gets placemarks by querying the Google Maps Geocoding service with the +request+ string. Options can either an explicity GMaps API key (<tt>:key</tt>) or a host, (<tt>:host</tt>).
18
+ def self.get(request,options = {})
19
+ api_key = options[:key]
20
+ output = options[:output] || "kml"
21
+ url = "http://maps.google.com/maps/geo?q=#{URI.encode(request)}&key=#{api_key}&output=#{output}"
52
22
 
53
- #Group of placemarks returned by the Geocoding service. If the result is valid the +statius+ attribute should be equal to <tt>Geocoding::GEI_SUCCESS</tt>
54
- class Placemarks < Array
55
- attr_accessor :name,:status
23
+ res = open(url).read
56
24
 
57
- def initialize(name,status)
58
- super(0)
59
- @name = name
60
- @status = status
61
- end
62
- end
25
+ case output.to_sym
26
+ when :json
27
+ res = eval(res.gsub(":","=>")) #!!!EVAL EVAL EVAL EVAL!!! hopefully we can trust google...
28
+ placemarks = Placemarks.new(res['name'],res['Status']['code'])
29
+ if res['Placemark']
30
+ placemark = res['Placemark']
31
+
32
+ placemark.each do |data|
33
+
34
+ data_country = data['Country']['CountryNameCode'] rescue ""
35
+ data_administrative = data['Country']['AdministrativeArea']['AdministrativeAreaName'] rescue ""
36
+ data_sub_administrative = data['Country']['AdministrativeArea']['SubAdministrativeArea']['SubAdministrativeAreaName'] rescue ""
37
+ data_locality = data['Country']['AdministrativeArea']['SubAdministrativeArea']['Locality']['LocalityName'] rescue ""
38
+ data_dependent_locality = data['Country']['AdministrativeArea']['SubAdministrativeArea']['Locality']['DependentLocality']['DependentLocalityName'] rescue ""
39
+ data_thoroughfare = data['Country']['AdministrativeArea']['SubAdministrativeArea']['Locality']['DependentLocality']['Thoroughfare']['ThoroughfareName'] rescue ""
40
+ data_postal_code = data['Country']['AdministrativeArea']['SubAdministrativeArea']['Locality']['DependentLocality']['Thoroughfare']['PostalCode']['PostalCodeNumber'] rescue ""
41
+ lon, lat = data['Point']['coordinates'][0,2]
42
+ data_accuracy = data['Accuracy']
43
+ unless data_accuracy.nil?
44
+ data_accuracy = data_accuracy.to_i
45
+ end
46
+
47
+ placemarks << Geocoding::Placemark.new(data['address'],
48
+ data_country,
49
+ data_administrative,
50
+ data_sub_administrative,
51
+ data_locality,
52
+ data_dependent_locality,
53
+ data_thoroughfare,
54
+ data_postal_code,
55
+ lon, lat, data_accuracy)
56
+
57
+ end
58
+ end
59
+ when :kml, :xml
60
+
61
+ doc = REXML::Document.new(res)
63
62
 
64
- #A result from the Geocoding service.
65
- class Placemark < Struct.new(:address,:country_code,:administrative_area,:sub_administrative_area,:locality,:dependent_locality,:thoroughfare,:postal_code,:longitude,:latitude)
66
- def lonlat
67
- [longitude,latitude]
68
- end
63
+ response = doc.elements['//Response']
64
+ placemarks = Placemarks.new(response.elements['name'].text,response.elements['Status/code'].text.to_i)
65
+ response.elements.each(".//Placemark") do |placemark|
66
+ data = placemark.elements
67
+ data_country = data['.//CountryNameCode']
68
+ data_administrative = data['.//AdministrativeAreaName']
69
+ data_sub_administrative = data['.//SubAdministrativeAreaName']
70
+ data_locality = data['.//LocalityName']
71
+ data_dependent_locality = data['.//DependentLocalityName']
72
+ data_thoroughfare = data['.//ThoroughfareName']
73
+ data_postal_code = data['.//PostalCodeNumber']
74
+ lon, lat = data['.//coordinates'].text.split(",")[0..1].collect {|l| l.to_f }
75
+ data_accuracy = data['.//*[local-name()="AddressDetails"]'].attributes['Accuracy']
76
+ unless data_accuracy.nil?
77
+ data_accuracy = data_accuracy.to_i
78
+ end
79
+ placemarks << Geocoding::Placemark.new(data['address'].text,
80
+ data_country.nil? ? "" : data_country.text,
81
+ data_administrative.nil? ? "" : data_administrative.text,
82
+ data_sub_administrative.nil? ? "" : data_sub_administrative.text,
83
+ data_locality.nil? ? "" : data_locality.text,
84
+ data_dependent_locality.nil? ? "" : data_dependent_locality.text,
85
+ data_thoroughfare.nil? ? "" : data_thoroughfare.text,
86
+ data_postal_code.nil? ? "" : data_postal_code.text,
87
+ lon, lat, data_accuracy )
88
+ end
89
+ end
90
+
91
+ placemarks
92
+ end
69
93
 
70
- def latlon
71
- [latitude,longitude]
72
- end
73
- end
94
+ #Group of placemarks returned by the Geocoding service. If the result is valid the +status+ attribute should be equal to <tt>Geocoding::GE0_SUCCESS</tt>
95
+ class Placemarks < Array
96
+ attr_accessor :name,:status
97
+
98
+ def initialize(name,status)
99
+ super(0)
100
+ @name = name
101
+ @status = status
102
+ end
103
+ end
104
+
105
+ #A result from the Geocoding service.
106
+ class Placemark < Struct.new(:address,:country_code,:administrative_area,:sub_administrative_area,:locality,:dependent_locality,:thoroughfare,:postal_code,:longitude,:latitude,:accuracy)
107
+ def lonlat
108
+ [longitude,latitude]
109
+ end
110
+
111
+ def latlon
112
+ [latitude,longitude]
113
+ end
114
+ end
115
+
116
+ def self.accuracy(code)
117
+ {0 => "Unknown location",
118
+ 1 => "Country level accuracy",
119
+ 2 => "Region (state, province, prefecture, etc.) level accuracy",
120
+ 3 => "Sub-region (county, municipality, etc.) level accuracy",
121
+ 4 => "Town (city, village) level accuracy",
122
+ 5 => "Post code (zip code) level accuracy",
123
+ 6 => "Street level accuracy",
124
+ 7 => "Intersection level accuracy",
125
+ 8 => "Address level accuracy"}[code]
126
+
127
+ end
74
128
 
75
129
  #Raised when the connection to the service is not possible
76
130
  class ConnectionException < StandardError
@@ -24,13 +24,13 @@ spec = Gem::Specification::new do |s|
24
24
  s.platform = Gem::Platform::RUBY
25
25
 
26
26
  s.name = 'ym4r'
27
- s.version = "0.6.0"
27
+ s.version = "0.6.1"
28
28
  s.summary = "Helping the use of Google Maps and Yahoo! Maps API's from Ruby and Rails"
29
29
  s.description = <<EOF
30
30
  EOF
31
31
  s.author = 'Guilhem Vellut'
32
- s.email = 'guilhem.vellut+ym4r@gmail.com'
33
- s.homepage = "http://thepochisuperstarmegashow.com/projects/#ym4r"
32
+ s.email = 'guilhem.vellut@gmail.com'
33
+ s.homepage = "http://ym4r.rubyforge.org"
34
34
 
35
35
  s.requirements << 'none'
36
36
  s.require_path = 'lib'
metadata CHANGED
@@ -1,33 +1,26 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.2
3
- specification_version: 1
4
2
  name: ym4r
5
3
  version: !ruby/object:Gem::Version
6
- version: 0.6.0
7
- date: 2007-09-12 00:00:00 +02:00
8
- summary: Helping the use of Google Maps and Yahoo! Maps API's from Ruby and Rails
9
- require_paths:
10
- - lib
11
- email: guilhem.vellut+ym4r@gmail.com
12
- homepage: http://thepochisuperstarmegashow.com/projects/#ym4r
13
- rubyforge_project:
14
- description: ""
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: 0.6.1
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
7
  - Guilhem Vellut
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-02-07 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: ""
17
+ email: guilhem.vellut@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README
31
24
  files:
32
25
  - lib/ym4r/google_maps/api_key.rb
33
26
  - lib/ym4r/google_maps/geocoding.rb
@@ -50,22 +43,36 @@ files:
50
43
  - README
51
44
  - MIT-LICENSE
52
45
  - rakefile.rb
46
+ has_rdoc: true
47
+ homepage: http://ym4r.rubyforge.org
48
+ post_install_message:
49
+ rdoc_options:
50
+ - --main
51
+ - README
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: "0"
59
+ version:
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: "0"
65
+ version:
66
+ requirements:
67
+ - none
68
+ rubyforge_project:
69
+ rubygems_version: 1.0.1
70
+ signing_key:
71
+ specification_version: 2
72
+ summary: Helping the use of Google Maps and Yahoo! Maps API's from Ruby and Rails
53
73
  test_files:
54
74
  - test/test_geocoding.rb
55
75
  - test/test_gm_geocoding.rb
56
76
  - test/test_local_search.rb
57
77
  - test/test_map_image.rb
58
78
  - test/test_traffic.rb
59
- rdoc_options:
60
- - --main
61
- - README
62
- extra_rdoc_files:
63
- - README
64
- executables: []
65
-
66
- extensions: []
67
-
68
- requirements:
69
- - none
70
- dependencies: []
71
-