mongoid_geo 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +50 -10
- data/lib/mongoid/geo/criterion/outer_operator.rb +13 -5
- data/lib/mongoid/geo/criterion/twin_operators.rb +6 -3
- data/lib/mongoid/geo/point.rb +18 -0
- data/lib/mongoid/geo.rb +6 -0
- metadata +8 -7
data/README.textile
CHANGED
@@ -105,7 +105,7 @@ h3. nearSphere
|
|
105
105
|
|
106
106
|
h3. nearMax
|
107
107
|
|
108
|
-
Find
|
108
|
+
Find points near a given point within a maximum distance
|
109
109
|
|
110
110
|
<pre>
|
111
111
|
base.where(:locations.nearMax => [[ 72, -44 ], 5])
|
@@ -113,6 +113,40 @@ Find all addresses near a point using spherical distance calculation
|
|
113
113
|
|
114
114
|
base.where(:locations.nearMax(:sphere) => [[ 72, -44 ], 5])
|
115
115
|
# => { $nearSphere: [50, 40] , $maxDistanceSphere: 3 }
|
116
|
+
|
117
|
+
base.where(:locations.nearMax(:sphere, :flat) => [[ 72, -44 ], 5])
|
118
|
+
# => { $nearSphere: [50, 40] , $maxDistance: 3 }
|
119
|
+
</pre>
|
120
|
+
|
121
|
+
You can also use a Hash to define the nearMax
|
122
|
+
|
123
|
+
<pre>
|
124
|
+
places.where(:location.nearMax => {:point => [ 72, -44 ], :distance => 5})
|
125
|
+
</pre>
|
126
|
+
|
127
|
+
Or use an Object (which must have the methods #point and #distance that return the point and max distance from that point)
|
128
|
+
|
129
|
+
<pre>
|
130
|
+
near_max_ = (Struct.new :point, :distance).new
|
131
|
+
near_max.point = [50, 40]
|
132
|
+
near_max.distance = [30,55]
|
133
|
+
|
134
|
+
places.where(:location.nearMax => near_max)
|
135
|
+
</pre>
|
136
|
+
|
137
|
+
Note: For the points, you can also use a hash or an object with the methods/keys, either :lat, lng or :latitude, :longitude
|
138
|
+
|
139
|
+
Example:
|
140
|
+
|
141
|
+
<pre>
|
142
|
+
center = (Struct.new :lat, :lng).new
|
143
|
+
center.lat = 72
|
144
|
+
center.lng = -44
|
145
|
+
places.where(:location.withinCenter => [center, radius])
|
146
|
+
|
147
|
+
# OR
|
148
|
+
|
149
|
+
places.where(:location.withinCenter => [{:lat => 72, :lng => -44}, radius])
|
116
150
|
</pre>
|
117
151
|
|
118
152
|
h3. withinBox
|
@@ -120,24 +154,29 @@ h3. withinBox
|
|
120
154
|
<pre>
|
121
155
|
box = [[50, 40], [30,55]]
|
122
156
|
base.where(:locations.withinBox => box)
|
123
|
-
# => locations: {"$within" : {"$box" :
|
157
|
+
# => locations: {"$within" : {"$box" : [[50, 40], [30,55]]}
|
124
158
|
|
125
159
|
base.where(:locations.withinBox(:sphere) => box)
|
126
|
-
# => locations: {"$within" : {"$boxSphere" :
|
160
|
+
# => locations: {"$within" : {"$boxSphere" : [[50, 40], [30,55]]}
|
127
161
|
</pre>
|
128
162
|
|
129
163
|
You can also use a Hash to define the box
|
130
164
|
|
131
165
|
<pre>
|
132
166
|
places.where(:location.withinBox => {:lower_left => [50, 40], :upper_right => [30,55]})
|
167
|
+
|
168
|
+
# or mix and match
|
169
|
+
|
170
|
+
places.where(:location.withinBox => {:lower_left => {:lat => 50, :lng => 40}, :upper_right => [30,55] } )
|
133
171
|
</pre>
|
134
172
|
|
135
173
|
Or use an Object (which must have the methods #lower_left and #upper_right that return the points of the bounding box)
|
136
174
|
|
137
175
|
<pre>
|
138
176
|
box = (Struct.new :lower_left, :upper_right).new
|
139
|
-
box.lower_left =
|
140
|
-
box.upper_right = [30,55]
|
177
|
+
box.lower_left = [50, 40]
|
178
|
+
box.upper_right = [30, 55]
|
179
|
+
|
141
180
|
places.where(:location.withinBox => box)
|
142
181
|
</pre>
|
143
182
|
|
@@ -146,15 +185,15 @@ h3. withinCenter
|
|
146
185
|
<pre>
|
147
186
|
center = [50, 40]
|
148
187
|
radius = 4
|
149
|
-
|
150
|
-
# places: {"$within" : {"$centerSphere" : [center, radius]}
|
151
|
-
places.where(:location.withinCenter(:sphere) => [center, radius])
|
152
188
|
|
153
|
-
# places: {"$within" : {"$center" : [center, radius]}
|
154
189
|
places.where(:location.withinCenter => [center, radius])
|
190
|
+
# => places: {"$within" : {"$center" : [[50, 40], 4]}
|
191
|
+
|
192
|
+
places.where(:location.withinCenter(:sphere) => [center, radius])
|
193
|
+
# => places: {"$within" : {"$centerSphere" : [[50, 40], 4]}
|
155
194
|
</pre>
|
156
195
|
|
157
|
-
You can also use a Hash to define the
|
196
|
+
You can also use a Hash to define the circle
|
158
197
|
|
159
198
|
<pre>
|
160
199
|
places.where(:location.withinCenter => {:center => [50, 40], :radius => 4})
|
@@ -166,5 +205,6 @@ Or use an Object (which must have the methods #lower_left and #upper_right that
|
|
166
205
|
circle = (Struct.new :center, :radius).new
|
167
206
|
circle.center = [50, 40]
|
168
207
|
circle.radius = 4
|
208
|
+
|
169
209
|
places.where(:location.withinCenter => circle)
|
170
210
|
</pre>
|
@@ -18,10 +18,14 @@ module Mongoid #:nodoc:
|
|
18
18
|
@outer_op = opts[:outer_op]
|
19
19
|
end
|
20
20
|
|
21
|
-
def make_hash v
|
22
|
-
|
21
|
+
def make_hash v
|
22
|
+
if operator =~ /box/
|
23
|
+
v = extract_box(v) if !v.kind_of?(Array)
|
24
|
+
v = [to_points(v.first), to_points(v.last)]
|
25
|
+
end
|
26
|
+
|
23
27
|
v = extract_circle(v) if !v.kind_of?(Array) && operator =~ /center/
|
24
|
-
{"$#{outer_op}" => {"$#{operator}" => v } }
|
28
|
+
{"$#{outer_op}" => {"$#{operator}" => to_points(v) } }
|
25
29
|
end
|
26
30
|
|
27
31
|
def hash
|
@@ -39,6 +43,10 @@ module Mongoid #:nodoc:
|
|
39
43
|
|
40
44
|
protected
|
41
45
|
|
46
|
+
def to_points v
|
47
|
+
v.extend(Mongoid::Geo::Point).to_points
|
48
|
+
end
|
49
|
+
|
42
50
|
def extract_circle(v)
|
43
51
|
case v
|
44
52
|
when Hash
|
@@ -49,12 +57,12 @@ module Mongoid #:nodoc:
|
|
49
57
|
end
|
50
58
|
|
51
59
|
def extract_box v
|
52
|
-
case v
|
60
|
+
box = case v
|
53
61
|
when Hash
|
54
62
|
[v[:lower_left], v[:upper_right]]
|
55
63
|
else
|
56
64
|
v.respond_to?(:lower_left) ? [v.lower_left, v.upper_right] : raise("Can't extract box from: #{v}, must have :lower_left and :upper_right methods or equivalent hash keys in Hash")
|
57
|
-
end
|
65
|
+
end
|
58
66
|
end
|
59
67
|
end
|
60
68
|
end
|
@@ -20,7 +20,7 @@ module Mongoid #:nodoc:
|
|
20
20
|
|
21
21
|
def make_hash v
|
22
22
|
v = extract_nearMax(v) if !v.kind_of?(Array) && op_b =~ /max/i
|
23
|
-
{"$#{op_a}" => v.first, "$#{op_b}" => v.last }
|
23
|
+
{"$#{op_a}" => to_points(v.first), "$#{op_b}" => to_points(v.last) }
|
24
24
|
end
|
25
25
|
|
26
26
|
def hash
|
@@ -35,10 +35,13 @@ module Mongoid #:nodoc:
|
|
35
35
|
return false unless other.is_a?(self.class)
|
36
36
|
self.op_a == other.op_a && self.op_b == other.op_b && self.key == other.key
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
protected
|
40
40
|
|
41
|
-
|
41
|
+
def to_points v
|
42
|
+
return v if v.kind_of? Fixnum
|
43
|
+
v.extend(Mongoid::Geo::Point).to_points
|
44
|
+
end
|
42
45
|
|
43
46
|
def extract_nearMax(v)
|
44
47
|
case v
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Mongoid::Geo
|
2
|
+
module Point
|
3
|
+
# convert hash or object to [x, y] of floats
|
4
|
+
def to_points
|
5
|
+
case self
|
6
|
+
when Hash
|
7
|
+
return [self[:lat], self[:lng]] if self[:lat]
|
8
|
+
return [self[:latitude], self[:longitude]] if self[:latitude]
|
9
|
+
raise "Hash must contain either :lat, :lng or :latitude, :longitude keys to be converted to a geo point"
|
10
|
+
else
|
11
|
+
return [self.lat, self.lng] if self.respond_to? :lat
|
12
|
+
return [self.latitude, self.longitude] if self.respond_to? :latitude
|
13
|
+
self
|
14
|
+
# raise 'Object must contain either #lat, #lng or #latitude, #longitude methods to be converted to a geo point'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
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.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease: !!null
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -14,7 +14,7 @@ default_executable: !!null
|
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
17
|
-
requirement: &
|
17
|
+
requirement: &2156985600 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *2156985600
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: mongoid
|
28
|
-
requirement: &
|
28
|
+
requirement: &2156984940 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 2.0.0.rc.6
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *2156984940
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: bson_ext
|
39
|
-
requirement: &
|
39
|
+
requirement: &2156984320 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,7 +44,7 @@ dependencies:
|
|
44
44
|
version: 1.1.6
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *2156984320
|
48
48
|
description: Geo spatial extension on Mongoid 2, to add more geo-spatial capabilities
|
49
49
|
email:
|
50
50
|
- kmandrup@gmail.com
|
@@ -61,6 +61,7 @@ files:
|
|
61
61
|
- lib/mongoid/geo/fields.rb
|
62
62
|
- lib/mongoid/geo/index.rb
|
63
63
|
- lib/mongoid/geo/inflections.rb
|
64
|
+
- lib/mongoid/geo/point.rb
|
64
65
|
- lib/mongoid/geo.rb
|
65
66
|
- lib/mongoid_geo.rb
|
66
67
|
- MIT-LICENSE
|