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.
- data/.gitignore +6 -0
- data/History.txt +4 -0
- data/LICENSE +21 -0
- data/README.txt +118 -0
- data/Rakefile +48 -0
- data/VERSION +1 -0
- data/lib/geo_ruby.rb +22 -0
- data/lib/geo_ruby/gpx.rb +1 -0
- data/lib/geo_ruby/gpx4r/gpx.rb +117 -0
- data/lib/geo_ruby/shp.rb +1 -0
- data/lib/geo_ruby/shp4r/dbf.rb +41 -0
- data/lib/geo_ruby/shp4r/shp.rb +697 -0
- data/lib/geo_ruby/simple_features/envelope.rb +167 -0
- data/lib/geo_ruby/simple_features/ewkb_parser.rb +216 -0
- data/lib/geo_ruby/simple_features/ewkt_parser.rb +336 -0
- data/lib/geo_ruby/simple_features/geometry.rb +228 -0
- data/lib/geo_ruby/simple_features/geometry_collection.rb +136 -0
- data/lib/geo_ruby/simple_features/geometry_factory.rb +81 -0
- data/lib/geo_ruby/simple_features/georss_parser.rb +135 -0
- data/lib/geo_ruby/simple_features/helper.rb +18 -0
- data/lib/geo_ruby/simple_features/line_string.rb +206 -0
- data/lib/geo_ruby/simple_features/linear_ring.rb +12 -0
- data/lib/geo_ruby/simple_features/multi_line_string.rb +51 -0
- data/lib/geo_ruby/simple_features/multi_point.rb +46 -0
- data/lib/geo_ruby/simple_features/multi_polygon.rb +52 -0
- data/lib/geo_ruby/simple_features/point.rb +364 -0
- data/lib/geo_ruby/simple_features/polygon.rb +157 -0
- data/ppe-georuby.gemspec +133 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +82 -0
- data/spec/data/gpx/fells_loop.gpx +1077 -0
- data/spec/data/gpx/long.gpx +1642 -0
- data/spec/data/gpx/long.kml +31590 -0
- data/spec/data/gpx/long.nmea +2220 -0
- data/spec/data/gpx/short.gpx +13634 -0
- data/spec/data/gpx/short.kml +130 -0
- data/spec/data/gpx/tracktreks.gpx +706 -0
- data/spec/data/multipoint.dbf +0 -0
- data/spec/data/multipoint.shp +0 -0
- data/spec/data/multipoint.shx +0 -0
- data/spec/data/point.dbf +0 -0
- data/spec/data/point.shp +0 -0
- data/spec/data/point.shx +0 -0
- data/spec/data/polygon.dbf +0 -0
- data/spec/data/polygon.shp +0 -0
- data/spec/data/polygon.shx +0 -0
- data/spec/data/polyline.dbf +0 -0
- data/spec/data/polyline.shp +0 -0
- data/spec/data/polyline.shx +0 -0
- data/spec/geo_ruby/gpx4r/gpx_spec.rb +106 -0
- data/spec/geo_ruby/shp4r/shp_spec.rb +240 -0
- data/spec/geo_ruby/simple_features/envelope_spec.rb +45 -0
- data/spec/geo_ruby/simple_features/ewkb_parser_spec.rb +158 -0
- data/spec/geo_ruby/simple_features/ewkt_parser_spec.rb +179 -0
- data/spec/geo_ruby/simple_features/geometry_collection_spec.rb +55 -0
- data/spec/geo_ruby/simple_features/geometry_factory_spec.rb +11 -0
- data/spec/geo_ruby/simple_features/geometry_spec.rb +32 -0
- data/spec/geo_ruby/simple_features/georss_parser_spec.rb +218 -0
- data/spec/geo_ruby/simple_features/line_string_spec.rb +245 -0
- data/spec/geo_ruby/simple_features/linear_ring_spec.rb +14 -0
- data/spec/geo_ruby/simple_features/multi_line_string_spec.rb +54 -0
- data/spec/geo_ruby/simple_features/multi_point_spec.rb +35 -0
- data/spec/geo_ruby/simple_features/multi_polygon_spec.rb +50 -0
- data/spec/geo_ruby/simple_features/point_spec.rb +356 -0
- data/spec/geo_ruby/simple_features/polygon_spec.rb +108 -0
- data/spec/geo_ruby_spec.rb +27 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helper.rb +65 -0
- metadata +162 -0
Binary file
|
Binary file
|
Binary file
|
data/spec/data/point.dbf
ADDED
Binary file
|
data/spec/data/point.shp
ADDED
Binary file
|
data/spec/data/point.shx
ADDED
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
|