rgeo 2.3.1 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +6 -0
  3. data/README.md +23 -14
  4. data/ext/geos_c_impl/analysis.c +30 -25
  5. data/ext/geos_c_impl/analysis.h +8 -7
  6. data/ext/geos_c_impl/coordinates.c +27 -21
  7. data/ext/geos_c_impl/coordinates.h +5 -2
  8. data/ext/geos_c_impl/errors.c +19 -10
  9. data/ext/geos_c_impl/errors.h +11 -4
  10. data/ext/geos_c_impl/extconf.rb +42 -28
  11. data/ext/geos_c_impl/factory.c +540 -451
  12. data/ext/geos_c_impl/factory.h +105 -95
  13. data/ext/geos_c_impl/geometry.c +593 -387
  14. data/ext/geos_c_impl/geometry.h +10 -5
  15. data/ext/geos_c_impl/geometry_collection.c +306 -339
  16. data/ext/geos_c_impl/geometry_collection.h +6 -20
  17. data/ext/geos_c_impl/globals.c +169 -0
  18. data/ext/geos_c_impl/globals.h +46 -0
  19. data/ext/geos_c_impl/line_string.c +271 -231
  20. data/ext/geos_c_impl/line_string.h +5 -8
  21. data/ext/geos_c_impl/main.c +16 -16
  22. data/ext/geos_c_impl/point.c +65 -67
  23. data/ext/geos_c_impl/point.h +4 -7
  24. data/ext/geos_c_impl/polygon.c +137 -135
  25. data/ext/geos_c_impl/polygon.h +11 -11
  26. data/ext/geos_c_impl/preface.h +16 -10
  27. data/ext/geos_c_impl/ruby_more.c +67 -0
  28. data/ext/geos_c_impl/ruby_more.h +25 -0
  29. data/lib/rgeo/cartesian/analysis.rb +5 -3
  30. data/lib/rgeo/cartesian/bounding_box.rb +74 -79
  31. data/lib/rgeo/cartesian/calculations.rb +64 -33
  32. data/lib/rgeo/cartesian/factory.rb +57 -102
  33. data/lib/rgeo/cartesian/feature_classes.rb +68 -46
  34. data/lib/rgeo/cartesian/feature_methods.rb +67 -25
  35. data/lib/rgeo/cartesian/interface.rb +6 -41
  36. data/lib/rgeo/cartesian/planar_graph.rb +373 -0
  37. data/lib/rgeo/cartesian/sweepline_intersector.rb +147 -0
  38. data/lib/rgeo/cartesian/valid_op.rb +69 -0
  39. data/lib/rgeo/cartesian.rb +3 -0
  40. data/lib/rgeo/coord_sys/cs/entities.rb +303 -99
  41. data/lib/rgeo/coord_sys/cs/factories.rb +0 -2
  42. data/lib/rgeo/coord_sys/cs/wkt_parser.rb +90 -42
  43. data/lib/rgeo/coord_sys.rb +1 -20
  44. data/lib/rgeo/error.rb +15 -0
  45. data/lib/rgeo/feature/curve.rb +0 -11
  46. data/lib/rgeo/feature/factory.rb +26 -36
  47. data/lib/rgeo/feature/factory_generator.rb +6 -14
  48. data/lib/rgeo/feature/geometry.rb +146 -66
  49. data/lib/rgeo/feature/geometry_collection.rb +16 -9
  50. data/lib/rgeo/feature/line_string.rb +4 -5
  51. data/lib/rgeo/feature/linear_ring.rb +0 -1
  52. data/lib/rgeo/feature/multi_curve.rb +0 -6
  53. data/lib/rgeo/feature/multi_surface.rb +3 -4
  54. data/lib/rgeo/feature/point.rb +4 -5
  55. data/lib/rgeo/feature/polygon.rb +1 -2
  56. data/lib/rgeo/feature/surface.rb +3 -4
  57. data/lib/rgeo/feature/types.rb +69 -85
  58. data/lib/rgeo/geographic/factory.rb +98 -125
  59. data/lib/rgeo/geographic/interface.rb +69 -166
  60. data/lib/rgeo/geographic/projected_feature_classes.rb +21 -9
  61. data/lib/rgeo/geographic/projected_feature_methods.rb +67 -42
  62. data/lib/rgeo/geographic/projected_window.rb +36 -22
  63. data/lib/rgeo/geographic/{proj4_projector.rb → projector.rb} +3 -5
  64. data/lib/rgeo/geographic/simple_mercator_projector.rb +26 -25
  65. data/lib/rgeo/geographic/spherical_feature_classes.rb +29 -9
  66. data/lib/rgeo/geographic/spherical_feature_methods.rb +86 -9
  67. data/lib/rgeo/geographic/spherical_math.rb +17 -20
  68. data/lib/rgeo/geographic.rb +1 -1
  69. data/lib/rgeo/geos/capi_factory.rb +87 -158
  70. data/lib/rgeo/geos/capi_feature_classes.rb +50 -36
  71. data/lib/rgeo/geos/ffi_factory.rb +105 -173
  72. data/lib/rgeo/geos/ffi_feature_classes.rb +34 -10
  73. data/lib/rgeo/geos/ffi_feature_methods.rb +105 -127
  74. data/lib/rgeo/geos/interface.rb +20 -59
  75. data/lib/rgeo/geos/utils.rb +5 -5
  76. data/lib/rgeo/geos/zm_factory.rb +53 -95
  77. data/lib/rgeo/geos/zm_feature_methods.rb +30 -33
  78. data/lib/rgeo/geos.rb +8 -8
  79. data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +9 -22
  80. data/lib/rgeo/impl_helper/basic_geometry_methods.rb +1 -2
  81. data/lib/rgeo/impl_helper/basic_line_string_methods.rb +28 -56
  82. data/lib/rgeo/impl_helper/basic_point_methods.rb +2 -14
  83. data/lib/rgeo/impl_helper/basic_polygon_methods.rb +17 -26
  84. data/lib/rgeo/impl_helper/utils.rb +21 -0
  85. data/lib/rgeo/impl_helper/valid_op.rb +350 -0
  86. data/lib/rgeo/impl_helper/validity_check.rb +139 -0
  87. data/lib/rgeo/impl_helper.rb +1 -0
  88. data/lib/rgeo/version.rb +1 -1
  89. data/lib/rgeo/wkrep/wkb_generator.rb +73 -63
  90. data/lib/rgeo/wkrep/wkb_parser.rb +33 -31
  91. data/lib/rgeo/wkrep/wkt_generator.rb +52 -45
  92. data/lib/rgeo/wkrep/wkt_parser.rb +48 -35
  93. data/lib/rgeo.rb +1 -3
  94. metadata +50 -13
  95. data/lib/rgeo/coord_sys/srs_database/entry.rb +0 -107
  96. data/lib/rgeo/coord_sys/srs_database/sr_org.rb +0 -64
  97. data/lib/rgeo/coord_sys/srs_database/url_reader.rb +0 -65
@@ -28,7 +28,6 @@ module RGeo
28
28
  # * FittedCoordinateSystem is not implemented.
29
29
  # * The defaultEnvelope attribute of CS_CoordinateSystem is not
30
30
  # implemented.
31
-
32
31
  module CS
33
32
  # A class implementing the CS_CoordinateSystemFactory interface.
34
33
  # It provides methods for building up complex objects from simpler
@@ -37,7 +36,6 @@ module RGeo
37
36
  # Note that the methods of CS_CoordinateSystemFactory do not provide
38
37
  # facilities for setting the authority. If you need to set authority
39
38
  # values, use the create methods for the object classes themselves.
40
-
41
39
  class CoordinateSystemFactory
42
40
  # Create a CompoundCoordinateSystem from a name, and two
43
41
  # constituent coordinate systems.
@@ -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
- raise Error::ParseError("Found token #{@cur_token} when we expected a value")
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,26 +49,34 @@ 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
- raise Error::ParseError("Expected 7 Bursa Wolf parameters but found #{bursa_wolf_params.size}")
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
- case containing_type
56
- when "GEOCCS", "VERT_CS", "PROJCS", "SPHEROID"
57
- klass = LinearUnit
58
- when "GEOGCS"
59
- klass = AngularUnit
60
- else
61
- klass = Unit
62
- end
59
+ klass = case containing_type
60
+ when "GEOCCS", "VERT_CS", "PROJCS", "SPHEROID"
61
+ LinearUnit
62
+ when "GEOGCS"
63
+ AngularUnit
64
+ else
65
+ Unit
66
+ end
63
67
  obj = klass.create(args.shift(QuotedString), args.shift(Numeric), *args.create_optionals)
64
68
  when "PARAMETER"
65
69
  obj = ProjectionParameter.create(args.shift(QuotedString), args.shift(Numeric))
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)
@@ -79,16 +89,26 @@ module RGeo
79
89
  obj = VerticalDatum.create(args.shift(QuotedString), args.shift(Numeric), *args.create_optionals)
80
90
  when "LOCAL_DATUM"
81
91
  obj = LocalDatum.create(args.shift(QuotedString), args.shift(Numeric), *args.create_optionals)
92
+ when "CS"
93
+ # Not actually valid WKT, but necessary to load and dump factories
94
+ # with placeholder coord_sys objects
95
+ defn = args.shift(QuotedString)
96
+ dim = args.shift(Float).to_i
97
+ optionals = args.create_optionals
98
+ obj = CoordinateSystem.create(defn, dim, *optionals)
82
99
  when "COMPD_CS"
83
- 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
+ )
84
106
  when "LOCAL_CS"
85
107
  name = args.shift(QuotedString)
86
108
  local_datum = args.find_first(LocalDatum)
87
109
  unit = args.find_first(Unit)
88
110
  axes = args.find_all(AxisInfo)
89
- unless axes.size > 0
90
- raise Error::ParseError("Expected at least one AXIS in a LOCAL_CS")
91
- end
111
+ raise Error::ParseError, "Expected at least one AXIS in a LOCAL_CS" unless axes.size > 0
92
112
  obj = LocalCoordinateSystem.create(name, local_datum, unit, axes, *args.create_optionals)
93
113
  when "GEOCCS"
94
114
  name = args.shift(QuotedString)
@@ -96,10 +116,21 @@ module RGeo
96
116
  prime_meridian = args.find_first(PrimeMeridian)
97
117
  linear_unit = args.find_first(LinearUnit)
98
118
  axes = args.find_all(AxisInfo)
119
+
99
120
  unless axes.size == 0 || axes.size == 3
100
- raise Error::ParseError("GEOCCS must contain either 0 or 3 AXIS parameters")
121
+ raise Error::ParseError, "GEOCCS must contain either 0 or 3 AXIS parameters"
101
122
  end
102
- 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
+ )
103
134
  when "VERT_CS"
104
135
  name = args.shift(QuotedString)
105
136
  vertical_datum = args.find_first(VerticalDatum)
@@ -112,10 +143,20 @@ module RGeo
112
143
  prime_meridian = args.find_first(PrimeMeridian)
113
144
  angular_unit = args.find_first(AngularUnit)
114
145
  axes = args.find_all(AxisInfo)
146
+
115
147
  unless axes.size == 0 || axes.size == 2
116
- raise Error::ParseError("GEOGCS must contain either 0 or 2 AXIS parameters")
148
+ raise Error::ParseError, "GEOGCS must contain either 0 or 2 AXIS parameters"
117
149
  end
118
- 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
+ )
119
160
  when "PROJCS"
120
161
  name = args.shift(QuotedString)
121
162
  geographic_coordinate_system = args.find_first(GeographicCoordinateSystem)
@@ -124,10 +165,20 @@ module RGeo
124
165
  projection.instance_variable_get(:@parameters).concat(parameters)
125
166
  linear_unit = args.find_first(LinearUnit)
126
167
  axes = args.find_all(AxisInfo)
168
+
127
169
  unless axes.size == 0 || axes.size == 2
128
- raise Error::ParseError("PROJCS must contain either 0 or 2 AXIS parameters")
170
+ raise Error::ParseError, "PROJCS must contain either 0 or 2 AXIS parameters"
129
171
  end
130
- 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
+ )
131
182
  else
132
183
  raise Error::ParseError, "Unrecognized type: #{type}"
133
184
  end
@@ -143,9 +194,9 @@ module RGeo
143
194
  end
144
195
 
145
196
  def expect_tokentype(type) # :nodoc:
146
- unless type === @cur_token
147
- raise Error::ParseError, "#{type.inspect} expected but #{@cur_token.inspect} found."
148
- end
197
+ return if type === @cur_token
198
+
199
+ raise Error::ParseError, "#{type.inspect} expected but #{@cur_token.inspect} found."
149
200
  end
150
201
 
151
202
  def next_token # :nodoc:
@@ -169,13 +220,14 @@ module RGeo
169
220
  when "", nil
170
221
  @cur_token = nil
171
222
  else
172
- @scanner.scan_until(/[^\s\(\)\[\],"]+/)
223
+ @scanner.scan_until(/[^\s()\[\],"]+/)
173
224
  token = @scanner.matched
174
- if token =~ /^[-+]?(\d+(\.\d*)?|\.\d+)(e[-+]?\d+)?$/
175
- @cur_token = token.to_f
176
- else
225
+
226
+ unless token =~ /^[-+]?(\d+(\.\d*)?|\.\d+)(e[-+]?\d+)?$/
177
227
  raise Error::ParseError, "Bad token: #{token.inspect}"
178
228
  end
229
+
230
+ @cur_token = token.to_f
179
231
  end
180
232
  @cur_token
181
233
  end
@@ -200,13 +252,12 @@ module RGeo
200
252
  end
201
253
 
202
254
  class ExtensionClause # :nodoc:
255
+ attr_reader :key, :value
256
+
203
257
  def initialize(key, value) # :nodoc:
204
258
  @key = key
205
259
  @value = value
206
260
  end
207
-
208
- attr_reader :key # :nodoc:
209
- attr_reader :value # :nodoc:
210
261
  end
211
262
 
212
263
  class ArgumentList # :nodoc:
@@ -219,12 +270,13 @@ module RGeo
219
270
  end
220
271
 
221
272
  def assert_empty # :nodoc:
222
- if @values.size > 0
223
- names = @values.map do |val|
224
- val.is_a?(Base) ? val.wkt_typename : val.inspect
225
- end
226
- 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
227
277
  end
278
+
279
+ raise Error::ParseError, "#{@values.size} unexpected arguments: #{names.join(', ')}"
228
280
  end
229
281
 
230
282
  def find_first(klass) # :nodoc:
@@ -259,12 +311,8 @@ module RGeo
259
311
 
260
312
  def shift(klass = nil) # :nodoc:
261
313
  val = @values.shift
262
- unless val
263
- raise Error::ParseError, "No arguments left... expected #{klass}"
264
- end
265
- if klass && !val.is_a?(klass)
266
- raise Error::ParseError, "Expected #{klass} but got #{val.class}"
267
- 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)
268
316
  val
269
317
  end
270
318
  end
@@ -9,9 +9,6 @@
9
9
  require_relative "coord_sys/cs/factories"
10
10
  require_relative "coord_sys/cs/entities"
11
11
  require_relative "coord_sys/cs/wkt_parser"
12
- require_relative "coord_sys/srs_database/entry"
13
- require_relative "coord_sys/srs_database/url_reader"
14
- require_relative "coord_sys/srs_database/sr_org"
15
12
 
16
13
  module RGeo
17
14
  # This module provides data structures and tools related to coordinate
@@ -26,23 +23,7 @@ module RGeo
26
23
  # This includes classes for representing ellipsoids, datums, coordinate
27
24
  # systems, and other related concepts, as well as a parser for the WKT
28
25
  # format for specifying coordinate systems.
29
- #
30
- # The RGeo::CoordSys::SRSDatabase module contains tools for accessing
31
- # spatial reference databases, from which you can look up coordinate
32
- # system specifications. You can access the <tt>spatial_ref_sys</tt>
33
- # table provided with OGC-compliant spatial databases such as PostGIS,
34
- # read the databases provided with the proj4 library, or access URLs
35
- # such as those provided by spatialreference.org.
36
-
37
26
  module CoordSys
38
- # The only valid key is :proj4
39
- def self.supported?(key)
40
- raise(Error::UnsupportedOperation, "Invalid key. The only valid key is :proj4.") unless key == :proj4
41
- defined?(RGeo::CoordSys::Proj4) && RGeo::CoordSys::Proj4.supported?
42
- end
43
-
44
- def self.check!(key)
45
- supported?(key) || raise(Error::UnsupportedOperation, "Coordinate system '#{key}' is not supported.")
46
- end
27
+ CONFIG = Struct.new(:default_coord_sys_class).new(CS::CoordinateSystem)
47
28
  end
48
29
  end
data/lib/rgeo/error.rb CHANGED
@@ -29,5 +29,20 @@ module RGeo
29
29
  # Parsing failed
30
30
  class ParseError < RGeoError
31
31
  end
32
+
33
+ # Standard error messages from
34
+ # https://github.com/locationtech/jts/blob/0afbfb1956ec24912a8b4dc4edff0f1200442857/modules/core/src/main/java/org/locationtech/jts/operation/valid/TopologyValidationError.java#L98-L110
35
+ TOPOLOGY_VALIDATION_ERR = "Topology Validation Error"
36
+ REPEATED_POINT = "Repeated Point"
37
+ HOLE_OUTSIDE_SHELL = "Hole lies outside shell"
38
+ NESTED_HOLES = "Holes are nested"
39
+ DISCONNECTED_INTERIOR = "Interior is disconnected"
40
+ SELF_INTERSECTION = "Self-intersection"
41
+ RING_SELF_INTERSECTION = "Ring Self-intersection"
42
+ NESTED_SHELLS = "Nested shells"
43
+ DUPLICATE_RINGS = "Duplicate Rings"
44
+ TOO_FEW_POINTS = "Too few distinct points in geometry component"
45
+ INVALID_COORDINATE = "Invalid Coordinate"
46
+ UNCLOSED_RING = "Ring is not closed"
32
47
  end
33
48
  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
@@ -94,11 +93,6 @@ module RGeo
94
93
  raise Error::UnsupportedOperation, "Method Curve#closed? not defined."
95
94
  end
96
95
 
97
- def is_closed?
98
- warn "The is_closed? method is deprecated, please use the closed? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
99
- closed?
100
- end
101
-
102
96
  # === SFS 1.1 Description
103
97
  #
104
98
  # Returns true if this Curve is closed [StartPoint() = EndPoint()]
@@ -113,11 +107,6 @@ module RGeo
113
107
  def ring?
114
108
  raise Error::UnsupportedOperation, "Method Curve#ring? not defined."
115
109
  end
116
-
117
- def is_ring?
118
- warn "The is_ring? method is deprecated, please use the ring? counterpart, will be removed in v3" unless ENV["RGEO_SILENCE_DEPRECATION"]
119
- ring?
120
- end
121
110
  end
122
111
  end
123
112
  end
@@ -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,16 +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
221
- end
222
-
223
- # Returns a RGeo::CoordSys::Proj4 representing the projection for
224
- # the coordinate system of features created by this factory, or nil
225
- # if there is no such proj4 projection.
226
-
227
- def proj4
228
- nil
217
+ def multi_polygon(_elems)
218
+ raise Error::UnsupportedOperation, "Method #{self.class}##{__method__} not defined."
229
219
  end
230
220
 
231
221
  # Returns the coordinate system specification for the features
@@ -262,7 +252,7 @@ module RGeo
262
252
  # the original is already of the desired factory and type
263
253
  # [<tt>:project</tt>]
264
254
  # indicates whether to project the coordinates from the source to
265
- # the destination proj4 coordinate system, if available
255
+ # the destination coordinate system, if available
266
256
  #
267
257
  # It should return either a casted result object, false, or nil.
268
258
  # A nil return value indicates that casting should be forced to
@@ -272,7 +262,7 @@ module RGeo
272
262
  # algorithm to cast the object. Therefore, by default, you should
273
263
  # return false.
274
264
 
275
- def override_cast(original, type, flags)
265
+ def override_cast(_original, _type, _flags)
276
266
  false
277
267
  end
278
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
  #
@@ -56,25 +55,18 @@ module RGeo
56
55
  # [<tt>:srid</tt>]
57
56
  # The SRID for the factory and objects it creates.
58
57
  # Default is usually 0.
59
- # [<tt>:proj4</tt>]
60
- # The coordinate system in Proj4 format, either as a
61
- # CoordSys::Proj4 object or as a string or hash representing the
62
- # proj4 format. This is usually an optional parameter; the default
63
- # is usually nil.
64
58
  # [<tt>:coord_sys</tt>]
65
59
  # The coordinate system in OGC form, either as a subclass of
66
60
  # CoordSys::CS::CoordinateSystem, or as a string in WKT format.
67
- # This is usually an optional parameter; the default is usually
68
- # nil.
69
- # [<tt>:srs_database</tt>]
70
- # If provided, look up the Proj4 and OGC coordinate systems from
71
- # the given database and SRID.
61
+ # Optional. If no coord_sys is given, but an SRID is the factory
62
+ # will try to create one using the CoordSys::CONFIG.default_coord_sys_class
63
+ # or the given :coord_sys_class option. The option is usually nil.
72
64
  # [<tt>:has_z_coordinate</tt>]
73
65
  # Support Z coordinates. Default is usually false.
74
66
  # [<tt>:has_m_coordinate</tt>]
75
67
  # Support M coordinates. Default is usually false.
76
68
 
77
- def call(config = {})
69
+ def call(_config = {})
78
70
  nil
79
71
  end
80
72
 
@@ -82,7 +74,7 @@ module RGeo
82
74
  # factory.
83
75
 
84
76
  def self.single(factory)
85
- proc { |c| factory }
77
+ proc { |_c| factory }
86
78
  end
87
79
 
88
80
  # Return a new FactoryGenerator that calls the given delegate, but
@@ -91,7 +83,7 @@ module RGeo
91
83
  # force certain values to override the given configuration.
92
84
 
93
85
  def self.decorate(delegate, default_config = {}, force_config = {})
94
- proc { |c| delegate_.call(default_config.merge(c).merge(force_config)) }
86
+ proc { |c| delegate.call(default_config.merge(c).merge(force_config)) }
95
87
  end
96
88
  end
97
89
  end