georuby-ext 0.0.1 → 0.0.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.
Files changed (51) hide show
  1. data/.jrubyrc +1 -0
  2. data/.travis.yml +23 -0
  3. data/Gemfile +6 -0
  4. data/Guardfile +12 -2
  5. data/MIT-LICENSE +20 -0
  6. data/README.rdoc +2 -28
  7. data/georuby-ext.gemspec +14 -11
  8. data/lib/georuby-ext.rb +17 -2
  9. data/lib/georuby-ext/core_ext.rb +11 -0
  10. data/lib/georuby-ext/geokit.rb +10 -3
  11. data/lib/georuby-ext/georuby/envelope.rb +36 -1
  12. data/lib/georuby-ext/georuby/ewkb_parser.rb +11 -0
  13. data/lib/georuby-ext/georuby/ewkt_parser.rb +11 -0
  14. data/lib/georuby-ext/georuby/geometry.rb +46 -2
  15. data/lib/georuby-ext/georuby/line_string.rb +19 -7
  16. data/lib/georuby-ext/georuby/linear_ring.rb +15 -0
  17. data/lib/georuby-ext/georuby/locators.rb +30 -17
  18. data/lib/georuby-ext/georuby/multi_polygon.rb +15 -1
  19. data/lib/georuby-ext/georuby/point.rb +148 -24
  20. data/lib/georuby-ext/georuby/polygon.rb +38 -27
  21. data/lib/georuby-ext/georuby/rtree.rb +133 -0
  22. data/lib/georuby-ext/georuby/srid.rb +17 -0
  23. data/lib/georuby-ext/proj4.rb +15 -2
  24. data/lib/georuby-ext/rgeo/cartesian/feature_methods.rb +58 -0
  25. data/lib/georuby-ext/rgeo/feature/geometry.rb +11 -0
  26. data/lib/georuby-ext/rgeo/feature/geometry_collection.rb +11 -0
  27. data/lib/georuby-ext/rgeo/feature/rgeo.rb +157 -0
  28. data/lib/georuby-ext/rgeo/geos/ffi_feature_methods.rb +265 -0
  29. data/lib/georuby-ext/rspec_helper.rb +47 -8
  30. data/spec/lib/geokit_spec.rb +44 -0
  31. data/spec/lib/georuby/envelope_spec.rb +46 -0
  32. data/spec/lib/georuby/geometry_spec.rb +81 -0
  33. data/spec/{georuby → lib/georuby}/line_string_spec.rb +29 -14
  34. data/spec/lib/georuby/linear_ring_spec.rb +52 -0
  35. data/spec/lib/georuby/locators_spec.rb +123 -0
  36. data/spec/lib/georuby/multi_polygon_spec.rb +69 -0
  37. data/spec/lib/georuby/point_spec.rb +248 -0
  38. data/spec/lib/georuby/polygon_spec.rb +175 -0
  39. data/spec/lib/georuby/rtree_spec.rb +132 -0
  40. data/spec/lib/proj4_spec.rb +24 -0
  41. data/spec/lib/rgeo/cartesian/feature_methods_spec.rb +110 -0
  42. data/spec/lib/rgeo/geos/ffi_feature_methods_spec.rb +234 -0
  43. data/spec/spec_helper.rb +12 -8
  44. metadata +224 -189
  45. data/lib/georuby-ext/rgeo.rb +0 -23
  46. data/spec/georuby/linear_ring_spec.rb +0 -33
  47. data/spec/georuby/locators_spec.rb +0 -120
  48. data/spec/georuby/multi_polygon_spec.rb +0 -29
  49. data/spec/georuby/point_spec.rb +0 -44
  50. data/spec/georuby/polygon_spec.rb +0 -134
  51. data/spec/rgeo_spec.rb +0 -81
@@ -0,0 +1,132 @@
1
+ require 'spec_helper'
2
+
3
+ describe GeoRuby::Rtree::STRBuilder do
4
+
5
+ subject { GeoRuby::Rtree::STRBuilder.new points("0 2,1 1,2 0").reverse }
6
+
7
+ let(:element) { "element" }
8
+
9
+ def slice(points)
10
+ GeoRuby::Rtree::STRBuilder::Slice.new points(points)
11
+ end
12
+
13
+ def node(*children)
14
+ children = points(children.first) if children.size == 1 and String === children.first
15
+ GeoRuby::Rtree::Node.new children
16
+ end
17
+
18
+ describe "#root_node" do
19
+
20
+ it "should return ..." do
21
+ subject.root_node.should == node(node("1 1, 0 2"), node("2 0"))
22
+ end
23
+
24
+ end
25
+
26
+ describe "#leaf_nodes" do
27
+ it "should return nodes from slices" do
28
+ subject.stub :slices => [ slice("0 2, 1 1"), slice("2 0") ]
29
+ subject.leaf_nodes.should == [ node("1 1, 0 2"), node("2 0") ]
30
+ end
31
+ end
32
+
33
+ describe "#slices" do
34
+ it "should fill slices with sorted elements (by x)" do
35
+ subject.slices.should == [ slice("0 2, 1 1"), slice("2 0") ]
36
+ end
37
+
38
+ it "should return slices with specified size" do
39
+ subject.slices.each do |slice|
40
+ slice.size.should <= subject.slice_size
41
+ end
42
+ end
43
+ end
44
+
45
+ describe "#leaf_nodes_count" do
46
+
47
+ it "should return 10 for 39 elements with a node size of 4" do
48
+ GeoRuby::Rtree::STRBuilder.new([element] * 39, 4).leaf_nodes_count.should == 10
49
+ end
50
+
51
+ end
52
+
53
+ describe "#slice_size" do
54
+
55
+ it "should return 3 for 27 elements with a node size of 3" do
56
+ GeoRuby::Rtree::STRBuilder.new([element] * 27, 3).slice_size.should == 3
57
+ end
58
+
59
+ it "should return 4 for 30 elements with a node size of 3" do
60
+ GeoRuby::Rtree::STRBuilder.new([element] * 30, 3).slice_size.should == 4
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+
67
+
68
+ describe GeoRuby::Rtree::STRBuilder::Slice do
69
+
70
+ subject { GeoRuby::Rtree::STRBuilder::Slice.new points("2 0,1 1,0 2").reverse, 2 }
71
+
72
+ describe "#sort_y" do
73
+
74
+ it "should return elements classified by y" do
75
+ subject.sort_y.should == points("2 0, 1 1, 0 2")
76
+ end
77
+
78
+ end
79
+
80
+ describe "#nodes" do
81
+
82
+ def node(points)
83
+ GeoRuby::Rtree::Node.new points(points)
84
+ end
85
+
86
+ it "should fill nodes with sorted elements" do
87
+ subject.nodes.should == [ node("2 0, 1 1"), node("0 2") ]
88
+ end
89
+
90
+ it "should return nodes with specified size" do
91
+ subject.nodes.each do |node|
92
+ node.size.should <= subject.node_size
93
+ end
94
+ end
95
+
96
+ end
97
+
98
+ end
99
+
100
+ describe GeoRuby::Rtree::Node do
101
+
102
+ describe "bounds" do
103
+
104
+ it "should return a global bounds of children" do
105
+ subject.children << polygon("(0 0,1 1,1 0,0 0)")
106
+ subject.children << polygon("(1 1,2 2,2 0,1 1)")
107
+
108
+ subject.bounds.should == envelope("0 0","2 2")
109
+ end
110
+
111
+ end
112
+
113
+ describe "#==" do
114
+
115
+ it "should be true when children are the same" do
116
+ GeoRuby::Rtree::Node.new(1,2,3).should == GeoRuby::Rtree::Node.new(1,2,3)
117
+ end
118
+
119
+ end
120
+
121
+ describe "#containing" do
122
+ bound = envelope("0 0","1 1")
123
+ let(:children) { [ polygon("(0 0,0 1,1 1,1 0,0 0)"), polygon("(0 0,0 2,2 2,2 0,0 0)"), polygon("(0 0,0 0.5,0.5 0.5,0.5 0,0 0)") ] }
124
+
125
+ it "should return elements if containing bounds" do
126
+ GeoRuby::Rtree::Node.new(children).containing(bound).should == children
127
+ end
128
+
129
+ end
130
+
131
+
132
+ end
@@ -0,0 +1,24 @@
1
+ require "spec_helper"
2
+
3
+ describe Proj4::Projection do
4
+
5
+ describe ".for_srid" do
6
+
7
+ it "should return wgs84 projection for srid 4326" do
8
+ Proj4::Projection.for_srid(4326).should == Proj4::Projection.wgs84
9
+ end
10
+
11
+ it "should return wgs84 projection for srid 900913" do
12
+ Proj4::Projection.for_srid(900913).should == Proj4::Projection.google
13
+ end
14
+
15
+ it "should raise an error when srid isn't supported" do
16
+ lambda do
17
+ Proj4::Projection.for_srid(123)
18
+ end.should raise_error
19
+ end
20
+
21
+ end
22
+
23
+
24
+ end
@@ -0,0 +1,110 @@
1
+ require "spec_helper"
2
+
3
+ module RGeo
4
+ module Cartesian
5
+
6
+ describe PointImpl do
7
+
8
+ subject { rgeo_point }
9
+
10
+ describe "#to_georuby" do
11
+
12
+ it "should return a GeoRuby::SimpleFeatures::Point" do
13
+ subject.to_georuby.should be_instance_of(GeoRuby::SimpleFeatures::Point)
14
+ end
15
+
16
+ it "should have the same x, y and srid" do
17
+ subject.to_georuby.should have_same(:x, :y, :srid).than(subject)
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+
24
+ describe LineStringImpl do
25
+
26
+ subject { rgeometry("LINESTRING(0 0, 1 1, 2 2)") }
27
+
28
+ describe "#to_linear_ring" do
29
+
30
+ it "should return a GeoRuby::SimpleFeatures::LinearRing" do
31
+ subject.to_linear_ring.should == rgeometry("LINESTRING(0 0, 1 1, 2 2, 0 0)")
32
+ end
33
+
34
+ end
35
+
36
+ describe "#to_georuby" do
37
+
38
+ it "should return a GeoRuby::SimpleFeatures::LineString" do
39
+ subject.to_georuby.should be_instance_of(GeoRuby::SimpleFeatures::LineString)
40
+ end
41
+
42
+ it "should return a LineString with the same information" do
43
+ subject.to_georuby.should == geometry("LINESTRING(0 0, 1 1, 2 2)")
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+
50
+ # describe RGeo::Geos::LinearRingImpl do
51
+
52
+ # subject { rgeometry("LINEARRING(0 0, 1 1, 0 0)") }
53
+
54
+ # describe "#to_georuby" do
55
+
56
+ # it "should return a GeoRuby::SimpleFeatures::LineString" do
57
+ # subject.to_georuby.should be_instance_of(GeoRuby::SimpleFeatures::LinearRing)
58
+ # end
59
+
60
+ # it "should return a LineString with the same information" do
61
+ # subject.to_georuby.should == geometry("LINEARRING(0 0, 1 1, 1 1)")
62
+ # end
63
+
64
+ # end
65
+
66
+ # end
67
+
68
+ describe PolygonImpl do
69
+
70
+ subject { rgeometry("POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))") }
71
+
72
+ describe "#to_georuby" do
73
+
74
+ it "should return a GeoRuby::SimpleFeatures::Polygon" do
75
+ subject.to_georuby.should be_instance_of(GeoRuby::SimpleFeatures::Polygon)
76
+ end
77
+
78
+ it "should return a georuby polygon with the same information" do
79
+ subject.to_georuby.should == geometry("POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))")
80
+ end
81
+
82
+ it "should return a georuby polygon with the same information" do
83
+ rgeo_polygon = rgeometry("POLYGON((0 0, 0 1, 1 1, 1 0, 0 0), (0.25 0.25,0 0.75,0.75 0.75,0.75 0.25))")
84
+ rgeo_polygon.to_georuby.should == geometry("POLYGON((0 0, 0 1, 1 1, 1 0, 0 0), (0.25 0.25,0 0.75,0.75 0.75,0.75 0.25))")
85
+ end
86
+
87
+ end
88
+
89
+ end
90
+
91
+ describe MultiPolygonImpl do
92
+
93
+ subject { rgeometry("MULTIPOLYGON ( ((0 0, 0 1, 1 1, 1 0, 0 0), (0.25 0.25,0 0.75,0.75 0.75,0.75 0.25, 0.25 0.25)), ((15 5, 40 10, 10 20, 5 10, 15 5)) )") }
94
+
95
+ describe "#to_georuby" do
96
+
97
+ it "should return a GeoRuby::SimpleFeatures::MultiPolygon" do
98
+ subject.to_georuby.should be_instance_of(GeoRuby::SimpleFeatures::MultiPolygon)
99
+ end
100
+
101
+ it "should return a MultiPolygon with the same information" do
102
+ subject.to_georuby.should == geometry("MULTIPOLYGON ( ((0 0, 0 1, 1 1, 1 0, 0 0), (0.25 0.25,0 0.75,0.75 0.75,0.75 0.25, 0.25 0.25)), ((15 5, 40 10, 10 20, 5 10, 15 5)) )")
103
+ end
104
+
105
+ end
106
+
107
+ end
108
+
109
+ end
110
+ end
@@ -0,0 +1,234 @@
1
+ require "spec_helper"
2
+
3
+ module RGeo
4
+ module Geos
5
+
6
+ describe FFIPointImpl do
7
+
8
+ subject { rgeo_point }
9
+
10
+ describe "#to_georuby" do
11
+
12
+ it "should return a GeoRuby::SimpleFeatures::Point" do
13
+ subject.to_georuby.should be_instance_of(GeoRuby::SimpleFeatures::Point)
14
+ end
15
+
16
+ it "should have the same x, y and srid" do
17
+ subject.to_georuby.should have_same(:x, :y, :srid).than(subject)
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+
24
+ describe FFILineStringImpl do
25
+
26
+ subject { rgeometry("LINESTRING(0 0, 1 1, 2 2)") }
27
+
28
+ describe "#to_linear_ring" do
29
+
30
+ it "should return a GeoRuby::SimpleFeatures::LinearRing" do
31
+ subject.to_linear_ring.should == rgeometry("LINESTRING(0 0, 1 1, 2 2, 0 0)")
32
+ end
33
+
34
+ end
35
+
36
+ describe "#to_georuby" do
37
+
38
+ it "should return a GeoRuby::SimpleFeatures::LineString" do
39
+ subject.to_georuby.should be_instance_of(GeoRuby::SimpleFeatures::LineString)
40
+ end
41
+
42
+ it "should return a LineString with the same information" do
43
+ subject.to_georuby.should == geometry("LINESTRING(0 0, 1 1, 2 2)")
44
+ end
45
+
46
+ end
47
+
48
+ describe "#distance_on_line" do
49
+
50
+ it "should return distance on line" do
51
+ #subject.stub :nearest_locator =>
52
+ #subject.distance_on_line().should ==
53
+ end
54
+
55
+ end
56
+
57
+ describe "#distance_from_line" do
58
+
59
+ it "should return distance from line" do
60
+ #subject.distance_from_line().should ==
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+
67
+ describe RGeo::Geos::FFILineStringImpl::Segment do
68
+ subject { RGeo::Geos::FFILineStringImpl::Segment.new(rgeo_point(0, 1.0), rgeo_point(0, 2.0)) }
69
+
70
+ before :each do
71
+ subject.stub :line_distance_at_departure => 1
72
+ subject.stub :line => rgeometry("LINESTRING(0 0, 0 1.0, 0 2.0)")
73
+ end
74
+
75
+ describe "#line_distance_at_arrival" do
76
+ it "should return distance between departure and arrival for Segment" do
77
+ subject.line_distance_at_arrival.should == 2
78
+ end
79
+
80
+ it "should return distance between departure and arrival for Segment and line distance" do
81
+ subject.stub :line_distance_at_departure => 0
82
+ subject.line_distance_at_arrival.should == 1
83
+ end
84
+ end
85
+
86
+ describe "#location_in_line" do
87
+ it "should return the distance at the beginning of the segment" do
88
+ subject.location_in_line.should == 0.5
89
+ end
90
+ end
91
+
92
+ end
93
+
94
+ describe RGeo::Geos::FFILineStringImpl::PointLocator do
95
+
96
+ let(:departure) { rgeo_point(0, 0) }
97
+ let(:arrival) { rgeo_point(2.0, 0) }
98
+ let(:point_on_segment) { rgeo_point(1.0, 0) }
99
+
100
+ def locator(target, departure, arrival)
101
+ RGeo::Geos::FFILineStringImpl::PointLocator.new target, departure, arrival
102
+ end
103
+
104
+ describe "distance_from_segment" do
105
+
106
+ it "should be zero if target is on the segment" do
107
+ locator(departure, departure, arrival).distance_from_segment.should be_zero
108
+ end
109
+
110
+ it "should be 0 if target is on the middle of the segment" do
111
+ locator(point_on_segment, departure, arrival).distance_from_segment.should == 0
112
+ end
113
+
114
+ it "should be 1 if target is on the x axis of the middle of the segment" do
115
+ locator(rgeo_point(1.0,1.0), departure, arrival).distance_from_segment.should be_within(0.01).of(1.0)
116
+ end
117
+
118
+ end
119
+
120
+ describe "distance_on_segment" do
121
+
122
+ it "should be zero if target is the departure" do
123
+ locator(departure, departure, arrival).distance_on_segment.should be_zero
124
+ end
125
+
126
+ it "should be 1 if target is on the middle of the segment" do
127
+ locator(point_on_segment, departure, arrival).distance_on_segment.should == 1.0
128
+ end
129
+
130
+ it "should be 1 if target is on the x axis of the middle of the segment" do
131
+ locator(rgeo_point(1.0,1.0), departure, arrival).distance_on_segment.should be_within(0.01).of(1.0)
132
+ end
133
+
134
+ end
135
+
136
+ end
137
+
138
+ # describe RGeo::Geos::FFILinearRingImpl do
139
+
140
+ # subject { rgeometry("LINEARRING(0 0, 1 1, 0 0)") }
141
+
142
+ # describe "#to_georuby" do
143
+
144
+ # it "should return a GeoRuby::SimpleFeatures::LineString" do
145
+ # subject.to_georuby.should be_instance_of(GeoRuby::SimpleFeatures::LinearRing)
146
+ # end
147
+
148
+ # it "should return a LineString with the same information" do
149
+ # subject.to_georuby.should == geometry("LINEARRING(0 0, 1 1, 1 1)")
150
+ # end
151
+
152
+ # end
153
+
154
+ # end
155
+
156
+ describe FFIPolygonImpl do
157
+
158
+ subject { rgeometry("POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))") }
159
+
160
+ describe "#to_georuby" do
161
+
162
+ it "should return a GeoRuby::SimpleFeatures::Polygon" do
163
+ subject.to_georuby.should be_instance_of(GeoRuby::SimpleFeatures::Polygon)
164
+ end
165
+
166
+ it "should return a georuby polygon with the same information" do
167
+ subject.to_georuby.should == geometry("POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))")
168
+ end
169
+
170
+ it "should return a georuby polygon with the same information" do
171
+ rgeo_polygon = rgeometry("POLYGON((0 0, 0 1, 1 1, 1 0, 0 0), (0.25 0.25,0 0.75,0.75 0.75,0.75 0.25))")
172
+ rgeo_polygon.to_georuby.should == geometry("POLYGON((0 0, 0 1, 1 1, 1 0, 0 0), (0.25 0.25,0 0.75,0.75 0.75,0.75 0.25))")
173
+ end
174
+
175
+ end
176
+
177
+ end
178
+
179
+ describe RGeo::Geos::FFIMultiLineStringImpl do
180
+
181
+ describe "locate_point" do
182
+
183
+ context "examples" do
184
+
185
+ # it "should find 2,1 at 0.5 between 0,0 and 4,0" do
186
+ # multi_line_string("(0 0,4 0)").locate_point(point(2,1)).should == 0.5
187
+ # end
188
+
189
+ # it "should find 2,1 at 1.5 for (0,4)...(0,1) and (0,0)...(4,0)" do
190
+ # multi_line_string("(0 4,0 1),(0 0,4 0)").locate_point(point(2,1)).should == 1.5
191
+ # end
192
+
193
+ end
194
+
195
+ end
196
+
197
+ # describe "interpolate_point" do
198
+
199
+ # context "examples" do
200
+
201
+ # it "should find 0.5 at (2,0) between 0,0 and 4,0" do
202
+ # rgeometry("MULTILINESTRING((0 0,4 0))").interpolate_point(0.5).should == point(2,0)
203
+ # end
204
+
205
+ # it "should find 1.5 at (2,0) for (0,4)...(0,1) and (0,0)...(4,0)" do
206
+ # rgeometry("MULTILINESTRING((0 4,0 1),(0 0,4 0))").interpolate_point(1.5).should == point(2,0)
207
+ # end
208
+
209
+ # end
210
+
211
+ # end
212
+
213
+ end
214
+
215
+
216
+ describe FFIMultiPolygonImpl do
217
+
218
+ subject { rgeometry("MULTIPOLYGON ( ((0 0, 0 1, 1 1, 1 0, 0 0), (0.25 0.25,0 0.75,0.75 0.75,0.75 0.25, 0.25 0.25)), ((15 5, 40 10, 10 20, 5 10, 15 5)) )") }
219
+
220
+ describe "#to_georuby" do
221
+
222
+ it "should return a GeoRuby::SimpleFeatures::MultiPolygon" do
223
+ subject.to_georuby.should be_instance_of(GeoRuby::SimpleFeatures::MultiPolygon)
224
+ end
225
+
226
+ it "should return a MultiPolygon with the same information" do
227
+ subject.to_georuby.should == geometry("MULTIPOLYGON ( ((0 0, 0 1, 1 1, 1 0, 0 0), (0.25 0.25,0 0.75,0.75 0.75,0.75 0.25, 0.25 0.25)), ((15 5, 40 10, 10 20, 5 10, 15 5)) )")
228
+ end
229
+
230
+ end
231
+ end
232
+
233
+ end
234
+ end