rails-geocoder 0.8.6 → 0.8.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.rdoc +5 -0
- data/README.rdoc +3 -0
- data/VERSION +1 -1
- data/lib/geocoder.rb +56 -13
- data/rails-geocoder.gemspec +2 -2
- data/test/geocoder_test.rb +13 -0
- metadata +2 -2
data/CHANGELOG.rdoc
CHANGED
@@ -2,6 +2,11 @@
|
|
2
2
|
|
3
3
|
Per-release changes to Geocoder.
|
4
4
|
|
5
|
+
== 0.8.7 (2009 Nov 4)
|
6
|
+
|
7
|
+
* Added Geocoder.geographic_center method.
|
8
|
+
* Replaced _get_coordinates class method with read_coordinates instance method.
|
9
|
+
|
5
10
|
== 0.8.6 (2009 Oct 27)
|
6
11
|
|
7
12
|
* The fetch_coordinates method now assigns coordinates to attributes (behaves like fetch_coordinates! used to) and fetch_coordinates! both assigns and saves the attributes.
|
data/README.rdoc
CHANGED
@@ -73,6 +73,9 @@ Some utility methods are also available:
|
|
73
73
|
|
74
74
|
# look up coordinates of some location (like searching Google Maps)
|
75
75
|
Geocoder.fetch_coordinates("25 Main St, Cooperstown, NY")
|
76
|
+
|
77
|
+
# find the geographic center (aka center of gravity) of objects or points
|
78
|
+
Geocoder.geographic_center([ city1, city2, city3, [40.22,-73.99], city4 ])
|
76
79
|
|
77
80
|
|
78
81
|
== More On Configuration
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.8.
|
1
|
+
0.8.7
|
data/lib/geocoder.rb
CHANGED
@@ -102,22 +102,21 @@ module Geocoder
|
|
102
102
|
:limit => limit
|
103
103
|
}
|
104
104
|
end
|
105
|
+
end
|
105
106
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
object.send(geocoder_options[:longitude])]
|
113
|
-
end
|
107
|
+
##
|
108
|
+
# Read the coordinates [lat,lon] of an object. This is not great but it
|
109
|
+
# seems cleaner than polluting the instance method namespace.
|
110
|
+
#
|
111
|
+
def read_coordinates
|
112
|
+
[:latitude, :longitude].map{ |i| send self.class.geocoder_options[i] }
|
114
113
|
end
|
115
|
-
|
114
|
+
|
116
115
|
##
|
117
116
|
# Is this object geocoded? (Does it have latitude and longitude?)
|
118
117
|
#
|
119
118
|
def geocoded?
|
120
|
-
|
119
|
+
read_coordinates.compact.size > 0
|
121
120
|
end
|
122
121
|
|
123
122
|
##
|
@@ -126,7 +125,7 @@ module Geocoder
|
|
126
125
|
#
|
127
126
|
def distance_to(lat, lon, units = :mi)
|
128
127
|
return nil unless geocoded?
|
129
|
-
mylat,mylon =
|
128
|
+
mylat,mylon = read_coordinates
|
130
129
|
Geocoder.distance_between(mylat, mylon, lat, lon, :units => units)
|
131
130
|
end
|
132
131
|
|
@@ -137,9 +136,8 @@ module Geocoder
|
|
137
136
|
#
|
138
137
|
def nearbys(radius = 20, options = {})
|
139
138
|
return [] unless geocoded?
|
140
|
-
coords = self.class._get_coordinates(self)
|
141
139
|
options = {:conditions => ["id != ?", id]}.merge(options)
|
142
|
-
self.class.near(
|
140
|
+
self.class.near(read_coordinates, radius, options) - [self]
|
143
141
|
end
|
144
142
|
|
145
143
|
##
|
@@ -213,6 +211,44 @@ module Geocoder
|
|
213
211
|
c * units[options[:units]]
|
214
212
|
end
|
215
213
|
|
214
|
+
##
|
215
|
+
# Compute the geographic center (aka geographic midpoint, center of
|
216
|
+
# gravity) for an array of geocoded objects and/or [lat,lon] arrays
|
217
|
+
# (can be mixed). Any objects missing coordinates are ignored. Follows
|
218
|
+
# the procedure documented at http://www.geomidpoint.com/calculation.html.
|
219
|
+
#
|
220
|
+
def self.geographic_center(points)
|
221
|
+
|
222
|
+
# convert objects to [lat,lon] arrays and remove nils
|
223
|
+
points = points.map{ |p|
|
224
|
+
p.is_a?(Array) ? p : (p.geocoded?? p.read_coordinates : nil)
|
225
|
+
}.compact
|
226
|
+
|
227
|
+
# convert degrees to radians
|
228
|
+
points.map!{ |p| [to_radians(p[0]), to_radians(p[1])] }
|
229
|
+
|
230
|
+
# convert to Cartesian coordinates
|
231
|
+
x = []; y = []; z = []
|
232
|
+
points.each do |p|
|
233
|
+
x << Math.cos(p[0]) * Math.cos(p[1])
|
234
|
+
y << Math.cos(p[0]) * Math.sin(p[1])
|
235
|
+
z << Math.sin(p[0])
|
236
|
+
end
|
237
|
+
|
238
|
+
# compute average coordinate values
|
239
|
+
xa, ya, za = [x,y,z].map do |c|
|
240
|
+
c.inject(0){ |tot,i| tot += i } / c.size.to_f
|
241
|
+
end
|
242
|
+
|
243
|
+
# convert back to latitude/longitude
|
244
|
+
lon = Math.atan2(ya, xa)
|
245
|
+
hyp = Math.sqrt(xa**2 + ya**2)
|
246
|
+
lat = Math.atan2(za, hyp)
|
247
|
+
|
248
|
+
# return answer in degrees
|
249
|
+
[to_degrees(lat), to_degrees(lon)]
|
250
|
+
end
|
251
|
+
|
216
252
|
##
|
217
253
|
# Convert degrees to radians.
|
218
254
|
#
|
@@ -220,6 +256,13 @@ module Geocoder
|
|
220
256
|
degrees * (Math::PI / 180)
|
221
257
|
end
|
222
258
|
|
259
|
+
##
|
260
|
+
# Convert radians to degrees.
|
261
|
+
#
|
262
|
+
def self.to_degrees(radians)
|
263
|
+
(radians * 180.0) / Math::PI
|
264
|
+
end
|
265
|
+
|
223
266
|
##
|
224
267
|
# Query Google for geographic information about the given phrase.
|
225
268
|
#
|
data/rails-geocoder.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rails-geocoder}
|
8
|
-
s.version = "0.8.
|
8
|
+
s.version = "0.8.7"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Alex Reisner"]
|
12
|
-
s.date = %q{2009-
|
12
|
+
s.date = %q{2009-11-04}
|
13
13
|
s.description = %q{Geocoder adds object geocoding and database-agnostic distance calculations to Ruby on Rails. It does not rely on proprietary database functions so finding geocoded objects in a given area is easily done using out-of-the-box MySQL or even SQLite.}
|
14
14
|
s.email = %q{alex@alexreisner.com}
|
15
15
|
s.extra_rdoc_files = [
|
data/test/geocoder_test.rb
CHANGED
@@ -7,4 +7,17 @@ class GeocoderTest < Test::Unit::TestCase
|
|
7
7
|
assert_equal [40.7495760, -73.9916733], v.fetch_coordinates
|
8
8
|
assert_equal [40.7495760, -73.9916733], [v.latitude, v.longitude]
|
9
9
|
end
|
10
|
+
|
11
|
+
# sanity check
|
12
|
+
def test_distance_between
|
13
|
+
assert_equal 69, Geocoder.distance_between(0,0, 0,1).round
|
14
|
+
end
|
15
|
+
|
16
|
+
# sanity check
|
17
|
+
def test_geographic_center
|
18
|
+
assert_equal [0.0, 0.5],
|
19
|
+
Geocoder.geographic_center([[0,0], [0,1]])
|
20
|
+
assert_equal [0.0, 1.0],
|
21
|
+
Geocoder.geographic_center([[0,0], [0,1], [0,2]])
|
22
|
+
end
|
10
23
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-geocoder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Reisner
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-11-04 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|