gotime-postgis_adapter 0.8.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/Gemfile +13 -0
- data/Gemfile.lock +31 -0
- data/History.txt +6 -0
- data/MIT-LICENSE +21 -0
- data/README.rdoc +380 -0
- data/Rakefile +70 -0
- data/lib/postgis_adapter/acts_as_geom.rb +43 -0
- data/lib/postgis_adapter/common_spatial_adapter.rb +105 -0
- data/lib/postgis_adapter/functions/bbox.rb +130 -0
- data/lib/postgis_adapter/functions/class.rb +67 -0
- data/lib/postgis_adapter/functions/common.rb +921 -0
- data/lib/postgis_adapter/functions.rb +174 -0
- data/lib/postgis_adapter/railtie.rb +7 -0
- data/lib/postgis_adapter.rb +446 -0
- data/postgis_adapter.gemspec +19 -0
- data/rails/init.rb +28 -0
- data/spec/db/models_postgis.rb +65 -0
- data/spec/db/schema_postgis.rb +98 -0
- data/spec/postgis_adapter/acts_as_geom_spec.rb +30 -0
- data/spec/postgis_adapter/common_spatial_adapter_spec.rb +254 -0
- data/spec/postgis_adapter/functions/bbox_spec.rb +45 -0
- data/spec/postgis_adapter/functions/class_spec.rb +79 -0
- data/spec/postgis_adapter/functions/common_spec.rb +428 -0
- data/spec/postgis_adapter/functions_spec.rb +60 -0
- data/spec/postgis_adapter_spec.rb +238 -0
- data/spec/spec_helper.rb +45 -0
- metadata +93 -0
@@ -0,0 +1,130 @@
|
|
1
|
+
###
|
2
|
+
##
|
3
|
+
#
|
4
|
+
# BBox
|
5
|
+
#
|
6
|
+
#
|
7
|
+
module PostgisAdapter
|
8
|
+
module Functions
|
9
|
+
|
10
|
+
#
|
11
|
+
# These operators utilize indexes. They compare geometries by bounding boxes.
|
12
|
+
#
|
13
|
+
# You can use the literal forms or call directly using the 'bbox' method. eg.:
|
14
|
+
#
|
15
|
+
# @point.bbox(">>", @area)
|
16
|
+
# @point.bbox("|&>", @area)
|
17
|
+
#
|
18
|
+
#
|
19
|
+
# Cheatsheet:
|
20
|
+
#
|
21
|
+
# A &< B => A overlaps or is to the left of B
|
22
|
+
# A &> B => A overlaps or is to the right of B
|
23
|
+
# A << B => A is strictly to the left of B
|
24
|
+
# A >> B => A is strictly to the right of B
|
25
|
+
# A &<| B => A overlaps B or is below B
|
26
|
+
# A |&> B => A overlaps or is above B
|
27
|
+
# A <<| B => A strictly below B
|
28
|
+
# A |>> B => A strictly above B
|
29
|
+
# A = B => A bbox same as B bbox
|
30
|
+
# A @ B => A completely contained by B
|
31
|
+
# A ~ B => A completely contains B
|
32
|
+
# A && B => A and B bboxes interact
|
33
|
+
# A ~= B => A and B geometries are binary equal?
|
34
|
+
#
|
35
|
+
def bbox(operator, other)
|
36
|
+
postgis_calculate(:bbox, [self, other], operator)
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
# bbox literal method.
|
41
|
+
#
|
42
|
+
def completely_contained_by? other
|
43
|
+
bbox("@", other)
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
# bbox literal method.
|
48
|
+
#
|
49
|
+
def completely_contains? other
|
50
|
+
bbox("~", other)
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# bbox literal method.
|
55
|
+
#
|
56
|
+
def overlaps_or_above? other
|
57
|
+
bbox("|&>", other)
|
58
|
+
end
|
59
|
+
|
60
|
+
#
|
61
|
+
# bbox literal method.
|
62
|
+
#
|
63
|
+
def overlaps_or_below? other
|
64
|
+
bbox("&<|", other)
|
65
|
+
end
|
66
|
+
|
67
|
+
#
|
68
|
+
# bbox literal method.
|
69
|
+
#
|
70
|
+
def overlaps_or_left_of? other
|
71
|
+
bbox("&<", other)
|
72
|
+
end
|
73
|
+
|
74
|
+
#
|
75
|
+
# bbox literal method.
|
76
|
+
#
|
77
|
+
def overlaps_or_right_of? other
|
78
|
+
bbox("&>", other)
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
# bbox literal method.
|
83
|
+
#
|
84
|
+
def strictly_above? other
|
85
|
+
bbox("|>>", other)
|
86
|
+
end
|
87
|
+
|
88
|
+
#
|
89
|
+
# bbox literal method.
|
90
|
+
#
|
91
|
+
def strictly_below? other
|
92
|
+
bbox("<<|", other)
|
93
|
+
end
|
94
|
+
|
95
|
+
#
|
96
|
+
# bbox literal method.
|
97
|
+
#
|
98
|
+
def strictly_left_of? other
|
99
|
+
bbox("<<", other)
|
100
|
+
end
|
101
|
+
|
102
|
+
#
|
103
|
+
# bbox literal method.
|
104
|
+
#
|
105
|
+
def strictly_right_of? other
|
106
|
+
bbox(">>", other)
|
107
|
+
end
|
108
|
+
|
109
|
+
#
|
110
|
+
# bbox literal method.
|
111
|
+
#
|
112
|
+
def interacts_with? other
|
113
|
+
bbox("&&", other)
|
114
|
+
end
|
115
|
+
|
116
|
+
#
|
117
|
+
# bbox literal method.
|
118
|
+
#
|
119
|
+
def binary_equal? other
|
120
|
+
bbox("~=", other)
|
121
|
+
end
|
122
|
+
|
123
|
+
#
|
124
|
+
# bbox literal method.
|
125
|
+
#
|
126
|
+
def same_as? other
|
127
|
+
bbox("=", other)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module PostgisAdapter
|
2
|
+
module Functions
|
3
|
+
|
4
|
+
#
|
5
|
+
# Class Methods
|
6
|
+
#
|
7
|
+
module ClassMethods
|
8
|
+
|
9
|
+
#
|
10
|
+
# Returns the closest record
|
11
|
+
def closest_to(p, opts = {})
|
12
|
+
srid = opts.delete(:srid) || 4326
|
13
|
+
opts.merge!(:order => "ST_Distance(geom, GeomFromText('POINT(#{p.x} #{p.y})', #{srid}))")
|
14
|
+
find(:first, opts)
|
15
|
+
end
|
16
|
+
|
17
|
+
#
|
18
|
+
# Order by distance
|
19
|
+
def close_to(p, opts = {})
|
20
|
+
srid = opts.delete(:srid) || 4326
|
21
|
+
opts.merge!(:order => "ST_Distance(geom, GeomFromText('POINT(#{p.x} #{p.y})', #{srid}))")
|
22
|
+
find(:all, opts)
|
23
|
+
end
|
24
|
+
|
25
|
+
def by_length opts = {}
|
26
|
+
sort = opts.delete(:sort) || 'asc'
|
27
|
+
opts.merge!(:order => "ST_length(geom) #{sort}")
|
28
|
+
find(:all, opts)
|
29
|
+
end
|
30
|
+
|
31
|
+
def longest
|
32
|
+
find(:first, :order => "ST_length(geom) DESC")
|
33
|
+
end
|
34
|
+
|
35
|
+
def contains(p, srid=4326)
|
36
|
+
find(:all, :conditions => ["ST_Contains(geom, GeomFromText('POINT(#{p.x} #{p.y})', #{srid}))"])
|
37
|
+
end
|
38
|
+
|
39
|
+
def contain(p, srid=4326)
|
40
|
+
find(:first, :conditions => ["ST_Contains(geom, GeomFromText('POINT(#{p.x} #{p.y})', #{srid}))"])
|
41
|
+
end
|
42
|
+
|
43
|
+
def by_area sort='asc'
|
44
|
+
find(:all, :order => "ST_Area(geom) #{sort}" )
|
45
|
+
end
|
46
|
+
|
47
|
+
def by_perimeter sort='asc'
|
48
|
+
find(:all, :order => "ST_Perimeter(geom) #{sort}" )
|
49
|
+
end
|
50
|
+
|
51
|
+
def all_dwithin(other, margin=1)
|
52
|
+
# find(:all, :conditions => "ST_DWithin(geom, ST_GeomFromEWKB(E'#{other.as_ewkt}'), #{margin})")
|
53
|
+
find(:all, :conditions => "ST_DWithin(geom, ST_GeomFromEWKT(E'#{other.as_hex_ewkb}'), #{margin})")
|
54
|
+
end
|
55
|
+
|
56
|
+
def all_within(other)
|
57
|
+
find(:all, :conditions => "ST_Within(geom, ST_GeomFromEWKT(E'#{other.as_hex_ewkb}'))")
|
58
|
+
end
|
59
|
+
|
60
|
+
def by_boundaries sort='asc'
|
61
|
+
find(:all, :order => "ST_Boundary(geom) #{sort}" )
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|