georuby 2.3.0 → 2.5.1

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -9
  3. data/Rakefile +13 -14
  4. data/lib/geo_ruby/ewk.rb +2 -0
  5. data/lib/geo_ruby/{simple_features → ewk}/ewkb_parser.rb +206 -218
  6. data/lib/geo_ruby/ewk/ewkt_parser.rb +321 -0
  7. data/lib/geo_ruby/geojson.rb +27 -32
  8. data/lib/geo_ruby/georss.rb +88 -66
  9. data/lib/geo_ruby/gpx.rb +113 -1
  10. data/lib/geo_ruby/kml.rb +43 -31
  11. data/lib/geo_ruby/shp.rb +1 -0
  12. data/lib/geo_ruby/shp4r/dbf.rb +7 -3
  13. data/lib/geo_ruby/shp4r/shp.rb +297 -284
  14. data/lib/geo_ruby/simple_features.rb +2 -6
  15. data/lib/geo_ruby/simple_features/circle.rb +15 -13
  16. data/lib/geo_ruby/simple_features/envelope.rb +84 -77
  17. data/lib/geo_ruby/simple_features/geometry.rb +89 -69
  18. data/lib/geo_ruby/simple_features/geometry_collection.rb +46 -43
  19. data/lib/geo_ruby/simple_features/geometry_factory.rb +50 -47
  20. data/lib/geo_ruby/simple_features/helper.rb +14 -14
  21. data/lib/geo_ruby/simple_features/line_string.rb +94 -97
  22. data/lib/geo_ruby/simple_features/linear_ring.rb +4 -9
  23. data/lib/geo_ruby/simple_features/multi_line_string.rb +18 -21
  24. data/lib/geo_ruby/simple_features/multi_point.rb +18 -20
  25. data/lib/geo_ruby/simple_features/multi_polygon.rb +19 -25
  26. data/lib/geo_ruby/simple_features/point.rb +134 -128
  27. data/lib/geo_ruby/simple_features/polygon.rb +60 -59
  28. data/lib/geo_ruby/version.rb +1 -1
  29. data/spec/data/geojson/feature.json +9 -0
  30. data/spec/data/geojson/feature_collection.json +3 -4
  31. data/spec/geo_ruby/{simple_features → ewk}/ewkb_parser_spec.rb +56 -57
  32. data/spec/geo_ruby/{simple_features → ewk}/ewkt_parser_spec.rb +62 -63
  33. data/spec/geo_ruby/geojson_spec.rb +34 -17
  34. data/spec/geo_ruby/georss_spec.rb +76 -64
  35. data/spec/geo_ruby/{gpx4r/gpx_spec.rb → gpx_spec.rb} +25 -25
  36. data/spec/geo_ruby/kml_spec.rb +40 -36
  37. data/spec/geo_ruby/shp4r/shp_spec.rb +51 -51
  38. data/spec/geo_ruby/simple_features/circle_spec.rb +2 -2
  39. data/spec/geo_ruby/simple_features/envelope_spec.rb +8 -8
  40. data/spec/geo_ruby/simple_features/geometry_collection_spec.rb +26 -26
  41. data/spec/geo_ruby/simple_features/geometry_factory_spec.rb +5 -5
  42. data/spec/geo_ruby/simple_features/geometry_spec.rb +8 -8
  43. data/spec/geo_ruby/simple_features/line_string_spec.rb +102 -102
  44. data/spec/geo_ruby/simple_features/linear_ring_spec.rb +7 -7
  45. data/spec/geo_ruby/simple_features/multi_line_string_spec.rb +20 -20
  46. data/spec/geo_ruby/simple_features/multi_point_spec.rb +16 -16
  47. data/spec/geo_ruby/simple_features/multi_polygon_spec.rb +19 -19
  48. data/spec/geo_ruby/simple_features/point_spec.rb +180 -174
  49. data/spec/geo_ruby/simple_features/polygon_spec.rb +55 -56
  50. data/spec/geo_ruby_spec.rb +4 -4
  51. data/spec/spec_helper.rb +19 -13
  52. metadata +10 -9
  53. data/lib/geo_ruby/gpx4r/gpx.rb +0 -118
  54. data/lib/geo_ruby/simple_features/ewkt_parser.rb +0 -336
@@ -1 +1,2 @@
1
1
  require 'geo_ruby/shp4r/shp'
2
+ require 'geo_ruby/shp4r/dbf'
@@ -9,6 +9,7 @@ rescue LoadError
9
9
  end
10
10
 
11
11
  module GeoRuby
12
+ # Ruby .shp files
12
13
  module Shp4r
13
14
  Dbf = DBF
14
15
 
@@ -20,11 +21,12 @@ module GeoRuby
20
21
  end
21
22
 
22
23
  class Field < Column::Base
23
- def initialize(name, type, length, decimal = 0, version=1, encoding=nil)
24
- super(name, type, length, decimal, version, encoding)
24
+ def initialize(name, type, length, decimal = 0, version = 1, enc = nil)
25
+ super(name, type, length, decimal, version, enc)
25
26
  end
26
27
  end
27
28
 
29
+ # Main DBF File Reader
28
30
  class Reader < Table
29
31
  alias_method :fields, :columns
30
32
  def header_length
@@ -35,7 +37,9 @@ module GeoRuby
35
37
  new(f)
36
38
  end
37
39
 
38
- def close(); nil; end
40
+ def close
41
+ nil
42
+ end
39
43
  end
40
44
  end
41
45
  end
@@ -1,12 +1,10 @@
1
1
  require 'date'
2
- require 'fileutils' if !defined?(FileUtils)
3
- require File.dirname(__FILE__) + '/dbf'
4
-
2
+ require 'fileutils' unless defined?(FileUtils)
5
3
 
6
4
  module GeoRuby
7
5
  module Shp4r
8
-
9
- #Enumerates all the types of SHP geometries. The MULTIPATCH one is the only one not currently supported by Geo_ruby.
6
+ # Enumerates all the types of SHP geometries.
7
+ # The MULTIPATCH one is the only one not currently supported by Geo_ruby.
10
8
  module ShpType
11
9
  NULL_SHAPE = 0
12
10
  POINT = 1
@@ -23,33 +21,39 @@ module GeoRuby
23
21
  MULTIPOINTM = 28
24
22
  end
25
23
 
26
- #An interface to an ESRI shapefile (actually 3 files : shp, shx and dbf). Currently supports only the reading of geometries.
24
+ # An interface to an ESRI shapefile (actually 3 files : shp, shx and dbf).
25
+ # Currently supports only the reading of geometries.
27
26
  class ShpFile
28
- attr_reader :shp_type, :record_count, :xmin, :ymin, :xmax, :ymax, :zmin, :zmax, :mmin, :mmax, :file_root, :file_length
27
+ attr_reader :shp_type, :record_count, :xmin, :ymin, :xmax, :ymax,
28
+ :zmin, :zmax, :mmin, :mmax, :file_root, :file_length
29
29
 
30
30
  include Enumerable
31
31
 
32
- #Opens a SHP file. Both "abc.shp" and "abc" are accepted. The files "abc.shp", "abc.shx" and "abc.dbf" must be present
32
+ # Opens a SHP file. Both "abc.shp" and "abc" are accepted.
33
+ # The files "abc.shp", "abc.shx" and "abc.dbf" must be present
33
34
  def initialize(file)
34
- #strip the shp out of the file if present
35
- @file_root = file.gsub(/.shp$/i,"")
36
- #check existence of shp, dbf and shx files
37
- unless File.exists?(@file_root + ".shp") and File.exists?(@file_root + ".dbf") and File.exists?(@file_root + ".shx")
38
- raise MalformedShpException.new("Missing one of shp, dbf or shx for: #{@file}")
35
+ # strip the shp out of the file if present
36
+ @file_root = file.gsub(/.shp$/i, '')
37
+ # check existence of shp, dbf and shx files
38
+ unless File.exist?(@file_root + '.shp') && File.exist?(@file_root + '.dbf') && File.exist?(@file_root + '.shx')
39
+ fail MalformedShpException.new("Missing one of shp, dbf or shx for: #{@file}")
39
40
  end
40
41
 
41
- @dbf = Dbf::Reader.open(@file_root + ".dbf")
42
- @shx = File.open(@file_root + ".shx","rb")
43
- @shp = File.open(@file_root + ".shp","rb")
42
+ @dbf = Dbf::Reader.open(@file_root + '.dbf')
43
+ @shx = File.open(@file_root + '.shx', 'rb')
44
+ @shp = File.open(@file_root + '.shp', 'rb')
44
45
  read_index
45
46
  end
46
47
 
47
- #force the reopening of the files compsing the shp. Close before calling this.
48
+ # force the reopening of the files compsing the shp.
49
+ # Close before calling this.
48
50
  def reload!
49
51
  initialize(@file_root)
50
52
  end
51
53
 
52
- #opens a SHP "file". If a block is given, the ShpFile object is yielded to it and is closed upon return. Else a call to <tt>open</tt> is equivalent to <tt>ShpFile.new(...)</tt>.
54
+ # opens a SHP "file". If a block is given, the ShpFile object
55
+ # is yielded to it and is closed upon return.
56
+ # Else a call to <tt>open</tt> is equivalent to <tt>ShpFile.new(...)</tt>.
53
57
  def self.open(file)
54
58
  shpfile = ShpFile.new(file)
55
59
  if block_given?
@@ -60,40 +64,42 @@ module GeoRuby
60
64
  end
61
65
  end
62
66
 
63
- #create a new Shapefile of the specified shp type (see ShpType) and with the attribute specified in the +fields+ array (see Dbf::Field). If a block is given, the ShpFile object newly created is passed to it.
64
- def self.create(file,shp_type,fields,&proc)
65
- file_root = file.gsub(/.shp$/i,"")
66
- shx_io = File.open(file_root + ".shx","wb")
67
- shp_io = File.open(file_root + ".shp","wb")
68
- dbf_io = File.open(file_root + ".dbf","wb")
69
- str = [9994,0,0,0,0,0,50,1000,shp_type,0,0,0,0,0,0,0,0].pack("N7V2E8")
67
+ # create a new Shapefile of the specified shp type (see ShpType) and
68
+ # with the attribute specified in the +fields+ array (see Dbf::Field).
69
+ # If a block is given, the ShpFile object newly created is passed to it.
70
+ def self.create(file, shp_type, fields, &proc)
71
+ file_root = file.gsub(/.shp$/i, '')
72
+ shx_io = File.open(file_root + '.shx', 'wb')
73
+ shp_io = File.open(file_root + '.shp', 'wb')
74
+ dbf_io = File.open(file_root + '.dbf', 'wb')
75
+ str = [9994, 0, 0, 0, 0, 0, 50, 1000, shp_type, 0, 0, 0, 0, 0, 0, 0, 0].pack('N7V2E8')
70
76
  shp_io << str
71
77
  shx_io << str
72
- rec_length = 1 + fields.inject(0) {|s,f| s + f.length} #+1 for the prefixed space (active record marker)
73
- dbf_io << [3,107,7,7,0,33 + 32 * fields.length,rec_length ].pack("c4Vv2x20") #32 bytes for first part of header
78
+ rec_length = 1 + fields.reduce(0) { |s, f| s + f.length } #+1 for the prefixed space (active record marker)
79
+ dbf_io << [3, 107, 7, 7, 0, 33 + 32 * fields.length, rec_length].pack('c4Vv2x20') # 32 bytes for first part of header
74
80
  fields.each do |field|
75
- dbf_io << [field.name,field.type,field.length,field.decimal].pack("a10xax4CCx14")
81
+ dbf_io << [field.name, field.type, field.length, field.decimal].pack('a10xax4CCx14')
76
82
  end
77
- dbf_io << ['0d'].pack("H2")
83
+ dbf_io << ['0d'].pack('H2')
78
84
 
79
85
  shx_io.close
80
86
  shp_io.close
81
87
  dbf_io.close
82
88
 
83
- open(file,&proc)
84
-
89
+ open(file, &proc)
85
90
  end
86
91
 
87
- #Closes a shapefile
92
+ # Closes a shapefile
88
93
  def close
89
94
  @dbf.close
90
95
  @shx.close
91
96
  @shp.close
92
97
  end
93
98
 
94
- #starts a transaction, to buffer physical file operations on the shapefile components.
99
+ # starts a transaction, to buffer physical file operations
100
+ # on the shapefile components.
95
101
  def transaction
96
- trs = ShpTransaction.new(self,@dbf)
102
+ trs = ShpTransaction.new(self, @dbf)
97
103
  if block_given?
98
104
  answer = yield trs
99
105
  if answer == :rollback
@@ -106,30 +112,30 @@ module GeoRuby
106
112
  end
107
113
  end
108
114
 
109
- #return the description of data fields
115
+ # return the description of data fields
110
116
  def fields
111
117
  @dbf.fields
112
118
  end
113
119
 
114
- #Tests if the file has no record
120
+ # Tests if the file has no record
115
121
  def empty?
116
122
  record_count == 0
117
123
  end
118
124
 
119
- #Goes through each record
125
+ # Goes through each record
120
126
  def each
121
127
  (0...record_count).each do |i|
122
128
  yield get_record(i)
123
129
  end
124
130
  end
125
- alias :each_record :each
131
+ alias_method :each_record, :each
126
132
 
127
- #Returns record +i+
133
+ # Returns record +i+
128
134
  def [](i)
129
135
  get_record(i)
130
136
  end
131
137
 
132
- #Returns all the records
138
+ # Returns all the records
133
139
  def records
134
140
  Array.new(record_count) do |i|
135
141
  get_record(i)
@@ -137,61 +143,64 @@ module GeoRuby
137
143
  end
138
144
 
139
145
  private
146
+
140
147
  def read_index
141
- @file_length, @shp_type, @xmin, @ymin, @xmax, @ymax, @zmin, @zmax, @mmin,@mmax = @shx.read(100).unpack("x24Nx4VE8")
148
+ @file_length, @shp_type, @xmin, @ymin, @xmax, @ymax, @zmin, @zmax, @mmin, @mmax = @shx.read(100).unpack('x24Nx4VE8')
142
149
  @record_count = (@file_length - 50) / 4
143
150
  if @record_count == 0
144
- #initialize the bboxes to default values so if data added, they will be replaced
145
- @xmin, @ymin, @xmax, @ymax, @zmin, @zmax, @mmin,@mmax = Float::MAX, Float::MAX, -Float::MAX, -Float::MAX, Float::MAX, -Float::MAX, Float::MAX, -Float::MAX
151
+ # initialize the bboxes to default values so if data added, they will be replaced
152
+ @xmin, @ymin, @xmax, @ymax, @zmin, @zmax, @mmin, @mmax = Float::MAX, Float::MAX, -Float::MAX, -Float::MAX, Float::MAX, -Float::MAX, Float::MAX, -Float::MAX
146
153
  end
147
154
  unless @record_count == @dbf.record_count
148
- raise MalformedShpException.new("Not the same number of records in SHP and DBF")
155
+ fail MalformedShpException.new('Not the same number of records in SHP and DBF')
149
156
  end
150
157
  end
151
158
 
152
- #TODO : refactor to minimize redundant code
153
- def get_record(i)
154
- return nil if record_count <= i or i < 0
155
- dbf_record = @dbf.record(i)
156
- @shx.seek(100 + 8 * i) #100 is the header length
157
- offset,length = @shx.read(8).unpack("N2")
159
+ # TODO : refactor to minimize redundant code
160
+ def get_record(index)
161
+ return nil if record_count <= index || index < 0
162
+ dbf_record = @dbf.record(index)
163
+ @shx.seek(100 + 8 * index) # 100 is the header length
164
+ offset, length = @shx.read(8).unpack('N2')
158
165
  @shp.seek(offset * 2 + 8)
159
- rec_shp_type = @shp.read(4).unpack("V")[0]
166
+ rec_shp_type = @shp.read(4).unpack('V')[0]
160
167
 
161
- case(rec_shp_type)
168
+ case (rec_shp_type)
162
169
  when ShpType::POINT
163
- x, y = @shp.read(16).unpack("E2")
164
- geometry = GeoRuby::SimpleFeatures::Point.from_x_y(x,y)
165
- when ShpType::POLYLINE #actually creates a multi_polyline
166
- @shp.seek(32,IO::SEEK_CUR) #extent
167
- num_parts, num_points = @shp.read(8).unpack("V2")
168
- parts = @shp.read(num_parts * 4).unpack("V" + num_parts.to_s)
169
- parts << num_points #indexes for LS of idx i go to parts of idx i to idx i +1
170
+ x, y = @shp.read(16).unpack('E2')
171
+ geometry = GeoRuby::SimpleFeatures::Point.from_x_y(x, y)
172
+ when ShpType::POLYLINE # actually creates a multi_polyline
173
+ @shp.seek(32, IO::SEEK_CUR) # extent
174
+ num_parts, num_points = @shp.read(8).unpack('V2')
175
+ parts = @shp.read(num_parts * 4).unpack('V' + num_parts.to_s)
176
+ parts << num_points # indexes for LS of idx i go to parts of idx i to idx i +1
170
177
  points = Array.new(num_points) do
171
- x, y = @shp.read(16).unpack("E2")
172
- GeoRuby::SimpleFeatures::Point.from_x_y(x,y)
178
+ x, y = @shp.read(16).unpack('E2')
179
+ GeoRuby::SimpleFeatures::Point.from_x_y(x, y)
173
180
  end
174
181
  line_strings = Array.new(num_parts) do |i|
175
- GeoRuby::SimpleFeatures::LineString.from_points(points[(parts[i])...(parts[i+1])])
182
+ GeoRuby::SimpleFeatures::LineString.from_points(points[(parts[i])...(parts[i + 1])])
176
183
  end
177
184
  geometry = GeoRuby::SimpleFeatures::MultiLineString.from_line_strings(line_strings)
178
185
  when ShpType::POLYGON
179
- #TODO : TO CORRECT
180
- #does not take into account the possibility that the outer loop could be after the inner loops in the SHP + more than one outer loop
181
- #Still sends back a multi polygon (so the correction above won't change what gets sent back)
182
- @shp.seek(32,IO::SEEK_CUR)
183
- num_parts, num_points = @shp.read(8).unpack("V2")
184
- parts = @shp.read(num_parts * 4).unpack("V" + num_parts.to_s)
185
- parts << num_points #indexes for LS of idx i go to parts of idx i to idx i +1
186
+ # TODO : TO CORRECT
187
+ # does not take into account the possibility that the outer loop could
188
+ # be after the inner loops in the SHP + more than one outer loop
189
+ # Still sends back a multi polygon (so the correction above won't
190
+ # change what gets sent back)
191
+ @shp.seek(32, IO::SEEK_CUR)
192
+ num_parts, num_points = @shp.read(8).unpack('V2')
193
+ parts = @shp.read(num_parts * 4).unpack('V' + num_parts.to_s)
194
+ parts << num_points # indexes for LS of idx i go to parts of idx i to idx i +1
186
195
  points = Array.new(num_points) do
187
- x, y = @shp.read(16).unpack("E2")
188
- GeoRuby::SimpleFeatures::Point.from_x_y(x,y)
196
+ x, y = @shp.read(16).unpack('E2')
197
+ GeoRuby::SimpleFeatures::Point.from_x_y(x, y)
189
198
  end
190
199
  linear_rings = Array.new(num_parts) do |i|
191
- GeoRuby::SimpleFeatures::LinearRing.from_points(points[(parts[i])...(parts[i+1])])
200
+ GeoRuby::SimpleFeatures::LinearRing.from_points(points[(parts[i])...(parts[i + 1])])
192
201
  end
193
202
  # geometry = GeoRuby::SimpleFeatures::MultiPolygon.from_polygons([GeoRuby::SimpleFeatures::Polygon.from_linear_rings(linear_rings)])
194
- outer, inner = linear_rings.partition { |lr| lr.clockwise? }
203
+ outer, inner = linear_rings.partition(&:clockwise?)
195
204
 
196
205
  # Make polygons from the outer rings so we can concatenate
197
206
  # them with inner rings.
@@ -207,216 +216,210 @@ module GeoRuby
207
216
  # TODO - what to do here? technically the geometry is
208
217
  # not well formed (or our above assumption does not
209
218
  # hold).
210
- $stderr.puts "Failed to find polygon for inner ring!"
219
+ $stderr.puts 'Failed to find polygon for inner ring!'
211
220
  end
212
221
  end
213
222
 
214
223
  geometry = GeoRuby::SimpleFeatures::MultiPolygon.from_polygons(outer)
215
224
  when ShpType::MULTIPOINT
216
- @shp.seek(32,IO::SEEK_CUR)
217
- num_points = @shp.read(4).unpack("V")[0]
225
+ @shp.seek(32, IO::SEEK_CUR)
226
+ num_points = @shp.read(4).unpack('V')[0]
218
227
  points = Array.new(num_points) do
219
- x, y = @shp.read(16).unpack("E2")
220
- GeoRuby::SimpleFeatures::Point.from_x_y(x,y)
228
+ x, y = @shp.read(16).unpack('E2')
229
+ GeoRuby::SimpleFeatures::Point.from_x_y(x, y)
221
230
  end
222
231
  geometry = GeoRuby::SimpleFeatures::MultiPoint.from_points(points)
223
232
 
224
-
225
233
  when ShpType::POINTZ
226
- x, y, z, m = @shp.read(24).unpack("E4")
227
- geometry = GeoRuby::SimpleFeatures::Point.from_x_y_z_m(x,y,z,m)
228
-
234
+ x, y, z, m = @shp.read(24).unpack('E4')
235
+ geometry = GeoRuby::SimpleFeatures::Point.from_x_y_z_m(x, y, z, m)
229
236
 
230
237
  when ShpType::POLYLINEZ
231
- @shp.seek(32,IO::SEEK_CUR)
232
- num_parts, num_points = @shp.read(8).unpack("V2")
233
- parts = @shp.read(num_parts * 4).unpack("V" + num_parts.to_s)
234
- parts << num_points #indexes for LS of idx i go to parts of idx i to idx i +1
235
- xys = Array.new(num_points) { @shp.read(16).unpack("E2") }
236
- @shp.seek(16,IO::SEEK_CUR)
237
- zs = Array.new(num_points) {@shp.read(8).unpack("E")[0]}
238
- @shp.seek(16,IO::SEEK_CUR)
239
- ms = Array.new(num_points) {@shp.read(8).unpack("E")[0]}
238
+ @shp.seek(32, IO::SEEK_CUR)
239
+ num_parts, num_points = @shp.read(8).unpack('V2')
240
+ parts = @shp.read(num_parts * 4).unpack('V' + num_parts.to_s)
241
+ parts << num_points # indexes for LS of idx i go to parts of idx i to idx i +1
242
+ xys = Array.new(num_points) { @shp.read(16).unpack('E2') }
243
+ @shp.seek(16, IO::SEEK_CUR)
244
+ zs = Array.new(num_points) { @shp.read(8).unpack('E')[0] }
245
+ @shp.seek(16, IO::SEEK_CUR)
246
+ ms = Array.new(num_points) { @shp.read(8).unpack('E')[0] }
240
247
  points = Array.new(num_points) do |i|
241
- GeoRuby::SimpleFeatures::Point.from_x_y_z_m(xys[i][0],xys[i][1],zs[i],ms[i])
248
+ GeoRuby::SimpleFeatures::Point.from_x_y_z_m(xys[i][0], xys[i][1], zs[i], ms[i])
242
249
  end
243
250
  line_strings = Array.new(num_parts) do |i|
244
- GeoRuby::SimpleFeatures::LineString.from_points(points[(parts[i])...(parts[i+1])],GeoRuby::SimpleFeatures::DEFAULT_SRID,true,true)
251
+ GeoRuby::SimpleFeatures::LineString.from_points(points[(parts[i])...(parts[i + 1])], GeoRuby::SimpleFeatures::DEFAULT_SRID, true, true)
245
252
  end
246
- geometry = GeoRuby::SimpleFeatures::MultiLineString.from_line_strings(line_strings,GeoRuby::SimpleFeatures::DEFAULT_SRID,true,true)
247
-
253
+ geometry = GeoRuby::SimpleFeatures::MultiLineString.from_line_strings(line_strings, GeoRuby::SimpleFeatures::DEFAULT_SRID, true, true)
248
254
 
249
255
  when ShpType::POLYGONZ
250
- #TODO : CORRECT
251
-
252
- @shp.seek(32,IO::SEEK_CUR)#extent
253
- num_parts, num_points = @shp.read(8).unpack("V2")
254
- parts = @shp.read(num_parts * 4).unpack("V" + num_parts.to_s)
255
- parts << num_points #indexes for LS of idx i go to parts of idx i to idx i +1
256
- xys = Array.new(num_points) { @shp.read(16).unpack("E2") }
257
- @shp.seek(16,IO::SEEK_CUR)#extent
258
- zs = Array.new(num_points) {@shp.read(8).unpack("E")[0]}
259
- @shp.seek(16,IO::SEEK_CUR)#extent
260
- ms = Array.new(num_points) {@shp.read(8).unpack("E")[0]}
256
+ # TODO : CORRECT
257
+
258
+ @shp.seek(32, IO::SEEK_CUR) # extent
259
+ num_parts, num_points = @shp.read(8).unpack('V2')
260
+ parts = @shp.read(num_parts * 4).unpack('V' + num_parts.to_s)
261
+ parts << num_points # indexes for LS of idx i go to parts of idx i to idx i +1
262
+ xys = Array.new(num_points) { @shp.read(16).unpack('E2') }
263
+ @shp.seek(16, IO::SEEK_CUR) # extent
264
+ zs = Array.new(num_points) { @shp.read(8).unpack('E')[0] }
265
+ @shp.seek(16, IO::SEEK_CUR) # extent
266
+ ms = Array.new(num_points) { @shp.read(8).unpack('E')[0] }
261
267
  points = Array.new(num_points) do |i|
262
- GeoRuby::SimpleFeatures::Point.from_x_y_z_m(xys[i][0],xys[i][1],zs[i],ms[i])
268
+ GeoRuby::SimpleFeatures::Point.from_x_y_z_m(xys[i][0], xys[i][1], zs[i], ms[i])
263
269
  end
264
270
  linear_rings = Array.new(num_parts) do |i|
265
- GeoRuby::SimpleFeatures::LinearRing.from_points(points[(parts[i])...(parts[i+1])],GeoRuby::SimpleFeatures::DEFAULT_SRID,true,true)
271
+ GeoRuby::SimpleFeatures::LinearRing.from_points(points[(parts[i])...(parts[i + 1])], GeoRuby::SimpleFeatures::DEFAULT_SRID, true, true)
266
272
  end
267
- geometry = GeoRuby::SimpleFeatures::MultiPolygon.from_polygons([GeoRuby::SimpleFeatures::Polygon.from_linear_rings(linear_rings)],GeoRuby::SimpleFeatures::DEFAULT_SRID,true,true)
268
-
273
+ geometry = GeoRuby::SimpleFeatures::MultiPolygon.from_polygons([GeoRuby::SimpleFeatures::Polygon.from_linear_rings(linear_rings)], GeoRuby::SimpleFeatures::DEFAULT_SRID, true, true)
269
274
 
270
275
  when ShpType::MULTIPOINTZ
271
- @shp.seek(32,IO::SEEK_CUR)
272
- num_points = @shp.read(4).unpack("V")[0]
273
- xys = Array.new(num_points) { @shp.read(16).unpack("E2") }
274
- @shp.seek(16,IO::SEEK_CUR)
275
- zs = Array.new(num_points) {@shp.read(8).unpack("E")[0]}
276
- @shp.seek(16,IO::SEEK_CUR)
277
- ms = Array.new(num_points) {@shp.read(8).unpack("E")[0]}
276
+ @shp.seek(32, IO::SEEK_CUR)
277
+ num_points = @shp.read(4).unpack('V')[0]
278
+ xys = Array.new(num_points) { @shp.read(16).unpack('E2') }
279
+ @shp.seek(16, IO::SEEK_CUR)
280
+ zs = Array.new(num_points) { @shp.read(8).unpack('E')[0] }
281
+ @shp.seek(16, IO::SEEK_CUR)
282
+ ms = Array.new(num_points) { @shp.read(8).unpack('E')[0] }
278
283
 
279
284
  points = Array.new(num_points) do |i|
280
- GeoRuby::SimpleFeatures::Point.from_x_y_z_m(xys[i][0],xys[i][1],zs[i],ms[i])
285
+ GeoRuby::SimpleFeatures::Point.from_x_y_z_m(xys[i][0], xys[i][1], zs[i], ms[i])
281
286
  end
282
287
 
283
- geometry = GeoRuby::SimpleFeatures::MultiPoint.from_points(points,GeoRuby::SimpleFeatures::DEFAULT_SRID,true,true)
288
+ geometry = GeoRuby::SimpleFeatures::MultiPoint.from_points(points, GeoRuby::SimpleFeatures::DEFAULT_SRID, true, true)
284
289
 
285
290
  when ShpType::POINTM
286
- x, y, m = @shp.read(24).unpack("E3")
287
- geometry = GeoRuby::SimpleFeatures::Point.from_x_y_m(x,y,m)
291
+ x, y, m = @shp.read(24).unpack('E3')
292
+ geometry = GeoRuby::SimpleFeatures::Point.from_x_y_m(x, y, m)
288
293
 
289
294
  when ShpType::POLYLINEM
290
- @shp.seek(32,IO::SEEK_CUR)
291
- num_parts, num_points = @shp.read(8).unpack("V2")
292
- parts = @shp.read(num_parts * 4).unpack("V" + num_parts.to_s)
293
- parts << num_points #indexes for LS of idx i go to parts of idx i to idx i +1
294
- xys = Array.new(num_points) { @shp.read(16).unpack("E2") }
295
- @shp.seek(16,IO::SEEK_CUR)
296
- ms = Array.new(num_points) {@shp.read(8).unpack("E")[0]}
295
+ @shp.seek(32, IO::SEEK_CUR)
296
+ num_parts, num_points = @shp.read(8).unpack('V2')
297
+ parts = @shp.read(num_parts * 4).unpack('V' + num_parts.to_s)
298
+ parts << num_points # indexes for LS of idx i go to parts of idx i to idx i +1
299
+ xys = Array.new(num_points) { @shp.read(16).unpack('E2') }
300
+ @shp.seek(16, IO::SEEK_CUR)
301
+ ms = Array.new(num_points) { @shp.read(8).unpack('E')[0] }
297
302
  points = Array.new(num_points) do |i|
298
- GeoRuby::SimpleFeatures::Point.from_x_y_m(xys[i][0],xys[i][1],ms[i])
303
+ GeoRuby::SimpleFeatures::Point.from_x_y_m(xys[i][0], xys[i][1], ms[i])
299
304
  end
300
305
  line_strings = Array.new(num_parts) do |i|
301
- GeoRuby::SimpleFeatures::LineString.from_points(points[(parts[i])...(parts[i+1])],GeoRuby::SimpleFeatures::DEFAULT_SRID,false,true)
306
+ GeoRuby::SimpleFeatures::LineString.from_points(points[(parts[i])...(parts[i + 1])], GeoRuby::SimpleFeatures::DEFAULT_SRID, false, true)
302
307
  end
303
- geometry = GeoRuby::SimpleFeatures::MultiLineString.from_line_strings(line_strings,GeoRuby::SimpleFeatures::DEFAULT_SRID,false,true)
304
-
308
+ geometry = GeoRuby::SimpleFeatures::MultiLineString.from_line_strings(line_strings, GeoRuby::SimpleFeatures::DEFAULT_SRID, false, true)
305
309
 
306
310
  when ShpType::POLYGONM
307
- #TODO : CORRECT
308
-
309
- @shp.seek(32,IO::SEEK_CUR)
310
- num_parts, num_points = @shp.read(8).unpack("V2")
311
- parts = @shp.read(num_parts * 4).unpack("V" + num_parts.to_s)
312
- parts << num_points #indexes for LS of idx i go to parts of idx i to idx i +1
313
- xys = Array.new(num_points) { @shp.read(16).unpack("E2") }
314
- @shp.seek(16,IO::SEEK_CUR)
315
- ms = Array.new(num_points) {@shp.read(8).unpack("E")[0]}
311
+ # TODO : CORRECT
312
+
313
+ @shp.seek(32, IO::SEEK_CUR)
314
+ num_parts, num_points = @shp.read(8).unpack('V2')
315
+ parts = @shp.read(num_parts * 4).unpack('V' + num_parts.to_s)
316
+ parts << num_points # indexes for LS of idx i go to parts of idx i to idx i +1
317
+ xys = Array.new(num_points) { @shp.read(16).unpack('E2') }
318
+ @shp.seek(16, IO::SEEK_CUR)
319
+ ms = Array.new(num_points) { @shp.read(8).unpack('E')[0] }
316
320
  points = Array.new(num_points) do |i|
317
- GeoRuby::SimpleFeatures::Point.from_x_y_m(xys[i][0],xys[i][1],ms[i])
321
+ GeoRuby::SimpleFeatures::Point.from_x_y_m(xys[i][0], xys[i][1], ms[i])
318
322
  end
319
323
  linear_rings = Array.new(num_parts) do |i|
320
- GeoRuby::SimpleFeatures::LinearRing.from_points(points[(parts[i])...(parts[i+1])],GeoRuby::SimpleFeatures::DEFAULT_SRID,false,true)
324
+ GeoRuby::SimpleFeatures::LinearRing.from_points(points[(parts[i])...(parts[i + 1])], GeoRuby::SimpleFeatures::DEFAULT_SRID, false, true)
321
325
  end
322
- geometry = GeoRuby::SimpleFeatures::MultiPolygon.from_polygons([GeoRuby::SimpleFeatures::Polygon.from_linear_rings(linear_rings)],GeoRuby::SimpleFeatures::DEFAULT_SRID,false,true)
323
-
326
+ geometry = GeoRuby::SimpleFeatures::MultiPolygon.from_polygons([GeoRuby::SimpleFeatures::Polygon.from_linear_rings(linear_rings)], GeoRuby::SimpleFeatures::DEFAULT_SRID, false, true)
324
327
 
325
328
  when ShpType::MULTIPOINTM
326
- @shp.seek(32,IO::SEEK_CUR)
327
- num_points = @shp.read(4).unpack("V")[0]
328
- xys = Array.new(num_points) { @shp.read(16).unpack("E2") }
329
- @shp.seek(16,IO::SEEK_CUR)
330
- ms = Array.new(num_points) {@shp.read(8).unpack("E")[0]}
329
+ @shp.seek(32, IO::SEEK_CUR)
330
+ num_points = @shp.read(4).unpack('V')[0]
331
+ xys = Array.new(num_points) { @shp.read(16).unpack('E2') }
332
+ @shp.seek(16, IO::SEEK_CUR)
333
+ ms = Array.new(num_points) { @shp.read(8).unpack('E')[0] }
331
334
 
332
335
  points = Array.new(num_points) do |i|
333
- GeoRuby::SimpleFeatures::Point.from_x_y_m(xys[i][0],xys[i][1],ms[i])
336
+ GeoRuby::SimpleFeatures::Point.from_x_y_m(xys[i][0], xys[i][1], ms[i])
334
337
  end
335
338
 
336
- geometry = GeoRuby::SimpleFeatures::MultiPoint.from_points(points,GeoRuby::SimpleFeatures::DEFAULT_SRID,false,true)
339
+ geometry = GeoRuby::SimpleFeatures::MultiPoint.from_points(points, GeoRuby::SimpleFeatures::DEFAULT_SRID, false, true)
337
340
  else
338
341
  geometry = nil
339
342
  end
340
343
 
341
- ShpRecord.new(geometry,dbf_record)
344
+ ShpRecord.new(geometry, dbf_record)
342
345
  end
343
346
  end
344
347
 
345
- #A SHP record : contains both the geometry and the data fields (from the DBF)
348
+ # A SHP record : contains both the geometry and the data fields (from the DBF)
346
349
  class ShpRecord
347
- attr_reader :geometry , :data
350
+ attr_reader :geometry, :data
348
351
 
349
352
  def initialize(geometry, data)
350
353
  @geometry = geometry
351
354
  @data = data
352
355
  end
353
356
 
354
- #Tests if the geometry is a NULL SHAPE
357
+ # Tests if the geometry is a NULL SHAPE
355
358
  def has_null_shape?
356
359
  @geometry.nil?
357
360
  end
358
361
  end
359
362
 
360
- #An object returned from ShpFile#transaction. Buffers updates to a Shapefile
363
+ # An object returned from ShpFile#transaction. Buffers updates to a Shapefile
361
364
  class ShpTransaction
362
365
  attr_reader :rollbacked
363
366
 
364
367
  def initialize(shp, dbf)
365
- @deleted = Hash.new
366
- @added = Array.new
368
+ @deleted = {}
369
+ @added = []
367
370
  @shp = shp
368
371
  @dbf = dbf
369
372
  end
370
373
 
371
- #delete a record. Does not take into account the records added in the current transaction
374
+ # delete a record. Does not take into account the records added in the current transaction
372
375
  def delete(i)
373
- raise UnexistantRecordException.new("Invalid index : #{i}") if @shp.record_count <= i
376
+ fail UnexistantRecordException.new("Invalid index : #{i}") if @shp.record_count <= i
374
377
  @deleted[i] = true
375
378
  end
376
379
 
377
- #Update a record. In effect just a delete followed by an add.
380
+ # Update a record. In effect just a delete followed by an add.
378
381
  def update(i, record)
379
382
  delete(i)
380
383
  add(record)
381
384
  end
382
385
 
383
- #add a ShpRecord at the end
386
+ # add a ShpRecord at the end
384
387
  def add(record)
385
388
  record_type = to_shp_type(record.geometry)
386
- raise IncompatibleGeometryException.new("Incompatible type") unless record_type==@shp.shp_type
389
+ fail IncompatibleGeometryException.new('Incompatible type') unless record_type == @shp.shp_type
387
390
  @added << record
388
391
  end
389
392
 
390
- #updates the physical files
393
+ # updates the physical files
391
394
  def commit
392
395
  @shp.close
393
- @shp_r = open(@shp.file_root + ".shp", "rb")
394
- @dbf_r = open(@shp.file_root + ".dbf", "rb")
395
- @shp_io = open(@shp.file_root + ".shp.tmp.shp", "wb")
396
- @shx_io = open(@shp.file_root + ".shx.tmp.shx", "wb")
397
- @dbf_io = open(@shp.file_root + ".dbf.tmp.dbf", "wb")
396
+ @shp_r = open(@shp.file_root + '.shp', 'rb')
397
+ @dbf_r = open(@shp.file_root + '.dbf', 'rb')
398
+ @shp_io = open(@shp.file_root + '.shp.tmp.shp', 'wb')
399
+ @shx_io = open(@shp.file_root + '.shx.tmp.shx', 'wb')
400
+ @dbf_io = open(@shp.file_root + '.dbf.tmp.dbf', 'wb')
398
401
  index = commit_delete
399
- min_x,max_x,min_y,max_y,min_z,max_z,min_m,max_m = commit_add(index)
400
- commit_finalize(min_x,max_x,min_y,max_y,min_z,max_z,min_m,max_m)
402
+ min_x, max_x, min_y, max_y, min_z, max_z, min_m, max_m = commit_add(index)
403
+ commit_finalize(min_x, max_x, min_y, max_y, min_z, max_z, min_m, max_m)
401
404
  @shp_r.close
402
405
  @dbf_r.close
403
406
  @dbf_io.close
404
407
  @shp_io.close
405
408
  @shx_io.close
406
- FileUtils.move(@shp.file_root + ".shp.tmp.shp", @shp.file_root + ".shp")
407
- FileUtils.move(@shp.file_root + ".shx.tmp.shx", @shp.file_root + ".shx")
408
- FileUtils.move(@shp.file_root + ".dbf.tmp.dbf", @shp.file_root + ".dbf")
409
+ FileUtils.move(@shp.file_root + '.shp.tmp.shp', @shp.file_root + '.shp')
410
+ FileUtils.move(@shp.file_root + '.shx.tmp.shx', @shp.file_root + '.shx')
411
+ FileUtils.move(@shp.file_root + '.dbf.tmp.dbf', @shp.file_root + '.dbf')
409
412
 
410
- @deleted = Hash.new
411
- @added = Array.new
413
+ @deleted = {}
414
+ @added = []
412
415
 
413
416
  @shp.reload!
414
417
  end
415
418
 
416
- #prevents the udpate from taking place
419
+ # prevents the udpate from taking place
417
420
  def rollback
418
- @deleted = Hash.new
419
- @added = Array.new
421
+ @deleted = {}
422
+ @added = []
420
423
  @rollbacked = true
421
424
  end
422
425
 
@@ -424,47 +427,47 @@ module GeoRuby
424
427
 
425
428
  def to_shp_type(geom)
426
429
  root = if geom.is_a? GeoRuby::SimpleFeatures::Point
427
- "POINT"
430
+ 'POINT'
428
431
  elsif geom.is_a? GeoRuby::SimpleFeatures::LineString
429
- "POLYLINE"
430
- elsif geom.is_a? GeoRuby::SimpleFeatures::Polygon
431
- "POLYGON"
432
- elsif geom.is_a? GeoRuby::SimpleFeatures::MultiPoint
433
- "MULTIPOINT"
434
- elsif geom.is_a? GeoRuby::SimpleFeatures::MultiLineString
435
- "POLYLINE"
436
- elsif geom.is_a? GeoRuby::SimpleFeatures::MultiPolygon
437
- "POLYGON"
432
+ 'POLYLINE'
433
+ elsif geom.is_a? GeoRuby::SimpleFeatures::Polygon
434
+ 'POLYGON'
435
+ elsif geom.is_a? GeoRuby::SimpleFeatures::MultiPoint
436
+ 'MULTIPOINT'
437
+ elsif geom.is_a? GeoRuby::SimpleFeatures::MultiLineString
438
+ 'POLYLINE'
439
+ elsif geom.is_a? GeoRuby::SimpleFeatures::MultiPolygon
440
+ 'POLYGON'
438
441
  else
439
442
  false
440
443
  end
441
- return false if !root
444
+ return false unless root
442
445
 
443
446
  if geom.with_z
444
- root = root + "Z"
447
+ root = root + 'Z'
445
448
  elsif geom.with_m
446
- root = root + "M"
449
+ root = root + 'M'
447
450
  end
448
- eval "ShpType::" + root
451
+ eval 'ShpType::' + root
449
452
  end
450
453
 
451
454
  def commit_add(index)
452
- max_x, min_x, max_y, min_y,max_z,min_z,max_m,min_m = @shp.xmax,@shp.xmin,@shp.ymax,@shp.ymin,@shp.zmax,@shp.zmin,@shp.mmax,@shp.mmin
455
+ max_x, min_x, max_y, min_y, max_z, min_z, max_m, min_m = @shp.xmax, @shp.xmin, @shp.ymax, @shp.ymin, @shp.zmax, @shp.zmin, @shp.mmax, @shp.mmin
453
456
  @added.each do |record|
454
457
  @dbf_io << ['20'].pack('H2')
455
458
  @dbf.fields.each do |field|
456
459
  data = record.data[field.name]
457
460
  str = if field.type == 'D'
458
- sprintf("%04i%02i%02i",data.year,data.month,data.mday)
461
+ sprintf('%04i%02i%02i', data.year, data.month, data.mday)
459
462
  elsif field.type == 'L'
460
- data ? "T" : "F"
463
+ data ? 'T' : 'F'
461
464
  else
462
465
  data.to_s
463
466
  end
464
467
  @dbf_io << [str].pack("A#{field.length}")
465
468
  end
466
469
 
467
- shp_str,min_xp,max_xp,min_yp,max_yp,min_zp,max_zp,min_mp,max_mp = build_shp_geometry(record.geometry)
470
+ shp_str, min_xp, max_xp, min_yp, max_yp, min_zp, max_zp, min_mp, max_mp = build_shp_geometry(record.geometry)
468
471
  max_x = max_xp if max_xp > max_x
469
472
  min_x = min_xp if min_xp < min_x
470
473
  max_y = max_yp if max_yp > max_y
@@ -473,16 +476,16 @@ module GeoRuby
473
476
  min_z = min_zp if min_zp < min_z
474
477
  max_m = max_mp if max_mp > max_m
475
478
  min_m = min_mp if min_mp < min_m
476
- length = (shp_str.length/2 + 2).to_i #num of 16-bit words; geom type is included (+2)
477
- @shx_io << [(@shp_io.pos/2).to_i,length].pack("N2")
478
- @shp_io << [index,length,@shp.shp_type].pack("N2V")
479
+ length = (shp_str.length / 2 + 2).to_i # num of 16-bit words; geom type is included (+2)
480
+ @shx_io << [(@shp_io.pos / 2).to_i, length].pack('N2')
481
+ @shp_io << [index, length, @shp.shp_type].pack('N2V')
479
482
  @shp_io << shp_str
480
483
  index += 1
481
484
  end
482
485
  @shp_io.flush
483
486
  @shx_io.flush
484
487
  @dbf_io.flush
485
- [min_x,max_x,min_y,max_y,min_z,max_z,min_m,max_m]
488
+ [min_x, max_x, min_y, max_y, min_z, max_z, min_m, max_m]
486
489
  end
487
490
 
488
491
  def commit_delete
@@ -491,15 +494,15 @@ module GeoRuby
491
494
  @shp_io << header
492
495
  @shx_io << header
493
496
  index = 1
494
- while(!@shp_r.eof?)
495
- icur,length = @shp_r.read(8).unpack("N2")
496
- unless(@deleted[icur-1])
497
- @shx_io << [(@shp_io.pos/2).to_i,length].pack("N2")
498
- @shp_io << [index,length].pack("N2")
497
+ until @shp_r.eof?
498
+ icur, length = @shp_r.read(8).unpack('N2')
499
+ unless @deleted[icur - 1]
500
+ @shx_io << [(@shp_io.pos / 2).to_i, length].pack('N2')
501
+ @shp_io << [index, length].pack('N2')
499
502
  @shp_io << @shp_r.read(length * 2)
500
503
  index += 1
501
504
  else
502
- @shp_r.seek(length * 2,IO::SEEK_CUR)
505
+ @shp_r.seek(length * 2, IO::SEEK_CUR)
503
506
  end
504
507
  end
505
508
  @shp_io.flush
@@ -508,11 +511,11 @@ module GeoRuby
508
511
  @dbf_r.rewind
509
512
  @dbf_io << @dbf_r.read(@dbf.header_length)
510
513
  icur = 0
511
- while(!@dbf_r.eof?)
512
- unless(@deleted[icur])
514
+ until @dbf_r.eof?
515
+ unless @deleted[icur]
513
516
  @dbf_io << @dbf_r.read(@dbf.record_length)
514
517
  else
515
- @dbf_r.seek(@dbf.record_length,IO::SEEK_CUR)
518
+ @dbf_r.seek(@dbf.record_length, IO::SEEK_CUR)
516
519
  end
517
520
  icur += 1
518
521
  end
@@ -520,24 +523,24 @@ module GeoRuby
520
523
  index
521
524
  end
522
525
 
523
- def commit_finalize(min_x,max_x,min_y,max_y,min_z,max_z,min_m,max_m)
524
- #update size in shp and dbf + extent and num records in dbf
525
- @shp_io.seek(0,IO::SEEK_END)
526
+ def commit_finalize(min_x, max_x, min_y, max_y, min_z, max_z, min_m, max_m)
527
+ # update size in shp and dbf + extent and num records in dbf
528
+ @shp_io.seek(0, IO::SEEK_END)
526
529
  shp_size = @shp_io.pos / 2
527
- @shx_io.seek(0,IO::SEEK_END)
528
- shx_size= @shx_io.pos / 2
530
+ @shx_io.seek(0, IO::SEEK_END)
531
+ shx_size = @shx_io.pos / 2
529
532
  @shp_io.seek(24)
530
- @shp_io.write([shp_size].pack("N"))
533
+ @shp_io.write([shp_size].pack('N'))
531
534
  @shx_io.seek(24)
532
- @shx_io.write([shx_size].pack("N"))
535
+ @shx_io.write([shx_size].pack('N'))
533
536
  @shp_io.seek(36)
534
537
  @shx_io.seek(36)
535
- str = [min_x,min_y,max_x,max_y,min_z,max_z,min_m,max_m].pack("E8")
538
+ str = [min_x, min_y, max_x, max_y, min_z, max_z, min_m, max_m].pack('E8')
536
539
  @shp_io.write(str)
537
540
  @shx_io.write(str)
538
541
 
539
542
  @dbf_io.seek(4)
540
- @dbf_io.write([@dbf.record_count + @added.length - @deleted.length].pack("V"))
543
+ @dbf_io.write([@dbf.record_count + @added.length - @deleted.length].pack('V'))
541
544
  end
542
545
 
543
546
  def build_shp_geometry(geometry)
@@ -546,119 +549,129 @@ module GeoRuby
546
549
  case @shp.shp_type
547
550
  when ShpType::POINT
548
551
  bbox = geometry.bounding_box
549
- [geometry.x,geometry.y].pack("E2")
552
+ [geometry.x, geometry.y].pack('E2')
550
553
  when ShpType::POLYLINE
551
- str,bbox = create_bbox(geometry)
552
- build_polyline(geometry,str)
554
+ str, bbox = create_bbox(geometry)
555
+ build_polyline(geometry, str)
553
556
  when ShpType::POLYGON
554
- str,bbox = create_bbox(geometry)
555
- build_polygon(geometry,str)
557
+ str, bbox = create_bbox(geometry)
558
+ build_polygon(geometry, str)
556
559
  when ShpType::MULTIPOINT
557
- str,bbox = create_bbox(geometry)
558
- build_multi_point(geometry,str)
560
+ str, bbox = create_bbox(geometry)
561
+ build_multi_point(geometry, str)
559
562
  when ShpType::POINTZ
560
563
  bbox = geometry.bounding_box
561
- [geometry.x,geometry.y,geometry.z,geometry.m].pack("E4")
564
+ [geometry.x, geometry.y, geometry.z, geometry.m].pack('E4')
562
565
  when ShpType::POLYLINEZ
563
- str,bbox = create_bbox(geometry)
566
+ str, bbox = create_bbox(geometry)
564
567
  m_range = geometry.m_range
565
- build_polyline(geometry,str)
566
- build_polyline_zm(geometry,:@z,[bbox[0].z,bbox[1].z],str)
567
- build_polyline_zm(geometry,:@m,m_range,str)
568
+ build_polyline(geometry, str)
569
+ build_polyline_zm(geometry, :@z, [bbox[0].z, bbox[1].z], str)
570
+ build_polyline_zm(geometry, :@m, m_range, str)
568
571
  when ShpType::POLYGONZ
569
- str,bbox = create_bbox(geometry)
572
+ str, bbox = create_bbox(geometry)
570
573
  m_range = geometry.m_range
571
- build_polygon(geometry,str)
572
- build_polygon_zm(geometry,:@z,[bbox[0].z,bbox[1].z],str)
573
- build_polygon_zm(geometry,:@m,m_range,str)
574
+ build_polygon(geometry, str)
575
+ build_polygon_zm(geometry, :@z, [bbox[0].z, bbox[1].z], str)
576
+ build_polygon_zm(geometry, :@m, m_range, str)
574
577
  when ShpType::MULTIPOINTZ
575
- str,bbox = create_bbox(geometry)
578
+ str, bbox = create_bbox(geometry)
576
579
  m_range = geometry.m_range
577
- build_multi_point(geometry,str)
578
- build_multi_point_zm(geometry,:@z,[bbox[0].z,bbox[1].z],str)
579
- build_multi_point_zm(geometry,:@m,m_range,str)
580
+ build_multi_point(geometry, str)
581
+ build_multi_point_zm(geometry, :@z, [bbox[0].z, bbox[1].z], str)
582
+ build_multi_point_zm(geometry, :@m, m_range, str)
580
583
  when ShpType::POINTM
581
584
  bbox = geometry.bounding_box
582
- [geometry.x,geometry.y,geometry.m].pack("E3")
585
+ [geometry.x, geometry.y, geometry.m].pack('E3')
583
586
  when ShpType::POLYLINEM
584
- str,bbox = create_bbox(geometry)
587
+ str, bbox = create_bbox(geometry)
585
588
  m_range = geometry.m_range
586
- build_polyline(geometry,str)
587
- build_polyline_zm(geometry,:@m,m_range,str)
589
+ build_polyline(geometry, str)
590
+ build_polyline_zm(geometry, :@m, m_range, str)
588
591
  when ShpType::POLYGONM
589
- str,bbox = create_bbox(geometry)
592
+ str, bbox = create_bbox(geometry)
590
593
  m_range = geometry.m_range
591
- build_polygon(geometry,str)
592
- build_polygon_zm(geometry,:@m,m_range,str)
594
+ build_polygon(geometry, str)
595
+ build_polygon_zm(geometry, :@m, m_range, str)
593
596
  when ShpType::MULTIPOINTM
594
- str,bbox = create_bbox(geometry)
597
+ str, bbox = create_bbox(geometry)
595
598
  m_range = geometry.m_range
596
- build_multi_point(geometry,str)
597
- build_multi_point_zm(geometry,:@m,m_range,str)
599
+ build_multi_point(geometry, str)
600
+ build_multi_point_zm(geometry, :@m, m_range, str)
598
601
  end
599
- m_range ||= [0,0]
600
- [answer,bbox[0].x,bbox[1].x,bbox[0].y,bbox[1].y,bbox[0].z || 0, bbox[1].z || 0, m_range[0], m_range[1]]
602
+ m_range ||= [0, 0]
603
+ [answer, bbox[0].x, bbox[1].x, bbox[0].y, bbox[1].y, bbox[0].z || 0, bbox[1].z || 0, m_range[0], m_range[1]]
601
604
  end
602
605
 
603
606
  def create_bbox(geometry)
604
607
  bbox = geometry.bounding_box
605
- [[bbox[0].x,bbox[0].y,bbox[1].x,bbox[1].y].pack("E4"),bbox]
608
+ [[bbox[0].x, bbox[0].y, bbox[1].x, bbox[1].y].pack('E4'), bbox]
606
609
  end
607
610
 
608
- def build_polyline(geometry,str)
611
+ def build_polyline(geometry, str)
609
612
  if geometry.is_a? GeoRuby::SimpleFeatures::LineString
610
- str << [1,geometry.length,0].pack("V3")
613
+ str << [1, geometry.length, 0].pack('V3')
611
614
  geometry.each do |point|
612
- str << [point.x,point.y].pack("E2")
615
+ str << [point.x, point.y].pack('E2')
613
616
  end
614
617
  else
615
- #multilinestring
616
- str << [geometry.length,geometry.inject(0) {|l, ls| l + ls.length}].pack("V2")
617
- str << geometry.inject([0]) {|a,ls| a << (a.last + ls.length)}.pack("V#{geometry.length}") #last element of the previous array is dropped
618
+ # multilinestring
619
+ str << [geometry.length, geometry.reduce(0) { |a, e| a + e.length }].pack('V2')
620
+ str << geometry.reduce([0]) do |a, e|
621
+ a << (a.last + e.length) # last element of the previous array is dropped
622
+ end.pack("V#{geometry.length}")
618
623
  geometry.each do |ls|
619
624
  ls.each do |point|
620
- str << [point.x,point.y].pack("E2")
625
+ str << [point.x, point.y].pack('E2')
621
626
  end
622
627
  end
623
628
  end
624
629
  str
625
630
  end
626
631
 
627
- def build_polyline_zm(geometry,zm,range,str)
628
- str << range.pack("E2")
632
+ def build_polyline_zm(geometry, zm, range, str)
633
+ str << range.pack('E2')
629
634
  if geometry.is_a? GeoRuby::SimpleFeatures::LineString
630
635
  geometry.each do |point|
631
- str << [point.instance_variable_get(zm)].pack("E")
636
+ str << [point.instance_variable_get(zm)].pack('E')
632
637
  end
633
638
  else
634
- #multilinestring
639
+ # multilinestring
635
640
  geometry.each do |ls|
636
641
  ls.each do |point|
637
- str << [point.instance_variable_get(zm)].pack("E")
642
+ str << [point.instance_variable_get(zm)].pack('E')
638
643
  end
639
644
  end
640
645
  end
641
646
  str
642
647
  end
643
648
 
644
- def build_polygon(geometry,str)
649
+ def build_polygon(geometry, str)
645
650
  if geometry.is_a? GeoRuby::SimpleFeatures::Polygon
646
- str << [geometry.length,geometry.inject(0) {|l, lr| l + lr.length}].pack("V2")
647
- str << geometry.inject([0]) {|a,lr| a << (a.last + lr.length)}.pack("V#{geometry.length}") #last element of the previous array is dropped
651
+ str << [geometry.length,
652
+ geometry.reduce(0) { |a, e| a + e.length }
653
+ ].pack('V2')
654
+ # last element of the previous array is dropped
655
+ str << geometry.reduce([0]) do |a, e|
656
+ a << (a.last + e.length)
657
+ end.pack("V#{geometry.length}")
648
658
  geometry.each do |lr|
649
659
  lr.each do |point|
650
- str << [point.x,point.y].pack("E2")
660
+ str << [point.x, point.y].pack('E2')
651
661
  end
652
662
  end
653
663
  else
654
- #multipolygon
655
- num_rings = geometry.inject(0) {|l, poly| l + poly.length}
656
- str << [num_rings, geometry.inject(0) {|l, poly| l + poly.inject(0) {|l2,lr| l2 + lr.length} }].pack("V2")
657
- str << geometry.inject([0]) {|a,poly| poly.inject(a) {|a2, lr| a2 << (a2.last + lr.length)}}.pack("V#{num_rings}") #last element of the previous array is dropped
664
+ # multipolygon
665
+ num_rings = geometry.reduce(0) { |a, e| a + e.length }
666
+ str << [num_rings, geometry.reduce(0) { |l, poly| l + poly.reduce(0) { |l2, lr| l2 + lr.length } }].pack('V2')
667
+ # last element of the previous array is dropped
668
+ str << geometry.reduce([0]) do |a, e|
669
+ e.reduce(a) { |a2, lr| a2 << (a2.last + lr.length) }
670
+ end.pack("V#{num_rings}")
658
671
  geometry.each do |poly|
659
672
  poly.each do |lr|
660
673
  lr.each do |point|
661
- str << [point.x,point.y].pack("E2")
674
+ str << [point.x, point.y].pack('E2')
662
675
  end
663
676
  end
664
677
  end
@@ -666,19 +679,19 @@ module GeoRuby
666
679
  str
667
680
  end
668
681
 
669
- def build_polygon_zm(geometry,zm,range,str)
670
- str << range.pack("E2")
682
+ def build_polygon_zm(geometry, zm, range, str)
683
+ str << range.pack('E2')
671
684
  if geometry.is_a? GeoRuby::SimpleFeatures::Polygon
672
685
  geometry.each do |lr|
673
686
  lr.each do |point|
674
- str << [point.instance_variable_get(zm)].pack("E")
687
+ str << [point.instance_variable_get(zm)].pack('E')
675
688
  end
676
689
  end
677
690
  else
678
691
  geometry.each do |poly|
679
692
  poly.each do |lr|
680
693
  lr.each do |point|
681
- str << [point.instance_variable_get(zm)].pack("E")
694
+ str << [point.instance_variable_get(zm)].pack('E')
682
695
  end
683
696
  end
684
697
  end
@@ -686,18 +699,18 @@ module GeoRuby
686
699
  str
687
700
  end
688
701
 
689
- def build_multi_point(geometry,str)
690
- str << [geometry.length].pack("V")
702
+ def build_multi_point(geometry, str)
703
+ str << [geometry.length].pack('V')
691
704
  geometry.each do |point|
692
- str << [point.x,point.y].pack("E2")
705
+ str << [point.x, point.y].pack('E2')
693
706
  end
694
707
  str
695
708
  end
696
709
 
697
- def build_multi_point_zm(geometry,zm,range,str)
698
- str << range.pack("E2")
710
+ def build_multi_point_zm(geometry, zm, range, str)
711
+ str << range.pack('E2')
699
712
  geometry.each do |point|
700
- str << [point.instance_variable_get(zm)].pack("E")
713
+ str << [point.instance_variable_get(zm)].pack('E')
701
714
  end
702
715
  str
703
716
  end