rgeo 3.0.0.pre.rc.3 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -0
  3. data/ext/geos_c_impl/factory.c +41 -5
  4. data/ext/geos_c_impl/factory.h +13 -2
  5. data/ext/geos_c_impl/geometry.c +151 -122
  6. data/ext/geos_c_impl/geometry_collection.c +17 -19
  7. data/ext/geos_c_impl/line_string.c +46 -36
  8. data/ext/geos_c_impl/point.c +0 -2
  9. data/ext/geos_c_impl/polygon.c +10 -11
  10. data/ext/geos_c_impl/polygon.h +1 -1
  11. data/ext/geos_c_impl/ruby_more.c +7 -0
  12. data/ext/geos_c_impl/ruby_more.h +8 -0
  13. data/lib/rgeo/cartesian/analysis.rb +5 -3
  14. data/lib/rgeo/cartesian/bounding_box.rb +74 -79
  15. data/lib/rgeo/cartesian/calculations.rb +20 -26
  16. data/lib/rgeo/cartesian/factory.rb +47 -49
  17. data/lib/rgeo/cartesian/planar_graph.rb +10 -16
  18. data/lib/rgeo/cartesian/sweepline_intersector.rb +1 -3
  19. data/lib/rgeo/cartesian/valid_op.rb +1 -3
  20. data/lib/rgeo/coord_sys/cs/entities.rb +87 -101
  21. data/lib/rgeo/coord_sys/cs/factories.rb +0 -2
  22. data/lib/rgeo/coord_sys/cs/wkt_parser.rb +70 -29
  23. data/lib/rgeo/feature/curve.rb +0 -1
  24. data/lib/rgeo/feature/factory.rb +25 -27
  25. data/lib/rgeo/feature/factory_generator.rb +3 -4
  26. data/lib/rgeo/feature/geometry.rb +41 -30
  27. data/lib/rgeo/feature/geometry_collection.rb +3 -4
  28. data/lib/rgeo/feature/line_string.rb +1 -2
  29. data/lib/rgeo/feature/linear_ring.rb +0 -1
  30. data/lib/rgeo/feature/multi_curve.rb +0 -1
  31. data/lib/rgeo/feature/multi_surface.rb +0 -1
  32. data/lib/rgeo/feature/point.rb +0 -1
  33. data/lib/rgeo/feature/polygon.rb +1 -2
  34. data/lib/rgeo/feature/surface.rb +0 -1
  35. data/lib/rgeo/feature/types.rb +73 -83
  36. data/lib/rgeo/geographic/factory.rb +87 -80
  37. data/lib/rgeo/geographic/interface.rb +40 -23
  38. data/lib/rgeo/geographic/projected_feature_methods.rb +2 -6
  39. data/lib/rgeo/geographic/projected_window.rb +35 -21
  40. data/lib/rgeo/geographic/simple_mercator_projector.rb +25 -13
  41. data/lib/rgeo/geographic/spherical_feature_methods.rb +8 -3
  42. data/lib/rgeo/geographic/spherical_math.rb +17 -20
  43. data/lib/rgeo/geos/capi_factory.rb +50 -50
  44. data/lib/rgeo/geos/ffi_factory.rb +41 -42
  45. data/lib/rgeo/geos/ffi_feature_methods.rb +72 -97
  46. data/lib/rgeo/geos/interface.rb +16 -16
  47. data/lib/rgeo/geos/utils.rb +3 -3
  48. data/lib/rgeo/geos/zm_factory.rb +50 -42
  49. data/lib/rgeo/geos/zm_feature_methods.rb +15 -8
  50. data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +4 -4
  51. data/lib/rgeo/impl_helper/basic_geometry_methods.rb +1 -2
  52. data/lib/rgeo/impl_helper/basic_line_string_methods.rb +18 -24
  53. data/lib/rgeo/impl_helper/basic_point_methods.rb +1 -3
  54. data/lib/rgeo/impl_helper/basic_polygon_methods.rb +15 -16
  55. data/lib/rgeo/impl_helper/utils.rb +3 -9
  56. data/lib/rgeo/impl_helper/valid_op.rb +12 -16
  57. data/lib/rgeo/version.rb +1 -1
  58. data/lib/rgeo/wkrep/wkb_generator.rb +42 -47
  59. data/lib/rgeo/wkrep/wkb_parser.rb +17 -18
  60. data/lib/rgeo/wkrep/wkt_generator.rb +23 -16
  61. data/lib/rgeo/wkrep/wkt_parser.rb +23 -13
  62. metadata +5 -5
@@ -13,6 +13,8 @@ module RGeo
13
13
  module FFIGeometryMethods # :nodoc:
14
14
  include Feature::Instance
15
15
 
16
+ attr_reader :factory, :fg_geom, :_klasses
17
+
16
18
  def initialize(factory, fg_geom, klasses)
17
19
  @factory = factory
18
20
  @fg_geom = fg_geom
@@ -56,11 +58,6 @@ module RGeo
56
58
  @_klasses = nil
57
59
  end
58
60
 
59
- attr_reader :factory
60
- attr_reader :fg_geom
61
-
62
- attr_reader :_klasses # :nodoc:
63
-
64
61
  def initialize_copy(orig)
65
62
  @factory = orig.factory
66
63
  @fg_geom = orig.fg_geom.clone
@@ -94,9 +91,7 @@ module RGeo
94
91
  end
95
92
 
96
93
  def prepare!
97
- if @_fg_prep.is_a?(Integer)
98
- @_fg_prep = ::Geos::PreparedGeometry.new(@fg_geom)
99
- end
94
+ @_fg_prep = ::Geos::PreparedGeometry.new(@fg_geom) if @_fg_prep.is_a?(Integer)
100
95
  self
101
96
  end
102
97
 
@@ -149,20 +144,21 @@ module RGeo
149
144
 
150
145
  # (see RGeo::ImplHelper::ValidityCheck#make_valid)
151
146
  # Only available since GEOS 3.8+
152
- def make_valid
153
- @factory.wrap_fg_geom(@fg_geom.make_valid, nil)
154
- rescue ::Geos::GEOSException
155
- raise Error::UnsupportedOperation
156
- end if ::Geos::FFIGeos.respond_to?(:GEOSMakeValid_r)
147
+ if ::Geos::FFIGeos.respond_to?(:GEOSMakeValid_r)
148
+ def make_valid
149
+ @factory.wrap_fg_geom(@fg_geom.make_valid, nil)
150
+ rescue ::Geos::GEOSException
151
+ raise Error::UnsupportedOperation
152
+ end
153
+ end
157
154
 
158
155
  def equals?(rhs)
159
156
  return false unless rhs.is_a?(RGeo::Feature::Instance)
160
157
  fg = factory.convert_to_fg_geometry(rhs)
161
- if !fg
162
- false
158
+
163
159
  # GEOS has a bug where empty geometries are not spatially equal
164
160
  # to each other. Work around this case first.
165
- elsif fg.empty? && @fg_geom.empty?
161
+ if fg.empty? && @fg_geom.empty?
166
162
  true
167
163
  else
168
164
  @fg_geom.eql?(fg)
@@ -172,83 +168,55 @@ module RGeo
172
168
 
173
169
  def disjoint?(rhs)
174
170
  fg = factory.convert_to_fg_geometry(rhs)
175
- if fg
176
- prep = request_prepared if Utils.ffi_supports_prepared_level_2
177
- prep ? prep.disjoint?(fg) : @fg_geom.disjoint?(fg)
178
- else
179
- false
180
- end
171
+ prep = request_prepared if Utils.ffi_supports_prepared_level_2
172
+ prep ? prep.disjoint?(fg) : @fg_geom.disjoint?(fg)
181
173
  end
182
174
 
183
175
  def intersects?(rhs)
184
176
  fg = factory.convert_to_fg_geometry(rhs)
185
- if fg
186
- prep = request_prepared if Utils.ffi_supports_prepared_level_1
187
- prep ? prep.intersects?(fg) : @fg_geom.intersects?(fg)
188
- else
189
- false
190
- end
177
+ prep = request_prepared if Utils.ffi_supports_prepared_level_1
178
+ prep ? prep.intersects?(fg) : @fg_geom.intersects?(fg)
191
179
  end
192
180
 
193
181
  def touches?(rhs)
194
182
  fg = factory.convert_to_fg_geometry(rhs)
195
- if fg
196
- prep = request_prepared if Utils.ffi_supports_prepared_level_2
197
- prep ? prep.touches?(fg) : @fg_geom.touches?(fg)
198
- else
199
- false
200
- end
183
+ prep = request_prepared if Utils.ffi_supports_prepared_level_2
184
+ prep ? prep.touches?(fg) : @fg_geom.touches?(fg)
201
185
  end
202
186
 
203
187
  def crosses?(rhs)
204
188
  fg = factory.convert_to_fg_geometry(rhs)
205
- if fg
206
- prep = request_prepared if Utils.ffi_supports_prepared_level_2
207
- prep ? prep.crosses?(fg) : @fg_geom.crosses?(fg)
208
- else
209
- false
210
- end
189
+ prep = request_prepared if Utils.ffi_supports_prepared_level_2
190
+ prep ? prep.crosses?(fg) : @fg_geom.crosses?(fg)
211
191
  end
212
192
 
213
193
  def within?(rhs)
214
194
  fg = factory.convert_to_fg_geometry(rhs)
215
- if fg
216
- prep = request_prepared if Utils.ffi_supports_prepared_level_2
217
- prep ? prep.within?(fg) : @fg_geom.within?(fg)
218
- else
219
- false
220
- end
195
+ prep = request_prepared if Utils.ffi_supports_prepared_level_2
196
+ prep ? prep.within?(fg) : @fg_geom.within?(fg)
221
197
  end
222
198
 
223
199
  def contains?(rhs)
224
200
  fg = factory.convert_to_fg_geometry(rhs)
225
- if fg
226
- prep = request_prepared if Utils.ffi_supports_prepared_level_1
227
- prep ? prep.contains?(fg) : @fg_geom.contains?(fg)
228
- else
229
- false
230
- end
201
+ prep = request_prepared if Utils.ffi_supports_prepared_level_1
202
+ prep ? prep.contains?(fg) : @fg_geom.contains?(fg)
231
203
  end
232
204
 
233
205
  def overlaps?(rhs)
234
206
  fg = factory.convert_to_fg_geometry(rhs)
235
- if fg
236
- prep = request_prepared if Utils.ffi_supports_prepared_level_2
237
- prep ? prep.overlaps?(fg) : @fg_geom.overlaps?(fg)
238
- else
239
- false
240
- end
207
+ prep = request_prepared if Utils.ffi_supports_prepared_level_2
208
+ prep ? prep.overlaps?(fg) : @fg_geom.overlaps?(fg)
241
209
  end
242
210
 
243
211
  def relate?(rhs, pattern)
244
212
  fg = factory.convert_to_fg_geometry(rhs)
245
- fg ? @fg_geom.relate_pattern(fg, pattern) : nil
213
+ @fg_geom.relate_pattern(fg, pattern)
246
214
  end
247
215
  alias relate relate? # DEPRECATED
248
216
 
249
217
  def distance(rhs)
250
218
  fg = factory.convert_to_fg_geometry(rhs)
251
- fg ? @fg_geom.distance(fg) : nil
219
+ @fg_geom.distance(fg)
252
220
  end
253
221
 
254
222
  def buffer(distance)
@@ -261,14 +229,14 @@ module RGeo
261
229
 
262
230
  def intersection(rhs)
263
231
  fg = factory.convert_to_fg_geometry(rhs)
264
- fg ? @factory.wrap_fg_geom(@fg_geom.intersection(fg), nil) : nil
232
+ @factory.wrap_fg_geom(@fg_geom.intersection(fg), nil)
265
233
  end
266
234
 
267
235
  alias * intersection
268
236
 
269
237
  def union(rhs)
270
238
  fg = factory.convert_to_fg_geometry(rhs)
271
- fg ? @factory.wrap_fg_geom(@fg_geom.union(fg), nil) : nil
239
+ @factory.wrap_fg_geom(@fg_geom.union(fg), nil)
272
240
  end
273
241
 
274
242
  alias + union
@@ -280,18 +248,18 @@ module RGeo
280
248
 
281
249
  def difference(rhs)
282
250
  fg = factory.convert_to_fg_geometry(rhs)
283
- fg ? @factory.wrap_fg_geom(@fg_geom.difference(fg), nil) : nil
251
+ @factory.wrap_fg_geom(@fg_geom.difference(fg), nil)
284
252
  end
285
253
 
286
254
  alias - difference
287
255
 
288
256
  def sym_difference(rhs)
289
257
  fg = factory.convert_to_fg_geometry(rhs)
290
- fg ? @factory.wrap_fg_geom(@fg_geom.sym_difference(fg), nil) : nil
258
+ @factory.wrap_fg_geom(@fg_geom.sym_difference(fg), nil)
291
259
  end
292
260
 
293
- def eql?(rhs)
294
- rep_equals?(rhs)
261
+ def eql?(other)
262
+ rep_equals?(other)
295
263
  end
296
264
 
297
265
  def detach_fg_geom
@@ -343,7 +311,7 @@ module RGeo
343
311
  end
344
312
 
345
313
  def rep_equals?(rhs)
346
- rhs.class == self.class && rhs.factory.eql?(@factory) &&
314
+ rhs.instance_of?(self.class) && rhs.factory.eql?(@factory) &&
347
315
  Utils.ffi_coord_seqs_equal?(rhs.fg_geom.coord_seq, @fg_geom.coord_seq, @factory._has_3d)
348
316
  end
349
317
 
@@ -372,14 +340,15 @@ module RGeo
372
340
  @fg_geom.num_points
373
341
  end
374
342
 
375
- def point_n(n)
376
- if n >= 0 && n < @fg_geom.num_points
377
- coord_seq = @fg_geom.coord_seq
378
- x = coord_seq.get_x(n)
379
- y = coord_seq.get_y(n)
380
- extra = @factory._has_3d ? [coord_seq.get_z(n)] : []
381
- @factory.point(x, y, *extra)
382
- end
343
+ def point_n(idx)
344
+ return unless idx >= 0 && idx < @fg_geom.num_points
345
+
346
+ coord_seq = @fg_geom.coord_seq
347
+ x = coord_seq.get_x(idx)
348
+ y = coord_seq.get_y(idx)
349
+ extra = @factory._has_3d ? [coord_seq.get_z(idx)] : []
350
+
351
+ @factory.point(x, y, *extra)
383
352
  end
384
353
 
385
354
  def start_point
@@ -410,7 +379,7 @@ module RGeo
410
379
  end
411
380
 
412
381
  def rep_equals?(rhs)
413
- rhs.class == self.class && rhs.factory.eql?(@factory) &&
382
+ rhs.instance_of?(self.class) && rhs.factory.eql?(@factory) &&
414
383
  Utils.ffi_coord_seqs_equal?(rhs.fg_geom.coord_seq, @fg_geom.coord_seq, @factory._has_3d)
415
384
  end
416
385
 
@@ -464,10 +433,10 @@ module RGeo
464
433
  @fg_geom.num_interior_rings
465
434
  end
466
435
 
467
- def interior_ring_n(n)
468
- if n >= 0 && n < @fg_geom.num_interior_rings
469
- @factory.wrap_fg_geom(@fg_geom.interior_ring_n(n), FFILinearRingImpl)
470
- end
436
+ def interior_ring_n(idx)
437
+ return unless idx >= 0 && idx < @fg_geom.num_interior_rings
438
+
439
+ @factory.wrap_fg_geom(@fg_geom.interior_ring_n(idx), FFILinearRingImpl)
471
440
  end
472
441
 
473
442
  def interior_rings
@@ -477,7 +446,7 @@ module RGeo
477
446
  end
478
447
 
479
448
  def rep_equals?(rhs)
480
- if rhs.class == self.class && rhs.factory.eql?(@factory) &&
449
+ if rhs.instance_of?(self.class) && rhs.factory.eql?(@factory) &&
481
450
  rhs.exterior_ring.rep_equals?(exterior_ring)
482
451
  sn = @fg_geom.num_interior_rings
483
452
  rn = rhs.num_interior_rings
@@ -493,8 +462,10 @@ module RGeo
493
462
 
494
463
  def hash
495
464
  @hash ||= begin
496
- hash = Utils.ffi_coord_seq_hash(@fg_geom.exterior_ring.coord_seq,
497
- [@factory, geometry_type].hash)
465
+ hash = Utils.ffi_coord_seq_hash(
466
+ @fg_geom.exterior_ring.coord_seq,
467
+ [@factory, geometry_type].hash
468
+ )
498
469
  @fg_geom.interior_rings.inject(hash) do |h, r|
499
470
  Utils.ffi_coord_seq_hash(r.coord_seq, h)
500
471
  end
@@ -512,7 +483,7 @@ module RGeo
512
483
  end
513
484
 
514
485
  def rep_equals?(rhs)
515
- if rhs.class == self.class && rhs.factory.eql?(@factory)
486
+ if rhs.instance_of?(self.class) && rhs.factory.eql?(@factory)
516
487
  size = @fg_geom.num_geometries
517
488
  if size == rhs.num_geometries
518
489
  size.times do |n|
@@ -529,19 +500,24 @@ module RGeo
529
500
  end
530
501
  alias size num_geometries
531
502
 
532
- def geometry_n(n)
533
- if n >= 0 && n < @fg_geom.num_geometries
534
- @factory.wrap_fg_geom(@fg_geom.get_geometry_n(n),
535
- @_klasses ? @_klasses[n] : nil)
536
- end
503
+ def geometry_n(idx)
504
+ return unless idx >= 0 && idx < @fg_geom.num_geometries
505
+
506
+ @factory.wrap_fg_geom(
507
+ @fg_geom.get_geometry_n(idx),
508
+ @_klasses ? @_klasses[idx] : nil
509
+ )
537
510
  end
538
511
 
539
- def [](n)
540
- n += @fg_geom.num_geometries if n < 0
541
- if n >= 0 && n < @fg_geom.num_geometries
542
- @factory.wrap_fg_geom(@fg_geom.get_geometry_n(n),
543
- @_klasses ? @_klasses[n] : nil)
544
- end
512
+ def [](idx)
513
+ idx += @fg_geom.num_geometries if idx < 0
514
+
515
+ return unless idx >= 0 && idx < @fg_geom.num_geometries
516
+
517
+ @factory.wrap_fg_geom(
518
+ @fg_geom.get_geometry_n(idx),
519
+ @_klasses ? @_klasses[idx] : nil
520
+ )
545
521
  end
546
522
 
547
523
  def hash
@@ -551,8 +527,7 @@ module RGeo
551
527
  def each
552
528
  if block_given?
553
529
  @fg_geom.num_geometries.times do |n|
554
- yield @factory.wrap_fg_geom(@fg_geom.get_geometry_n(n),
555
- @_klasses ? @_klasses[n] : nil)
530
+ yield @factory.wrap_fg_geom(@fg_geom.get_geometry_n(n), @_klasses ? @_klasses[n] : nil)
556
531
  end
557
532
  self
558
533
  else
@@ -62,13 +62,12 @@ module RGeo
62
62
 
63
63
  def version
64
64
  unless defined?(@version)
65
- if RGeo::Geos::CAPI_SUPPORTED
66
- @version = RGeo::Geos::CAPIFactory._geos_version.freeze
67
- elsif RGeo::Geos::FFI_SUPPORTED
68
- @version = ::Geos::FFIGeos.GEOSversion.sub(/-CAPI-.*$/, "").freeze
69
- else
70
- @version = nil
71
- end
65
+ @version =
66
+ if RGeo::Geos::CAPI_SUPPORTED
67
+ RGeo::Geos::CAPIFactory._geos_version.freeze
68
+ elsif RGeo::Geos::FFI_SUPPORTED
69
+ ::Geos::FFIGeos.GEOSversion.sub(/-CAPI-.*$/, "").freeze
70
+ end
72
71
  end
73
72
  @version
74
73
  end
@@ -163,15 +162,16 @@ module RGeo
163
162
  # never automatically generates a prepared geometry (unless you
164
163
  # generate one explicitly using the <tt>prepare!</tt> method).
165
164
  def factory(opts = {})
166
- if supported?
167
- native_interface = opts[:native_interface] || Geos.preferred_native_interface
168
- if opts[:has_z_coordinate] && opts[:has_m_coordinate]
169
- ZMFactory.new(opts)
170
- elsif native_interface == :ffi
171
- FFIFactory.new(opts)
172
- else
173
- CAPIFactory.create(opts)
174
- end
165
+ return unless supported?
166
+
167
+ native_interface = opts[:native_interface] || Geos.preferred_native_interface
168
+
169
+ if opts[:has_z_coordinate] && opts[:has_m_coordinate]
170
+ ZMFactory.new(opts)
171
+ elsif native_interface == :ffi
172
+ FFIFactory.new(opts)
173
+ else
174
+ CAPIFactory.create(opts)
175
175
  end
176
176
  end
177
177
  end
@@ -49,9 +49,9 @@ module RGeo
49
49
  result
50
50
  end
51
51
 
52
- def ffi_coord_seq_hash(cs, hash = 0)
53
- (0...cs.length).inject(hash) do |h, i|
54
- [hash, cs.get_x(i), cs.get_y(i), cs.get_z(i)].hash
52
+ def ffi_coord_seq_hash(coord_seq, init_hash = 0)
53
+ (0...coord_seq.length).inject(init_hash) do |hash, i|
54
+ [hash, coord_seq.get_x(i), coord_seq.get_y(i), coord_seq.get_z(i)].hash
55
55
  end
56
56
  end
57
57
 
@@ -9,7 +9,6 @@
9
9
  module RGeo
10
10
  module Geos
11
11
  # A factory for Geos that handles both Z and M.
12
-
13
12
  class ZMFactory
14
13
  include Feature::Factory::Instance
15
14
  include ImplHelper::Utils
@@ -60,33 +59,37 @@ module RGeo
60
59
  end
61
60
 
62
61
  wkt_generator = opts[:wkt_generator]
63
- case wkt_generator
64
- when Hash
65
- @wkt_generator = WKRep::WKTGenerator.new(wkt_generator)
66
- else
67
- @wkt_generator = WKRep::WKTGenerator.new(convert_case: :upper)
68
- end
62
+ @wkt_generator =
63
+ case wkt_generator
64
+ when Hash
65
+ WKRep::WKTGenerator.new(wkt_generator)
66
+ else
67
+ WKRep::WKTGenerator.new(convert_case: :upper)
68
+ end
69
69
  wkb_generator = opts[:wkb_generator]
70
- case wkb_generator
71
- when Hash
72
- @wkb_generator = WKRep::WKBGenerator.new(wkb_generator)
73
- else
74
- @wkb_generator = WKRep::WKBGenerator.new
75
- end
70
+ @wkb_generator =
71
+ case wkb_generator
72
+ when Hash
73
+ WKRep::WKBGenerator.new(wkb_generator)
74
+ else
75
+ WKRep::WKBGenerator.new
76
+ end
76
77
  wkt_parser = opts[:wkt_parser]
77
- case wkt_parser
78
- when Hash
79
- @wkt_parser = WKRep::WKTParser.new(self, wkt_parser)
80
- else
81
- @wkt_parser = WKRep::WKTParser.new(self)
82
- end
78
+ @wkt_parser =
79
+ case wkt_parser
80
+ when Hash
81
+ WKRep::WKTParser.new(self, wkt_parser)
82
+ else
83
+ WKRep::WKTParser.new(self)
84
+ end
83
85
  wkb_parser = opts[:wkb_parser]
84
- case wkb_parser
85
- when Hash
86
- @wkb_parser = WKRep::WKBParser.new(self, wkb_parser)
87
- else
88
- @wkb_parser = WKRep::WKBParser.new(self)
89
- end
86
+ @wkb_parser =
87
+ case wkb_parser
88
+ when Hash
89
+ WKRep::WKBParser.new(self, wkb_parser)
90
+ else
91
+ WKRep::WKBParser.new(self)
92
+ end
90
93
  end
91
94
 
92
95
  # Marshal support
@@ -108,11 +111,9 @@ module RGeo
108
111
  end
109
112
 
110
113
  def marshal_load(data) # :nodoc:
111
- if (coord_sys_data = data["cs"])
112
- coord_sys = CoordSys::CONFIG.default_coord_sys_class.create_from_wkt(coord_sys_data)
113
- else
114
- coord_sys = nil
115
- end
114
+ cs_class = CoordSys::CONFIG.default_coord_sys_class
115
+ coord_sys = data["cs"]&.then { |cs| cs_class.create_from_wkt(cs) }
116
+
116
117
  initialize(
117
118
  native_interface: (data["nffi"] ? :ffi : :capi),
118
119
  has_z_coordinate: data["hasz"],
@@ -139,17 +140,16 @@ module RGeo
139
140
  coder["wkb_parser"] = @wkb_parser.properties
140
141
  coder["auto_prepare"] = @zfactory.property(:auto_prepare).to_s
141
142
  coder["native_interface"] = @zfactory.is_a?(FFIFactory) ? "ffi" : "capi"
142
- if (coord_sys = @zfactory.coord_sys)
143
- coder["coord_sys"] = coord_sys.to_wkt
144
- end
143
+
144
+ return unless (coord_sys = @zfactory.coord_sys)
145
+
146
+ coder["coord_sys"] = coord_sys.to_wkt
145
147
  end
146
148
 
147
149
  def init_with(coder) # :nodoc:
148
- if (coord_sys_data = coder["cs"])
149
- coord_sys = CoordSys::CONFIG.default_coord_sys_class.create_from_wkt(coord_sys_data.to_s)
150
- else
151
- coord_sys = nil
152
- end
150
+ cs_class = CoordSys::CONFIG.default_coord_sys_class
151
+ coord_sys = coder["cs"]&.then { |cs| cs_class.create_from_wkt(cs) }
152
+
153
153
  initialize(
154
154
  native_interface: coder["native_interface"] == "ffi" ? :ffi : :capi,
155
155
  has_z_coordinate: coder["has_z_coordinate"],
@@ -192,8 +192,8 @@ module RGeo
192
192
 
193
193
  # Factory equivalence test.
194
194
 
195
- def eql?(rhs)
196
- rhs.is_a?(ZMFactory) && rhs.z_factory == @zfactory
195
+ def eql?(other)
196
+ other.is_a?(ZMFactory) && other.z_factory == @zfactory
197
197
  end
198
198
  alias == eql?
199
199
 
@@ -227,7 +227,11 @@ module RGeo
227
227
  # See RGeo::Feature::Factory#point
228
228
 
229
229
  def point(x, y, z = 0, m = 0)
230
- create_feature(ZMPointImpl, @zfactory.point(x, y, z), @mfactory.point(x, y, m))
230
+ create_feature(
231
+ ZMPointImpl,
232
+ @zfactory.point(x, y, z),
233
+ @mfactory.point(x, y, m)
234
+ )
231
235
  end
232
236
 
233
237
  # See RGeo::Feature::Factory#line_string
@@ -251,7 +255,11 @@ module RGeo
251
255
  # See RGeo::Feature::Factory#polygon
252
256
 
253
257
  def polygon(outer_ring, inner_rings = nil)
254
- create_feature(ZMPolygonImpl, @zfactory.polygon(outer_ring, inner_rings), @mfactory.polygon(outer_ring, inner_rings))
258
+ create_feature(
259
+ ZMPolygonImpl,
260
+ @zfactory.polygon(outer_ring, inner_rings),
261
+ @mfactory.polygon(outer_ring, inner_rings)
262
+ )
255
263
  end
256
264
 
257
265
  # See RGeo::Feature::Factory#collection
@@ -159,12 +159,19 @@ module RGeo
159
159
 
160
160
  def sym_difference(rhs)
161
161
  rhs = RGeo::Feature.cast(rhs, self)
162
- @factory.create_feature(nil, @zgeometry.sym_difference(rhs.z_geometry), @mgeometry.sym_difference(rhs.m_geometry))
162
+ @factory.create_feature(
163
+ nil,
164
+ @zgeometry.sym_difference(rhs.z_geometry),
165
+ @mgeometry.sym_difference(rhs.m_geometry)
166
+ )
163
167
  end
164
168
 
165
169
  def rep_equals?(rhs)
166
170
  rhs = RGeo::Feature.cast(rhs, self)
167
- rhs.is_a?(self.class) && @factory.eql?(rhs.factory) && @zgeometry.rep_equals?(rhs.z_geometry) && @mgeometry.rep_equals?(rhs.m_geometry)
171
+ rhs.is_a?(self.class) &&
172
+ @factory.eql?(rhs.factory) &&
173
+ @zgeometry.rep_equals?(rhs.z_geometry) &&
174
+ @mgeometry.rep_equals?(rhs.m_geometry)
168
175
  end
169
176
 
170
177
  alias eql? rep_equals?
@@ -250,8 +257,8 @@ module RGeo
250
257
  @zgeometry.num_points
251
258
  end
252
259
 
253
- def point_n(n)
254
- @factory.create_feature(ZMPointImpl, @zgeometry.point_n(n), @mgeometry.point_n(n))
260
+ def point_n(idx)
261
+ @factory.create_feature(ZMPointImpl, @zgeometry.point_n(idx), @mgeometry.point_n(idx))
255
262
  end
256
263
 
257
264
  def points
@@ -290,8 +297,8 @@ module RGeo
290
297
  @zgeometry.num_interior_rings
291
298
  end
292
299
 
293
- def interior_ring_n(n)
294
- @factory.create_feature(ZMLineStringImpl, @zgeometry.interior_ring_n(n), @mgeometry.interior_ring_n(n))
300
+ def interior_ring_n(idx)
301
+ @factory.create_feature(ZMLineStringImpl, @zgeometry.interior_ring_n(idx), @mgeometry.interior_ring_n(idx))
295
302
  end
296
303
 
297
304
  def interior_rings
@@ -315,8 +322,8 @@ module RGeo
315
322
  end
316
323
  alias size num_geometries
317
324
 
318
- def geometry_n(n)
319
- @factory.create_feature(nil, @zgeometry.geometry_n(n), @mgeometry.geometry_n(n))
325
+ def geometry_n(idx)
326
+ @factory.create_feature(nil, @zgeometry.geometry_n(idx), @mgeometry.geometry_n(idx))
320
327
  end
321
328
  alias [] geometry_n
322
329
 
@@ -27,12 +27,12 @@ module RGeo
27
27
  @elements.size
28
28
  end
29
29
 
30
- def geometry_n(n)
31
- n < 0 ? nil : @elements[n]
30
+ def geometry_n(idx)
31
+ idx < 0 ? nil : @elements[idx]
32
32
  end
33
33
 
34
- def [](n)
35
- @elements[n]
34
+ def [](idx)
35
+ @elements[idx]
36
36
  end
37
37
 
38
38
  def each(&block)
@@ -52,8 +52,7 @@ module RGeo
52
52
  @factory = obj.factory
53
53
  end
54
54
 
55
- def init_geometry
56
- end
55
+ def init_geometry; end
57
56
  end
58
57
  end
59
58
  end