rp_clustering-rgeo-activerecord 0.0.1
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 +15 -0
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +80 -0
- data/Rakefile +12 -0
- data/lib/rp_clustering-rgeo-activerecord.rb +39 -0
- data/lib/rp_clustering-rgeo-activerecord/arel_attribute_spatial_expressions.rb +66 -0
- data/lib/rp_clustering-rgeo-activerecord/arel_table_spatial_expressions.rb +82 -0
- data/lib/rp_clustering-rgeo-activerecord/version.rb +7 -0
- data/rp_clustering-rgeo-activerecord.gemspec +36 -0
- data/test/database.yml +7 -0
- data/test/test_unit.rb +107 -0
- metadata +199 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YjAzODU1ZmI0ZjZlMDdlODlmYjA0NTBiOGRmMjQyMDViZGNjZDAzMw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZTk2ZTk4NTc4YjU3M2MxZjc5ZDdlMjdhNzk1NjBhMGJjM2I4MTRjMg==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YTQ0OGI2Y2I0NWEyMGVlN2FlZmQ0Mzc4ZDc0N2FhMjMwNGQwNjNjZDI5NzZl
|
10
|
+
ZjNhNWNmNjc5YjY4ODJjMmZkZmYwOTYwN2EzNTU5NTU3YjRlNmQ2NmUwYjkw
|
11
|
+
YTc3ZDc5NGVjNzAyMjM3MDEzNGRhNWM5ZGZjZDhiNDRmZTk5Mzc=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
OTcxZjBjYTViYjU2ZTdjMjIwZjdkNGRjN2NiODFjOWM4ZjRiNjIzOWIyMTc5
|
14
|
+
YzE1ZWUwOTllZjUzNjcxYjg4YzA3MzU5ZDVkNWY0YjBlOGVhMmEzYzRiNWE3
|
15
|
+
NTJiYTVmZGMzNjVhMTkxNGZkY2U4NzljMzYyNzc3Nzc5MThiMTA=
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Robert Pyke
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
# RPClustering::RGeo::ActiveRecord
|
2
|
+
|
3
|
+
A RGeo PostGIS extension to provide Active Record (Model) clustering functionality.
|
4
|
+
|
5
|
+
The intention is that this Gem will eventually provide abstracted methods for
|
6
|
+
both "on the fly" clustering, as well as cached clustering (including associated generators).
|
7
|
+
|
8
|
+
If you find a problem with this Gem, please don't hesitate to raise an [issue](https://github.com/robertpyke/rp_clustering-rgeo-activerecord/issues).
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
Note: This gem provides extensions for [activerecord-postgis-adapter](https://github.com/dazuma/activerecord-postgis-adapter).
|
13
|
+
Please see [activerecord-postgis-adapter](https://github.com/dazuma/activerecord-postgis-adapter)
|
14
|
+
for its install instructions. Once you've got
|
15
|
+
it working, then simply add this gem to your Gemfile to enable these extensions.
|
16
|
+
|
17
|
+
Add this line to your application's Gemfile:
|
18
|
+
|
19
|
+
gem 'rp_clustering-rgeo-activerecord'
|
20
|
+
|
21
|
+
And then execute:
|
22
|
+
|
23
|
+
$ bundle
|
24
|
+
|
25
|
+
Or install it yourself as:
|
26
|
+
|
27
|
+
$ gem install rp_clustering-rgeo-activerecord
|
28
|
+
|
29
|
+
|
30
|
+
## Usage
|
31
|
+
|
32
|
+
### Added in Version 0.0.1
|
33
|
+
|
34
|
+
This version allows for hand-coded low-level clustering via the Arel interface.
|
35
|
+
|
36
|
+
e.g.
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
|
40
|
+
# Get the Arel handle for the model
|
41
|
+
|
42
|
+
arel_table = MyModel.arel_table
|
43
|
+
|
44
|
+
# Our cluster grid size.
|
45
|
+
# Smaller grid_size means more clusters.
|
46
|
+
# Larger grid_size means less clusters (cluster covers a larger area).
|
47
|
+
# See http://www.postgis.org/docs/ST_SnapToGrid.html for more info.
|
48
|
+
|
49
|
+
grid_size = 0.1
|
50
|
+
|
51
|
+
# Cluster against our model's :latlon attribute with a grid size of '0.1'.
|
52
|
+
# Return the centroid of each cluster as "cluster_centroid".
|
53
|
+
|
54
|
+
query = MyModel.select(
|
55
|
+
arel_table.st_astext(
|
56
|
+
arel_table.st_centroid(arel_table.st_collect(attr))
|
57
|
+
).as("cluster_centroid")
|
58
|
+
).group(arel_table[:latlon].st_snaptogrid(0.1))
|
59
|
+
|
60
|
+
# Iterate over our clusters
|
61
|
+
query.all.each do |cluster|
|
62
|
+
|
63
|
+
# print the cluster_centroid (a point) as WKT
|
64
|
+
puts cluster["cluster_centroid"]
|
65
|
+
|
66
|
+
# convert the WKT into a RGeo Geometry (a point)
|
67
|
+
geographic_factory.parse_wkt(cluster["cluster_centroid")
|
68
|
+
|
69
|
+
# ...
|
70
|
+
end
|
71
|
+
|
72
|
+
```
|
73
|
+
|
74
|
+
## Contributing
|
75
|
+
|
76
|
+
1. Fork it
|
77
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
78
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
79
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
80
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require "rp_clustering-rgeo-activerecord/version"
|
2
|
+
require "rp_clustering-rgeo-activerecord/arel_attribute_spatial_expressions"
|
3
|
+
require "rp_clustering-rgeo-activerecord/arel_table_spatial_expressions"
|
4
|
+
|
5
|
+
module RPClustering
|
6
|
+
|
7
|
+
module RGeo
|
8
|
+
|
9
|
+
module ActiveRecord
|
10
|
+
|
11
|
+
# Spatial Expressions to be attached directly to Arel Attributes (DB columns)
|
12
|
+
|
13
|
+
module ArelAttributeSpatialExpressions
|
14
|
+
end
|
15
|
+
|
16
|
+
# Attach our Spatial Expression methods onto the Arel::Attribute class.
|
17
|
+
#
|
18
|
+
# i.e. As stated in the RGeo::ActiveRecord docs.. Allow chaining of spatial expressions from attributes
|
19
|
+
|
20
|
+
::Arel::Attribute.class_eval do
|
21
|
+
include ::RPClustering::RGeo::ActiveRecord::ArelAttributeSpatialExpressions
|
22
|
+
end
|
23
|
+
|
24
|
+
# Spatial Expressions to be attached to Arel Table (DB tables)
|
25
|
+
|
26
|
+
module ArelTableSpatialExpressions
|
27
|
+
end
|
28
|
+
|
29
|
+
# Attach our Spatial Expression methods onto the Arel::Table class.
|
30
|
+
|
31
|
+
::Arel::Table.class_eval do
|
32
|
+
include ::RPClustering::RGeo::ActiveRecord::ArelTableSpatialExpressions
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# Author: Robert Pyke
|
2
|
+
|
3
|
+
module RPClustering
|
4
|
+
|
5
|
+
module RGeo
|
6
|
+
|
7
|
+
module ActiveRecord
|
8
|
+
|
9
|
+
module ArelAttributeSpatialExpressions
|
10
|
+
|
11
|
+
# ST_SnapToGrid: http://www.postgis.org/docs/ST_SnapToGrid.html
|
12
|
+
#
|
13
|
+
# Implements postgis function variant:
|
14
|
+
#
|
15
|
+
# geometry ST_SnapToGrid(geometry geomA, float size);
|
16
|
+
#
|
17
|
+
# Returns a geometry collection
|
18
|
+
|
19
|
+
def st_snaptogrid(grid_size)
|
20
|
+
args = [self, grid_size.to_s]
|
21
|
+
|
22
|
+
# SpatialNamedFunction takes the following args:
|
23
|
+
# * name
|
24
|
+
# * expr
|
25
|
+
# * spatial_flags
|
26
|
+
# * aliaz (defaults to nil)
|
27
|
+
#
|
28
|
+
#
|
29
|
+
# Understanding the spatial_flags argument
|
30
|
+
# -----------------------------------------
|
31
|
+
#
|
32
|
+
# A flag is true if the corresponding argument is spatial, else the
|
33
|
+
# flag is false.
|
34
|
+
# The first element is the spatial-ness result, the other args
|
35
|
+
# relate to our expression args
|
36
|
+
|
37
|
+
::RGeo::ActiveRecord::SpatialNamedFunction.new(
|
38
|
+
'ST_SnapToGrid', args, [true, true, false]
|
39
|
+
)
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
# ST_Collect: http://www.postgis.org/docs/ST_Collect.html
|
44
|
+
#
|
45
|
+
# Implements postgis function variant:
|
46
|
+
#
|
47
|
+
# geometry ST_Collect(geometry[] g1_array);
|
48
|
+
#
|
49
|
+
# Returns a geometry collection
|
50
|
+
|
51
|
+
def st_collect()
|
52
|
+
args = [self]
|
53
|
+
|
54
|
+
::RGeo::ActiveRecord::SpatialNamedFunction.new(
|
55
|
+
'ST_Collect', args, [true, true]
|
56
|
+
)
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# Author: Robert Pyke
|
2
|
+
|
3
|
+
module RPClustering
|
4
|
+
|
5
|
+
module RGeo
|
6
|
+
|
7
|
+
module ActiveRecord
|
8
|
+
|
9
|
+
module ArelTableSpatialExpressions
|
10
|
+
|
11
|
+
# ST_SnapToGrid: http://www.postgis.org/docs/ST_SnapToGrid.html
|
12
|
+
#
|
13
|
+
# Implements postgis function variant:
|
14
|
+
#
|
15
|
+
# geometry ST_SnapToGrid(geometry geomA, float size);
|
16
|
+
#
|
17
|
+
# Returns a geometry collection
|
18
|
+
|
19
|
+
def st_snaptogrid(geom_a, grid_size)
|
20
|
+
args = [geom_a, grid_size.to_s]
|
21
|
+
|
22
|
+
::RGeo::ActiveRecord::SpatialNamedFunction.new(
|
23
|
+
'ST_SnapToGrid', args, [true, true, false]
|
24
|
+
)
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
# ST_Collect: http://www.postgis.org/docs/ST_Collect.html
|
29
|
+
#
|
30
|
+
# Implements postgis function variant:
|
31
|
+
#
|
32
|
+
# geometry ST_Collect(geometry[] g1_array);
|
33
|
+
#
|
34
|
+
# This variant is an aggregate, it operates on rows of data.
|
35
|
+
#
|
36
|
+
# Returns a geometry collection
|
37
|
+
|
38
|
+
def st_collect(g1_array)
|
39
|
+
args = [g1_array]
|
40
|
+
|
41
|
+
::RGeo::ActiveRecord::SpatialNamedFunction.new(
|
42
|
+
'ST_Collect', args, [true, true]
|
43
|
+
)
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
# ST_AsText: http://www.postgis.org/docs/ST_AsText.html
|
48
|
+
#
|
49
|
+
# Returns a string (WKT)
|
50
|
+
|
51
|
+
def st_astext(g)
|
52
|
+
args = [g]
|
53
|
+
|
54
|
+
::RGeo::ActiveRecord::SpatialNamedFunction.new(
|
55
|
+
'ST_AsText', args, [true, true]
|
56
|
+
)
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
# ST_Centroid: http://www.postgis.org/docs/ST_Centroid.html
|
61
|
+
#
|
62
|
+
# Implements postgis function variant:
|
63
|
+
#
|
64
|
+
# geometry ST_Centroid(geometry g1);
|
65
|
+
#
|
66
|
+
# Returns a geometry
|
67
|
+
|
68
|
+
def st_centroid(g)
|
69
|
+
args = [g]
|
70
|
+
|
71
|
+
::RGeo::ActiveRecord::SpatialNamedFunction.new(
|
72
|
+
'ST_Centroid', args, [true, true]
|
73
|
+
)
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'rp_clustering-rgeo-activerecord/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "rp_clustering-rgeo-activerecord"
|
8
|
+
gem.version = RPClustering::RGeo::ActiveRecord::VERSION
|
9
|
+
gem.authors = ["Robert Pyke"]
|
10
|
+
gem.email = ["robert.j.pyke@gmail.com"]
|
11
|
+
gem.summary = %q{RGeo PostGIS extension to provide clustering functionality}
|
12
|
+
gem.description = %q{A RGeo PostGIS extension to provide Active Record (Model) clustering functionality}
|
13
|
+
gem.homepage = "https://github.com/robertpyke/rp_clustering-rgeo-activerecord"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.license = 'MIT'
|
21
|
+
|
22
|
+
# Development Dependencies
|
23
|
+
gem.add_development_dependency('bundler', '>= 1.0.0')
|
24
|
+
gem.add_development_dependency('test-unit', '~> 2.5.4')
|
25
|
+
gem.add_development_dependency('rake')
|
26
|
+
gem.add_development_dependency('rdoc')
|
27
|
+
gem.add_development_dependency('pg')
|
28
|
+
|
29
|
+
# Deployed Gem Dependencies
|
30
|
+
gem.add_dependency('activerecord', '~> 3.0')
|
31
|
+
gem.add_dependency('arel', '~> 3.0.2')
|
32
|
+
gem.add_dependency('rgeo', '~> 0.3.20')
|
33
|
+
gem.add_dependency('rgeo-activerecord', '~> 0.4.6')
|
34
|
+
# This Gem is specific to postgis
|
35
|
+
gem.add_dependency('activerecord-postgis-adapter')
|
36
|
+
end
|
data/test/database.yml
ADDED
data/test/test_unit.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rgeo/active_record/adapter_test_helper'
|
3
|
+
require 'rp_clustering-rgeo-activerecord'
|
4
|
+
|
5
|
+
module RPClustering
|
6
|
+
module RGeo
|
7
|
+
module ActiveRecord
|
8
|
+
module Tests
|
9
|
+
class MyUnitTest < Test::Unit::TestCase # :nodoc:
|
10
|
+
|
11
|
+
# Use the RGEO active record adapter test helper
|
12
|
+
|
13
|
+
DATABASE_CONFIG_PATH = ::File.dirname(__FILE__)+'/database.yml'
|
14
|
+
OVERRIDE_DATABASE_CONFIG_PATH = ::File.dirname(__FILE__)+'/database_local.yml'
|
15
|
+
include ::RGeo::ActiveRecord::AdapterTestHelper
|
16
|
+
|
17
|
+
|
18
|
+
define_test_methods do
|
19
|
+
|
20
|
+
def populate_ar_class(content_)
|
21
|
+
klass_ = create_ar_class
|
22
|
+
case content_
|
23
|
+
when :latlon_point
|
24
|
+
klass_.connection.create_table(:spatial_test) do |t_|
|
25
|
+
t_.column 'latlon', :point, :srid => 4326
|
26
|
+
end
|
27
|
+
end
|
28
|
+
klass_
|
29
|
+
end
|
30
|
+
|
31
|
+
# Confirm that everything is working as it should
|
32
|
+
def test_should_pass
|
33
|
+
assert(true)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_should_have_a_version
|
37
|
+
assert_not_nil(RPClustering::RGeo::ActiveRecord::VERSION)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Test that the st_snaptogrid method exists on the Arel::Attribute
|
41
|
+
# and on the Arel::Table
|
42
|
+
|
43
|
+
def test_st_snaptogrid_method_should_exist
|
44
|
+
arel_klass = populate_ar_class(:latlon_point)
|
45
|
+
assert(
|
46
|
+
arel_klass.arel_table[:latlon_point].methods.include?(:st_snaptogrid),
|
47
|
+
"Active Record Arel::Attribute should now have a st_snaptogrid function. " +
|
48
|
+
"Found:\n#{arel_klass.arel_table[:latlon_point].methods.sort}"
|
49
|
+
)
|
50
|
+
|
51
|
+
assert(
|
52
|
+
arel_klass.arel_table.methods.include?(:st_snaptogrid),
|
53
|
+
"Active Record Arel::Table should now have a st_snaptogrid function. " +
|
54
|
+
"Found:\n#{arel_klass.arel_table.methods.sort}"
|
55
|
+
)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Confirm that the st_snaptogrid function is producing the
|
59
|
+
# expected results
|
60
|
+
|
61
|
+
def test_st_snap_to_grid
|
62
|
+
arel_klass = populate_ar_class(:latlon_point)
|
63
|
+
|
64
|
+
points_generated = 0
|
65
|
+
(-5..5).each do |lng|
|
66
|
+
(-5..5).each do |lat|
|
67
|
+
obj = arel_klass.new
|
68
|
+
obj.latlon = @geographic_factory.point(lng, lat)
|
69
|
+
obj.save!
|
70
|
+
points_generated+=1
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Sanity check, confirm that we have all the points we created.
|
75
|
+
count_res = arel_klass.count()
|
76
|
+
assert_equal(
|
77
|
+
points_generated,
|
78
|
+
count_res,
|
79
|
+
"The number of points generated doesn't match the number in the DB"
|
80
|
+
)
|
81
|
+
|
82
|
+
attr = arel_klass.arel_table[:latlon]
|
83
|
+
t = arel_klass.arel_table
|
84
|
+
|
85
|
+
q1 = arel_klass.select(t.st_astext(t.st_centroid(t.st_collect(attr))).as("cluster_centroid"))
|
86
|
+
q1 = q1.group(attr.st_snaptogrid(180))
|
87
|
+
|
88
|
+
assert_equal(1, q1.all.count(), "With a sufficiently large grid size, we would expect the st_snaptogrid to produce only a single point")
|
89
|
+
|
90
|
+
|
91
|
+
value = q1.first["cluster_centroid"]
|
92
|
+
compare_point = @geographic_factory.point(0,0)
|
93
|
+
assert_equal(@geographic_factory.parse_wkt(value), compare_point, "cluster centroid should be a valid point in the center of the earth")
|
94
|
+
|
95
|
+
q2 = arel_klass.select(t.st_astext(t.st_centroid(t.st_collect(attr))).as("cluster_centroid"))
|
96
|
+
q2 = q2.group(attr.st_snaptogrid(1))
|
97
|
+
|
98
|
+
assert_equal(points_generated, q2.all.count(), "With a small grid size, we would expect the st_snaptogrid to produce every single point")
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
metadata
ADDED
@@ -0,0 +1,199 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rp_clustering-rgeo-activerecord
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Robert Pyke
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-02-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.0.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: test-unit
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.5.4
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.5.4
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rdoc
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pg
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ! '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: activerecord
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: arel
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 3.0.2
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 3.0.2
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rgeo
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.3.20
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ~>
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.3.20
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rgeo-activerecord
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ~>
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 0.4.6
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ~>
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 0.4.6
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: activerecord-postgis-adapter
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ! '>='
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ! '>='
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
description: A RGeo PostGIS extension to provide Active Record (Model) clustering
|
154
|
+
functionality
|
155
|
+
email:
|
156
|
+
- robert.j.pyke@gmail.com
|
157
|
+
executables: []
|
158
|
+
extensions: []
|
159
|
+
extra_rdoc_files: []
|
160
|
+
files:
|
161
|
+
- .gitignore
|
162
|
+
- Gemfile
|
163
|
+
- LICENSE.txt
|
164
|
+
- README.md
|
165
|
+
- Rakefile
|
166
|
+
- lib/rp_clustering-rgeo-activerecord.rb
|
167
|
+
- lib/rp_clustering-rgeo-activerecord/arel_attribute_spatial_expressions.rb
|
168
|
+
- lib/rp_clustering-rgeo-activerecord/arel_table_spatial_expressions.rb
|
169
|
+
- lib/rp_clustering-rgeo-activerecord/version.rb
|
170
|
+
- rp_clustering-rgeo-activerecord.gemspec
|
171
|
+
- test/database.yml
|
172
|
+
- test/test_unit.rb
|
173
|
+
homepage: https://github.com/robertpyke/rp_clustering-rgeo-activerecord
|
174
|
+
licenses:
|
175
|
+
- MIT
|
176
|
+
metadata: {}
|
177
|
+
post_install_message:
|
178
|
+
rdoc_options: []
|
179
|
+
require_paths:
|
180
|
+
- lib
|
181
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
182
|
+
requirements:
|
183
|
+
- - ! '>='
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
version: '0'
|
186
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
|
+
requirements:
|
188
|
+
- - ! '>='
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: '0'
|
191
|
+
requirements: []
|
192
|
+
rubyforge_project:
|
193
|
+
rubygems_version: 2.0.0
|
194
|
+
signing_key:
|
195
|
+
specification_version: 4
|
196
|
+
summary: RGeo PostGIS extension to provide clustering functionality
|
197
|
+
test_files:
|
198
|
+
- test/database.yml
|
199
|
+
- test/test_unit.rb
|