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
@@ -23,9 +23,11 @@ module RGeo
23
23
  next_token
24
24
  return value
25
25
  end
26
+
26
27
  unless @cur_token.is_a?(TypeString)
27
28
  raise Error::ParseError, "Found token #{@cur_token} when we expected a value"
28
29
  end
30
+
29
31
  type = @cur_token
30
32
  next_token
31
33
  consume_tokentype(:begin)
@@ -47,9 +49,11 @@ module RGeo
47
49
  obj = AxisInfo.create(args.shift(QuotedString), args.shift(TypeString))
48
50
  when "TOWGS84"
49
51
  bursa_wolf_params = args.find_all(Numeric)
52
+
50
53
  unless bursa_wolf_params.size == 7
51
54
  raise Error::ParseError, "Expected 7 Bursa Wolf parameters but found #{bursa_wolf_params.size}"
52
55
  end
56
+
53
57
  obj = WGS84ConversionInfo.create(*bursa_wolf_params)
54
58
  when "UNIT"
55
59
  klass = case containing_type
@@ -66,7 +70,13 @@ module RGeo
66
70
  when "PRIMEM"
67
71
  obj = PrimeMeridian.create(args.shift(QuotedString), nil, args.shift(Numeric), *args.create_optionals)
68
72
  when "SPHEROID"
69
- obj = Ellipsoid.create_flattened_sphere(args.shift(QuotedString), args.shift(Numeric), args.shift(Numeric), args.find_first(LinearUnit), *args.create_optionals)
73
+ obj = Ellipsoid.create_flattened_sphere(
74
+ args.shift(QuotedString),
75
+ args.shift(Numeric),
76
+ args.shift(Numeric),
77
+ args.find_first(LinearUnit),
78
+ *args.create_optionals
79
+ )
70
80
  when "PROJECTION"
71
81
  name = args.shift(QuotedString)
72
82
  obj = Projection.create(name, name, args.find_all(ProjectionParameter), *args.create_optionals)
@@ -87,15 +97,18 @@ module RGeo
87
97
  optionals = args.create_optionals
88
98
  obj = CoordinateSystem.create(defn, dim, *optionals)
89
99
  when "COMPD_CS"
90
- obj = CompoundCoordinateSystem.create(args.shift(QuotedString), args.shift(CoordinateSystem), args.shift(CoordinateSystem), *args.create_optionals)
100
+ obj = CompoundCoordinateSystem.create(
101
+ args.shift(QuotedString),
102
+ args.shift(CoordinateSystem),
103
+ args.shift(CoordinateSystem),
104
+ *args.create_optionals
105
+ )
91
106
  when "LOCAL_CS"
92
107
  name = args.shift(QuotedString)
93
108
  local_datum = args.find_first(LocalDatum)
94
109
  unit = args.find_first(Unit)
95
110
  axes = args.find_all(AxisInfo)
96
- unless axes.size > 0
97
- raise Error::ParseError, "Expected at least one AXIS in a LOCAL_CS"
98
- end
111
+ raise Error::ParseError, "Expected at least one AXIS in a LOCAL_CS" unless axes.size > 0
99
112
  obj = LocalCoordinateSystem.create(name, local_datum, unit, axes, *args.create_optionals)
100
113
  when "GEOCCS"
101
114
  name = args.shift(QuotedString)
@@ -103,10 +116,21 @@ module RGeo
103
116
  prime_meridian = args.find_first(PrimeMeridian)
104
117
  linear_unit = args.find_first(LinearUnit)
105
118
  axes = args.find_all(AxisInfo)
119
+
106
120
  unless axes.size == 0 || axes.size == 3
107
121
  raise Error::ParseError, "GEOCCS must contain either 0 or 3 AXIS parameters"
108
122
  end
109
- obj = GeocentricCoordinateSystem.create(name, horizontal_datum, prime_meridian, linear_unit, axes[0], axes[1], axes[2], *args.create_optionals)
123
+
124
+ obj = GeocentricCoordinateSystem.create(
125
+ name,
126
+ horizontal_datum,
127
+ prime_meridian,
128
+ linear_unit,
129
+ axes[0],
130
+ axes[1],
131
+ axes[2],
132
+ *args.create_optionals
133
+ )
110
134
  when "VERT_CS"
111
135
  name = args.shift(QuotedString)
112
136
  vertical_datum = args.find_first(VerticalDatum)
@@ -119,10 +143,20 @@ module RGeo
119
143
  prime_meridian = args.find_first(PrimeMeridian)
120
144
  angular_unit = args.find_first(AngularUnit)
121
145
  axes = args.find_all(AxisInfo)
146
+
122
147
  unless axes.size == 0 || axes.size == 2
123
148
  raise Error::ParseError, "GEOGCS must contain either 0 or 2 AXIS parameters"
124
149
  end
125
- obj = GeographicCoordinateSystem.create(name, angular_unit, horizontal_datum, prime_meridian, axes[0], axes[1], *args.create_optionals)
150
+
151
+ obj = GeographicCoordinateSystem.create(
152
+ name,
153
+ angular_unit,
154
+ horizontal_datum,
155
+ prime_meridian,
156
+ axes[0],
157
+ axes[1],
158
+ *args.create_optionals
159
+ )
126
160
  when "PROJCS"
127
161
  name = args.shift(QuotedString)
128
162
  geographic_coordinate_system = args.find_first(GeographicCoordinateSystem)
@@ -131,10 +165,20 @@ module RGeo
131
165
  projection.instance_variable_get(:@parameters).concat(parameters)
132
166
  linear_unit = args.find_first(LinearUnit)
133
167
  axes = args.find_all(AxisInfo)
168
+
134
169
  unless axes.size == 0 || axes.size == 2
135
170
  raise Error::ParseError, "PROJCS must contain either 0 or 2 AXIS parameters"
136
171
  end
137
- obj = ProjectedCoordinateSystem.create(name, geographic_coordinate_system, projection, linear_unit, axes[0], axes[1], *args.create_optionals)
172
+
173
+ obj = ProjectedCoordinateSystem.create(
174
+ name,
175
+ geographic_coordinate_system,
176
+ projection,
177
+ linear_unit,
178
+ axes[0],
179
+ axes[1],
180
+ *args.create_optionals
181
+ )
138
182
  else
139
183
  raise Error::ParseError, "Unrecognized type: #{type}"
140
184
  end
@@ -150,9 +194,9 @@ module RGeo
150
194
  end
151
195
 
152
196
  def expect_tokentype(type) # :nodoc:
153
- unless type === @cur_token
154
- raise Error::ParseError, "#{type.inspect} expected but #{@cur_token.inspect} found."
155
- end
197
+ return if type === @cur_token
198
+
199
+ raise Error::ParseError, "#{type.inspect} expected but #{@cur_token.inspect} found."
156
200
  end
157
201
 
158
202
  def next_token # :nodoc:
@@ -176,13 +220,14 @@ module RGeo
176
220
  when "", nil
177
221
  @cur_token = nil
178
222
  else
179
- @scanner.scan_until(/[^\s\(\)\[\],"]+/)
223
+ @scanner.scan_until(/[^\s()\[\],"]+/)
180
224
  token = @scanner.matched
181
- if token =~ /^[-+]?(\d+(\.\d*)?|\.\d+)(e[-+]?\d+)?$/
182
- @cur_token = token.to_f
183
- else
225
+
226
+ unless token =~ /^[-+]?(\d+(\.\d*)?|\.\d+)(e[-+]?\d+)?$/
184
227
  raise Error::ParseError, "Bad token: #{token.inspect}"
185
228
  end
229
+
230
+ @cur_token = token.to_f
186
231
  end
187
232
  @cur_token
188
233
  end
@@ -207,13 +252,12 @@ module RGeo
207
252
  end
208
253
 
209
254
  class ExtensionClause # :nodoc:
255
+ attr_reader :key, :value
256
+
210
257
  def initialize(key, value) # :nodoc:
211
258
  @key = key
212
259
  @value = value
213
260
  end
214
-
215
- attr_reader :key # :nodoc:
216
- attr_reader :value # :nodoc:
217
261
  end
218
262
 
219
263
  class ArgumentList # :nodoc:
@@ -226,12 +270,13 @@ module RGeo
226
270
  end
227
271
 
228
272
  def assert_empty # :nodoc:
229
- if @values.size > 0
230
- names = @values.map do |val|
231
- val.is_a?(Base) ? val.wkt_typename : val.inspect
232
- end
233
- raise Error::ParseError, "#{@values.size} unexpected arguments: #{names.join(', ')}"
273
+ return if @values.empty?
274
+
275
+ names = @values.map do |val|
276
+ val.is_a?(Base) ? val.wkt_typename : val.inspect
234
277
  end
278
+
279
+ raise Error::ParseError, "#{@values.size} unexpected arguments: #{names.join(', ')}"
235
280
  end
236
281
 
237
282
  def find_first(klass) # :nodoc:
@@ -266,12 +311,8 @@ module RGeo
266
311
 
267
312
  def shift(klass = nil) # :nodoc:
268
313
  val = @values.shift
269
- unless val
270
- raise Error::ParseError, "No arguments left... expected #{klass}"
271
- end
272
- if klass && !val.is_a?(klass)
273
- raise Error::ParseError, "Expected #{klass} but got #{val.class}"
274
- end
314
+ raise Error::ParseError, "No arguments left... expected #{klass}" unless val
315
+ raise Error::ParseError, "Expected #{klass} but got #{val.class}" if klass && !val.is_a?(klass)
275
316
  val
276
317
  end
277
318
  end
@@ -40,7 +40,6 @@ module RGeo
40
40
  # class method (or === operator) defined in the Type module.
41
41
  #
42
42
  # Some implementations may support higher dimensional points.
43
-
44
43
  module Curve
45
44
  include Geometry
46
45
  extend Type
@@ -30,12 +30,10 @@ module RGeo
30
30
  # is provided. All factory implementation classes MUST include
31
31
  # <tt>Factory::Instance</tt>, and you may use it in <tt>is_a?</tt>,
32
32
  # <tt>===</tt>, and case-when constructs.
33
-
34
33
  module Factory
35
34
  # All factory implementations MUST include this submodule.
36
35
  # This serves as a marker that may be used to test an object for
37
36
  # factory-ness.
38
-
39
37
  module Instance
40
38
  end
41
39
 
@@ -74,22 +72,22 @@ module RGeo
74
72
  # information is present about whether the coordinate system is
75
73
  # meant to be so interpreted.
76
74
 
77
- def property(name)
78
- nil
75
+ def property(_name)
76
+ raise Error::UnsupportedOperation, "Method #{self.class}##{__method__} not defined."
79
77
  end
80
78
 
81
79
  # Parse the given string in well-known-text format and return the
82
80
  # resulting feature. Returns nil if the string couldn't be parsed.
83
81
 
84
- def parse_wkt(str)
85
- nil
82
+ def parse_wkt(_str)
83
+ raise Error::UnsupportedOperation, "Method #{self.class}##{__method__} not defined."
86
84
  end
87
85
 
88
86
  # Parse the given string in well-known-binary format and return the
89
87
  # resulting feature. Returns nil if the string couldn't be parsed.
90
88
 
91
- def parse_wkb(str)
92
- nil
89
+ def parse_wkb(_str)
90
+ raise Error::UnsupportedOperation, "Method #{self.class}##{__method__} not defined."
93
91
  end
94
92
 
95
93
  # Create a feature of type Point.
@@ -99,8 +97,8 @@ module RGeo
99
97
  # supported. If both Z and M coordinates are supported, Z should
100
98
  # be passed first.
101
99
 
102
- def point(x, y, *extra)
103
- nil
100
+ def point(_x, _y, *_extra)
101
+ raise Error::UnsupportedOperation, "Method #{self.class}##{__method__} not defined."
104
102
  end
105
103
 
106
104
  # Create a feature of type LineString.
@@ -112,8 +110,8 @@ module RGeo
112
110
  # result of building geometries from objects of the wrong factory
113
111
  # is undefined.
114
112
 
115
- def line_string(points)
116
- nil
113
+ def line_string(_points)
114
+ raise Error::UnsupportedOperation, "Method #{self.class}##{__method__} not defined."
117
115
  end
118
116
 
119
117
  # Create a feature of type Line.
@@ -125,8 +123,8 @@ module RGeo
125
123
  # result of building geometries from objects of the wrong factory
126
124
  # is undefined.
127
125
 
128
- def line(start, stop)
129
- nil
126
+ def line(_start, _stop)
127
+ raise Error::UnsupportedOperation, "Method #{self.class}##{__method__} not defined."
130
128
  end
131
129
 
132
130
  # Create a feature of type LinearRing.
@@ -141,8 +139,8 @@ module RGeo
141
139
  # result of building geometries from objects of the wrong factory
142
140
  # is undefined.
143
141
 
144
- def linear_ring(points)
145
- nil
142
+ def linear_ring(_points)
143
+ raise Error::UnsupportedOperation, "Method #{self.class}##{__method__} not defined."
146
144
  end
147
145
 
148
146
  # Create a feature of type Polygon.
@@ -157,8 +155,8 @@ module RGeo
157
155
  # result of building geometries from objects of the wrong factory
158
156
  # is undefined.
159
157
 
160
- def polygon(outer_ring, inner_rings = nil)
161
- nil
158
+ def polygon(_outer_ring, _inner_rings = nil)
159
+ raise Error::UnsupportedOperation, "Method #{self.class}##{__method__} not defined."
162
160
  end
163
161
 
164
162
  # Create a feature of type GeometryCollection.
@@ -169,8 +167,8 @@ module RGeo
169
167
  # result of building geometries from objects of the wrong factory
170
168
  # is undefined.
171
169
 
172
- def collection(elems)
173
- nil
170
+ def collection(_elems)
171
+ raise Error::UnsupportedOperation, "Method #{self.class}##{__method__} not defined."
174
172
  end
175
173
 
176
174
  # Create a feature of type MultiPoint.
@@ -184,8 +182,8 @@ module RGeo
184
182
  # result of building geometries from objects of the wrong factory
185
183
  # is undefined.
186
184
 
187
- def multi_point(elems)
188
- nil
185
+ def multi_point(_elems)
186
+ raise Error::UnsupportedOperation, "Method #{self.class}##{__method__} not defined."
189
187
  end
190
188
 
191
189
  # Create a feature of type MultiLineString.
@@ -199,8 +197,8 @@ module RGeo
199
197
  # result of building geometries from objects of the wrong factory
200
198
  # is undefined.
201
199
 
202
- def multi_line_string(elems)
203
- nil
200
+ def multi_line_string(_elems)
201
+ raise Error::UnsupportedOperation, "Method #{self.class}##{__method__} not defined."
204
202
  end
205
203
 
206
204
  # Create a feature of type MultiPolygon.
@@ -216,8 +214,8 @@ module RGeo
216
214
  # result of building geometries from objects of the wrong factory
217
215
  # is undefined.
218
216
 
219
- def multi_polygon(elems)
220
- nil
217
+ def multi_polygon(_elems)
218
+ raise Error::UnsupportedOperation, "Method #{self.class}##{__method__} not defined."
221
219
  end
222
220
 
223
221
  # Returns the coordinate system specification for the features
@@ -264,7 +262,7 @@ module RGeo
264
262
  # algorithm to cast the object. Therefore, by default, you should
265
263
  # return false.
266
264
 
267
- def override_cast(original, type, flags)
265
+ def override_cast(_original, _type, _flags)
268
266
  false
269
267
  end
270
268
  end
@@ -31,7 +31,6 @@ module RGeo
31
31
  # necessarily include this module itself. Therefore, you should not
32
32
  # depend on the kind_of? method to determine if an object is a
33
33
  # factory generator.
34
-
35
34
  module FactoryGenerator
36
35
  # Generate a factory given a configuration as a hash.
37
36
  #
@@ -67,7 +66,7 @@ module RGeo
67
66
  # [<tt>:has_m_coordinate</tt>]
68
67
  # Support M coordinates. Default is usually false.
69
68
 
70
- def call(config = {})
69
+ def call(_config = {})
71
70
  nil
72
71
  end
73
72
 
@@ -75,7 +74,7 @@ module RGeo
75
74
  # factory.
76
75
 
77
76
  def self.single(factory)
78
- proc { |c| factory }
77
+ proc { |_c| factory }
79
78
  end
80
79
 
81
80
  # Return a new FactoryGenerator that calls the given delegate, but
@@ -84,7 +83,7 @@ module RGeo
84
83
  # force certain values to override the given configuration.
85
84
 
86
85
  def self.decorate(delegate, default_config = {}, force_config = {})
87
- proc { |c| delegate_.call(default_config.merge(c).merge(force_config)) }
86
+ proc { |c| delegate.call(default_config.merge(c).merge(force_config)) }
88
87
  end
89
88
  end
90
89
  end
@@ -78,7 +78,6 @@ module RGeo
78
78
  # Therefore, if an implementation cannot provide a suitable test for
79
79
  # their equivalence types, they must degrade to use a stronger form
80
80
  # of equivalence.
81
-
82
81
  module Geometry
83
82
  extend Type
84
83
 
@@ -294,7 +293,7 @@ module RGeo
294
293
  # this geometry, strictly speaking, the result of comparing objects
295
294
  # from different factories is undefined.
296
295
 
297
- def equals?(another_geometry)
296
+ def equals?(_another_geometry)
298
297
  raise Error::UnsupportedOperation, "Method #{self.class}#equals? not defined."
299
298
  end
300
299
 
@@ -313,7 +312,7 @@ module RGeo
313
312
  # this geometry, strictly speaking, the result of comparing objects
314
313
  # from different factories is undefined.
315
314
 
316
- def disjoint?(another_geometry)
315
+ def disjoint?(_another_geometry)
317
316
  raise Error::UnsupportedOperation, "Method #{self.class}#disjoint? not defined."
318
317
  end
319
318
 
@@ -332,7 +331,7 @@ module RGeo
332
331
  # this geometry, strictly speaking, the result of comparing objects
333
332
  # from different factories is undefined.
334
333
 
335
- def intersects?(another_geometry)
334
+ def intersects?(_another_geometry)
336
335
  raise Error::UnsupportedOperation, "Method #{self.class}#intersects? not defined."
337
336
  end
338
337
 
@@ -351,7 +350,7 @@ module RGeo
351
350
  # this geometry, strictly speaking, the result of comparing objects
352
351
  # from different factories is undefined.
353
352
 
354
- def touches?(another_geometry)
353
+ def touches?(_another_geometry)
355
354
  raise Error::UnsupportedOperation, "Method #{self.class}#touches? not defined."
356
355
  end
357
356
 
@@ -370,7 +369,7 @@ module RGeo
370
369
  # this geometry, strictly speaking, the result of comparing objects
371
370
  # from different factories is undefined.
372
371
 
373
- def crosses?(another_geometry)
372
+ def crosses?(_another_geometry)
374
373
  raise Error::UnsupportedOperation, "Method #{self.class}#crosses? not defined."
375
374
  end
376
375
 
@@ -389,7 +388,7 @@ module RGeo
389
388
  # this geometry, strictly speaking, the result of comparing objects
390
389
  # from different factories is undefined.
391
390
 
392
- def within?(another_geometry)
391
+ def within?(_another_geometry)
393
392
  raise Error::UnsupportedOperation, "Method #{self.class}#within? not defined."
394
393
  end
395
394
 
@@ -408,7 +407,7 @@ module RGeo
408
407
  # this geometry, strictly speaking, the result of comparing objects
409
408
  # from different factories is undefined.
410
409
 
411
- def contains?(another_geometry)
410
+ def contains?(_another_geometry)
412
411
  raise Error::UnsupportedOperation, "Method #{self.class}#contains? not defined."
413
412
  end
414
413
 
@@ -427,7 +426,7 @@ module RGeo
427
426
  # this geometry, strictly speaking, the result of comparing objects
428
427
  # from different factories is undefined.
429
428
 
430
- def overlaps?(another_geometry)
429
+ def overlaps?(_another_geometry)
431
430
  raise Error::UnsupportedOperation, "Method #{self.class}#overlaps? not defined."
432
431
  end
433
432
 
@@ -453,7 +452,7 @@ module RGeo
453
452
  # this geometry, strictly speaking, the result of comparing objects
454
453
  # from different factories is undefined.
455
454
 
456
- def relate?(another_geometry, _intersection_pattern_matrix_)
455
+ def relate?(_another_geometry, _intersection_pattern_matrix_)
457
456
  raise Error::UnsupportedOperation, "Method #{self.class}#relate not defined."
458
457
  end
459
458
 
@@ -499,7 +498,7 @@ module RGeo
499
498
  # this geometry, strictly speaking, the result of measuring the
500
499
  # distance between objects from different factories is undefined.
501
500
 
502
- def distance(another_geometry)
501
+ def distance(_another_geometry)
503
502
  raise Error::UnsupportedOperation, "Method #{self.class}#distance not defined."
504
503
  end
505
504
 
@@ -545,7 +544,7 @@ module RGeo
545
544
  # this geometry, strictly speaking, the result of performing
546
545
  # operations on objects from different factories is undefined.
547
546
 
548
- def intersection(another_geometry)
547
+ def intersection(_another_geometry)
549
548
  raise Error::UnsupportedOperation, "Method #{self.class}#intersection not defined."
550
549
  end
551
550
 
@@ -563,7 +562,7 @@ module RGeo
563
562
  # this geometry, strictly speaking, the result of performing
564
563
  # operations on objects from different factories is undefined.
565
564
 
566
- def union(another_geometry)
565
+ def union(_another_geometry)
567
566
  raise Error::UnsupportedOperation, "Method #{self.class}#union not defined."
568
567
  end
569
568
 
@@ -581,7 +580,7 @@ module RGeo
581
580
  # this geometry, strictly speaking, the result of performing
582
581
  # operations on objects from different factories is undefined.
583
582
 
584
- def difference(another_geometry)
583
+ def difference(_another_geometry)
585
584
  raise Error::UnsupportedOperation, "Method #{self.class}#difference not defined."
586
585
  end
587
586
 
@@ -599,7 +598,7 @@ module RGeo
599
598
  # this geometry, strictly speaking, the result of performing
600
599
  # operations on objects from different factories is undefined.
601
600
 
602
- def sym_difference(another_geometry)
601
+ def sym_difference(_another_geometry)
603
602
  raise Error::UnsupportedOperation, "Method #{self.class}#sym_difference not defined."
604
603
  end
605
604
 
@@ -611,7 +610,7 @@ module RGeo
611
610
  # this geometry, strictly speaking, the result of comparing objects
612
611
  # from different factories is undefined.
613
612
 
614
- def rep_equals?(another_geometry)
613
+ def rep_equals?(_another_geometry)
615
614
  raise Error::UnsupportedOperation, "Method #{self.class}#rep_equals? not defined."
616
615
  end
617
616
 
@@ -647,12 +646,12 @@ module RGeo
647
646
  # representational equivalence test, this method must fall back on
648
647
  # objective equivalence.
649
648
 
650
- def eql?(rhs)
651
- if rhs.is_a?(RGeo::Feature::Instance)
649
+ def eql?(other)
650
+ if other.is_a?(RGeo::Feature::Instance)
652
651
  begin
653
- rep_equals?(rhs)
652
+ rep_equals?(other)
654
653
  rescue Error::UnsupportedOperation
655
- equal?(rhs)
654
+ equal?(other)
656
655
  end
657
656
  else
658
657
  false
@@ -673,12 +672,12 @@ module RGeo
673
672
  # test, the == operator must fall back on representational or
674
673
  # objective equivalence.
675
674
 
676
- def ==(rhs)
677
- if rhs.is_a?(RGeo::Feature::Instance)
675
+ def ==(other)
676
+ if other.is_a?(RGeo::Feature::Instance)
678
677
  begin
679
- equals?(rhs)
678
+ equals?(other)
680
679
  rescue Error::UnsupportedOperation
681
- eql?(rhs)
680
+ eql?(other)
682
681
  end
683
682
  else
684
683
  false
@@ -690,8 +689,8 @@ module RGeo
690
689
  # types is not specified; an implementation may choose to provide
691
690
  # additional capabilities as appropriate.
692
691
 
693
- def -(rhs)
694
- difference(rhs)
692
+ def -(other)
693
+ difference(other)
695
694
  end
696
695
 
697
696
  # If the given rhs is a geometry object, this operator must behave
@@ -699,8 +698,8 @@ module RGeo
699
698
  # is not specified; an implementation may choose to provide
700
699
  # additional capabilities as appropriate.
701
700
 
702
- def +(rhs)
703
- union(rhs)
701
+ def +(other)
702
+ union(other)
704
703
  end
705
704
 
706
705
  # If the given rhs is a geometry object, this operator must behave
@@ -708,8 +707,20 @@ module RGeo
708
707
  # types is not specified; an implementation may choose to provide
709
708
  # additional capabilities as appropriate.
710
709
 
711
- def *(rhs)
712
- intersection(rhs)
710
+ def *(other)
711
+ intersection(other)
712
+ end
713
+
714
+ # Convenience method to transform/project a geometry
715
+ # to a different coordinate system from the geometry itself
716
+ # instead of the cast method.
717
+ #
718
+ # @note: Not an OGC SFS method
719
+ #
720
+ # @param [RGeo::Feature::Factory] other_factory
721
+ # @return [RGeo::Feature::Geometry]
722
+ def transform(other_factory)
723
+ Feature.cast(self, factory: other_factory, project: true)
713
724
  end
714
725
  end
715
726
  end
@@ -28,7 +28,6 @@ module RGeo
28
28
  # include this module itself. Therefore, you should not depend on the
29
29
  # kind_of? method to check type. Instead, use the provided check_type
30
30
  # class method (or === operator) defined in the Type module.
31
-
32
31
  module GeometryCollection
33
32
  include Geometry
34
33
  extend Type
@@ -58,7 +57,7 @@ module RGeo
58
57
  # Also note that this method is different from GeometryCollection#[]
59
58
  # in that it does not support negative indexes.
60
59
 
61
- def geometry_n(n)
60
+ def geometry_n(_idx)
62
61
  raise Error::UnsupportedOperation, "Method #{self.class}#geometry_n not defined."
63
62
  end
64
63
 
@@ -78,7 +77,7 @@ module RGeo
78
77
  # the same way Ruby's array indexing works. Hence, geometry_n(-1)
79
78
  # returns nil, where [-1] returns the last element of the collection.
80
79
 
81
- def [](n)
80
+ def [](_idx)
82
81
  raise Error::UnsupportedOperation, "Method #{self.class}#[] not defined."
83
82
  end
84
83
 
@@ -95,7 +94,7 @@ module RGeo
95
94
  # Note that all GeometryCollection implementations must also
96
95
  # include the Enumerable mixin.
97
96
 
98
- def each(&block)
97
+ def each(&_block)
99
98
  raise Error::UnsupportedOperation, "Method #{self.class}#each not defined."
100
99
  end
101
100
 
@@ -20,7 +20,6 @@ module RGeo
20
20
  # include this module itself. Therefore, you should not depend on the
21
21
  # kind_of? method to check type. Instead, use the provided check_type
22
22
  # class method (or === operator) defined in the Type module.
23
-
24
23
  module LineString
25
24
  include Curve
26
25
  extend Type
@@ -47,7 +46,7 @@ module RGeo
47
46
  # if the given N is out of range. N is zero-based.
48
47
  # Does not support negative indexes.
49
48
 
50
- def point_n(n)
49
+ def point_n(_idx)
51
50
  raise Error::UnsupportedOperation, "Method #{self.class}#point_n not defined."
52
51
  end
53
52
 
@@ -19,7 +19,6 @@ module RGeo
19
19
  # include this module itself. Therefore, you should not depend on the
20
20
  # kind_of? method to check type. Instead, use the provided check_type
21
21
  # class method (or === operator) defined in the Type module.
22
-
23
22
  module LinearRing
24
23
  include LineString
25
24
  extend Type
@@ -37,7 +37,6 @@ module RGeo
37
37
  # include this module itself. Therefore, you should not depend on the
38
38
  # kind_of? method to check type. Instead, use the provided check_type
39
39
  # class method (or === operator) defined in the Type module.
40
-
41
40
  module MultiCurve
42
41
  include GeometryCollection
43
42
  extend Type