mongoid_geo 0.5.1 → 0.5.2
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/README.textile +36 -31
- data/lib/mongoid/geo/fields.rb +2 -1
- data/lib/mongoid/geo/geo_near.rb +8 -5
- data/lib/mongoid_geo.rb +1 -1
- metadata +11 -11
data/README.textile
CHANGED
@@ -4,13 +4,16 @@ A Geo extension for Mongoid.
|
|
4
4
|
|
5
5
|
"MongoDB Geospatial Indexing":http://www.mongodb.org/display/DOCS/Geospatial+Indexing
|
6
6
|
|
7
|
-
* Supports
|
7
|
+
* Supports Mongo DB 1.7+ sphere distance calculations
|
8
8
|
* Adds nearSphere inclusion method
|
9
9
|
* Adds a set of geo related inflections
|
10
10
|
* Adds an exta option for defining a "geo" field, to have the generated attr_writer parse and convert strings etc. to float arrays.
|
11
|
+
* Calculate locations near a given point (geoNear)
|
11
12
|
|
12
13
|
h2. Mongoid 2 geo features
|
13
14
|
|
15
|
+
The following summarized what geo functionality is already provided by Mongoid 2.0 (as far as I could tell, May 9th, 2011)
|
16
|
+
|
14
17
|
h3. Find addresses near a point
|
15
18
|
|
16
19
|
<pre>
|
@@ -38,26 +41,29 @@ h3. Create geo-spatial index
|
|
38
41
|
autocreate_indexes: true
|
39
42
|
</pre>
|
40
43
|
|
41
|
-
These are the only geo features I could find are currently built-in for Mongoid 2.
|
42
|
-
|
44
|
+
These are the only geo features I could find that are currently built-in for Mongoid 2.
|
45
|
+
|
46
|
+
_Mongoid Geo_ implements some nice extra geo features:
|
43
47
|
|
44
48
|
h1. Mongoid Geo features
|
45
49
|
|
46
|
-
The following briefly demonstrates all the features that
|
50
|
+
The following briefly demonstrates all the features that *mongoid-geo* provides:
|
47
51
|
|
48
52
|
h2. Geo index
|
49
53
|
|
50
|
-
|
54
|
+
A new _geo_index_ class method
|
51
55
|
|
52
|
-
|
56
|
+
Usage example:
|
57
|
+
|
58
|
+
@geo_index :location@
|
53
59
|
|
54
60
|
Note: For embedded documents, you must define the index in the root collection class. (davemitchell)
|
55
61
|
|
56
|
-
h2.
|
62
|
+
h2. Geo option for Array GPS location field
|
57
63
|
|
58
|
-
When setting a geo
|
64
|
+
Objective: When setting a geo GPS location array, the setter should try to convert the value to an array of floats
|
59
65
|
|
60
|
-
|
66
|
+
The "old" manual way:
|
61
67
|
|
62
68
|
<pre>
|
63
69
|
class Person
|
@@ -69,7 +75,9 @@ Old/Manual way:
|
|
69
75
|
end
|
70
76
|
</pre>
|
71
77
|
|
72
|
-
|
78
|
+
*mongoid-geo* provides a new @:geo@ option that can be used with any Array field:
|
79
|
+
|
80
|
+
Usage example:
|
73
81
|
|
74
82
|
<pre>
|
75
83
|
class Person
|
@@ -121,11 +129,12 @@ With the new @:geo@ option supplied by _mongoid-geo_ :
|
|
121
129
|
|
122
130
|
# or alternatively
|
123
131
|
Mongoid::Geo.spherical = true
|
132
|
+
|
133
|
+
address.location = "23.5, -47"
|
134
|
+
address.location.should == [23.5, -47].reverse
|
124
135
|
</pre>
|
125
136
|
|
126
|
-
h2.
|
127
|
-
|
128
|
-
The geoNear queries can now convert the result into a Mongoid::Criteria, where distance from a given location is sorted in either descending or ascending (default) order
|
137
|
+
h2. geoNear
|
129
138
|
|
130
139
|
<pre>
|
131
140
|
class Address
|
@@ -148,46 +157,42 @@ end
|
|
148
157
|
</pre>
|
149
158
|
|
150
159
|
Find all positions sorted nearest to the address loation
|
160
|
+
|
151
161
|
@nearest_positions = Position.geoNear(another_address.location, :pos)@
|
152
162
|
|
153
163
|
Perform distance locations in Speherical mode inside Mongo DB (default is :plane)
|
164
|
+
|
154
165
|
@nearest_positions = Position.geoNear(another_address.location, :pos, :mode => :sphere)@
|
155
166
|
|
156
167
|
Other options supported are: @:num, :maxDistance, :distanceMultiplier, :query@
|
157
168
|
|
158
169
|
GeoNear returns each distance calculated in degrees. Use the :distanceMultiplier or :unit option to return in the unit of your choice (see unit.rb).
|
159
170
|
|
160
|
-
Set
|
161
|
-
Set
|
171
|
+
Set @:distanceMultiplier = 6371@ to get distance in KMs
|
172
|
+
Set @@:distanceMultiplier = @3963.19@ to get distance in Miles
|
162
173
|
|
163
|
-
You can also use the :unit option instead like this (supports :feet, :meters, :kms, :miles)
|
174
|
+
You can also use the :unit option instead like this (supports :feet, :meters, :kms, :miles):
|
164
175
|
|
165
|
-
@results = Address.geoNear @center.location, :location, :unit => :
|
176
|
+
@results = Address.geoNear @center.location, :location, :unit => :feet, :dist_order => :desc@
|
166
177
|
|
167
|
-
The
|
178
|
+
The _geoNear_ query result is returned as a _Mongoid::Criteria_
|
168
179
|
|
169
180
|
@results.desc(:distance).map(&:distance)@
|
170
181
|
|
171
|
-
Note that the
|
182
|
+
Note that the @:fromLocation@ field, stores the location the distance was last calculated as a Hash of the GPS location point it was calculated from:
|
172
183
|
|
173
184
|
@[23.5, -47].hash@
|
174
185
|
|
175
|
-
|
176
|
-
|
177
|
-
If you need to operate on the Mongoid models referenced by the query result, simply call #to_models on it
|
178
|
-
Fx to get the city of the first model instance from the query result:
|
186
|
+
This hash can be retrieved (and used for comparison?) using the @fromHash@ field
|
179
187
|
|
180
|
-
@
|
188
|
+
@from = results.first.fromHash@
|
181
189
|
|
182
|
-
You can also
|
190
|
+
You can also at any time get the GPS location point which the distance of any result instance was calculated from, using the @fromPoint field
|
183
191
|
|
184
|
-
@
|
185
|
-
|
186
|
-
# the model returned also has a distance accessor populated with the distance calculated by running the geoNear query
|
187
|
-
|
188
|
-
@nearest_distance = Position.geoNear(another_address.location, :pos).first.to_model.distance@
|
192
|
+
@from = results.first.fromPoint@
|
193
|
+
</pre>
|
189
194
|
|
190
|
-
You can now explicitly set/configure the Mongo DB version used. This will affect whether built-in Mongo DB distance calculation will be used or using standalone Ruby Haversine algorithm. By default the version is set to 1.
|
195
|
+
You can now explicitly set/configure the Mongo DB version used. This will affect whether built-in Mongo DB distance calculation will be used or using standalone Ruby Haversine algorithm. By default the Mongo DB version is set to 1.8 (as of May 9, 2011) . See _geo_near_ specs for more details/info on this.
|
191
196
|
|
192
197
|
@Mongoid::Geo.mongo_db_version = 1.7@
|
193
198
|
|
data/lib/mongoid/geo/fields.rb
CHANGED
@@ -28,7 +28,8 @@ module Mongoid #:nodoc
|
|
28
28
|
define_method("#{meth}=") do |value|
|
29
29
|
if options[:geo]
|
30
30
|
self.class.send :field, :distance, :type => Float
|
31
|
-
self.class.send :field, :
|
31
|
+
self.class.send :field, :fromHash, :type => String
|
32
|
+
self.class.send :field, :fromPoint, :type => Array
|
32
33
|
end
|
33
34
|
|
34
35
|
if options[:type] == Array && options[:geo]
|
data/lib/mongoid/geo/geo_near.rb
CHANGED
@@ -36,11 +36,12 @@ module Mongoid
|
|
36
36
|
module Models
|
37
37
|
def to_models mode = nil
|
38
38
|
distance_hash = Hash[ self.map {|item| [item._id, item.distance] } ]
|
39
|
-
from_hash = Hash[ self.map { |item| [item._id, item.
|
39
|
+
from_hash = Hash[ self.map { |item| [item._id, item.fromPoint] } ]
|
40
40
|
|
41
41
|
ret = to_criteria.to_a.map do |m|
|
42
42
|
m.distance = distance_hash[m._id.to_s]
|
43
|
-
m.
|
43
|
+
m.fromPoint = from_hash[m._id.to_s]
|
44
|
+
m.fromHash = from_hash[m._id.to_s].hash
|
44
45
|
m.save if mode == :save
|
45
46
|
m
|
46
47
|
end
|
@@ -50,7 +51,7 @@ module Mongoid
|
|
50
51
|
def as_criteria direction = nil
|
51
52
|
to_models(:save)
|
52
53
|
ids = first.klass.all.map(&:_id)
|
53
|
-
crit = Mongoid::Criteria.new(first.klass).where(:_id.in => ids, :
|
54
|
+
crit = Mongoid::Criteria.new(first.klass).where(:_id.in => ids, :fromHash => first.fromPoint.hash)
|
54
55
|
crit = crit.send(direction, :distance) if direction
|
55
56
|
crit
|
56
57
|
end
|
@@ -98,7 +99,8 @@ module Mongoid
|
|
98
99
|
# Calculate distance in KM or Miles if mongodb < 1.7
|
99
100
|
r[distance_meth] ||= calc_distance(r, center, location_attribute, options) if Mongoid::Geo.mongo_db_version < 1.7
|
100
101
|
r['klass'] = klass
|
101
|
-
r['
|
102
|
+
r['fromPoint'] = center
|
103
|
+
# r['fromHash'] = center.hash
|
102
104
|
end
|
103
105
|
query_result
|
104
106
|
end
|
@@ -107,7 +109,8 @@ module Mongoid
|
|
107
109
|
qres.map do |qr|
|
108
110
|
res = Hashie::Mash.new(qr['obj'].to_hash).extend(Mongoid::Geo::Model)
|
109
111
|
res.klass = qr['klass']
|
110
|
-
res.
|
112
|
+
res.fromPoint = qr['fromPoint']
|
113
|
+
# res.fromHash = qr['fromHash']
|
111
114
|
res.distance = qr[distance_meth]
|
112
115
|
res._id = qr['obj']['_id'].to_s
|
113
116
|
res
|
data/lib/mongoid_geo.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid_geo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-05-09 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &2152549140 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '2.4'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2152549140
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: mongoid
|
27
|
-
requirement: &
|
27
|
+
requirement: &2152548680 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 2.0.1
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2152548680
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: bson
|
38
|
-
requirement: &
|
38
|
+
requirement: &2152548220 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '1.3'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2152548220
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: activesupport
|
49
|
-
requirement: &
|
49
|
+
requirement: &2152547760 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 3.0.4
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2152547760
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: hashie
|
60
|
-
requirement: &
|
60
|
+
requirement: &2152547300 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: 0.4.0
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *2152547300
|
69
69
|
description: Geo spatial extension on Mongoid 2, to add more geo-spatial capabilities
|
70
70
|
email:
|
71
71
|
- kmandrup@gmail.com
|