mongoid-geospatial 4.0.1 → 5.0.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/README.md +126 -242
- data/bench/bench +11 -10
- data/lib/mongoid/geospatial.rb +14 -17
- data/lib/mongoid/geospatial/fields/point.rb +42 -10
- data/lib/mongoid/geospatial/geometry_field.rb +25 -2
- data/lib/mongoid/geospatial/helpers/delegate.rb +6 -2
- data/lib/mongoid/geospatial/version.rb +1 -1
- data/lib/mongoid/geospatial/wrappers/georuby.rb +4 -0
- data/lib/mongoid/geospatial/wrappers/rgeo.rb +4 -1
- data/mongoid-geospatial.gemspec +2 -2
- data/spec/models/bar.rb +1 -1
- data/spec/models/farm.rb +1 -1
- data/spec/models/person.rb +2 -1
- data/spec/models/river.rb +7 -7
- data/spec/mongoid/geospatial/fields/line_string_spec.rb +44 -8
- data/spec/mongoid/geospatial/fields/point_spec.rb +30 -28
- data/spec/mongoid/geospatial/fields/polygon_spec.rb +25 -18
- data/spec/mongoid/geospatial/geospatial_spec.rb +65 -49
- data/spec/mongoid/geospatial/helpers/core_spec.rb +8 -3
- data/spec/mongoid/geospatial/helpers/delegate_spec.rb +18 -1
- data/spec/mongoid/geospatial/helpers/spatial_spec.rb +9 -1
- data/spec/mongoid/geospatial/helpers/sphere_spec.rb +10 -1
- data/spec/mongoid/geospatial/wrappers/rgeo_spec.rb +4 -2
- data/spec/spec_helper.rb +7 -3
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e35bbf5de066ee3347846c61de3a32f8f034705b
|
4
|
+
data.tar.gz: ff4828b80b77ef40b8f3e3a91c3831dcab387e03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e5c121ff1e4869322186eebc97362209e08b704957cbd96d2b52d3588005e6f560bced4a287e2251a6e9e16f04d02765f4140222c65b042ac39d7ec20506c987
|
7
|
+
data.tar.gz: 7576483685a5c3969413e7584ebb82676261ad8b4ffe9758226ce2df17485e16f3e901c6488c35275ab8f92c50f75c4b915d37d4b4878040350e1799646b32cf
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -4,24 +4,19 @@ Mongoid Geospatial
|
|
4
4
|
|
5
5
|
A Mongoid Extension that simplifies the use of MongoDB spatial features.
|
6
6
|
|
7
|
-
|
7
|
+
* Version 5.x -> Mongoid 5
|
8
|
+
* Version 4.x -> Mongoid 4
|
8
9
|
|
9
|
-
|
10
|
-
Version 3+ is going to be beta testing, when it's ready I'll release v4,
|
11
|
-
So the major version stays the same as mongoid.
|
12
|
-
|
13
|
-
** Gem name: 'mongoid-geospatial' (notice the hyphen) **
|
14
|
-
|
15
|
-
The name of this gem has changed.
|
10
|
+
** Gem name has changed: 'mongoid-geospatial' (notice the hyphen) **
|
16
11
|
Please change the underscore to a hyphen.
|
17
|
-
|
18
|
-
|
12
|
+
That will require it correctly within bundler:
|
13
|
+
`require 'mongoid/geospatial'`
|
19
14
|
|
20
|
-
[](http://badge.fury.io/rb/mongoid-geospatial)
|
16
|
+
[](https://codeclimate.com/github/nofxx/mongoid-geospatial)
|
17
|
+
[](https://coveralls.io/r/nofxx/mongoid-geospatial?branch=master)
|
23
18
|
[](https://gemnasium.com/nofxx/mongoid-geospatial)
|
24
|
-
[](https://travis-ci.org/nofxx/mongoid-geospatial)
|
25
20
|
|
26
21
|
|
27
22
|
Quick Start
|
@@ -34,7 +29,7 @@ But you may also use an external Geometric/Spatial gem alongside.
|
|
34
29
|
gem 'mongoid-geospatial'
|
35
30
|
|
36
31
|
|
37
|
-
A
|
32
|
+
A `Place` to illustrate `Point`, `Line` and `Polygon`
|
38
33
|
|
39
34
|
class Place
|
40
35
|
include Mongoid::Document
|
@@ -50,23 +45,19 @@ A place to illustrate Point, Line and Polygon
|
|
50
45
|
field :route, type: Linestring
|
51
46
|
field :area, type: Polygon
|
52
47
|
|
53
|
-
#
|
54
|
-
|
48
|
+
# To query on your points, don't forget to index:
|
49
|
+
# You may use a method:
|
50
|
+
sphere_index :location # 2d
|
51
|
+
# or
|
52
|
+
spatial_index :location # 2dsphere
|
55
53
|
|
56
|
-
# Or
|
57
|
-
field :location, type: Point, spatial: true
|
54
|
+
# Or use a helper directly on the `field`:
|
55
|
+
field :location, type: Point, spatial: true # 2d
|
56
|
+
# or
|
57
|
+
field :location, type: Point, sphere: true # 2dsphere
|
58
58
|
end
|
59
59
|
|
60
60
|
|
61
|
-
For geo points, an extra macro `geo_field` is available
|
62
|
-
|
63
|
-
geo_field :location
|
64
|
-
|
65
|
-
Will generate:
|
66
|
-
|
67
|
-
field :location, type: Point, spatial: true
|
68
|
-
|
69
|
-
|
70
61
|
|
71
62
|
Generate indexes on MongoDB via rake:
|
72
63
|
|
@@ -81,7 +72,6 @@ Or programatically:
|
|
81
72
|
|
82
73
|
|
83
74
|
|
84
|
-
|
85
75
|
Points
|
86
76
|
------
|
87
77
|
|
@@ -149,119 +139,6 @@ And for polygons and lines:
|
|
149
139
|
house.area.center # Returns calculate middle point
|
150
140
|
|
151
141
|
|
152
|
-
Query
|
153
|
-
-----
|
154
|
-
|
155
|
-
Before you read about this gem have sure you read this:
|
156
|
-
|
157
|
-
http://mongoid.org/en/origin/docs/selection.html#standard
|
158
|
-
|
159
|
-
All MongoDB queries are handled by Mongoid.
|
160
|
-
|
161
|
-
|
162
|
-
You can use Geometry instance directly on any query:
|
163
|
-
|
164
|
-
* near
|
165
|
-
* Bar.near(location: person.house)
|
166
|
-
* Bar.where(:location.near => person.house)
|
167
|
-
|
168
|
-
|
169
|
-
* near_sphere
|
170
|
-
* Bar.near_sphere(location: person.house)
|
171
|
-
* Bar.where(:location.near_sphere => person.house)
|
172
|
-
|
173
|
-
|
174
|
-
### Not supported (until Mongoid 5.0.0)
|
175
|
-
Those have been dropped from moped, should return on mongoid 5.
|
176
|
-
Sad story.
|
177
|
-
|
178
|
-
* within_box
|
179
|
-
* Bar.within_box(location: hood.area)
|
180
|
-
|
181
|
-
|
182
|
-
* within_circle
|
183
|
-
* Bar.within_circle(location: hood.area)
|
184
|
-
|
185
|
-
|
186
|
-
* within_circle_sphere
|
187
|
-
* Bar.within_circle_sphere(location: hood.area)
|
188
|
-
|
189
|
-
|
190
|
-
* within_polygon
|
191
|
-
* Bar.within_polygon(location: city.area)
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
External Libraries
|
196
|
-
------------------
|
197
|
-
|
198
|
-
Use RGeo?
|
199
|
-
https://github.com/dazuma/rgeo
|
200
|
-
|
201
|
-
RGeo is a Ruby wrapper for Proj/GEOS.
|
202
|
-
It's perfect when you need to work with complex calculations and projections.
|
203
|
-
It'll require more stuff installed to compile/work.
|
204
|
-
|
205
|
-
|
206
|
-
Use GeoRuby?
|
207
|
-
https://github.com/nofxx/georuby
|
208
|
-
|
209
|
-
GeoRuby is a pure Ruby Geometry Library.
|
210
|
-
It's perfect if you want simple calculations and/or keep your stack in pure ruby.
|
211
|
-
Albeit not full featured in maths it has a handful of methods and good import/export helpers.
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
Geometry Helpers
|
216
|
-
----------------
|
217
|
-
|
218
|
-
We currently support GeoRuby and RGeo.
|
219
|
-
If you require one of those, a #to_geo and #to_rgeo, respectivelly,
|
220
|
-
method(s) will be available to all spatial fields, returning the
|
221
|
-
external library corresponding object.
|
222
|
-
|
223
|
-
To illustrate:
|
224
|
-
|
225
|
-
class Person
|
226
|
-
include Mongoid::Document
|
227
|
-
include Mongoid::Geospatial
|
228
|
-
|
229
|
-
field :location, type: Point
|
230
|
-
end
|
231
|
-
|
232
|
-
me = Person.new(location: [8, 8])
|
233
|
-
|
234
|
-
# Example with GeoRuby
|
235
|
-
point.class # Mongoid::Geospatial::Point
|
236
|
-
point.to_geo.class # GeoRuby::SimpleFeatures::Point
|
237
|
-
|
238
|
-
# Example with RGeo
|
239
|
-
point.class # Mongoid::Geospatial::Point
|
240
|
-
point.to_rgeo.class # RGeo::Geographic::SphericalPointImpl
|
241
|
-
|
242
|
-
|
243
|
-
Configure
|
244
|
-
---------
|
245
|
-
|
246
|
-
Assemble it as you need (use a initializer file):
|
247
|
-
|
248
|
-
With RGeo
|
249
|
-
|
250
|
-
Mongoid::Geospatial.with_rgeo!
|
251
|
-
# Optional
|
252
|
-
# Mongoid::Geospatial.factory = RGeo::Geographic.spherical_factory
|
253
|
-
|
254
|
-
|
255
|
-
With GeoRuby
|
256
|
-
|
257
|
-
Mongoid::Geospatial.with_georuby!
|
258
|
-
|
259
|
-
|
260
|
-
Defaults (change if you know what you're doing)
|
261
|
-
|
262
|
-
Mongoid::Geospatial.lng_symbol = :x
|
263
|
-
Mongoid::Geospatial.lat_symbol = :y
|
264
|
-
Mongoid::Geospatial.earth_radius = EARTH_RADIUS
|
265
142
|
|
266
143
|
|
267
144
|
|
@@ -294,13 +171,20 @@ You can create Point, Line, Circle, Box and Polygon on your models:
|
|
294
171
|
Helpers
|
295
172
|
-------
|
296
173
|
|
297
|
-
You can use `spatial: true` to add
|
174
|
+
You can use `spatial: true` to add a '2d' index automatically,
|
298
175
|
No need for `spatial_index :location`:
|
299
176
|
|
300
177
|
|
301
178
|
field :location, type: Point, spatial: true
|
302
179
|
|
303
180
|
|
181
|
+
And you can use `sphere: true` to add a '2dsphere' index automatically,
|
182
|
+
No need for `spatial_sphere :location`:
|
183
|
+
|
184
|
+
|
185
|
+
field :location, type: Point, sphere: true
|
186
|
+
|
187
|
+
|
304
188
|
You can delegate some point methods to the instance itself:
|
305
189
|
|
306
190
|
|
@@ -335,7 +219,7 @@ Some helper methods are available to them:
|
|
335
219
|
|
336
220
|
|
337
221
|
# Returns a geometry bounding box
|
338
|
-
# Useful to query #
|
222
|
+
# Useful to query #within_geometry
|
339
223
|
polygon.bbox
|
340
224
|
polygon.bounding_box
|
341
225
|
|
@@ -349,127 +233,123 @@ Some helper methods are available to them:
|
|
349
233
|
polygon.radius_sphere(5) # [[1.0, 1.0], 0.00048..]
|
350
234
|
|
351
235
|
|
236
|
+
Query
|
237
|
+
-----
|
352
238
|
|
239
|
+
Before you read about this gem have sure you read this:
|
353
240
|
|
354
|
-
|
355
|
-
---------
|
241
|
+
http://mongoid.org/en/origin/docs/selection.html#standard
|
356
242
|
|
357
|
-
|
243
|
+
All MongoDB queries are handled by Mongoid/Origin.
|
244
|
+
|
245
|
+
http://www.rubydoc.info/github/mongoid/origin/Origin/Selectable
|
246
|
+
|
247
|
+
You can use Geometry instance directly on any query:
|
248
|
+
|
249
|
+
* near
|
358
250
|
|
359
|
-
MongoDB now also supports indexing documents by multiple locations. These locations can be specified in arrays of sub-objects, for example:
|
360
251
|
|
361
252
|
```
|
362
|
-
|
363
|
-
|
253
|
+
Bar.near(location: person.house)
|
254
|
+
Bar.where(:location.near => person.house)
|
364
255
|
```
|
365
256
|
|
366
|
-
|
257
|
+
* near_sphere
|
367
258
|
|
368
259
|
```
|
369
|
-
|
370
|
-
|
260
|
+
Bar.near_sphere(location: person.house)
|
261
|
+
Bar.where(:location.near_sphere => person.house)
|
371
262
|
```
|
372
263
|
|
373
|
-
|
374
|
-
|
375
|
-
v2.0
|
376
|
-
In v2.0, this default can be overridden by the use of a $uniqueDocs parameter for geoNear and $within queries, like so:
|
264
|
+
* within_polygon
|
377
265
|
|
378
266
|
```
|
379
|
-
|
380
|
-
|
267
|
+
Bar.within_polygon(location: [[[x,y],...[x,y]]])
|
268
|
+
# or with a bbox
|
269
|
+
Bar.within_polygon(location: street.bbox)
|
381
270
|
```
|
382
271
|
|
383
|
-
Currently it is not possible to specify $uniqueDocs for $near queries
|
384
|
-
Whether or not uniqueDocs is true, when using a limit the limit is applied (as is normally the case) to the number of results returned (and not to the docs or locations). If running a geoNear query with uniqueDocs : true, the closest location in a document to the center of the search region will always be returned - this is not true for $within queries.
|
385
272
|
|
386
|
-
|
273
|
+
* intersects_line
|
274
|
+
* intersects_point
|
275
|
+
* intersects_polygon
|
387
276
|
|
388
|
-
If the location was an array, the location returned will be an object with "0" and "1" fields in v2.0.0 and v2.0.1.
|
389
277
|
|
390
|
-
```
|
391
|
-
> db.runCommand({ geoNear : "places", near : [ 0, 0 ], maxDistance : 20, includeLocs : true })
|
392
|
-
{
|
393
|
-
"ns" : "test.places",
|
394
|
-
"near" : "1100000000000000000000000000000000000000000000000000",
|
395
|
-
"results" : [
|
396
|
-
{
|
397
|
-
"dis" : 5.830951894845301,
|
398
|
-
"loc" : {
|
399
|
-
"x" : 3,
|
400
|
-
"y" : 5
|
401
|
-
},
|
402
|
-
"obj" : {
|
403
|
-
"_id" : ObjectId("4e52672c15f59224bdb2544d"),
|
404
|
-
"name" : "Final Place",
|
405
|
-
"loc" : {
|
406
|
-
"x" : 3,
|
407
|
-
"y" : 5
|
408
|
-
}
|
409
|
-
}
|
410
|
-
},
|
411
|
-
{
|
412
|
-
"dis" : 14.142135623730951,
|
413
|
-
"loc" : {
|
414
|
-
"0" : 10,
|
415
|
-
"1" : 10
|
416
|
-
},
|
417
|
-
"obj" : {
|
418
|
-
"_id" : ObjectId("4e5266a915f59224bdb2544b"),
|
419
|
-
"name" : "Some Place",
|
420
|
-
"loc" : [
|
421
|
-
[
|
422
|
-
10,
|
423
|
-
10
|
424
|
-
],
|
425
|
-
[
|
426
|
-
50,
|
427
|
-
50
|
428
|
-
]
|
429
|
-
]
|
430
|
-
}
|
431
|
-
},
|
432
|
-
{
|
433
|
-
"dis" : 14.142135623730951,
|
434
|
-
"loc" : {
|
435
|
-
"0" : -10,
|
436
|
-
"1" : -10
|
437
|
-
},
|
438
|
-
"obj" : {
|
439
|
-
"_id" : ObjectId("4e5266ba15f59224bdb2544c"),
|
440
|
-
"name" : "Another Place",
|
441
|
-
"loc" : [
|
442
|
-
[
|
443
|
-
-10,
|
444
|
-
-10
|
445
|
-
],
|
446
|
-
[
|
447
|
-
-50,
|
448
|
-
-50
|
449
|
-
]
|
450
|
-
]
|
451
|
-
}
|
452
|
-
}
|
453
|
-
],
|
454
|
-
"stats" : {
|
455
|
-
"time" : 0,
|
456
|
-
"btreelocs" : 0,
|
457
|
-
"nscanned" : 5,
|
458
|
-
"objectsLoaded" : 3,
|
459
|
-
"avgDistance" : 11.371741047435734,
|
460
|
-
"maxDistance" : 14.142157540259815
|
461
|
-
},
|
462
|
-
"ok" : 1
|
463
|
-
}
|
464
|
-
```
|
465
278
|
|
466
|
-
|
279
|
+
External Libraries
|
280
|
+
------------------
|
281
|
+
|
282
|
+
We currently support GeoRuby and RGeo.
|
283
|
+
If you require one of those, a #to_geo and #to_rgeo, respectivelly,
|
284
|
+
method(s) will be available to all spatial fields, returning the
|
285
|
+
external library corresponding object.
|
286
|
+
|
287
|
+
|
288
|
+
### Use RGeo?
|
289
|
+
https://github.com/dazuma/rgeo
|
290
|
+
|
291
|
+
RGeo is a Ruby wrapper for Proj/GEOS.
|
292
|
+
It's perfect when you need to work with complex calculations and projections.
|
293
|
+
It'll require more stuff installed to compile/work.
|
294
|
+
|
295
|
+
|
296
|
+
### Use GeoRuby?
|
297
|
+
https://github.com/nofxx/georuby
|
298
|
+
|
299
|
+
GeoRuby is a pure Ruby Geometry Library.
|
300
|
+
It's perfect if you want simple calculations and/or keep your stack in pure ruby.
|
301
|
+
Albeit not full featured in maths it has a handful of methods and good import/export helpers.
|
302
|
+
|
303
|
+
|
304
|
+
### Example
|
305
|
+
|
306
|
+
class Person
|
307
|
+
include Mongoid::Document
|
308
|
+
include Mongoid::Geospatial
|
309
|
+
|
310
|
+
field :location, type: Point
|
311
|
+
end
|
312
|
+
|
313
|
+
me = Person.new(location: [8, 8])
|
314
|
+
|
315
|
+
# Example with GeoRuby
|
316
|
+
point.class # Mongoid::Geospatial::Point
|
317
|
+
point.to_geo.class # GeoRuby::SimpleFeatures::Point
|
318
|
+
|
319
|
+
# Example with RGeo
|
320
|
+
point.class # Mongoid::Geospatial::Point
|
321
|
+
point.to_rgeo.class # RGeo::Geographic::SphericalPointImpl
|
322
|
+
|
323
|
+
|
324
|
+
## Configure
|
325
|
+
|
326
|
+
Assemble it as you need (use a initializer file):
|
327
|
+
|
328
|
+
With RGeo
|
329
|
+
|
330
|
+
Mongoid::Geospatial.with_rgeo!
|
331
|
+
# Optional
|
332
|
+
# Mongoid::Geospatial.factory = RGeo::Geographic.spherical_factory
|
333
|
+
|
334
|
+
|
335
|
+
With GeoRuby
|
336
|
+
|
337
|
+
Mongoid::Geospatial.with_georuby!
|
338
|
+
|
339
|
+
|
340
|
+
Defaults (change if you know what you're doing)
|
341
|
+
|
342
|
+
Mongoid::Geospatial.lng_symbol = :x
|
343
|
+
Mongoid::Geospatial.lat_symbol = :y
|
344
|
+
Mongoid::Geospatial.earth_radius = EARTH_RADIUS
|
345
|
+
|
346
|
+
|
467
347
|
|
468
348
|
This Fork
|
469
349
|
---------
|
470
350
|
|
471
|
-
This fork is not backwards compatible with '
|
472
|
-
This fork delegates calculations to
|
351
|
+
This fork is not backwards compatible with 'mongoid_spacial'.
|
352
|
+
This fork delegates calculations to external libs.
|
473
353
|
|
474
354
|
Change in your models:
|
475
355
|
|
@@ -487,7 +367,7 @@ And for the fields:
|
|
487
367
|
|
488
368
|
to
|
489
369
|
|
490
|
-
field :source, type: Point, spatial: true
|
370
|
+
field :source, type: Point, spatial: true # or sphere: true
|
491
371
|
|
492
372
|
|
493
373
|
Beware the 't' and 'c' issue. It's spaTial.
|
@@ -503,6 +383,10 @@ Indexes need to be created. Execute command:
|
|
503
383
|
|
504
384
|
rake db:mongoid:create_indexes
|
505
385
|
|
386
|
+
Programatically
|
387
|
+
|
388
|
+
Model.create_indexes
|
389
|
+
|
506
390
|
|
507
391
|
Contributing
|
508
392
|
------------
|