rgeo 3.0.0.pre.rc.3 → 3.0.0

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 (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