georuby 1.9.3

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 (75) hide show
  1. data/Gemfile +8 -0
  2. data/Gemfile.lock +29 -0
  3. data/History.txt +4 -0
  4. data/LICENSE +21 -0
  5. data/README.rdoc +184 -0
  6. data/Rakefile +48 -0
  7. data/VERSION +1 -0
  8. data/georuby.gemspec +128 -0
  9. data/lib/geo_ruby.rb +23 -0
  10. data/lib/geo_ruby/geojson.rb +129 -0
  11. data/lib/geo_ruby/georss.rb +133 -0
  12. data/lib/geo_ruby/gpx.rb +1 -0
  13. data/lib/geo_ruby/gpx4r/gpx.rb +118 -0
  14. data/lib/geo_ruby/shp.rb +1 -0
  15. data/lib/geo_ruby/shp4r/dbf.rb +42 -0
  16. data/lib/geo_ruby/shp4r/shp.rb +718 -0
  17. data/lib/geo_ruby/simple_features/envelope.rb +167 -0
  18. data/lib/geo_ruby/simple_features/ewkb_parser.rb +218 -0
  19. data/lib/geo_ruby/simple_features/ewkt_parser.rb +336 -0
  20. data/lib/geo_ruby/simple_features/geometry.rb +236 -0
  21. data/lib/geo_ruby/simple_features/geometry_collection.rb +144 -0
  22. data/lib/geo_ruby/simple_features/geometry_factory.rb +81 -0
  23. data/lib/geo_ruby/simple_features/helper.rb +18 -0
  24. data/lib/geo_ruby/simple_features/line_string.rb +228 -0
  25. data/lib/geo_ruby/simple_features/linear_ring.rb +34 -0
  26. data/lib/geo_ruby/simple_features/multi_line_string.rb +63 -0
  27. data/lib/geo_ruby/simple_features/multi_point.rb +58 -0
  28. data/lib/geo_ruby/simple_features/multi_polygon.rb +64 -0
  29. data/lib/geo_ruby/simple_features/point.rb +381 -0
  30. data/lib/geo_ruby/simple_features/polygon.rb +175 -0
  31. data/nofxx-georuby.gemspec +149 -0
  32. data/spec/data/geojson/feature_collection.json +34 -0
  33. data/spec/data/georss/atom.xml +21 -0
  34. data/spec/data/georss/gml.xml +40 -0
  35. data/spec/data/georss/w3c.xml +22 -0
  36. data/spec/data/gpx/fells_loop.gpx +1077 -0
  37. data/spec/data/gpx/long.gpx +1642 -0
  38. data/spec/data/gpx/long.kml +31590 -0
  39. data/spec/data/gpx/long.nmea +2220 -0
  40. data/spec/data/gpx/short.gpx +13634 -0
  41. data/spec/data/gpx/short.kml +130 -0
  42. data/spec/data/gpx/tracktreks.gpx +706 -0
  43. data/spec/data/multipoint.dbf +0 -0
  44. data/spec/data/multipoint.shp +0 -0
  45. data/spec/data/multipoint.shx +0 -0
  46. data/spec/data/point.dbf +0 -0
  47. data/spec/data/point.shp +0 -0
  48. data/spec/data/point.shx +0 -0
  49. data/spec/data/polygon.dbf +0 -0
  50. data/spec/data/polygon.shp +0 -0
  51. data/spec/data/polygon.shx +0 -0
  52. data/spec/data/polyline.dbf +0 -0
  53. data/spec/data/polyline.shp +0 -0
  54. data/spec/data/polyline.shx +0 -0
  55. data/spec/geo_ruby/geojson_spec.rb +147 -0
  56. data/spec/geo_ruby/georss.rb +218 -0
  57. data/spec/geo_ruby/georss_spec.rb +14 -0
  58. data/spec/geo_ruby/gpx4r/gpx_spec.rb +106 -0
  59. data/spec/geo_ruby/shp4r/shp_spec.rb +239 -0
  60. data/spec/geo_ruby/simple_features/envelope_spec.rb +47 -0
  61. data/spec/geo_ruby/simple_features/ewkb_parser_spec.rb +158 -0
  62. data/spec/geo_ruby/simple_features/ewkt_parser_spec.rb +179 -0
  63. data/spec/geo_ruby/simple_features/geometry_collection_spec.rb +55 -0
  64. data/spec/geo_ruby/simple_features/geometry_factory_spec.rb +11 -0
  65. data/spec/geo_ruby/simple_features/geometry_spec.rb +32 -0
  66. data/spec/geo_ruby/simple_features/line_string_spec.rb +259 -0
  67. data/spec/geo_ruby/simple_features/linear_ring_spec.rb +24 -0
  68. data/spec/geo_ruby/simple_features/multi_line_string_spec.rb +54 -0
  69. data/spec/geo_ruby/simple_features/multi_point_spec.rb +35 -0
  70. data/spec/geo_ruby/simple_features/multi_polygon_spec.rb +50 -0
  71. data/spec/geo_ruby/simple_features/point_spec.rb +356 -0
  72. data/spec/geo_ruby/simple_features/polygon_spec.rb +122 -0
  73. data/spec/geo_ruby_spec.rb +27 -0
  74. data/spec/spec_helper.rb +73 -0
  75. metadata +228 -0
@@ -0,0 +1,50 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe MultiPolygon do
4
+
5
+ it "test_multi_polygon_creation" do
6
+ multi_polygon1 = MultiPolygon.from_polygons([Polygon.from_coordinates([[[12.4,-45.3],[45.4,41.6],[4.456,1.0698],[12.4,-45.3]],[[2.4,5.3],[5.4,1.4263],[14.46,1.06],[2.4,5.3]]],256),Polygon.from_coordinates([[[0,0],[4,0],[4,4],[0,4],[0,0]],[[1,1],[3,1],[3,3],[1,3],[1,1]]],256)],256)
7
+ multi_polygon1.should be_instance_of(MultiPolygon)
8
+ multi_polygon1.length.should eql(2)
9
+ multi_polygon1[0].should == Polygon.from_coordinates([[[12.4,-45.3],[45.4,41.6],[4.456,1.0698],[12.4,-45.3]],[[2.4,5.3],[5.4,1.4263],[14.46,1.06],[2.4,5.3]]],256)
10
+
11
+ multi_polygon2 = MultiPolygon.from_coordinates([[[[12.4,-45.3],[45.4,41.6],[4.456,1.0698],[12.4,-45.3]],[[2.4,5.3],[5.4,1.4263],[14.46,1.06],[2.4,5.3]]],[[[0,0],[4,0],[4,4],[0,4],[0,0]],[[1,1],[3,1],[3,3],[1,3],[1,1]]]],256)
12
+ multi_polygon1.should be_instance_of(MultiPolygon)
13
+ multi_polygon1.length.should eql(2)
14
+
15
+ multi_polygon2[0].should == Polygon.from_coordinates([[[12.4,-45.3],[45.4,41.6],[4.456,1.0698],[12.4,-45.3]],[[2.4,5.3],[5.4,1.4263],[14.46,1.06],[2.4,5.3]]],256)
16
+ multi_polygon1.should == multi_polygon2
17
+ end
18
+
19
+ it "test_multi_polygon_binary" do
20
+ multi_polygon = MultiPolygon.from_polygons([Polygon.from_coordinates([[[12.4,-45.3],[45.4,41.6],[4.456,1.0698],[12.4,-45.3]],[[2.4,5.3],[5.4,1.4263],[14.46,1.06],[2.4,5.3]]],256),Polygon.from_coordinates([[[0,0],[4,0],[4,4],[0,4],[0,0]],[[1,1],[3,1],[3,3],[1,3],[1,1]]],256)],256)
21
+ multi_polygon.as_hex_ewkb.should eql("0106000020000100000200000001030000000200000004000000CDCCCCCCCCCC28406666666666A646C03333333333B34640CDCCCCCCCCCC44406DE7FBA9F1D211403D2CD49AE61DF13FCDCCCCCCCCCC28406666666666A646C004000000333333333333034033333333333315409A999999999915408A8EE4F21FD2F63FEC51B81E85EB2C40F6285C8FC2F5F03F3333333333330340333333333333154001030000000200000005000000000000000000000000000000000000000000000000001040000000000000000000000000000010400000000000001040000000000000000000000000000010400000000000000000000000000000000005000000000000000000F03F000000000000F03F0000000000000840000000000000F03F00000000000008400000000000000840000000000000F03F0000000000000840000000000000F03F000000000000F03F")
22
+
23
+ multi_polygon = MultiPolygon.from_polygons([Polygon.from_coordinates([[[12.4,-45.3,1.2],[45.4,41.6,1.2],[4.456,1.0698,1.2],[12.4,-45.3,1.2]],[[2.4,5.3,1.2],[5.4,1.4263,1.2],[14.46,1.06,1.2],[2.4,5.3,1.2]]],256,false,true),Polygon.from_coordinates([[[0,0,1.2],[4,0,1.2],[4,4,2.3],[0,4,1.2],[0,0,1.2]],[[1,1,2.2],[3,1,3.3],[3,3,1.1],[1,3,2.4],[1,1,2.2]]],256,false,true)],256,false,true)
24
+ multi_polygon.as_hex_ewkb.should eql("0106000020000100000200000001030000400200000004000000CDCCCCCCCCCC28406666666666A646C0333333333333F33F3333333333B34640CDCCCCCCCCCC4440333333333333F33F6DE7FBA9F1D211403D2CD49AE61DF13F333333333333F33FCDCCCCCCCCCC28406666666666A646C0333333333333F33F0400000033333333333303403333333333331540333333333333F33F9A999999999915408A8EE4F21FD2F63F333333333333F33FEC51B81E85EB2C40F6285C8FC2F5F03F333333333333F33F33333333333303403333333333331540333333333333F33F0103000040020000000500000000000000000000000000000000000000333333333333F33F00000000000010400000000000000000333333333333F33F00000000000010400000000000001040666666666666024000000000000000000000000000001040333333333333F33F00000000000000000000000000000000333333333333F33F05000000000000000000F03F000000000000F03F9A999999999901400000000000000840000000000000F03F6666666666660A40000000000000084000000000000008409A9999999999F13F000000000000F03F00000000000008403333333333330340000000000000F03F000000000000F03F9A99999999990140")
25
+ end
26
+
27
+ it "test_multi_polygon_text" do
28
+ multi_polygon = MultiPolygon.from_polygons([Polygon.from_coordinates([[[12.4,-45.3],[45.4,41.6],[4.456,1.0698],[12.4,-45.3]],[[2.4,5.3],[5.4,1.4263],[14.46,1.06],[2.4,5.3]]],256),Polygon.from_coordinates([[[0,0],[4,0],[4,4],[0,4],[0,0]],[[1,1],[3,1],[3,3],[1,3],[1,1]]],256)],256)
29
+ multi_polygon.as_ewkt.should eql("SRID=256;MULTIPOLYGON(((12.4 -45.3,45.4 41.6,4.456 1.0698,12.4 -45.3),(2.4 5.3,5.4 1.4263,14.46 1.06,2.4 5.3)),((0 0,4 0,4 4,0 4,0 0),(1 1,3 1,3 3,1 3,1 1)))")
30
+
31
+ multi_polygon = MultiPolygon.from_polygons([Polygon.from_coordinates([[[12.4,-45.3,2],[45.4,41.6,3],[4.456,1.0698,4],[12.4,-45.3,2]],[[2.4,5.3,1],[5.4,1.4263,3.44],[14.46,1.06,4.5],[2.4,5.3,1]]],4326,true),Polygon.from_coordinates([[[0,0,5.6],[4,0,5.4],[4,4,1],[0,4,23],[0,0,5.6]],[[1,1,2.3],[3,1,4],[3,3,5],[1,3,6],[1,1,2.3]]],4326,true)],4326,true)
32
+ multi_polygon.as_ewkt.should eql("SRID=4326;MULTIPOLYGON(((12.4 -45.3 2,45.4 41.6 3,4.456 1.0698 4,12.4 -45.3 2),(2.4 5.3 1,5.4 1.4263 3.44,14.46 1.06 4.5,2.4 5.3 1)),((0 0 5.6,4 0 5.4,4 4 1,0 4 23,0 0 5.6),(1 1 2.3,3 1 4,3 3 5,1 3 6,1 1 2.3)))")
33
+ end
34
+
35
+ describe "Counting" do
36
+
37
+ before do
38
+ @mp = MultiPolygon.from_polygons([Polygon.from_coordinates([[[12.4,-45.3],[45.4,41.6],[4.456,1.0698],[12.4,-45.3]],[[2.4,5.3],[5.4,1.4263],[14.46,1.06],[2.4,5.3]]],256),Polygon.from_coordinates([[[0,0],[4,0],[4,4],[0,4],[0,0]],[[1,1],[3,1],[3,3],[1,3],[1,1]]],256)],256)
39
+ end
40
+
41
+ it "should have a points method" do
42
+ @mp.points[0].should be_instance_of(Point)
43
+ end
44
+
45
+ it "should flatten it right" do
46
+ @mp.should have(18).points
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,356 @@
1
+ # -*- coding: utf-8 -*-
2
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
3
+
4
+ describe Point do
5
+ before(:each) do
6
+ @point = Point.new(4326)
7
+ end
8
+
9
+ it "should instantiatember" do
10
+ violated unless @point
11
+ @point.should be_instance_of(Point)
12
+ end
13
+
14
+ it "should have a nice matcher" do
15
+ @point.should be_a_point
16
+ end
17
+
18
+ it "should have a very nice matcher" do
19
+ @point.should be_a_point(0.0, 0.0)
20
+ end
21
+
22
+ it "should have a very nice matcher" do
23
+ Point.from_x_y_z_m(1,2,3.33,"t").should be_a_point(1, 2, 3.33, "t")
24
+ end
25
+
26
+ it "should have a dumb matcher" do
27
+ Point.should be_geometric
28
+ end
29
+
30
+ it "should be subclassable" do
31
+ place = Class.new(Point)
32
+ p = place.from_x_y(1,2)
33
+ p.should be_a place
34
+ end
35
+
36
+ it "should have binary_geometry_type 2" do
37
+ @point.binary_geometry_type.should eql(1)
38
+ end
39
+
40
+ it "should have the correct srid" do
41
+ @point.srid.should eql(4326)
42
+ end
43
+
44
+ it "should not have z or m" do
45
+ @point.with_z.should be_false
46
+ @point.should_not be_with_z
47
+ @point.with_m.should be_false
48
+ @point.should_not be_with_m
49
+ end
50
+
51
+ it "should set params to 0.0" do
52
+ @point.x.should eql(0.0)
53
+ @point.y.should eql(0.0)
54
+ @point.z.should eql(0.0)
55
+ @point.m.should eql(0.0)
56
+ end
57
+
58
+ it "should compare ok" do
59
+ point1= Point::new
60
+ point1.set_x_y(1.5,45.4)
61
+ point2= Point::new
62
+ point2.set_x_y(1.5,45.4)
63
+ point3= Point::new
64
+ point3.set_x_y(4.5,12.3)
65
+ point4= Point::new
66
+ point4.set_x_y_z(1.5,45.4,423)
67
+ point5= Point::new
68
+ point5.set_x_y(1.5,45.4)
69
+ point5.m=15
70
+ geometry= Geometry::new
71
+
72
+ point1.should == point2
73
+ point1.should_not == point3
74
+ point1.should_not == point4
75
+ point1.should_not == point5
76
+ point1.should_not == geometry
77
+ end
78
+
79
+ describe "> Instantiation" do
80
+
81
+ it "should instantiate a 2d point" do
82
+ point = Point.from_x_y(10,20,123)
83
+ point.x.should eql(10)
84
+ point.y.should eql(20)
85
+ point.srid.should eql(123)
86
+ point.z.should eql(0.0)
87
+ end
88
+
89
+ it "should instantiate a 3d point" do
90
+ point = Point.from_x_y_z(-10,-20,-30)
91
+ point.x.should eql(-10)
92
+ point.y.should eql(-20)
93
+ point.z.should eql(-30)
94
+ end
95
+
96
+ it "should instantiate a 3d(m) point" do
97
+ point = Point.from_x_y_m(10,20,30)
98
+ point.x.should eql(10)
99
+ point.y.should eql(20)
100
+ point.m.should eql(30)
101
+ point.z.should eql(0.0)
102
+ end
103
+
104
+ it "should instantiate a 4d point" do
105
+ point = Point.from_x_y_z_m(10,20,30,40,123)
106
+ point.x.should eql(10)
107
+ point.y.should eql(20)
108
+ point.z.should eql(30)
109
+ point.m.should eql(40)
110
+ point.srid.should eql(123)
111
+ end
112
+
113
+ it "should instantiate a point from polar coordinates" do
114
+ point = Point.from_r_t(1.4142,45)
115
+ point.y.should be_within(0.1).of(1)
116
+ point.x.should be_within(0.1).of(1)
117
+ end
118
+
119
+ it "should instantiate from coordinates x,y" do
120
+ point = Point.from_coordinates([1.6,2.8],123)
121
+ point.x.should eql(1.6)
122
+ point.y.should eql(2.8)
123
+ point.should_not be_with_z
124
+ point.z.should eql(0.0)
125
+ point.srid.should eql(123)
126
+ end
127
+
128
+ it "should instantiate from coordinates x,y,z" do
129
+ point = Point.from_coordinates([1.6,2.8,3.4],123, true)
130
+ point.x.should eql(1.6)
131
+ point.y.should eql(2.8)
132
+ point.z.should eql(3.4)
133
+ point.should be_with_z
134
+ point.srid.should eql(123)
135
+ end
136
+
137
+ it "should instantiate from coordinates x,y,z,m" do
138
+ point = Point.from_coordinates([1.6,2.8,3.4,15],123, true, true)
139
+ point.x.should eql(1.6)
140
+ point.y.should eql(2.8)
141
+ point.z.should eql(3.4)
142
+ point.m.should eql(15)
143
+ point.should be_with_z
144
+ point.should be_with_m
145
+ point.srid.should eql(123)
146
+ end
147
+
148
+ it "should have a bbox" do
149
+ bbox = Point.from_x_y_z_m(-1.6,2.8,-3.4,15,123).bounding_box
150
+ bbox.length.should eql(2)
151
+ bbox[0].should == Point.from_x_y_z(-1.6,2.8,-3.4)
152
+ bbox[1].should == Point.from_x_y_z(-1.6,2.8,-3.4)
153
+ end
154
+
155
+ it "should parse lat long" do
156
+ Point.from_latlong("-20° 47' 26.37","-20° 47' 26.37").x.should be_within(0.00001).of(-20.790658)
157
+ Point.from_latlong("20° 47' 26.378","20° 47' 26.378").y.should be_within(0.00001).of(20.790658)
158
+ end
159
+
160
+ it "should parse lat long w/o sec" do
161
+ Point.from_latlong("-20°47′26″","-20°47′26″").x.should be_within(0.00001).of(-20.790555)
162
+ Point.from_latlong("20°47′26″","20°47′26″").y.should be_within(0.00001).of(20.790555)
163
+ end
164
+
165
+ it "should accept with W or S notation" do
166
+ Point.from_latlong("20° 47' 26.37 W","20° 47' 26.37 S").x.should be_within(0.00001).of(-20.790658)
167
+ Point.from_latlong("20° 47' 26.37 W","20° 47' 26.37 S").y.should be_within(0.00001).of(-20.790658)
168
+ end
169
+
170
+ it "should instantiate a point from positive degrees" do
171
+ point = Point.from_latlong('47`20 06.09E','22`50 77.35N')
172
+ point.y.should be_within(0.000001).of(22.8548194)
173
+ point.x.should be_within(0.000001).of(47.335025)
174
+ end
175
+
176
+ it "should instantiate a point from negative degrees" do
177
+ point = Point.from_latlong('47`20 06.09W','22`50 77.35S')
178
+ point.y.should be_within(0.000001).of(-22.8548194)
179
+ point.x.should be_within(0.000001).of(-47.335025)
180
+ end
181
+
182
+ it "should print out nicely" do
183
+ Point.from_x_y(47.88, -20.1).as_latlong.should eql("47°52′48″, -20°06′00″")
184
+ end
185
+
186
+ it "should print out nicely" do
187
+ Point.from_x_y(-20.78, 20.78).as_latlong(:full => true).should eql("-20°46′48.00″, 20°46′48.00″")
188
+ end
189
+
190
+ it "should print out nicely" do
191
+ Point.from_x_y(47.11, -20.2).as_latlong(:full => true).should eql("47°06′36.00″, -20°11′60.00″")
192
+ end
193
+
194
+ it "should print out nicely" do
195
+ Point.from_x_y(47.11, -20.2).as_latlong(:coord => true).should eql("47°06′36″N, 20°11′60″W")
196
+ end
197
+
198
+ it "should print out nicely" do
199
+ Point.from_x_y(-47.11, 20.2).as_latlong(:full => true,:coord => true).should eql("47°06′36.00″S, 20°11′60.00″E")
200
+ end
201
+
202
+ end
203
+
204
+ describe " > Distance & Bearing" do
205
+
206
+ before(:each) do
207
+ @p1 = Point.from_x_y(1,1)
208
+ @p2 = Point.from_x_y(2,2)
209
+ end
210
+
211
+ it "and a 3th grade child should calculate euclidian distance" do
212
+ @p1.euclidian_distance(@p2).
213
+ should be_within(0.00000001).of(1.4142135623731)
214
+ end
215
+
216
+ it "should calculate spherical distance" do
217
+ @p1.spherical_distance(@p2).
218
+ should be_within(0.00000001).of(157225.358003181)
219
+ end
220
+
221
+ it "should calculate ellipsoidal distance" do
222
+ @p1.ellipsoidal_distance(@p2).
223
+ should be_within(0.00000001).of(156876.149400742)
224
+ end
225
+
226
+ describe "Orthogonal Distance" do
227
+ before do
228
+ @line = LineString.from_coordinates([[0,0],[1,3]], 4326)
229
+ @line2 = LineString.from_coordinates([[1,1],[1,2]], 4326)
230
+ end
231
+
232
+ it "should calcula orthogonal distance from a line (90 deg)" do
233
+ @p1.orthogonal_distance(@line).should be_within(0.001).of(1.414)
234
+ end
235
+
236
+ it "should calcula orthogonal distance very close..." do
237
+ @p1.orthogonal_distance(@line2).should be_zero
238
+ end
239
+
240
+ it "should calcula orthogonal distance from a line (90 deg)" do
241
+ @p2.orthogonal_distance(@line).should be_within(0.001).of(2.828)
242
+ end
243
+
244
+ it "should calcula orthogonal distance from a line (0 deg)" do
245
+ @p2.orthogonal_distance(@line2).should be_within(0.1).of(1.0)
246
+ end
247
+
248
+ it "should calcula orthogonal distance from a line (0 deg)" do
249
+ @p2.orthogonal_distance(@line2).should be_within(0.1).of(1.0)
250
+ end
251
+
252
+ end
253
+
254
+ it "should calculate the bearing from apoint to another in degrees" do
255
+ @p1.bearing_to(@p2).should be_within(0.01).of(45.0)
256
+ end
257
+
258
+ it "should calculate the bearing from apoint to another in degrees" do
259
+ p3 = Point.from_x_y(1,-1)
260
+ @p1.bearing_to(p3).should be_within(0.01).of(180.0)
261
+ end
262
+
263
+ it "should calculate the bearing from apoint to another in degrees" do
264
+ p3 = Point.from_x_y(-1,-1)
265
+ @p1.bearing_to(p3).should be_within(0.01).of(225.0)
266
+ end
267
+
268
+ it "should calculate the bearing from apoint to another in degrees" do
269
+ p3 = Point.from_x_y(-1,1)
270
+ @p1.bearing_to(p3).should be_within(0.01).of(270.0)
271
+ end
272
+
273
+ it "should calculate the bearing from apoint to another in degrees" do
274
+ p3 = Point.from_x_y(2,-1)
275
+ @p1.bearing_to(p3).should be_within(0.0001).of(153.4349488)
276
+ end
277
+
278
+ it "should calculate a clone point bearing to 0" do
279
+ @p1.bearing_to(@p1).should eql(0)
280
+ end
281
+
282
+ it "should calculate the bearing from apoint to another in degrees" do
283
+ @p1.bearing_text(@p2).should eql(:ne)
284
+ end
285
+
286
+ it "should calculate the bearing from apoint to another in degrees" do
287
+ p3 = Point.from_x_y(-1,1)
288
+ @p1.bearing_text(p3).should eql(:w)
289
+ end
290
+
291
+ end
292
+
293
+ describe "> Export Formats" do
294
+
295
+ before(:each) do
296
+ @point = Point.from_x_y( -11.2431, 32.3141 )
297
+ end
298
+
299
+ it "should print nicely" do
300
+ @point.text_representation.should eql("-11.2431 32.3141")
301
+ end
302
+
303
+ it "should printoout as binary" do
304
+ Point.from_x_y(12.4,45.3,123).as_hex_ewkb.should eql("01010000207B000000CDCCCCCCCCCC28406666666666A64640")
305
+ point = Point.from_x_y_z_m(12.4,45.3,-3.5,15,123)
306
+ point.as_hex_ewkb.should eql("01010000E07B000000CDCCCCCCCCCC28406666666666A646400000000000000CC00000000000002E40")
307
+ point.as_hex_wkb.should eql("0101000000CDCCCCCCCCCC28406666666666A64640")
308
+ end
309
+
310
+ it "should printoout as text" do
311
+ Point.from_x_y(12.4,45.3,123).as_ewkt.should eql("SRID=123;POINT(12.4 45.3)")
312
+ point = Point.from_x_y_z(12.4,45.3,-3.5,123)
313
+ point.as_ewkt.should eql("SRID=123;POINT(12.4 45.3 -3.5)")
314
+ point.as_wkt.should eql("POINT(12.4 45.3)")
315
+ point.as_ewkt(false,true).should eql("POINT(12.4 45.3 -3.5)")
316
+ point = Point.from_x_y_m(12.4,45.3,-3.5,123)
317
+ point.as_ewkt.should eql("SRID=123;POINTM(12.4 45.3 -3.5)")
318
+ point.as_ewkt(true,true,false).should eql("SRID=123;POINT(12.4 45.3)")
319
+ end
320
+
321
+ it "should have a nice bounding box" do
322
+ @point.should have(2).bounding_box
323
+ @point.bounding_box.each do |point|
324
+ point.x.should eql(@point.x)
325
+ point.y.should eql(@point.y)
326
+ end
327
+ end
328
+
329
+ it "should print as kml too" do
330
+ @point.kml_representation.should eql("<Point>\n<coordinates>-11.2431,32.3141</coordinates>\n</Point>\n")
331
+ end
332
+
333
+ it "should print as georss" do
334
+ @point.georss_simple_representation(:georss_ns => 'hey').should eql("<hey:point>32.3141 -11.2431</hey:point>\n")
335
+ end
336
+
337
+ it "should print r (polar coords)" do
338
+ @point.r.should be_within(0.000001).of(34.214154)
339
+ end
340
+
341
+ it "should print theta as degrees" do
342
+ @point.theta_deg.should be_within(0.0001).of(289.184406352127)
343
+ end
344
+
345
+ it "should print theta as radians" do
346
+ @point.theta_rad.should be_within(0.0001).of(5.04722003626982)
347
+ end
348
+
349
+ it "should output as polar" do
350
+ @point.as_polar.should be_instance_of(Array)
351
+ @point.should have(2).as_polar #.length.should eql(2)
352
+ end
353
+
354
+ end
355
+
356
+ end
@@ -0,0 +1,122 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Polygon do
4
+
5
+ describe "Instance Methods" do
6
+
7
+ let(:poly) { Polygon.from_coordinates([[[0,0],[4,0],[4,4],[0,4],[0,0]],[[1,1],[3,1],[3,3],[1,3],[1,1]]],256) }
8
+
9
+ it "should check if contains point" do
10
+ poly.contains_point?(Point.from_x_y(3, 3)).should be_true
11
+ end
12
+
13
+ it "should check if not contains point" do
14
+ poly.contains_point?(Point.from_x_y(5, 5)).should be_false
15
+ end
16
+
17
+ end
18
+
19
+ describe "tu converted" do
20
+ #no test of the binary representation for linear_rings : always with polygons and like line_string
21
+ it "should test_polygon_creation" do
22
+ linear_ring1 = LinearRing.from_coordinates([[12.4,-45.3],[45.4,41.6],[4.456,1.0698],[12.4,-45.3]],256)
23
+ linear_ring2 = LinearRing.from_coordinates([[2.4,5.3],[5.4,1.4263],[14.46,1.06],[2.4,5.3]],256)
24
+ point1 = Point.from_x_y(12.4,-45.3,256)
25
+ point2 = Point.from_x_y(45.4,41.6,256)
26
+ point3 = Point.from_x_y(4.456,1.0698,256)
27
+ point4 = Point.from_x_y(12.4,-45.3,256)
28
+ point5 = Point.from_x_y(2.4,5.3,256)
29
+ point6 = Point.from_x_y(5.4,1.4263,256)
30
+ point7 = Point.from_x_y(14.46,1.06,256)
31
+ point8 = Point.from_x_y(2.4,5.3,256)
32
+
33
+ polygon = Polygon::new(256)
34
+ polygon.length.should be_zero
35
+
36
+ polygon << linear_ring1
37
+ polygon.length.should eql(1)
38
+ polygon[0].should == linear_ring1
39
+
40
+ #the validity of the hole is not checked : just for the sake of example
41
+ polygon << linear_ring2
42
+ polygon.length.should eql(2)
43
+ polygon[1].should == linear_ring2
44
+
45
+ polygon = Polygon.from_linear_rings([linear_ring1,linear_ring2],256)
46
+ polygon.class.should eql(Polygon)
47
+ polygon.length.should eql(2)
48
+ polygon[0].should == linear_ring1
49
+ polygon[1].should == linear_ring2
50
+
51
+ polygon = Polygon.from_coordinates([[[12.4,-45.3],[45.4,41.6],[4.456,1.0698],[12.4,-45.3]],[[2.4,5.3],[5.4,1.4263],[14.46,1.06],[2.4,5.3]]],256)
52
+ polygon.class.should eql(Polygon)
53
+ polygon.length.should eql(2)
54
+ polygon[0].should == linear_ring1
55
+ polygon[1].should == linear_ring2
56
+
57
+ polygon = Polygon.from_points([[point1,point2,point3,point4],[point5,point6,point7,point8]],256)
58
+ polygon.length.should eql(2)
59
+ polygon[0].should == linear_ring1
60
+ polygon[1].should == linear_ring2
61
+
62
+ polygon = Polygon.from_coordinates([[[12.4,-45.3,15.2],[45.4,41.6,2.4],[4.456,1.0698,5.6],[12.4,-45.3,6.1]],[[2.4,5.3,4.5],[5.4,1.4263,4.2],[14.46,1.06,123.1],[2.4,5.3,4.4]]],256,true)
63
+ polygon.class.should eql(Polygon)
64
+ polygon.length.should eql(2)
65
+
66
+ linear_ring1 = LinearRing.from_coordinates([[12.4,-45.3,15.2],[45.4,41.6,2.4],[4.456,1.0698,5.6],[12.4,-45.3,6.1]],256,true)
67
+ linear_ring2 = LinearRing.from_coordinates([[2.4,5.3,4.5],[5.4,1.4263,4.2],[14.46,1.06,123.1],[2.4,5.3,4.4]],256,true)
68
+ polygon[0].should == linear_ring1
69
+ polygon[1].should == linear_ring2
70
+ end
71
+
72
+ it "bbox" do
73
+ bbox = Polygon.from_coordinates([[[12.4,-45.3,15.2],[45.4,41.6,2.4],[4.456,1.0698,5.6],[12.4,-45.3,6.1]],[[2.4,5.3,4.5],[5.4,1.4263,4.2],[14.46,1.06,123.1],[2.4,5.3,4.4]]],256,true).bounding_box
74
+ bbox.length.should eql(2)
75
+ bbox[0].should == Point.from_x_y_z(4.456,-45.3,2.4)
76
+ bbox[1].should == Point.from_x_y_z(45.4,41.6,123.1)
77
+ end
78
+
79
+
80
+ it "test_polygon_equal" do
81
+ polygon1 = Polygon.from_coordinates([[[12.4,-45.3],[45.4,41.6],[4.456,1.0698],[12.4,-45.3]],[[2.4,5.3],[5.4,1.4263],[14.46,1.06],[2.4,5.3]]],256)
82
+ polygon2 = Polygon.from_coordinates([[[12.4,-45.3],[45.4,41.6],[4.456,1.0698],[12.4,-45.3]],[[2.4,5.3],[5.4,1.4263],[14.46,1.06]]])
83
+ point = Point.from_x_y(12.4,-45.3,123)
84
+
85
+ polygon1.should == Polygon.from_coordinates([[[12.4,-45.3],[45.4,41.6],[4.456,1.0698],[12.4,-45.3]],[[2.4,5.3],[5.4,1.4263],[14.46,1.06],[2.4,5.3]]],256)
86
+ polygon1.should_not == polygon2
87
+ polygon1.should_not == point
88
+ end
89
+
90
+ it "test_polygon_binary" do
91
+ polygon = Polygon.from_coordinates([[[0,0],[4,0],[4,4],[0,4],[0,0]],[[1,1],[3,1],[3,3],[1,3],[1,1]]],256)
92
+ #taken from PostGIS answer
93
+ polygon.as_hex_ewkb.should eql("0103000020000100000200000005000000000000000000000000000000000000000000000000001040000000000000000000000000000010400000000000001040000000000000000000000000000010400000000000000000000000000000000005000000000000000000F03F000000000000F03F0000000000000840000000000000F03F00000000000008400000000000000840000000000000F03F0000000000000840000000000000F03F000000000000F03F")
94
+
95
+ polygon = Polygon.from_coordinates([[[0,0,2],[4,0,2],[4,4,2],[0,4,2],[0,0,2]],[[1,1,2],[3,1,2],[3,3,2],[1,3,2],[1,1,2]]],256,true)
96
+ #taken from PostGIS answer
97
+ polygon.as_hex_ewkb.should eql("01030000A000010000020000000500000000000000000000000000000000000000000000000000004000000000000010400000000000000000000000000000004000000000000010400000000000001040000000000000004000000000000000000000000000001040000000000000004000000000000000000000000000000000000000000000004005000000000000000000F03F000000000000F03F00000000000000400000000000000840000000000000F03F0000000000000040000000000000084000000000000008400000000000000040000000000000F03F00000000000008400000000000000040000000000000F03F000000000000F03F0000000000000040")
98
+
99
+ polygon = Polygon.from_coordinates([[[0,0,2],[4,0,2],[4,4,2],[0,4,2],[0,0,2]],[[1,1,2],[3,1,2],[3,3,2],[1,3,2],[1,1,2]]],256,false,true)
100
+ polygon.as_hex_ewkb.should eql("010300006000010000020000000500000000000000000000000000000000000000000000000000004000000000000010400000000000000000000000000000004000000000000010400000000000001040000000000000004000000000000000000000000000001040000000000000004000000000000000000000000000000000000000000000004005000000000000000000F03F000000000000F03F00000000000000400000000000000840000000000000F03F0000000000000040000000000000084000000000000008400000000000000040000000000000F03F00000000000008400000000000000040000000000000F03F000000000000F03F0000000000000040")
101
+
102
+ polygon = Polygon.from_coordinates([[[0,0,2,-45.1],[4,0,2,5],[4,4,2,4.67],[0,4,2,1.34],[0,0,2,-45.1]],[[1,1,2,12.3],[3,1,2,123],[3,3,2,12.2],[1,3,2,12],[1,1,2,12.3]]],256,true,true)
103
+ polygon.as_hex_ewkb.should eql("01030000E0000100000200000005000000000000000000000000000000000000000000000000000040CDCCCCCCCC8C46C00000000000001040000000000000000000000000000000400000000000001440000000000000104000000000000010400000000000000040AE47E17A14AE1240000000000000000000000000000010400000000000000040713D0AD7A370F53F000000000000000000000000000000000000000000000040CDCCCCCCCC8C46C005000000000000000000F03F000000000000F03F00000000000000409A999999999928400000000000000840000000000000F03F00000000000000400000000000C05E400000000000000840000000000000084000000000000000406666666666662840000000000000F03F000000000000084000000000000000400000000000002840000000000000F03F000000000000F03F00000000000000409A99999999992840")
104
+ end
105
+
106
+ it "should test_polygon_text" do
107
+ polygon = Polygon.from_coordinates([[[0,0],[4,0],[4,4],[0,4],[0,0]],[[1,1],[3,1],[3,3],[1,3],[1,1]]],256)
108
+ polygon.as_ewkt.should eql("SRID=256;POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1,3 1,3 3,1 3,1 1))")
109
+
110
+ polygon = Polygon.from_coordinates([[[0,0,2],[4,0,2],[4,4,2],[0,4,2],[0,0,2]],[[1,1,2],[3,1,2],[3,3,2],[1,3,2],[1,1,2]]],256,true)
111
+ polygon.as_ewkt.should eql("SRID=256;POLYGON((0 0 2,4 0 2,4 4 2,0 4 2,0 0 2),(1 1 2,3 1 2,3 3 2,1 3 2,1 1 2))")
112
+
113
+ polygon = Polygon.from_coordinates([[[0,0,2],[4,0,2],[4,4,2],[0,4,2],[0,0,2]],[[1,1,2],[3,1,2],[3,3,2],[1,3,2],[1,1,2]]],256,false,true)
114
+ polygon.as_ewkt.should eql("SRID=256;POLYGONM((0 0 2,4 0 2,4 4 2,0 4 2,0 0 2),(1 1 2,3 1 2,3 3 2,1 3 2,1 1 2))")
115
+
116
+ polygon = Polygon.from_coordinates([[[0,0,2,-45.1],[4,0,2,5],[4,4,2,4.67],[0,4,2,1.34],[0,0,2,-45.1]],[[1,1,2,12.3],[3,1,2,123],[3,3,2,12.2],[1,3,2,12],[1,1,2,12.3]]],256,true,true)
117
+ polygon.as_ewkt.should eql("SRID=256;POLYGON((0 0 2 -45.1,4 0 2 5,4 4 2 4.67,0 4 2 1.34,0 0 2 -45.1),(1 1 2 12.3,3 1 2 123,3 3 2 12.2,1 3 2 12,1 1 2 12.3))")
118
+ end
119
+
120
+ end
121
+
122
+ end