rgeo 2.3.1 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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