ppe-georuby 1.7.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 (71) hide show
  1. data/.gitignore +6 -0
  2. data/History.txt +4 -0
  3. data/LICENSE +21 -0
  4. data/README.txt +118 -0
  5. data/Rakefile +48 -0
  6. data/VERSION +1 -0
  7. data/lib/geo_ruby.rb +22 -0
  8. data/lib/geo_ruby/gpx.rb +1 -0
  9. data/lib/geo_ruby/gpx4r/gpx.rb +117 -0
  10. data/lib/geo_ruby/shp.rb +1 -0
  11. data/lib/geo_ruby/shp4r/dbf.rb +41 -0
  12. data/lib/geo_ruby/shp4r/shp.rb +697 -0
  13. data/lib/geo_ruby/simple_features/envelope.rb +167 -0
  14. data/lib/geo_ruby/simple_features/ewkb_parser.rb +216 -0
  15. data/lib/geo_ruby/simple_features/ewkt_parser.rb +336 -0
  16. data/lib/geo_ruby/simple_features/geometry.rb +228 -0
  17. data/lib/geo_ruby/simple_features/geometry_collection.rb +136 -0
  18. data/lib/geo_ruby/simple_features/geometry_factory.rb +81 -0
  19. data/lib/geo_ruby/simple_features/georss_parser.rb +135 -0
  20. data/lib/geo_ruby/simple_features/helper.rb +18 -0
  21. data/lib/geo_ruby/simple_features/line_string.rb +206 -0
  22. data/lib/geo_ruby/simple_features/linear_ring.rb +12 -0
  23. data/lib/geo_ruby/simple_features/multi_line_string.rb +51 -0
  24. data/lib/geo_ruby/simple_features/multi_point.rb +46 -0
  25. data/lib/geo_ruby/simple_features/multi_polygon.rb +52 -0
  26. data/lib/geo_ruby/simple_features/point.rb +364 -0
  27. data/lib/geo_ruby/simple_features/polygon.rb +157 -0
  28. data/ppe-georuby.gemspec +133 -0
  29. data/script/console +10 -0
  30. data/script/destroy +14 -0
  31. data/script/generate +14 -0
  32. data/script/txt2html +82 -0
  33. data/spec/data/gpx/fells_loop.gpx +1077 -0
  34. data/spec/data/gpx/long.gpx +1642 -0
  35. data/spec/data/gpx/long.kml +31590 -0
  36. data/spec/data/gpx/long.nmea +2220 -0
  37. data/spec/data/gpx/short.gpx +13634 -0
  38. data/spec/data/gpx/short.kml +130 -0
  39. data/spec/data/gpx/tracktreks.gpx +706 -0
  40. data/spec/data/multipoint.dbf +0 -0
  41. data/spec/data/multipoint.shp +0 -0
  42. data/spec/data/multipoint.shx +0 -0
  43. data/spec/data/point.dbf +0 -0
  44. data/spec/data/point.shp +0 -0
  45. data/spec/data/point.shx +0 -0
  46. data/spec/data/polygon.dbf +0 -0
  47. data/spec/data/polygon.shp +0 -0
  48. data/spec/data/polygon.shx +0 -0
  49. data/spec/data/polyline.dbf +0 -0
  50. data/spec/data/polyline.shp +0 -0
  51. data/spec/data/polyline.shx +0 -0
  52. data/spec/geo_ruby/gpx4r/gpx_spec.rb +106 -0
  53. data/spec/geo_ruby/shp4r/shp_spec.rb +240 -0
  54. data/spec/geo_ruby/simple_features/envelope_spec.rb +45 -0
  55. data/spec/geo_ruby/simple_features/ewkb_parser_spec.rb +158 -0
  56. data/spec/geo_ruby/simple_features/ewkt_parser_spec.rb +179 -0
  57. data/spec/geo_ruby/simple_features/geometry_collection_spec.rb +55 -0
  58. data/spec/geo_ruby/simple_features/geometry_factory_spec.rb +11 -0
  59. data/spec/geo_ruby/simple_features/geometry_spec.rb +32 -0
  60. data/spec/geo_ruby/simple_features/georss_parser_spec.rb +218 -0
  61. data/spec/geo_ruby/simple_features/line_string_spec.rb +245 -0
  62. data/spec/geo_ruby/simple_features/linear_ring_spec.rb +14 -0
  63. data/spec/geo_ruby/simple_features/multi_line_string_spec.rb +54 -0
  64. data/spec/geo_ruby/simple_features/multi_point_spec.rb +35 -0
  65. data/spec/geo_ruby/simple_features/multi_polygon_spec.rb +50 -0
  66. data/spec/geo_ruby/simple_features/point_spec.rb +356 -0
  67. data/spec/geo_ruby/simple_features/polygon_spec.rb +108 -0
  68. data/spec/geo_ruby_spec.rb +27 -0
  69. data/spec/spec.opts +6 -0
  70. data/spec/spec_helper.rb +65 -0
  71. metadata +162 -0
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,106 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ include GeoRuby::Gpx4r
4
+ include GeoRuby::SimpleFeatures
5
+
6
+ describe Gpx4r do
7
+
8
+ it "should add gpx extension and raise if doesn't exists" do
9
+ lambda do
10
+ File.should_receive(:exists?).with("short.gpx").and_return(false)
11
+ GpxFile.open('short').should be_true
12
+ end.should raise_error MalformedGpxException
13
+ end
14
+
15
+ describe "Waypoints" do
16
+
17
+ before(:all) do
18
+ @gpxfile = GpxFile.open(File.dirname(__FILE__) + '/../../data/gpx/short.gpx', :with_z => true, :with_m => true)
19
+ @gpxfile2 = GpxFile.open(File.dirname(__FILE__) + '/../../data/gpx/fells_loop', :with_z => true, :with_m => true)
20
+ @gpxfile3 = GpxFile.open(File.dirname(__FILE__) + '/../../data/gpx/tracktreks.gpx', :with_z => true)
21
+ end
22
+
23
+ it "should open and parse" do
24
+ @gpxfile.record_count.should eql(2724)
25
+ end
26
+
27
+ it "should open and parse no trkpt one" do
28
+ @gpxfile2.record_count.should eql(46)
29
+ end
30
+
31
+ it "should open and parse 3" do
32
+ @gpxfile3.record_count.should eql(225)
33
+ end
34
+
35
+ it "should read X and Y" do
36
+ @gpxfile[0].x.should be_close(9.093942, 0.0001)
37
+ @gpxfile[0].y.should be_close(48.731813, 0.0001)
38
+ end
39
+
40
+ it "should read Z and M" do
41
+ @gpxfile[0].z.should eql(468)
42
+ @gpxfile[0].m.should eql("2008-09-07T17:36:57Z")
43
+ end
44
+
45
+ it "should read X and Y 2" do
46
+ @gpxfile2[0].x.should be_close(-71.107628, 0.0001)
47
+ @gpxfile2[0].y.should be_close(42.43095, 0.0001)
48
+ end
49
+
50
+ it "should read Z and M 2" do
51
+ @gpxfile2[0].z.should eql(23)
52
+ @gpxfile2[0].m.should eql("2001-06-02T00:18:15Z")
53
+ end
54
+
55
+ it "should read X and Y 3" do
56
+ @gpxfile3[0].x.should be_close(-149.8358011, 0.0001)
57
+ @gpxfile3[0].y.should be_close(-17.5326508, 0.0001)
58
+ end
59
+
60
+ it "should read Z and M 3" do
61
+ @gpxfile3[0].z.should eql(88)
62
+ @gpxfile3[0].m.should eql(0.0)
63
+ end
64
+
65
+ it "should return it as a linestring" do
66
+ @gpxfile.as_line_string.should be_instance_of LineString
67
+ @gpxfile.as_polyline.should be_instance_of LineString
68
+ end
69
+
70
+ it "should return it as a linestring 3" do
71
+ @gpxfile3.as_line_string.should be_instance_of LineString
72
+ @gpxfile3.as_polyline.should be_instance_of LineString
73
+ end
74
+
75
+ it "should return a envelope" do
76
+ @gpxfile.envelope.should be_instance_of Envelope
77
+ @gpxfile.envelope.lower_corner.x.should be_close(9.08128, 0.001)
78
+ @gpxfile.envelope.lower_corner.y.should be_close(48.7169, 0.001)
79
+ end
80
+
81
+ it "should return a envelope 3" do
82
+ @gpxfile3.envelope.should be_instance_of Envelope
83
+ @gpxfile3.envelope.lower_corner.x.should be_close(-149.8422613, 0.001)
84
+ @gpxfile3.envelope.lower_corner.y.should be_close(-17.547636, 0.001)
85
+ end
86
+
87
+ it "should return it as a polygon" do
88
+ [@gpxfile, @gpxfile2, @gpxfile3].each do |g|
89
+ g.as_polygon.should be_instance_of Polygon
90
+ g.as_polygon[0].should be_instance_of LinearRing
91
+ g.as_polygon[0].should be_closed
92
+ g.as_polygon[1].should be_nil
93
+ end
94
+ end
95
+
96
+ it "should close the polygon" do
97
+ se = Point.from_x_y(-44, -23)
98
+ sw = Point.from_x_y(-42, -22)
99
+ nw = Point.from_x_y(-42, -25)
100
+ ne = Point.from_x_y(-44, -21)
101
+ @gpxfile.instance_variable_set(:@points, [se,sw,nw,ne])
102
+ @gpxfile.as_polygon.should == Polygon.from_points([[se,sw,nw,ne,se]])
103
+ end
104
+ end
105
+
106
+ end
@@ -0,0 +1,240 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ include GeoRuby::Shp4r
4
+ include GeoRuby::SimpleFeatures
5
+
6
+ describe Shp4r do
7
+
8
+ describe "Point" do
9
+ before(:each) do
10
+ @shpfile = ShpFile.open(File.dirname(__FILE__) + '/../../data/point.shp')
11
+ end
12
+
13
+ it "should parse ok" do
14
+ @shpfile.record_count.should eql(2)
15
+ @shpfile.should have(1).fields
16
+ @shpfile.shp_type.should eql(ShpType::POINT)
17
+ end
18
+
19
+ it "should parse fields" do
20
+ field = @shpfile.fields.first
21
+ field.name.should eql("Hoyoyo")
22
+ field.type.should eql("N")
23
+ end
24
+
25
+ it "should parse record 1" do
26
+ rec = @shpfile[0]
27
+ rec.geometry.should be_kind_of Point
28
+ rec.geometry.x.should be_close(-90.08375, 0.00001)
29
+ rec.geometry.y.should be_close(34.39996, 0.00001)
30
+ rec.data["Hoyoyo"].should eql(6)
31
+ end
32
+
33
+ it "should parse record 2" do
34
+ rec = @shpfile[1]
35
+ rec.geometry.should be_kind_of Point
36
+ rec.geometry.x.should be_close(-87.82580, 0.00001)
37
+ rec.geometry.y.should be_close(33.36416, 0.00001)
38
+ rec.data["Hoyoyo"].should eql(9)
39
+ end
40
+
41
+ end
42
+
43
+ describe "Polyline" do
44
+ before(:each) do
45
+ @shpfile = ShpFile.open(File.dirname(__FILE__) + '/../../data/polyline.shp')
46
+ end
47
+
48
+ it "should parse ok" do
49
+ @shpfile.record_count.should eql(1)
50
+ @shpfile.should have(1).fields
51
+ @shpfile.shp_type.should eql(ShpType::POLYLINE)
52
+ end
53
+
54
+ it "should parse fields" do
55
+ field = @shpfile.fields.first
56
+ field.name.should eql("Chipoto")
57
+ # Dbf now uses the decimal to choose between int and float
58
+ # So here is N instead of F
59
+ field.type.should eql("N")
60
+ end
61
+
62
+ it "should parse record 1" do
63
+ rec = @shpfile[0]
64
+ rec.geometry.should be_kind_of MultiLineString
65
+ rec.geometry.length.should eql(1)
66
+ rec.geometry[0].length.should eql(6)
67
+ rec.data["Chipoto"].should eql(5.678)
68
+ end
69
+
70
+ end
71
+
72
+ describe "Polygon" do
73
+ before(:each) do
74
+ @shpfile = ShpFile.open(File.dirname(__FILE__) + '/../../data/polygon.shp')
75
+ end
76
+
77
+ it "should parse ok" do
78
+ @shpfile.record_count.should eql(1)
79
+ @shpfile.should have(1).fields
80
+ @shpfile.shp_type.should eql(ShpType::POLYGON)
81
+ end
82
+
83
+ it "should parse fields" do
84
+ field = @shpfile.fields.first
85
+ field.name.should eql("Hello")
86
+ field.type.should eql("C")
87
+ end
88
+
89
+ it "should parse record 1" do
90
+ rec = @shpfile[0]
91
+ rec.geometry.should be_kind_of MultiPolygon
92
+ rec.geometry.length.should eql(1)
93
+ rec.geometry[0].length.should eql(1)
94
+ rec.geometry[0][0].length.should eql(7)
95
+ rec.data["Hello"].should eql("Bouyoul!")
96
+ end
97
+ end
98
+
99
+ describe "Write" do
100
+ def cp_all_shp(file1,file2)
101
+ FileUtils.copy(file1 + ".shp",file2 + ".shp")
102
+ FileUtils.copy(file1 + ".shx",file2 + ".shx")
103
+ FileUtils.copy(file1 + ".dbf",file2 + ".dbf")
104
+ end
105
+
106
+ def rm_all_shp(file)
107
+ FileUtils.rm(file + ".shp")
108
+ FileUtils.rm(file + ".shx")
109
+ FileUtils.rm(file + ".dbf")
110
+ end
111
+
112
+ it "test_point" do
113
+ cp_all_shp(File.dirname(__FILE__) + '/../../data/point',
114
+ File.dirname(__FILE__) + '/../../data/point2')
115
+ shpfile = ShpFile.open(File.dirname(__FILE__) + '/../../data/point2.shp')
116
+
117
+ shpfile.transaction do |tr|
118
+ tr.should be_instance_of ShpTransaction
119
+ tr.add(ShpRecord.new(Point.from_x_y(123.4,123.4),'Hoyoyo' => 5))
120
+ tr.add(ShpRecord.new(Point.from_x_y(-16.67,16.41),'Hoyoyo' => -7))
121
+ tr.delete(1)
122
+ end
123
+
124
+ shpfile.record_count.should eql(3)
125
+
126
+ shpfile.close
127
+ rm_all_shp(File.dirname(__FILE__) + '/../../data/point2')
128
+ end
129
+
130
+ it "test_linestring" do
131
+ cp_all_shp(File.dirname(__FILE__) + '/../../data/polyline',
132
+ File.dirname(__FILE__) + '/../../data/polyline2')
133
+
134
+ shpfile = ShpFile.open(File.dirname(__FILE__) + '/../../data/polyline2.shp')
135
+
136
+ shpfile.transaction do |tr|
137
+ tr.should be_instance_of ShpTransaction
138
+ tr.add(ShpRecord.new(LineString.from_coordinates([[123.4,123.4],[45.6,12.3]]),'Chipoto' => 5.6778))
139
+ tr.add(ShpRecord.new(LineString.from_coordinates([[23.4,13.4],[45.6,12.3],[12,-67]]),'Chipoto' => -7.1))
140
+ tr.delete(0)
141
+ end
142
+
143
+ shpfile.record_count.should eql(2)
144
+ shpfile.close
145
+ rm_all_shp(File.dirname(__FILE__) + '/../../data/polyline2')
146
+ end
147
+
148
+ it "test_polygon" do
149
+ cp_all_shp(File.dirname(__FILE__) + '/../../data/polygon',
150
+ File.dirname(__FILE__) + '/../../data/polygon2')
151
+ shpfile = ShpFile.open(File.dirname(__FILE__) + '/../../data/polygon2.shp')
152
+
153
+ shpfile.transaction do |tr|
154
+ tr.should be_instance_of ShpTransaction
155
+ tr.delete(0)
156
+ tr.add(ShpRecord.new(Polygon.from_coordinates([[[0,0],[40,0],[40,40],[0,40],[0,0]],[[10,10],[10,20],[20,20],[10,10]]]),'Hello' => "oook"))
157
+ end
158
+
159
+ shpfile.record_count.should eql(1)
160
+
161
+ shpfile.close
162
+ rm_all_shp(File.dirname(__FILE__) + '/../../data/polygon2')
163
+ end
164
+
165
+ it "test_multipoint" do
166
+ cp_all_shp(File.dirname(__FILE__) + '/../../data/multipoint',
167
+ File.dirname(__FILE__) + '/../../data/multipoint2')
168
+ shpfile = ShpFile.open(File.dirname(__FILE__) + '/../../data/multipoint2.shp')
169
+
170
+ shpfile.transaction do |tr|
171
+ tr.should be_instance_of ShpTransaction
172
+ tr.add(ShpRecord.new(MultiPoint.from_coordinates([[45.6,-45.1],[12.4,98.2],[51.2,-0.12],[156.12345,56.109]]),'Hello' => 5,"Hoyoyo" => "AEZAE"))
173
+ end
174
+
175
+ shpfile.record_count.should eql(2)
176
+
177
+ shpfile.close
178
+ rm_all_shp(File.dirname(__FILE__) + '/../../data/multipoint2')
179
+ end
180
+
181
+ it "test_multi_polygon" do
182
+ cp_all_shp(File.dirname(__FILE__) + '/../../data/polygon',
183
+ File.dirname(__FILE__) + '/../../data/polygon4')
184
+
185
+ shpfile = ShpFile.open(File.dirname(__FILE__) + '/../../data/polygon4.shp')
186
+
187
+ shpfile.transaction do |tr|
188
+ tr.should be_instance_of ShpTransaction
189
+ tr.add(ShpRecord.new(MultiPolygon.from_polygons([Polygon.from_coordinates([[[0,0],[40,0],[40,40],[0,40],[0,0]],[[10,10],[10,20],[20,20],[10,10]]])]),'Hello' => "oook"))
190
+ end
191
+
192
+ shpfile.record_count.should eql(2)
193
+
194
+ shpfile.close
195
+
196
+ rm_all_shp(File.dirname(__FILE__) + '/../../data/polygon4')
197
+ end
198
+
199
+ it "test_rollback" do
200
+ cp_all_shp(File.dirname(__FILE__) + '/../../data/polygon',
201
+ File.dirname(__FILE__) + '/../../data/polygon5')
202
+
203
+ shpfile = ShpFile.open(File.dirname(__FILE__) + '/../../data/polygon5.shp')
204
+
205
+ shpfile.transaction do |tr|
206
+ tr.should be_instance_of ShpTransaction
207
+ tr.add(ShpRecord.new(MultiPolygon.from_polygons([Polygon.from_coordinates([[[0,0],[40,0],[40,40],[0,40],[0,0]],[[10,10],[10,20],[20,20],[10,10]]])]),'Hello' => "oook"))
208
+ tr.rollback
209
+ end
210
+ shpfile.record_count.should eql(1)
211
+
212
+ shpfile.close
213
+
214
+ rm_all_shp(File.dirname(__FILE__) + '/../../data/polygon5')
215
+
216
+ end
217
+
218
+ it "test_creation" do
219
+ shpfile = ShpFile.create(File.dirname(__FILE__) + '/../../data/point3.shp',ShpType::POINT,[Dbf::Field.new("Hoyoyo","C",10,0)])
220
+ shpfile.transaction do |tr|
221
+ tr.add(ShpRecord.new(Point.from_x_y(123,123.4),'Hoyoyo' => "HJHJJ"))
222
+ end
223
+ shpfile.record_count.should eql(1)
224
+ shpfile.close
225
+ rm_all_shp(File.dirname(__FILE__) + '/../../data/point3')
226
+ end
227
+
228
+ it "test_creation_multipoint" do
229
+ shpfile = ShpFile.create(File.dirname(__FILE__) + '/../../data/multipoint3.shp',ShpType::MULTIPOINT,[Dbf::Field.new("Hoyoyo","C",10),Dbf::Field.new("Hello","N",10)])
230
+ shpfile.transaction do |tr|
231
+ tr.add(ShpRecord.new(MultiPoint.from_coordinates([[123,123.4],[345,12.2]]),'Hoyoyo' => "HJHJJ","Hello" => 5))
232
+ end
233
+ shpfile.record_count.should eql(1)
234
+ shpfile.close
235
+ rm_all_shp(File.dirname(__FILE__) + '/../../data/multipoint3')
236
+ end
237
+
238
+ end
239
+
240
+ end
@@ -0,0 +1,45 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Envelope do
4
+ before(:each) do
5
+ @env = Envelope.from_points([Point.from_x_y(10,20),Point.from_x_y(20,30)])
6
+ end
7
+
8
+ it "should initialize" do
9
+ @env.should be_instance_of(Envelope)
10
+ end
11
+
12
+ it "converted tu" do
13
+ linear_ring = LinearRing.from_coordinates([[12.4,-45.3],[45.4,41.6],[4.456,1.0698],[12.4,-45.3]],256)
14
+ polygon = Polygon.from_linear_rings([linear_ring],256)
15
+ e = polygon.envelope
16
+
17
+ e.lower_corner.class.should eql(Point)
18
+ e.upper_corner.class.should eql(Point)
19
+
20
+ e.lower_corner.x.should eql(4.456)
21
+ e.lower_corner.y.should eql(-45.3)
22
+ e.upper_corner.x.should eql(45.4)
23
+ e.upper_corner.y.should eql(41.6)
24
+
25
+ line_string = LineString.from_coordinates([[13.6,-49.3],[45.4,44.6],[14.2,1.09],[13.6,-49.3]],256)
26
+ e2 = line_string.envelope
27
+
28
+ e3 = e.extend(e2)
29
+
30
+ e3.lower_corner.x.should eql(4.456)
31
+ e3.lower_corner.y.should eql(-49.3)
32
+ e3.upper_corner.x.should eql(45.4)
33
+ e3.upper_corner.y.should eql(44.6)
34
+ end
35
+
36
+ it "should have a center" do
37
+ @env.center.x.should eql(15)
38
+ @env.center.y.should eql(25)
39
+ end
40
+
41
+ it "should print a kml_representation" do
42
+ @env.as_kml.should eql("<LatLonAltBox>\n<north>30</north>\n<south>20</south>\n<east>20</east>\n<west>10</west>\n</LatLonAltBox>\n")
43
+ end
44
+
45
+ end
@@ -0,0 +1,158 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe EWKBParser do
4
+
5
+ before(:each) do
6
+ @factory = GeometryFactory::new
7
+ @hex_ewkb_parser = HexEWKBParser::new(@factory)
8
+ end
9
+
10
+ it "test_point2d" do
11
+ @hex_ewkb_parser.parse("01010000207B000000CDCCCCCCCCCC28406666666666A64640")
12
+ point = @factory.geometry
13
+ point.should be_instance_of Point
14
+ point.should == Point.from_x_y(12.4,45.3,123)
15
+ end
16
+
17
+ it "test_point2d_BigEndian" do
18
+ @hex_ewkb_parser.parse("00000000014013A035BD512EC7404A3060C38F3669")
19
+ point = @factory.geometry
20
+ point.should be_instance_of Point
21
+ point.should == Point.from_x_y(4.906455,52.377953)
22
+ end
23
+
24
+ it "test_point3dz" do
25
+ @hex_ewkb_parser.parse("01010000A07B000000CDCCCCCCCCCC28406666666666A646400000000000000CC0")
26
+ point = @factory.geometry
27
+ point.should be_instance_of Point
28
+ point.should == Point.from_x_y_z(12.4,45.3,-3.5,123)
29
+ end
30
+
31
+ it "test_point4d" do
32
+ @hex_ewkb_parser.parse("01010000E07B000000CDCCCCCCCCCC28406666666666A646400000000000000CC00000000000002E40")
33
+ point = @factory.geometry
34
+ point.should be_instance_of Point
35
+ point.should == Point.from_x_y_z_m(12.4,45.3,-3.5,15,123)
36
+ end
37
+
38
+ it "test_line_string" do
39
+ @hex_ewkb_parser.parse("01020000200001000002000000CDCCCCCCCCCC28406666666666A646C03333333333B34640CDCCCCCCCCCC4440")
40
+ line_string = @factory.geometry
41
+ line_string.should be_instance_of LineString
42
+ line_string.should == LineString.from_coordinates([[12.4,-45.3],[45.4,41.6]],256)
43
+
44
+ @hex_ewkb_parser.parse("01020000A00001000002000000CDCCCCCCCCCC28406666666666A646C06666666666A641403333333333B34640CDCCCCCCCCCC44409A99999999992840")
45
+ line_string = @factory.geometry
46
+ line_string.should be_instance_of LineString
47
+ line_string.should == LineString.from_coordinates([[12.4,-45.3,35.3],[45.4,41.6,12.3]],256,true)
48
+
49
+ @hex_ewkb_parser.parse("01020000E00001000002000000CDCCCCCCCCCC28406666666666A646C06666666666A64140CDCCCCCCCC8C46403333333333B34640CDCCCCCCCCCC44409A999999999928403D0AD7A3701D4440")
50
+ line_string = @factory.geometry
51
+ line_string.should be_instance_of LineString
52
+ line_string.should == LineString.from_coordinates([[12.4,-45.3,35.3,45.1],[45.4,41.6,12.3,40.23]],256,true,true)
53
+ end
54
+
55
+ it "test_polygon" do
56
+ @hex_ewkb_parser.parse("0103000020000100000200000005000000000000000000000000000000000000000000000000001040000000000000000000000000000010400000000000001040000000000000000000000000000010400000000000000000000000000000000005000000000000000000F03F000000000000F03F0000000000000840000000000000F03F00000000000008400000000000000840000000000000F03F0000000000000840000000000000F03F000000000000F03F")
57
+ polygon = @factory.geometry
58
+ polygon.should be_instance_of Polygon
59
+ polygon.should == Polygon.from_coordinates([[[0,0],[4,0],[4,4],[0,4],[0,0]],[[1,1],[3,1],[3,3],[1,3],[1,1]]],256)
60
+
61
+ @hex_ewkb_parser.parse("01030000A000010000020000000500000000000000000000000000000000000000000000000000004000000000000010400000000000000000000000000000004000000000000010400000000000001040000000000000004000000000000000000000000000001040000000000000004000000000000000000000000000000000000000000000004005000000000000000000F03F000000000000F03F00000000000000400000000000000840000000000000F03F0000000000000040000000000000084000000000000008400000000000000040000000000000F03F00000000000008400000000000000040000000000000F03F000000000000F03F0000000000000040")
62
+ polygon = @factory.geometry
63
+ polygon.should be_instance_of Polygon
64
+ polygon.should == 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)
65
+
66
+ @hex_ewkb_parser.parse("010300006000010000020000000500000000000000000000000000000000000000000000000000004000000000000010400000000000000000000000000000004000000000000010400000000000001040000000000000004000000000000000000000000000001040000000000000004000000000000000000000000000000000000000000000004005000000000000000000F03F000000000000F03F00000000000000400000000000000840000000000000F03F0000000000000040000000000000084000000000000008400000000000000040000000000000F03F00000000000008400000000000000040000000000000F03F000000000000F03F0000000000000040")
67
+ polygon = @factory.geometry
68
+ polygon.should be_instance_of Polygon
69
+ polygon.should == 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)
70
+
71
+ @hex_ewkb_parser.parse("01030000E0000100000200000005000000000000000000000000000000000000000000000000000040CDCCCCCCCC8C46C00000000000001040000000000000000000000000000000400000000000001440000000000000104000000000000010400000000000000040AE47E17A14AE1240000000000000000000000000000010400000000000000040713D0AD7A370F53F000000000000000000000000000000000000000000000040CDCCCCCCCC8C46C005000000000000000000F03F000000000000F03F00000000000000409A999999999928400000000000000840000000000000F03F00000000000000400000000000C05E400000000000000840000000000000084000000000000000406666666666662840000000000000F03F000000000000084000000000000000400000000000002840000000000000F03F000000000000F03F00000000000000409A99999999992840")
72
+ polygon = @factory.geometry
73
+ polygon.should be_instance_of Polygon
74
+ polygon.should == 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)
75
+ end
76
+
77
+ it "test_geometry_collection" do
78
+ @hex_ewkb_parser.parse("010700002000010000020000000101000000AE47E17A14AE12403333333333B34640010200000002000000CDCCCCCCCCCC16406666666666E628403333333333E350400000000000004B40")
79
+ geometry_collection = @factory.geometry
80
+ geometry_collection.should be_instance_of GeometryCollection
81
+
82
+ geometry_collection.should == GeometryCollection.from_geometries([Point.from_x_y(4.67,45.4,256),LineString.from_coordinates([[5.7,12.45],[67.55,54]],256)],256)
83
+ geometry_collection[0].srid.should eql(256)
84
+
85
+ @hex_ewkb_parser.parse("01070000E0000100000200000001010000C0AE47E17A14AE12403333333333B34640F6285C8FC2D54640666666666666024001020000C002000000CDCCCCCCCCCC16406666666666E628403D0AD7A3703D124033333333339358403333333333E350400000000000004B4066666666666628403333333333330B40")
86
+ geometry_collection = @factory.geometry
87
+ geometry_collection.should be_instance_of GeometryCollection
88
+ geometry_collection.should == GeometryCollection.from_geometries([Point.from_x_y_z_m(4.67,45.4,45.67,2.3,256),LineString.from_coordinates([[5.7,12.45,4.56,98.3],[67.55,54,12.2,3.4]],256,true, true)],256,true, true)
89
+ geometry_collection[0].srid.should eql(256)
90
+ end
91
+
92
+ it "test_multi_point" do
93
+ @hex_ewkb_parser.parse("0104000020BC010000030000000101000000CDCCCCCCCCCC28403333333333D35EC0010100000066666666664650C09A99999999D95E4001010000001F97DD388EE35E400000000000C05E40")
94
+ multi_point = @factory.geometry
95
+ multi_point.should be_instance_of MultiPoint
96
+ multi_point.should == MultiPoint.from_coordinates([[12.4,-123.3],[-65.1,123.4],[123.55555555,123]],444)
97
+ multi_point.srid.should eql(444)
98
+ multi_point[0].srid.should eql(444)
99
+
100
+ @hex_ewkb_parser.parse("01040000A0BC010000030000000101000080CDCCCCCCCCCC28403333333333D35EC00000000000001240010100008066666666664650C09A99999999D95E40333333333333F33F01010000801F97DD388EE35E400000000000C05E406666666666660240")
101
+ multi_point = @factory.geometry
102
+ multi_point.should be_instance_of MultiPoint
103
+ multi_point.should == MultiPoint.from_coordinates([[12.4,-123.3,4.5],[-65.1,123.4,1.2],[123.55555555,123,2.3]],444,true)
104
+ multi_point.srid.should eql(444)
105
+ multi_point[0].srid.should eql(444)
106
+ end
107
+
108
+ it "test_multi_line_string" do
109
+ @hex_ewkb_parser.parse("01050000200001000002000000010200000002000000000000000000F83F9A99999999994640E4BD6A65C20F4BC0FA7E6ABC749388BF010200000003000000000000000000F83F9A99999999994640E4BD6A65C20F4BC0FA7E6ABC749388BF39B4C876BE8F46403333333333D35E40")
110
+ multi_line_string = @factory.geometry
111
+ multi_line_string.should be_instance_of MultiLineString
112
+ multi_line_string.should == MultiLineString.from_line_strings([LineString.from_coordinates([[1.5,45.2],[-54.12312,-0.012]],256),LineString.from_coordinates([[1.5,45.2],[-54.12312,-0.012],[45.123,123.3]],256)],256)
113
+ multi_line_string.srid.should eql(256)
114
+ multi_line_string[0].srid.should eql(256)
115
+
116
+ @hex_ewkb_parser.parse("0105000020000100000200000001020000C002000000000000000000F83F9A99999999994640CDCCCCCCCCCCF43F333333333333F33FE4BD6A65C20F4BC0FA7E6ABC749388BF333333333333F33F000000000000124001020000C003000000000000000000F83F9A99999999994640666666666666144000000000000012C0E4BD6A65C20F4BC0FA7E6ABC749388BF3333333333331BC03333333333330B4039B4C876BE8F46403333333333D35E40000000000000124033333333333315C0")
117
+ multi_line_string = @factory.geometry
118
+ multi_line_string.should be_instance_of MultiLineString
119
+ multi_line_string.should == MultiLineString.from_line_strings([LineString.from_coordinates([[1.5,45.2,1.3,1.2],[-54.12312,-0.012,1.2,4.5]],256,true,true),LineString.from_coordinates([[1.5,45.2,5.1,-4.5],[-54.12312,-0.012,-6.8,3.4],[45.123,123.3,4.5,-5.3]],256,true,true)],256,true,true)
120
+ multi_line_string.srid.should eql(256)
121
+ multi_line_string[0].srid.should eql(256)
122
+ end
123
+
124
+ it "test_multi_polygon" do
125
+ @hex_ewkb_parser.parse("0106000020000100000200000001030000000200000004000000CDCCCCCCCCCC28406666666666A646C03333333333B34640CDCCCCCCCCCC44406DE7FBA9F1D211403D2CD49AE61DF13FCDCCCCCCCCCC28406666666666A646C004000000333333333333034033333333333315409A999999999915408A8EE4F21FD2F63FEC51B81E85EB2C40F6285C8FC2F5F03F3333333333330340333333333333154001030000000200000005000000000000000000000000000000000000000000000000001040000000000000000000000000000010400000000000001040000000000000000000000000000010400000000000000000000000000000000005000000000000000000F03F000000000000F03F0000000000000840000000000000F03F00000000000008400000000000000840000000000000F03F0000000000000840000000000000F03F000000000000F03F")
126
+ multi_polygon = @factory.geometry
127
+ multi_polygon.should be_instance_of MultiPolygon
128
+ multi_polygon.should == 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)
129
+ multi_polygon.srid.should eql(256)
130
+ multi_polygon[0].srid.should eql(256)
131
+
132
+ @hex_ewkb_parser.parse("0106000020000100000200000001030000400200000004000000CDCCCCCCCCCC28406666666666A646C0333333333333F33F3333333333B34640CDCCCCCCCCCC4440333333333333F33F6DE7FBA9F1D211403D2CD49AE61DF13F333333333333F33FCDCCCCCCCCCC28406666666666A646C0333333333333F33F0400000033333333333303403333333333331540333333333333F33F9A999999999915408A8EE4F21FD2F63F333333333333F33FEC51B81E85EB2C40F6285C8FC2F5F03F333333333333F33F33333333333303403333333333331540333333333333F33F0103000040020000000500000000000000000000000000000000000000333333333333F33F00000000000010400000000000000000333333333333F33F00000000000010400000000000001040666666666666024000000000000000000000000000001040333333333333F33F00000000000000000000000000000000333333333333F33F05000000000000000000F03F000000000000F03F9A999999999901400000000000000840000000000000F03F6666666666660A40000000000000084000000000000008409A9999999999F13F000000000000F03F00000000000008403333333333330340000000000000F03F000000000000F03F9A99999999990140")
133
+ multi_polygon = @factory.geometry
134
+ multi_polygon.should be_instance_of MultiPolygon
135
+ multi_polygon.should == 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)
136
+ multi_polygon.srid.should eql(256)
137
+ multi_polygon[0].srid.should eql(256)
138
+ end
139
+
140
+
141
+ it "test_failure_trailing_data" do
142
+ #added A345 at the end
143
+ lambda {@hex_ewkb_parser.parse("01010000207B000000CDCCCCCCCCCC28406666666666A64640A345")}.should raise_error(EWKBFormatError)
144
+ end
145
+
146
+ it "test_failure_unknown_geometry_type" do
147
+ lambda {@hex_ewkb_parser.parse("01090000207B000000CDCCCCCCCCCC28406666666666A64640")}.should raise_error(EWKBFormatError)
148
+ end
149
+
150
+ it "test_failure_m" do
151
+ lambda {@hex_ewkb_parser.parse("01010000607B000000CDCCCCCCCCCC28406666666666A64640")}.should raise_error(EWKBFormatError)
152
+ end
153
+
154
+ it "test_failure_truncated_data" do
155
+ lambda {@hex_ewkb_parser.parse("01010000207B000000CDCCCCCCCCCC2840666666")}.should raise_error(EWKBFormatError)
156
+ end
157
+
158
+ end