geo_magic 0.2.2.1 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +16 -2
- data/VERSION +1 -1
- data/geo_magic.gemspec +3 -3
- data/lib/geo_magic/geocode/config.rb +1 -1
- data/lib/geo_magic/geocode/geocoder.rb +57 -18
- data/lib/rails/config.rb +2 -2
- data/spec/fixtures/{config.yaml → map_api_keys.yaml} +2 -0
- data/spec/geo_magic/geocoder_spec.rb +16 -3
- metadata +5 -6
data/README.textile
CHANGED
@@ -77,8 +77,16 @@ h2. Extra features
|
|
77
77
|
|
78
78
|
Lots of extra features has been added recently. For now, please check out the specs to get an idea of the features included.
|
79
79
|
Most recently I have added support to filter a list of points for those who are within a radius of another point (see _select_neares_spec.rb_).
|
80
|
+
|
81
|
+
h3. Geocoder adapters
|
82
|
+
|
80
83
|
I have also just created a Geocode adapter for _Geocode_ and _Graticule_ (see: _geocoder_spec.rb_) - This can also easily be configured for Rails.
|
81
84
|
|
85
|
+
I recently discovered that the Geocode adapter didn't work for all addresses, so I made some improvements to make it more "stable".
|
86
|
+
I'm sure there are still corner cases it wont handle, so please join in the effort to fix this!
|
87
|
+
|
88
|
+
Also note that the API has changed a little bit, so that it uses the same GeoMagic namespace as the rest of _geo_magic_.
|
89
|
+
|
82
90
|
h3. Create random points in Radius
|
83
91
|
|
84
92
|
* @create_points_in_square@
|
@@ -90,17 +98,23 @@ Within distance:
|
|
90
98
|
|
91
99
|
<pre>@points.as_map_points.within_distance 4.km, :from => @center_point</pre>
|
92
100
|
|
93
|
-
The closest n:
|
101
|
+
The closest n points:
|
94
102
|
|
95
103
|
<pre>@points.as_map_points.the_closest 4, :from => @center_point</pre>
|
96
104
|
|
105
|
+
Or using container objects (objects containing a location):
|
106
|
+
|
107
|
+
@people.as_map_points.the_closest 4, :from => @house
|
108
|
+
|
109
|
+
Where @people is an array of Person and @house is an instance of House and where both House and Person has a #location, #to_point or #point method that returns an object
|
110
|
+
with latitude and longitude methods that each return a float.
|
111
|
+
|
97
112
|
Within bounding rectangle:
|
98
113
|
|
99
114
|
<pre>rectangle = GeoMagic::Rectangle.new(GeoMagic::Point.new(-115, 50), GeoMagic::Point.new(-100, 20))
|
100
115
|
# or
|
101
116
|
# rect = GeoMagic::Rectangle.create_from_coords lat1, long1, lat2, long2
|
102
117
|
@points.as_map_points.within_rectangle rect, :from => @center_point
|
103
|
-
|
104
118
|
</pre>
|
105
119
|
|
106
120
|
h2. Meta magic
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.3
|
data/geo_magic.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{geo_magic}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kristian Mandrup"]
|
12
|
-
s.date = %q{2011-01-
|
12
|
+
s.date = %q{2011-01-22}
|
13
13
|
s.description = %q{Get IP and location data using freegeoip.net - can also calculate of distance between map points using haversine supporting multiple distance units}
|
14
14
|
s.email = %q{kmandrup@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -40,7 +40,7 @@ Gem::Specification.new do |s|
|
|
40
40
|
"lib/geo_magic/remote.rb",
|
41
41
|
"lib/geo_magic/util.rb",
|
42
42
|
"lib/rails/config.rb",
|
43
|
-
"spec/fixtures/
|
43
|
+
"spec/fixtures/map_api_keys.yaml",
|
44
44
|
"spec/geo_magic/calculate_spec.rb",
|
45
45
|
"spec/geo_magic/geocoder_spec.rb",
|
46
46
|
"spec/geo_magic/include_calc_spec.rb",
|
@@ -3,7 +3,7 @@ require 'active_support/inflector'
|
|
3
3
|
require 'geocode'
|
4
4
|
require 'graticule'
|
5
5
|
|
6
|
-
module
|
6
|
+
module GeoMagic
|
7
7
|
class GeoAdapter
|
8
8
|
attr_accessor :service_name, :environment
|
9
9
|
|
@@ -53,32 +53,41 @@ module GeoMap
|
|
53
53
|
geo_coder.geocode(location_str).extend GeocodeAPI
|
54
54
|
end
|
55
55
|
|
56
|
-
module GeocodeAPI
|
57
|
-
|
58
|
-
|
56
|
+
module GeocodeAPI
|
57
|
+
# Address
|
58
|
+
|
59
|
+
def street
|
60
|
+
thoroughfare["ThoroughfareName"]
|
59
61
|
end
|
60
62
|
|
61
|
-
def country_name
|
62
|
-
country_api["CountryName"]
|
63
|
-
end
|
64
|
-
|
65
|
-
def state
|
66
|
-
adm_api["AdministrativeAreaName"]
|
67
|
-
end
|
68
|
-
|
69
63
|
def postal_code
|
70
|
-
|
64
|
+
locality["PostalCode"]["PostalCodeNumber"]
|
71
65
|
end
|
72
66
|
alias_method :zip, :postal_code
|
73
67
|
|
74
|
-
def street
|
75
|
-
subadm_api["Thoroughfare"]["ThoroughfareName"]
|
76
|
-
end
|
77
|
-
|
78
68
|
def city
|
79
69
|
subadm_api["SubAdministrativeAreaName"]
|
80
70
|
end
|
81
71
|
|
72
|
+
def state
|
73
|
+
adm_api["AdministrativeAreaName"]
|
74
|
+
end
|
75
|
+
|
76
|
+
def country_code
|
77
|
+
country_api["CountryNameCode"]
|
78
|
+
end
|
79
|
+
|
80
|
+
def country_name
|
81
|
+
country_api["CountryName"].gsub(/Bundesrepublik /, '')
|
82
|
+
end
|
83
|
+
alias_method :country, :country_name
|
84
|
+
|
85
|
+
def address_hash
|
86
|
+
{:street => street, :postal_code => postal_code, :city => city, :state => state, :country => country, :country_code => country_code}
|
87
|
+
end
|
88
|
+
|
89
|
+
# Location
|
90
|
+
|
82
91
|
def latitude
|
83
92
|
coords[1]
|
84
93
|
end
|
@@ -86,9 +95,31 @@ module GeoMap
|
|
86
95
|
def longitude
|
87
96
|
coords[0]
|
88
97
|
end
|
98
|
+
|
99
|
+
def location_hash
|
100
|
+
{:longitude => longitude, :latitude => latitude}
|
101
|
+
end
|
89
102
|
|
90
103
|
protected
|
91
104
|
|
105
|
+
def thoroughfare
|
106
|
+
@thoroughfare ||= begin
|
107
|
+
thorough = [:subadm_api, :locality_api, :dependent_locality_api].select do |api|
|
108
|
+
send(api)["Thoroughfare"]
|
109
|
+
end
|
110
|
+
send(thorough.first)["Thoroughfare"]
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def locality
|
115
|
+
@locality ||= begin
|
116
|
+
thorough = [:locality_api, :dependent_locality_api].select do |api|
|
117
|
+
send(api)["PostalCode"]
|
118
|
+
end
|
119
|
+
send(thorough.first)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
92
123
|
def api
|
93
124
|
data["Placemark"].first
|
94
125
|
end
|
@@ -112,6 +143,14 @@ module GeoMap
|
|
112
143
|
def subadm_api
|
113
144
|
adm_api["SubAdministrativeArea"]
|
114
145
|
end
|
146
|
+
|
147
|
+
def locality_api
|
148
|
+
subadm_api["Locality"]
|
149
|
+
end
|
150
|
+
|
151
|
+
def dependent_locality_api
|
152
|
+
locality_api["DependentLocality"]
|
153
|
+
end
|
115
154
|
end
|
116
155
|
|
117
156
|
def reverse_geocode latitude, longitude
|
@@ -125,7 +164,7 @@ module GeoMap
|
|
125
164
|
service_name = options[:service_name] || :google
|
126
165
|
type = options[:type] || :geocode
|
127
166
|
env = options[:env]
|
128
|
-
"
|
167
|
+
"GeoMagic::#{type.to_s.classify}Adapter".constantize.new service_name, env
|
129
168
|
end
|
130
169
|
|
131
170
|
def geocode location_str
|
data/lib/rails/config.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module GeoMagic
|
2
2
|
module RailsServiceAdapter
|
3
3
|
attr_reader :geo_coder
|
4
4
|
|
@@ -17,7 +17,7 @@ module GeoMap
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def config
|
20
|
-
@config ||= ::YAML.load_file("#{::Rails.root}/config/
|
20
|
+
@config ||= ::YAML.load_file("#{::Rails.root}/config/map_api_keys.yml")[env]
|
21
21
|
end
|
22
22
|
|
23
23
|
def google_key
|
@@ -3,8 +3,8 @@ require 'geo_magic'
|
|
3
3
|
|
4
4
|
describe "GeoMagic Geocoder" do
|
5
5
|
before do
|
6
|
-
@geocoder =
|
7
|
-
@geocoder.configure File.expand_path('../fixtures/
|
6
|
+
@geocoder = GeoMagic.geo_coder
|
7
|
+
@geocoder.configure File.expand_path('../fixtures/map_api_keys.yaml', File.dirname(__FILE__)), :development
|
8
8
|
end
|
9
9
|
|
10
10
|
it "should geocode" do
|
@@ -18,8 +18,21 @@ describe "GeoMagic Geocoder" do
|
|
18
18
|
p location.longitude
|
19
19
|
end
|
20
20
|
|
21
|
+
it "should create location and address hashes" do
|
22
|
+
location = @geocoder.instance.geocode "Marienplatz 14, munich, Germany"
|
23
|
+
p location.location_hash
|
24
|
+
p location.address_hash
|
25
|
+
end
|
26
|
+
|
27
|
+
# Geocoder with Rails 3
|
28
|
+
|
29
|
+
# Expects map api keys (fx for google maps) to be defined in ROOT/config/map_api_keys.yml
|
30
|
+
# See spec/fixtures/map_api_keys.yml for example
|
31
|
+
|
32
|
+
# Use @geocoder.configure(path, env) to customize this
|
33
|
+
|
21
34
|
# it "should geocode for rails" do
|
22
|
-
# @geocoder = GeoMap.geo_coder
|
35
|
+
# @geocoder = GeoMap.geo_coder(:env => :rails)
|
23
36
|
# location = @geocoder.instance.geocode "Mullerstrasse 9, Munich"
|
24
37
|
# location.city.should == 'Munich'
|
25
38
|
# end
|
metadata
CHANGED
@@ -5,9 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
|
10
|
-
version: 0.2.2.1
|
8
|
+
- 3
|
9
|
+
version: 0.2.3
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Kristian Mandrup
|
@@ -15,7 +14,7 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2011-01-
|
17
|
+
date: 2011-01-22 00:00:00 +01:00
|
19
18
|
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
@@ -169,7 +168,7 @@ files:
|
|
169
168
|
- lib/geo_magic/remote.rb
|
170
169
|
- lib/geo_magic/util.rb
|
171
170
|
- lib/rails/config.rb
|
172
|
-
- spec/fixtures/
|
171
|
+
- spec/fixtures/map_api_keys.yaml
|
173
172
|
- spec/geo_magic/calculate_spec.rb
|
174
173
|
- spec/geo_magic/geocoder_spec.rb
|
175
174
|
- spec/geo_magic/include_calc_spec.rb
|
@@ -193,7 +192,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
193
192
|
requirements:
|
194
193
|
- - ">="
|
195
194
|
- !ruby/object:Gem::Version
|
196
|
-
hash: -
|
195
|
+
hash: -701075083202968492
|
197
196
|
segments:
|
198
197
|
- 0
|
199
198
|
version: "0"
|