rgeo 3.0.0 → 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.
- checksums.yaml +4 -4
- data/README.md +2 -3
- data/ext/geos_c_impl/extconf.rb +1 -0
- data/ext/geos_c_impl/factory.c +2 -0
- data/ext/geos_c_impl/geometry.c +27 -0
- data/ext/geos_c_impl/preface.h +3 -0
- data/lib/rgeo/coord_sys/cs/entities.rb +4 -0
- data/lib/rgeo/feature/types.rb +9 -15
- data/lib/rgeo/geographic/interface.rb +8 -8
- data/lib/rgeo/geographic/simple_mercator_projector.rb +4 -4
- data/lib/rgeo/geos/ffi_factory.rb +10 -8
- data/lib/rgeo/geos/ffi_feature_methods.rb +7 -8
- data/lib/rgeo/geos/utils.rb +2 -2
- data/lib/rgeo/geos/zm_feature_methods.rb +0 -1
- data/lib/rgeo/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 792e1494e9ef340bb740e8675b2ce67e4d02fa6c4333ad93c523e348e5153812
|
4
|
+
data.tar.gz: a4051c1728401caca45807c9e786a5e5130761c95a95ff6bdb60265130aa2049
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a6ee8000fd92f7bef89915d9d7e11aea0fb413248778d0f5e5218516d98cc6d16afba66d92c670c9f0539d37a6c7e934a5fcc3ad839626d7299b7c5ae8ffc57
|
7
|
+
data.tar.gz: 580f0a56261c8ab5698e14a78e7f61bcdb8fa362160db4ed1662dbb792d1d8ec7272a1e3387568b00c6b8403547aae128363ad230cf622ec5b5908a0e17b8d6f
|
data/README.md
CHANGED
@@ -5,11 +5,10 @@
|
|
5
5
|
|
6
6
|
RGeo is a geospatial data library for Ruby.
|
7
7
|
|
8
|
-
|
8
|
+
***Contributors Wanted!***
|
9
9
|
|
10
|
-
|
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
|
|
data/ext/geos_c_impl/extconf.rb
CHANGED
@@ -45,6 +45,7 @@ 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")
|
48
49
|
have_func("rb_memhash", "ruby.h")
|
49
50
|
have_func("rb_gc_mark_movable", "ruby.h")
|
50
51
|
end
|
data/ext/geos_c_impl/factory.c
CHANGED
@@ -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);
|
data/ext/geos_c_impl/geometry.c
CHANGED
@@ -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
|
data/ext/geos_c_impl/preface.h
CHANGED
@@ -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
|
data/lib/rgeo/feature/types.rb
CHANGED
@@ -191,21 +191,15 @@ module RGeo
|
|
191
191
|
if nfactory == factory
|
192
192
|
force_new ? obj.dup : obj
|
193
193
|
elsif type == Point
|
194
|
-
|
195
|
-
if project
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
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))
|
@@ -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 ||
|
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:
|
192
|
+
coord_sys: coord_sys4326,
|
193
193
|
srid: 4326,
|
194
194
|
wkt_parser: opts[:wkt_parser],
|
195
195
|
wkb_parser: opts[:wkb_parser],
|
@@ -379,16 +379,16 @@ module RGeo
|
|
379
379
|
|
380
380
|
private
|
381
381
|
|
382
|
-
def
|
383
|
-
return @
|
382
|
+
def coord_sys4055
|
383
|
+
return @coord_sys4055 if defined?(@coord_sys4055)
|
384
384
|
|
385
|
-
@
|
385
|
+
@coord_sys4055 = CoordSys::CONFIG.default_coord_sys_class.create(4055)
|
386
386
|
end
|
387
387
|
|
388
|
-
def
|
389
|
-
return @
|
388
|
+
def coord_sys4326
|
389
|
+
return @coord_sys4326 if defined?(@coord_sys4326)
|
390
390
|
|
391
|
-
@
|
391
|
+
@coord_sys4326 = CoordSys::CONFIG.default_coord_sys_class.create(4326)
|
392
392
|
end
|
393
393
|
end
|
394
394
|
end
|
@@ -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.
|
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.
|
108
|
-
return @
|
107
|
+
def self._coordsys3857 # :nodoc:
|
108
|
+
return @coordsys3857 if defined?(@coordsys3857)
|
109
109
|
|
110
|
-
@
|
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
|
|
@@ -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
|
-
|
299
|
-
|
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
|
-
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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)
|
data/lib/rgeo/geos/utils.rb
CHANGED
@@ -55,11 +55,11 @@ module RGeo
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
def
|
58
|
+
def ffi_supports_prepared_level1
|
59
59
|
FFI_SUPPORTED && ::Geos::FFIGeos.respond_to?(:GEOSPreparedContains_r)
|
60
60
|
end
|
61
61
|
|
62
|
-
def
|
62
|
+
def ffi_supports_prepared_level2
|
63
63
|
FFI_SUPPORTED && ::Geos::FFIGeos.respond_to?(:GEOSPreparedDisjoint_r)
|
64
64
|
end
|
65
65
|
|
data/lib/rgeo/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rgeo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Azuma
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-
|
12
|
+
date: 2023-11-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi-geos
|
@@ -238,14 +238,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
238
238
|
requirements:
|
239
239
|
- - ">="
|
240
240
|
- !ruby/object:Gem::Version
|
241
|
-
version: 2.
|
241
|
+
version: 2.7.7
|
242
242
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
243
243
|
requirements:
|
244
244
|
- - ">="
|
245
245
|
- !ruby/object:Gem::Version
|
246
246
|
version: '0'
|
247
247
|
requirements: []
|
248
|
-
rubygems_version: 3.
|
248
|
+
rubygems_version: 3.2.33
|
249
249
|
signing_key:
|
250
250
|
specification_version: 4
|
251
251
|
summary: RGeo is a geospatial data library for Ruby.
|