rgeo 3.0.0 → 3.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dc0fdafb5f2260dd8e4310275cdb5d07be71c7cdeb39c86d5aa6931a454df3cf
4
- data.tar.gz: 1b47209e5205243eb568ed50eea430279c629a1c16cb290253de809dd3a99ee2
3
+ metadata.gz: 986cc6e02e2625161460dee926ef5237df6bd9959323190ab25fff10de68d76f
4
+ data.tar.gz: 10611b18bd565c006ff06bf12b152a07fed95968e46730fa652d39d2b4a6be5c
5
5
  SHA512:
6
- metadata.gz: 40a807a8aa741e30715c5b7dc1a487ae9682c149ff3c94b7f370190fbf804c1f11ac034c0f697a923b49cef3f763121224c1e1cef6eafc5b9721a1ba0f6d4344
7
- data.tar.gz: 72bec2c1432b56a2bb5ea50809f0d15d157c5c1e30379e756fb089c4dcd62a455d66783036e2d742c33ae552fe0f3a2ef40e53b07a26c6ccab21a2489f4f9214
6
+ metadata.gz: 85874f17611f284b7af91fce4bc383f5361f1880cdcb3cb2b40b4efd3c7c8146925cfac415819d4e1195dd92b9887fa0406fa3df786e7d651e5e55e165f231de
7
+ data.tar.gz: 7abe786c87c3138e94c665a2cd845d1f599e7238cdf505e25e68303ec1de575d5fd400393541d1c3e023fb57511f7ae8defeaceb60d4d08cecb013a04526035d
data/README.md CHANGED
@@ -5,11 +5,10 @@
5
5
 
6
6
  RGeo is a geospatial data library for Ruby.
7
7
 
8
- :warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning:
8
+ ***Contributors Wanted!***
9
9
 
10
- This organization is looking for maintainers, see [this issue](https://github.com/rgeo/rgeo/issues/216) for more information.
10
+ If you use RGeo and are interested in contributing, please check out our [open issues](https://github.com/rgeo/rgeo/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22%2C%22help+wanted%22) to see if there's anything you're able to help with.
11
11
 
12
- :warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning::warning:
13
12
 
14
13
  ### Summary
15
14
 
@@ -37,7 +36,7 @@ Use the core **rgeo** gem to:
37
36
 
38
37
  RGeo works with the following Ruby implementations:
39
38
 
40
- * MRI Ruby 2.6.0 or later.
39
+ * MRI Ruby 3.1.4 or later.
41
40
  * Partial support for JRuby 9.0 or later. The FFI implementation of GEOS
42
41
  is available (ffi-geos gem required) but CAPI is not.
43
42
  * See earlier versions for support for older ruby versions.
@@ -45,6 +45,8 @@ if have_header("geos_c.h")
45
45
  have_func("GEOSPreparedDisjoint_r", "geos_c.h")
46
46
  have_func("GEOSUnaryUnion_r", "geos_c.h")
47
47
  have_func("GEOSCoordSeq_isCCW_r", "geos_c.h")
48
+ have_func("GEOSDensify", "geos_c.h")
49
+ have_func("GEOSPolygonHullSimplify", "geos_c.h")
48
50
  have_func("rb_memhash", "ruby.h")
49
51
  have_func("rb_gc_mark_movable", "ruby.h")
50
52
  end
@@ -378,6 +378,7 @@ method_factory_write_for_marshal(VALUE self, VALUE obj)
378
378
  wkb_writer = self_data->marshal_wkb_writer;
379
379
  if (!wkb_writer) {
380
380
  wkb_writer = GEOSWKBWriter_create();
381
+ GEOSWKBWriter_setOutputDimension(wkb_writer, 2);
381
382
  if (has_3d) {
382
383
  GEOSWKBWriter_setOutputDimension(wkb_writer, 3);
383
384
  }
@@ -427,6 +428,7 @@ method_factory_write_for_psych(VALUE self, VALUE obj)
427
428
  wkt_writer = self_data->psych_wkt_writer;
428
429
  if (!wkt_writer) {
429
430
  wkt_writer = GEOSWKTWriter_create();
431
+ GEOSWKTWriter_setOutputDimension(wkt_writer, 2);
430
432
  GEOSWKTWriter_setTrim(wkt_writer, 1);
431
433
  if (has_3d) {
432
434
  GEOSWKTWriter_setOutputDimension(wkt_writer, 3);
@@ -1008,7 +1010,7 @@ rgeo_geos_coordseqs_eql(const GEOSGeometry* geom1,
1008
1010
  result = Qnil;
1009
1011
  break;
1010
1012
  }
1011
- } // Iteration over coords
1013
+ } // Iteration over coords
1012
1014
  } else { // Lengths are different
1013
1015
  result = Qfalse;
1014
1016
  }
@@ -105,8 +105,8 @@ extern const rb_data_type_t rgeo_geometry_type;
105
105
  (_RGEO_TYPEDDATA_P(object, &rgeo_geometry_type))
106
106
 
107
107
  #define _RGEO_TYPEDDATA_P(object, data_type) \
108
- (TYPE(object) == T_DATA && RTYPEDDATA(object)->typed_flag == 1 && \
109
- RTYPEDDATA(object)->type == data_type)
108
+ (RB_TYPE_P(object, T_DATA) && RTYPEDDATA_P(object) && \
109
+ RTYPEDDATA_TYPE(object) == data_type)
110
110
 
111
111
  // Returns the RGeo_FactoryData* given a ruby Factory object
112
112
  #define RGEO_FACTORY_DATA_PTR(factory) \
@@ -266,6 +266,7 @@ method_geometry_as_text(VALUE self)
266
266
  wkt_writer = factory_data->wkt_writer;
267
267
  if (!wkt_writer) {
268
268
  wkt_writer = GEOSWKTWriter_create();
269
+ GEOSWKTWriter_setOutputDimension(wkt_writer, 2);
269
270
  GEOSWKTWriter_setTrim(wkt_writer, 1);
270
271
  factory_data->wkt_writer = wkt_writer;
271
272
  }
@@ -304,6 +305,7 @@ method_geometry_as_binary(VALUE self)
304
305
 
305
306
  if (!wkb_writer) {
306
307
  wkb_writer = GEOSWKBWriter_create();
308
+ GEOSWKBWriter_setOutputDimension(wkb_writer, 2);
307
309
  factory_data->wkb_writer = wkb_writer;
308
310
  }
309
311
  str = (char*)GEOSWKBWriter_write(wkb_writer, self_geom, &size);
@@ -738,6 +740,27 @@ method_geometry_buffer(VALUE self, VALUE distance)
738
740
  return result;
739
741
  }
740
742
 
743
+ #ifdef RGEO_GEOS_SUPPORTS_DENSIFY
744
+ static VALUE
745
+ method_geometry_segmentize(VALUE self, VALUE max_segment_length)
746
+ {
747
+ VALUE result;
748
+ RGeo_GeometryData* self_data;
749
+ const GEOSGeometry* self_geom;
750
+ VALUE factory;
751
+
752
+ result = Qnil;
753
+ self_data = RGEO_GEOMETRY_DATA_PTR(self);
754
+ self_geom = self_data->geom;
755
+ if (self_geom) {
756
+ factory = self_data->factory;
757
+ result = rgeo_wrap_geos_geometry(
758
+ factory, GEOSDensify(self_geom, rb_num2dbl(max_segment_length)), Qnil);
759
+ }
760
+ return result;
761
+ }
762
+ #endif
763
+
741
764
  static VALUE
742
765
  method_geometry_buffer_with_style(VALUE self,
743
766
  VALUE distance,
@@ -1306,6 +1329,10 @@ rgeo_init_geos_geometry()
1306
1329
  geos_geometry_methods, "make_valid", method_geometry_make_valid, 0);
1307
1330
  rb_define_method(
1308
1331
  geos_geometry_methods, "polygonize", method_geometry_polygonize, 0);
1332
+ #ifdef RGEO_GEOS_SUPPORTS_DENSIFY
1333
+ rb_define_method(
1334
+ geos_geometry_methods, "segmentize", method_geometry_segmentize, 1);
1335
+ #endif
1309
1336
  }
1310
1337
 
1311
1338
  RGEO_END_C
@@ -56,8 +56,7 @@ notice_handler(const char* fmt, ...)
56
56
  #endif
57
57
  }
58
58
 
59
- static void
60
- error_handler(const char* fmt, ...)
59
+ NORETURN(static void error_handler(const char* fmt, ...))
61
60
  {
62
61
  // See https://en.cppreference.com/w/c/io/vfprintf
63
62
  va_list args1;
@@ -212,7 +212,8 @@ rgeo_create_geos_point(VALUE factory, double x, double y, double z)
212
212
  GEOSGeometry* geom;
213
213
 
214
214
  result = Qnil;
215
- coord_seq = GEOSCoordSeq_create(1, 3);
215
+ coord_seq = GEOSCoordSeq_create(
216
+ 1, 3); // Never cleaned if failure setting one of the coord
216
217
  if (coord_seq) {
217
218
  if (GEOSCoordSeq_setX(coord_seq, 0, x)) {
218
219
  if (GEOSCoordSeq_setY(coord_seq, 0, y)) {
@@ -231,6 +231,34 @@ method_polygon_interior_rings(VALUE self)
231
231
  return result;
232
232
  }
233
233
 
234
+ #ifdef RGEO_GEOS_SUPPORTS_POLYGON_HULL_SIMPLIFY
235
+ static VALUE
236
+ method_polygon_simplify_polygon_hull(VALUE self,
237
+ VALUE vertex_fraction,
238
+ VALUE is_outer)
239
+ {
240
+ VALUE result;
241
+ RGeo_GeometryData* self_data;
242
+ const GEOSGeometry* self_geom;
243
+ VALUE factory;
244
+
245
+ unsigned int is_outer_uint = RTEST(is_outer) ? 1 : 0;
246
+
247
+ result = Qnil;
248
+ self_data = RGEO_GEOMETRY_DATA_PTR(self);
249
+ self_geom = self_data->geom;
250
+ if (self_geom) {
251
+ factory = self_data->factory;
252
+ result = rgeo_wrap_geos_geometry(
253
+ factory,
254
+ GEOSPolygonHullSimplify(
255
+ self_geom, is_outer_uint, rb_num2dbl(vertex_fraction)),
256
+ Qnil);
257
+ }
258
+ return result;
259
+ }
260
+ #endif
261
+
234
262
  static VALUE
235
263
  cmethod_create(VALUE module,
236
264
  VALUE factory,
@@ -335,6 +363,13 @@ rgeo_init_geos_polygon()
335
363
  geos_polygon_methods, "interior_rings", method_polygon_interior_rings, 0);
336
364
  rb_define_method(
337
365
  geos_polygon_methods, "coordinates", method_polygon_coordinates, 0);
366
+
367
+ #ifdef RGEO_GEOS_SUPPORTS_POLYGON_HULL_SIMPLIFY
368
+ rb_define_method(geos_polygon_methods,
369
+ "simplify_polygon_hull",
370
+ method_polygon_simplify_polygon_hull,
371
+ 2);
372
+ #endif
338
373
  }
339
374
 
340
375
  st_index_t
@@ -23,6 +23,12 @@
23
23
  #ifdef HAVE_GEOSCOORDSEQ_ISCCW_R
24
24
  #define RGEO_GEOS_SUPPORTS_ISCCW
25
25
  #endif
26
+ #ifdef HAVE_GEOSDENSIFY
27
+ #define RGEO_GEOS_SUPPORTS_DENSIFY
28
+ #endif
29
+ #ifdef HAVE_GEOSPOLYGONHULLSIMPLIFY
30
+ #define RGEO_GEOS_SUPPORTS_POLYGON_HULL_SIMPLIFY
31
+ #endif
26
32
  #ifdef HAVE_RB_GC_MARK_MOVABLE
27
33
  #define mark rb_gc_mark_movable
28
34
  #else
@@ -121,7 +121,7 @@ module RGeo
121
121
  wkt_parser: symbolize_hash(data["wktp"]),
122
122
  wkb_parser: symbolize_hash(data["wkbp"]),
123
123
  buffer_resolution: data["bufr"],
124
- coord_sys: coord_sys
124
+ coord_sys:
125
125
  )
126
126
  end
127
127
 
@@ -152,7 +152,7 @@ module RGeo
152
152
  wkt_parser: symbolize_hash(coder["wkt_parser"]),
153
153
  wkb_parser: symbolize_hash(coder["wkb_parser"]),
154
154
  buffer_resolution: coder["buffer_resolution"],
155
- coord_sys: coord_sys
155
+ coord_sys:
156
156
  )
157
157
  end
158
158
 
@@ -251,6 +251,7 @@ module RGeo
251
251
  # :startdoc:
252
252
 
253
253
  def initialize(name, orientation) # :nodoc:
254
+ super()
254
255
  @name = name
255
256
  @orientation =
256
257
  case orientation
@@ -302,6 +303,7 @@ module RGeo
302
303
  # system that the projected coordinate system is based on.
303
304
  class ProjectionParameter < Base
304
305
  def initialize(name, value) # :nodoc:
306
+ super()
305
307
  @name = name
306
308
  @value = value.to_f
307
309
  end
@@ -339,6 +341,7 @@ module RGeo
339
341
  # points East, and the Z axis points North.
340
342
  class WGS84ConversionInfo < Base
341
343
  def initialize(dx_meters, dy_meters, dz_meters, ex_arc_seconds, ey_arc_seconds, ez_arc_seconds, ppm) # :nodoc:
344
+ super()
342
345
  @dx = dx_meters.to_f
343
346
  @dy = dy_meters.to_f
344
347
  @dz = dz_meters.to_f
@@ -427,6 +430,7 @@ module RGeo
427
430
  class Info < Base
428
431
  def initialize(name, authority = nil, authority_code = nil, abbreviation = nil, init_alias = nil,
429
432
  remarks = nil, extensions = nil) # :nodoc:
433
+ super()
430
434
  @name = name
431
435
  @authority = authority ? authority.to_s : nil
432
436
  @authority_code = authority_code ? authority_code.to_s : nil
@@ -817,8 +821,8 @@ module RGeo
817
821
  private
818
822
 
819
823
  def wkt_content(standard_brackets)
820
- array = [@ellipsoid.to_wkt(standard_brackets: standard_brackets)]
821
- array << @wgs84_parameters.to_wkt(standard_brackets: standard_brackets) if @wgs84_parameters
824
+ array = [@ellipsoid.to_wkt(standard_brackets:)]
825
+ array << @wgs84_parameters.to_wkt(standard_brackets:) if @wgs84_parameters
822
826
  array
823
827
  end
824
828
  end
@@ -851,8 +855,8 @@ module RGeo
851
855
 
852
856
  # Iterates over the parameters of the projection.
853
857
 
854
- def each_parameter(&block)
855
- @parameters.each(&block)
858
+ def each_parameter(&)
859
+ @parameters.each(&)
856
860
  end
857
861
 
858
862
  def wkt_typename
@@ -1024,7 +1028,7 @@ module RGeo
1024
1028
  private
1025
1029
 
1026
1030
  def wkt_content(standard_brackets)
1027
- [@head.to_wkt(standard_brackets: standard_brackets), @tail.to_wkt(standard_brackets: standard_brackets)]
1031
+ [@head.to_wkt(standard_brackets:), @tail.to_wkt(standard_brackets:)]
1028
1032
  end
1029
1033
  end
1030
1034
 
@@ -1088,9 +1092,9 @@ module RGeo
1088
1092
 
1089
1093
  def wkt_content(standard_brackets)
1090
1094
  [
1091
- @local_datum.to_wkt(standard_brackets: standard_brackets),
1092
- @unit.to_wkt(standard_brackets: standard_brackets)
1093
- ] + @axes.map { |ax| ax.to_wkt(standard_brackets: standard_brackets) }
1095
+ @local_datum.to_wkt(standard_brackets:),
1096
+ @unit.to_wkt(standard_brackets:)
1097
+ ] + @axes.map { |ax| ax.to_wkt(standard_brackets:) }
1094
1098
  end
1095
1099
  end
1096
1100
 
@@ -1161,13 +1165,13 @@ module RGeo
1161
1165
 
1162
1166
  def wkt_content(standard_brackets)
1163
1167
  arr = [
1164
- @horizontal_datum.to_wkt(standard_brackets: standard_brackets),
1165
- @prime_meridian.to_wkt(standard_brackets: standard_brackets),
1166
- @linear_unit.to_wkt(standard_brackets: standard_brackets)
1168
+ @horizontal_datum.to_wkt(standard_brackets:),
1169
+ @prime_meridian.to_wkt(standard_brackets:),
1170
+ @linear_unit.to_wkt(standard_brackets:)
1167
1171
  ]
1168
- arr << @axis0.to_wkt(standard_brackets: standard_brackets) if @axis0
1169
- arr << @axis1.to_wkt(standard_brackets: standard_brackets) if @axis1
1170
- arr << @axis2.to_wkt(standard_brackets: standard_brackets) if @axis2
1172
+ arr << @axis0.to_wkt(standard_brackets:) if @axis0
1173
+ arr << @axis1.to_wkt(standard_brackets:) if @axis1
1174
+ arr << @axis2.to_wkt(standard_brackets:) if @axis2
1171
1175
  arr
1172
1176
  end
1173
1177
  end
@@ -1222,10 +1226,10 @@ module RGeo
1222
1226
 
1223
1227
  def wkt_content(standard_brackets)
1224
1228
  arr = [
1225
- @vertical_datum.to_wkt(standard_brackets: standard_brackets),
1226
- @vertical_unit.to_wkt(standard_brackets: standard_brackets)
1229
+ @vertical_datum.to_wkt(standard_brackets:),
1230
+ @vertical_unit.to_wkt(standard_brackets:)
1227
1231
  ]
1228
- arr << @axis.to_wkt(standard_brackets: standard_brackets) if @axis
1232
+ arr << @axis.to_wkt(standard_brackets:) if @axis
1229
1233
  arr
1230
1234
  end
1231
1235
  end
@@ -1324,12 +1328,12 @@ module RGeo
1324
1328
 
1325
1329
  def wkt_content(standard_brackets)
1326
1330
  arr = [
1327
- @horizontal_datum.to_wkt(standard_brackets: standard_brackets),
1328
- @prime_meridian.to_wkt(standard_brackets: standard_brackets),
1329
- @angular_unit.to_wkt(standard_brackets: standard_brackets)
1331
+ @horizontal_datum.to_wkt(standard_brackets:),
1332
+ @prime_meridian.to_wkt(standard_brackets:),
1333
+ @angular_unit.to_wkt(standard_brackets:)
1330
1334
  ]
1331
- arr << @axis0.to_wkt(standard_brackets: standard_brackets) if @axis0
1332
- arr << @axis1.to_wkt(standard_brackets: standard_brackets) if @axis1
1335
+ arr << @axis0.to_wkt(standard_brackets:) if @axis0
1336
+ arr << @axis1.to_wkt(standard_brackets:) if @axis1
1333
1337
  arr
1334
1338
  end
1335
1339
  end
@@ -1393,13 +1397,13 @@ module RGeo
1393
1397
 
1394
1398
  def wkt_content(standard_brackets)
1395
1399
  arr = [
1396
- @geographic_coordinate_system.to_wkt(standard_brackets: standard_brackets),
1397
- @projection.to_wkt(standard_brackets: standard_brackets)
1400
+ @geographic_coordinate_system.to_wkt(standard_brackets:),
1401
+ @projection.to_wkt(standard_brackets:)
1398
1402
  ]
1399
- @projection.each_parameter { |param| arr << param.to_wkt(standard_brackets: standard_brackets) }
1400
- arr << @linear_unit.to_wkt(standard_brackets: standard_brackets)
1401
- arr << @axis0.to_wkt(standard_brackets: standard_brackets) if @axis0
1402
- arr << @axis1.to_wkt(standard_brackets: standard_brackets) if @axis1
1403
+ @projection.each_parameter { |param| arr << param.to_wkt(standard_brackets:) }
1404
+ arr << @linear_unit.to_wkt(standard_brackets:)
1405
+ arr << @axis0.to_wkt(standard_brackets:) if @axis0
1406
+ arr << @axis1.to_wkt(standard_brackets:) if @axis1
1403
1407
  arr
1404
1408
  end
1405
1409
  end
@@ -1546,8 +1550,8 @@ module RGeo
1546
1550
  private
1547
1551
 
1548
1552
  def wkt_content(standard_brackets)
1549
- source_cs_wkt = "SOURCECS[#{source_cs.to_wkt(standard_brackets: standard_brackets)}]"
1550
- target_cs_wkt = "TARGETCS[#{target_cs.to_wkt(standard_brackets: standard_brackets)}]"
1553
+ source_cs_wkt = "SOURCECS[#{source_cs.to_wkt(standard_brackets:)}]"
1554
+ target_cs_wkt = "TARGETCS[#{target_cs.to_wkt(standard_brackets:)}]"
1551
1555
 
1552
1556
  [source_cs_wkt, target_cs_wkt]
1553
1557
  end
@@ -94,7 +94,7 @@ module RGeo
94
94
  # Note that all GeometryCollection implementations must also
95
95
  # include the Enumerable mixin.
96
96
 
97
- def each(&_block)
97
+ def each(&)
98
98
  raise Error::UnsupportedOperation, "Method #{self.class}#each not defined."
99
99
  end
100
100
 
@@ -78,8 +78,8 @@ module RGeo
78
78
 
79
79
  # Iterates over the known immediate subtypes of this type.
80
80
 
81
- def each_immediate_subtype(&block)
82
- @subtypes&.each(&block)
81
+ def each_immediate_subtype(&)
82
+ @subtypes&.each(&)
83
83
  end
84
84
 
85
85
  # Returns the OpenGIS type name of this type. For example:
@@ -191,21 +191,15 @@ module RGeo
191
191
  if nfactory == factory
192
192
  force_new ? obj.dup : obj
193
193
  elsif type == Point
194
- cs = ncs = nil
195
- if project
196
- cs = factory.coord_sys
197
- ncs = nfactory.coord_sys
198
- end
199
- hasz = factory.property(:has_z_coordinate)
200
- nhasz = nfactory.property(:has_z_coordinate)
201
- if cs && ncs
202
- coords = cs.transform_coords(ncs, obj.x, obj.y, hasz ? obj.z : nil)
203
- coords << (hasz ? obj.z : 0.0) if nhasz && coords.size < 3
204
- else
205
- coords = [obj.x, obj.y]
206
- coords << (hasz ? obj.z : 0.0) if nhasz
207
- end
208
- coords << (factory.property(:has_m_coordinate) ? obj.m : 0.0) if nfactory.property(:has_m_coordinate)
194
+ z = factory.property(:has_z_coordinate) ? obj.z : nil
195
+ coords = if project && (cs = factory.coord_sys) && (ncs = nfactory.coord_sys)
196
+ cs.transform_coords(ncs, obj.x, obj.y, z)
197
+ else
198
+ [obj.x, obj.y]
199
+ end
200
+ coords << (z || 0.0) if nfactory.property(:has_z_coordinate) && coords.size < 3
201
+ m = factory.property(:has_m_coordinate) ? obj.m : nil
202
+ coords << (m || 0.0) if nfactory.property(:has_m_coordinate)
209
203
  nfactory.point(*coords)
210
204
  elsif type == Line
211
205
  nfactory.line(cast(obj.start_point, nfactory, opts), cast(obj.end_point, nfactory, opts))
@@ -139,7 +139,7 @@ module RGeo
139
139
  wkt_parser: symbolize_hash(data_["wktp"]),
140
140
  wkb_parser: symbolize_hash(data_["wkbp"]),
141
141
  buffer_resolution: data_["bufr"],
142
- coord_sys: coord_sys
142
+ coord_sys:
143
143
  )
144
144
  proj_klass = data_["prjc"]
145
145
  proj_factory = data_["prjf"]
@@ -189,7 +189,7 @@ module RGeo
189
189
  wkt_parser: symbolize_hash(coder["wkt_parser"]),
190
190
  wkb_parser: symbolize_hash(coder["wkb_parser"]),
191
191
  buffer_resolution: coder["buffer_resolution"],
192
- coord_sys: coord_sys
192
+ coord_sys:
193
193
  )
194
194
  proj_klass = coder["projectorclass"]
195
195
  proj_factory = coder["projection_factory"]
@@ -106,7 +106,7 @@ module RGeo
106
106
  "Spherical",
107
107
  has_z_coordinate: opts[:has_z_coordinate],
108
108
  has_m_coordinate: opts[:has_m_coordinate],
109
- coord_sys: coord_sys || coord_sys_4055,
109
+ coord_sys: coord_sys || coord_sys4055,
110
110
  buffer_resolution: opts[:buffer_resolution],
111
111
  wkt_parser: opts[:wkt_parser],
112
112
  wkb_parser: opts[:wkb_parser],
@@ -189,7 +189,7 @@ module RGeo
189
189
  def simple_mercator_factory(opts = {})
190
190
  factory = Geographic::Factory.new(
191
191
  "Projected",
192
- coord_sys: coord_sys_4326,
192
+ coord_sys: coord_sys4326,
193
193
  srid: 4326,
194
194
  wkt_parser: opts[:wkt_parser],
195
195
  wkb_parser: opts[:wkb_parser],
@@ -323,7 +323,7 @@ module RGeo
323
323
  # Now we should have all the coordinate system info.
324
324
  factory = Geographic::Factory.new(
325
325
  "Projected",
326
- coord_sys: coord_sys,
326
+ coord_sys:,
327
327
  srid: srid.to_i,
328
328
  has_z_coordinate: projection_factory.property(:has_z_coordinate),
329
329
  has_m_coordinate: projection_factory.property(:has_m_coordinate),
@@ -355,7 +355,7 @@ module RGeo
355
355
  # Now we should have all the coordinate system info.
356
356
  factory = Geographic::Factory.new(
357
357
  "Projected",
358
- coord_sys: coord_sys,
358
+ coord_sys:,
359
359
  srid: srid.to_i,
360
360
  has_z_coordinate: opts[:has_z_coordinate],
361
361
  has_m_coordinate: opts[:has_m_coordinate],
@@ -379,16 +379,16 @@ module RGeo
379
379
 
380
380
  private
381
381
 
382
- def coord_sys_4055
383
- return @coord_sys_4055 if defined?(@coord_sys_4055)
382
+ def coord_sys4055
383
+ return @coord_sys4055 if defined?(@coord_sys4055)
384
384
 
385
- @coord_sys_4055 = CoordSys::CONFIG.default_coord_sys_class.create(4055)
385
+ @coord_sys4055 = CoordSys::CONFIG.default_coord_sys_class.create(4055)
386
386
  end
387
387
 
388
- def coord_sys_4326
389
- return @coord_sys_4326 if defined?(@coord_sys_4326)
388
+ def coord_sys4326
389
+ return @coord_sys4326 if defined?(@coord_sys4326)
390
390
 
391
- @coord_sys_4326 = CoordSys::CONFIG.default_coord_sys_class.create(4326)
391
+ @coord_sys4326 = CoordSys::CONFIG.default_coord_sys_class.create(4326)
392
392
  end
393
393
  end
394
394
  end
@@ -66,7 +66,7 @@ module RGeo
66
66
  def eql?(other) # :nodoc:
67
67
  return false unless other.is_a?(ProjectedWindow)
68
68
  @factory == other.factory && @x_min == other.x_min && @x_max == other.x_max &&
69
- @y_min = other.y_min && @y_max = other.y_max
69
+ @y_min == other.y_min && @y_max == other.y_max
70
70
  end
71
71
  alias == eql?
72
72
 
@@ -14,7 +14,7 @@ module RGeo
14
14
  def initialize(geography_factory, opts = {})
15
15
  @geography_factory = geography_factory
16
16
  @projection_factory = Cartesian.preferred_factory(srid: 3857,
17
- coord_sys: SimpleMercatorProjector._coordsys_3857,
17
+ coord_sys: SimpleMercatorProjector._coordsys3857,
18
18
  buffer_resolution: opts[:buffer_resolution],
19
19
  has_z_coordinate: opts[:has_z_coordinate],
20
20
  has_m_coordinate: opts[:has_m_coordinate])
@@ -104,10 +104,10 @@ module RGeo
104
104
  )
105
105
  end
106
106
 
107
- def self._coordsys_3857 # :nodoc:
108
- return @coordsys_3857 if defined?(@coordsys_3857)
107
+ def self._coordsys3857 # :nodoc:
108
+ return @coordsys3857 if defined?(@coordsys3857)
109
109
 
110
- @coordsys_3857 = CoordSys::CONFIG.default_coord_sys_class.create(3857)
110
+ @coordsys3857 = CoordSys::CONFIG.default_coord_sys_class.create(3857)
111
111
  end
112
112
  end
113
113
  end
@@ -56,6 +56,7 @@ module RGeo
56
56
  @wkt_writer = nil
57
57
  else
58
58
  @wkt_writer = ::Geos::WktWriter.new
59
+ @wkt_writer.output_dimensions = 2
59
60
  @wkt_writer.trim = true
60
61
  @wkt_generator = nil
61
62
  end
@@ -66,6 +67,7 @@ module RGeo
66
67
  @wkb_writer = nil
67
68
  else
68
69
  @wkb_writer = ::Geos::WkbWriter.new
70
+ @wkb_writer.output_dimensions = 2
69
71
  @wkb_generator = nil
70
72
  end
71
73
 
@@ -150,7 +152,7 @@ module RGeo
150
152
  wkt_parser: data["wktp"] && symbolize_hash(data["wktp"]),
151
153
  wkb_parser: data["wkbp"] && symbolize_hash(data["wkbp"]),
152
154
  auto_prepare: (data["apre"] ? :simple : :disabled),
153
- coord_sys: coord_sys
155
+ coord_sys:
154
156
  )
155
157
  end
156
158
 
@@ -183,7 +185,7 @@ module RGeo
183
185
  wkt_parser: coder["wkt_parser"] && symbolize_hash(coder["wkt_parser"]),
184
186
  wkb_parser: coder["wkb_parser"] && symbolize_hash(coder["wkb_parser"]),
185
187
  auto_prepare: coder["auto_prepare"] == "disabled" ? :disabled : :simple,
186
- coord_sys: coord_sys
188
+ coord_sys:
187
189
  )
188
190
  end
189
191
 
@@ -295,10 +297,8 @@ module RGeo
295
297
  inner_rings = inner_rings.to_a unless inner_rings.is_a?(Array)
296
298
  return unless RGeo::Feature::LineString.check_type(outer_ring)
297
299
  outer_ring = create_fg_linear_ring(outer_ring.points)
298
- inner_rings = inner_rings.map do |r|
299
- return unless RGeo::Feature::LineString.check_type(r)
300
- create_fg_linear_ring(r.points)
301
- end
300
+ return unless inner_rings.all? { |r| RGeo::Feature::LineString.check_type(r) }
301
+ inner_rings = inner_rings.map { |r| create_fg_linear_ring(r.points) }
302
302
  inner_rings.compact!
303
303
  fg_geom = ::Geos::Utils.create_polygon(outer_ring, *inner_rings)
304
304
  FFIPolygonImpl.new(self, fg_geom, nil)
@@ -327,16 +327,16 @@ module RGeo
327
327
  def multi_point(elems)
328
328
  elems = elems.to_a unless elems.is_a?(Array)
329
329
  elems = elems.map do |elem|
330
- elem = RGeo::Feature.cast(
330
+ RGeo::Feature.cast(
331
331
  elem,
332
332
  self,
333
333
  RGeo::Feature::Point,
334
334
  :force_new,
335
335
  :keep_subtype
336
336
  )
337
- return unless elem
338
- elem.detach_fg_geom
339
337
  end
338
+ return unless elems.all?
339
+ elems = elems.map(&:detach_fg_geom)
340
340
  klasses = Array.new(elems.size, FFIPointImpl)
341
341
  fg_geom = ::Geos::Utils.create_collection(::Geos::GeomTypes::GEOS_MULTIPOINT, elems)
342
342
  FFIMultiPointImpl.new(self, fg_geom, klasses)
@@ -449,6 +449,7 @@ module RGeo
449
449
  def write_for_marshal(geom)
450
450
  if Utils.ffi_supports_set_output_dimension || !@_has_3d
451
451
  wkb_writer = ::Geos::WkbWriter.new
452
+ wkb_writer.output_dimensions = 2
452
453
  wkb_writer.output_dimensions = 3 if @_has_3d
453
454
  wkb_writer.write(geom.fg_geom)
454
455
  else
@@ -463,6 +464,7 @@ module RGeo
463
464
  def write_for_psych(geom)
464
465
  if Utils.ffi_supports_set_output_dimension || !@_has_3d
465
466
  wkt_writer = ::Geos::WktWriter.new
467
+ wkt_writer.output_dimensions = 2
466
468
  wkt_writer.trim = true
467
469
  wkt_writer.output_dimensions = 3 if @_has_3d
468
470
  wkt_writer.write(geom.fg_geom)
@@ -485,8 +487,8 @@ module RGeo
485
487
  size += 1
486
488
  end
487
489
  cs = ::Geos::CoordinateSequence.new(size, 3)
490
+ return unless points.all? { |p| RGeo::Feature::Point.check_type(p) }
488
491
  points.each_with_index do |p, i|
489
- return unless RGeo::Feature::Point.check_type(p)
490
492
  cs.set_x(i, p.x)
491
493
  cs.set_y(i, p.y)
492
494
  if @has_z
@@ -168,43 +168,43 @@ module RGeo
168
168
 
169
169
  def disjoint?(rhs)
170
170
  fg = factory.convert_to_fg_geometry(rhs)
171
- prep = request_prepared if Utils.ffi_supports_prepared_level_2
171
+ prep = request_prepared if Utils.ffi_supports_prepared_level2
172
172
  prep ? prep.disjoint?(fg) : @fg_geom.disjoint?(fg)
173
173
  end
174
174
 
175
175
  def intersects?(rhs)
176
176
  fg = factory.convert_to_fg_geometry(rhs)
177
- prep = request_prepared if Utils.ffi_supports_prepared_level_1
177
+ prep = request_prepared if Utils.ffi_supports_prepared_level1
178
178
  prep ? prep.intersects?(fg) : @fg_geom.intersects?(fg)
179
179
  end
180
180
 
181
181
  def touches?(rhs)
182
182
  fg = factory.convert_to_fg_geometry(rhs)
183
- prep = request_prepared if Utils.ffi_supports_prepared_level_2
183
+ prep = request_prepared if Utils.ffi_supports_prepared_level2
184
184
  prep ? prep.touches?(fg) : @fg_geom.touches?(fg)
185
185
  end
186
186
 
187
187
  def crosses?(rhs)
188
188
  fg = factory.convert_to_fg_geometry(rhs)
189
- prep = request_prepared if Utils.ffi_supports_prepared_level_2
189
+ prep = request_prepared if Utils.ffi_supports_prepared_level2
190
190
  prep ? prep.crosses?(fg) : @fg_geom.crosses?(fg)
191
191
  end
192
192
 
193
193
  def within?(rhs)
194
194
  fg = factory.convert_to_fg_geometry(rhs)
195
- prep = request_prepared if Utils.ffi_supports_prepared_level_2
195
+ prep = request_prepared if Utils.ffi_supports_prepared_level2
196
196
  prep ? prep.within?(fg) : @fg_geom.within?(fg)
197
197
  end
198
198
 
199
199
  def contains?(rhs)
200
200
  fg = factory.convert_to_fg_geometry(rhs)
201
- prep = request_prepared if Utils.ffi_supports_prepared_level_1
201
+ prep = request_prepared if Utils.ffi_supports_prepared_level1
202
202
  prep ? prep.contains?(fg) : @fg_geom.contains?(fg)
203
203
  end
204
204
 
205
205
  def overlaps?(rhs)
206
206
  fg = factory.convert_to_fg_geometry(rhs)
207
- prep = request_prepared if Utils.ffi_supports_prepared_level_2
207
+ prep = request_prepared if Utils.ffi_supports_prepared_level2
208
208
  prep ? prep.overlaps?(fg) : @fg_geom.overlaps?(fg)
209
209
  end
210
210
 
@@ -212,7 +212,6 @@ module RGeo
212
212
  fg = factory.convert_to_fg_geometry(rhs)
213
213
  @fg_geom.relate_pattern(fg, pattern)
214
214
  end
215
- alias relate relate? # DEPRECATED
216
215
 
217
216
  def distance(rhs)
218
217
  fg = factory.convert_to_fg_geometry(rhs)
@@ -55,11 +55,11 @@ module RGeo
55
55
  end
56
56
  end
57
57
 
58
- def ffi_supports_prepared_level_1
58
+ def ffi_supports_prepared_level1
59
59
  FFI_SUPPORTED && ::Geos::FFIGeos.respond_to?(:GEOSPreparedContains_r)
60
60
  end
61
61
 
62
- def ffi_supports_prepared_level_2
62
+ def ffi_supports_prepared_level2
63
63
  FFI_SUPPORTED && ::Geos::FFIGeos.respond_to?(:GEOSPreparedDisjoint_r)
64
64
  end
65
65
 
@@ -47,7 +47,7 @@ module RGeo
47
47
  buffer_resolution: opts[:buffer_resolution], auto_prepare: opts[:auto_prepare],
48
48
  wkt_generator: opts[:wkt_generator], wkt_parser: opts[:wkt_parser],
49
49
  wkb_generator: opts[:wkb_generator], wkb_parser: opts[:wkb_parser],
50
- srid: srid.to_i, coord_sys: coord_sys
50
+ srid: srid.to_i, coord_sys:
51
51
  }
52
52
  native_interface = opts[:native_interface] || Geos.preferred_native_interface
53
53
  if native_interface == :ffi
@@ -125,7 +125,7 @@ module RGeo
125
125
  wkt_parser: symbolize_hash(data["wktp"]),
126
126
  wkb_parser: symbolize_hash(data["wkbp"]),
127
127
  auto_prepare: (data["apre"] ? :simple : :disabled),
128
- coord_sys: coord_sys
128
+ coord_sys:
129
129
  )
130
130
  end
131
131
 
@@ -161,7 +161,7 @@ module RGeo
161
161
  wkt_parser: symbolize_hash(coder["wkt_parser"]),
162
162
  wkb_parser: symbolize_hash(coder["wkb_parser"]),
163
163
  auto_prepare: coder["auto_prepare"] == "disabled" ? :disabled : :simple,
164
- coord_sys: coord_sys
164
+ coord_sys:
165
165
  )
166
166
  end
167
167
 
@@ -128,7 +128,6 @@ module RGeo
128
128
  def relate?(rhs, pattern)
129
129
  @zgeometry.relate?(RGeo::Feature.cast(rhs, self).z_geometry, pattern)
130
130
  end
131
- alias relate relate? # DEPRECATED
132
131
 
133
132
  def distance(rhs)
134
133
  @zgeometry.distance(RGeo::Feature.cast(rhs, self).z_geometry)
data/lib/rgeo/geos.rb CHANGED
@@ -26,7 +26,13 @@ module RGeo
26
26
  begin
27
27
  require_relative "geos/geos_c_impl"
28
28
  rescue LoadError
29
- # continue
29
+ # fall back to a system-wide search if the c-extension is stored in different location
30
+ # important for systems such as Amazon Linux
31
+ begin
32
+ require "geos/geos_c_impl"
33
+ rescue LoadError
34
+ # continue
35
+ end
30
36
  end
31
37
  CAPI_SUPPORTED = RGeo::Geos.const_defined?(:CAPIGeometryMethods)
32
38
  if CAPI_SUPPORTED
@@ -35,8 +35,8 @@ module RGeo
35
35
  @elements[idx]
36
36
  end
37
37
 
38
- def each(&block)
39
- @elements.each(&block)
38
+ def each(&)
39
+ @elements.each(&)
40
40
  end
41
41
 
42
42
  def geometries
@@ -27,7 +27,7 @@ module RGeo
27
27
  # Create a coord sys based on the SRID if one was not given
28
28
  coord_sys = coord_sys_class.create(srid) if coord_sys.nil? && srid != 0
29
29
 
30
- { coord_sys: coord_sys, srid: srid }
30
+ { coord_sys:, srid: }
31
31
  end
32
32
 
33
33
  private
data/lib/rgeo/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RGeo
4
- VERSION = "3.0.0"
4
+ VERSION = "3.1.0"
5
5
  end
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rgeo
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Azuma
8
8
  - Tee Parham
9
- autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2023-01-25 00:00:00.000000000 Z
11
+ date: 2026-01-20 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: ffi-geos
@@ -39,6 +38,20 @@ dependencies:
39
38
  - - "~>"
40
39
  - !ruby/object:Gem::Version
41
40
  version: '5.11'
41
+ - !ruby/object:Gem::Dependency
42
+ name: ostruct
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
42
55
  - !ruby/object:Gem::Dependency
43
56
  name: rake
44
57
  requirement: !ruby/object:Gem::Requirement
@@ -87,14 +100,14 @@ dependencies:
87
100
  requirements:
88
101
  - - "~>"
89
102
  - !ruby/object:Gem::Version
90
- version: '1.0'
103
+ version: '3.0'
91
104
  type: :development
92
105
  prerelease: false
93
106
  version_requirements: !ruby/object:Gem::Requirement
94
107
  requirements:
95
108
  - - "~>"
96
109
  - !ruby/object:Gem::Version
97
- version: '1.0'
110
+ version: '3.0'
98
111
  - !ruby/object:Gem::Dependency
99
112
  name: yard
100
113
  requirement: !ruby/object:Gem::Requirement
@@ -229,8 +242,8 @@ homepage: https://github.com/rgeo/rgeo
229
242
  licenses:
230
243
  - BSD-3-Clause
231
244
  metadata:
245
+ funding_uri: https://opencollective.com/rgeo
232
246
  rubygems_mfa_required: 'true'
233
- post_install_message:
234
247
  rdoc_options: []
235
248
  require_paths:
236
249
  - lib
@@ -238,15 +251,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
238
251
  requirements:
239
252
  - - ">="
240
253
  - !ruby/object:Gem::Version
241
- version: 2.6.0
254
+ version: 3.1.4
242
255
  required_rubygems_version: !ruby/object:Gem::Requirement
243
256
  requirements:
244
257
  - - ">="
245
258
  - !ruby/object:Gem::Version
246
259
  version: '0'
247
260
  requirements: []
248
- rubygems_version: 3.1.4
249
- signing_key:
261
+ rubygems_version: 3.6.4
250
262
  specification_version: 4
251
263
  summary: RGeo is a geospatial data library for Ruby.
252
264
  test_files: []