rgeo 3.0.0.pre.rc.3 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +9 -0
- data/ext/geos_c_impl/factory.c +41 -5
- data/ext/geos_c_impl/factory.h +13 -2
- data/ext/geos_c_impl/geometry.c +151 -122
- data/ext/geos_c_impl/geometry_collection.c +17 -19
- data/ext/geos_c_impl/line_string.c +46 -36
- data/ext/geos_c_impl/point.c +0 -2
- data/ext/geos_c_impl/polygon.c +10 -11
- data/ext/geos_c_impl/polygon.h +1 -1
- data/ext/geos_c_impl/ruby_more.c +7 -0
- data/ext/geos_c_impl/ruby_more.h +8 -0
- data/lib/rgeo/cartesian/analysis.rb +5 -3
- data/lib/rgeo/cartesian/bounding_box.rb +74 -79
- data/lib/rgeo/cartesian/calculations.rb +20 -26
- data/lib/rgeo/cartesian/factory.rb +47 -49
- data/lib/rgeo/cartesian/planar_graph.rb +10 -16
- data/lib/rgeo/cartesian/sweepline_intersector.rb +1 -3
- data/lib/rgeo/cartesian/valid_op.rb +1 -3
- data/lib/rgeo/coord_sys/cs/entities.rb +87 -101
- data/lib/rgeo/coord_sys/cs/factories.rb +0 -2
- data/lib/rgeo/coord_sys/cs/wkt_parser.rb +70 -29
- data/lib/rgeo/feature/curve.rb +0 -1
- data/lib/rgeo/feature/factory.rb +25 -27
- data/lib/rgeo/feature/factory_generator.rb +3 -4
- data/lib/rgeo/feature/geometry.rb +41 -30
- data/lib/rgeo/feature/geometry_collection.rb +3 -4
- data/lib/rgeo/feature/line_string.rb +1 -2
- data/lib/rgeo/feature/linear_ring.rb +0 -1
- data/lib/rgeo/feature/multi_curve.rb +0 -1
- data/lib/rgeo/feature/multi_surface.rb +0 -1
- data/lib/rgeo/feature/point.rb +0 -1
- data/lib/rgeo/feature/polygon.rb +1 -2
- data/lib/rgeo/feature/surface.rb +0 -1
- data/lib/rgeo/feature/types.rb +73 -83
- data/lib/rgeo/geographic/factory.rb +87 -80
- data/lib/rgeo/geographic/interface.rb +40 -23
- data/lib/rgeo/geographic/projected_feature_methods.rb +2 -6
- data/lib/rgeo/geographic/projected_window.rb +35 -21
- data/lib/rgeo/geographic/simple_mercator_projector.rb +25 -13
- data/lib/rgeo/geographic/spherical_feature_methods.rb +8 -3
- data/lib/rgeo/geographic/spherical_math.rb +17 -20
- data/lib/rgeo/geos/capi_factory.rb +50 -50
- data/lib/rgeo/geos/ffi_factory.rb +41 -42
- data/lib/rgeo/geos/ffi_feature_methods.rb +72 -97
- data/lib/rgeo/geos/interface.rb +16 -16
- data/lib/rgeo/geos/utils.rb +3 -3
- data/lib/rgeo/geos/zm_factory.rb +50 -42
- data/lib/rgeo/geos/zm_feature_methods.rb +15 -8
- data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +4 -4
- data/lib/rgeo/impl_helper/basic_geometry_methods.rb +1 -2
- data/lib/rgeo/impl_helper/basic_line_string_methods.rb +18 -24
- data/lib/rgeo/impl_helper/basic_point_methods.rb +1 -3
- data/lib/rgeo/impl_helper/basic_polygon_methods.rb +15 -16
- data/lib/rgeo/impl_helper/utils.rb +3 -9
- data/lib/rgeo/impl_helper/valid_op.rb +12 -16
- data/lib/rgeo/version.rb +1 -1
- data/lib/rgeo/wkrep/wkb_generator.rb +42 -47
- data/lib/rgeo/wkrep/wkb_parser.rb +17 -18
- data/lib/rgeo/wkrep/wkt_generator.rb +23 -16
- data/lib/rgeo/wkrep/wkt_parser.rb +23 -13
- metadata +5 -5
@@ -10,11 +10,18 @@ module RGeo
|
|
10
10
|
module Cartesian
|
11
11
|
# This class implements the factory for the simple cartesian
|
12
12
|
# implementation.
|
13
|
-
|
14
13
|
class Factory
|
15
14
|
include Feature::Factory::Instance
|
16
15
|
include ImplHelper::Utils
|
17
16
|
|
17
|
+
attr_reader :coordinate_dimension, :spatial_dimension
|
18
|
+
|
19
|
+
# Returns the SRID.
|
20
|
+
attr_reader :srid
|
21
|
+
|
22
|
+
# See RGeo::Feature::Factory#coord_sys
|
23
|
+
attr_reader :coord_sys
|
24
|
+
|
18
25
|
# Create a new simple cartesian factory.
|
19
26
|
#
|
20
27
|
# See RGeo::Cartesian.simple_factory for a list of supported options.
|
@@ -35,43 +42,46 @@ module RGeo
|
|
35
42
|
@buffer_resolution = 1 if @buffer_resolution < 1
|
36
43
|
|
37
44
|
wkt_generator = opts[:wkt_generator]
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
45
|
+
@wkt_generator =
|
46
|
+
case wkt_generator
|
47
|
+
when Hash
|
48
|
+
WKRep::WKTGenerator.new(wkt_generator)
|
49
|
+
else
|
50
|
+
WKRep::WKTGenerator.new(convert_case: :upper)
|
51
|
+
end
|
44
52
|
wkb_generator = opts[:wkb_generator]
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
53
|
+
@wkb_generator =
|
54
|
+
case wkb_generator
|
55
|
+
when Hash
|
56
|
+
WKRep::WKBGenerator.new(wkb_generator)
|
57
|
+
else
|
58
|
+
WKRep::WKBGenerator.new
|
59
|
+
end
|
51
60
|
wkt_parser = opts[:wkt_parser]
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
61
|
+
@wkt_parser =
|
62
|
+
case wkt_parser
|
63
|
+
when Hash
|
64
|
+
WKRep::WKTParser.new(self, wkt_parser)
|
65
|
+
else
|
66
|
+
WKRep::WKTParser.new(self)
|
67
|
+
end
|
58
68
|
wkb_parser = opts[:wkb_parser]
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
69
|
+
@wkb_parser =
|
70
|
+
case wkb_parser
|
71
|
+
when Hash
|
72
|
+
WKRep::WKBParser.new(self, wkb_parser)
|
73
|
+
else
|
74
|
+
WKRep::WKBParser.new(self)
|
75
|
+
end
|
65
76
|
end
|
66
|
-
attr_reader :coordinate_dimension, :spatial_dimension
|
67
77
|
|
68
78
|
# Equivalence test.
|
69
79
|
|
70
|
-
def eql?(
|
71
|
-
|
72
|
-
@has_z ==
|
73
|
-
@has_m ==
|
74
|
-
@coord_sys ==
|
80
|
+
def eql?(other)
|
81
|
+
other.is_a?(self.class) && @srid == other.srid &&
|
82
|
+
@has_z == other.property(:has_z_coordinate) &&
|
83
|
+
@has_m == other.property(:has_m_coordinate) &&
|
84
|
+
@coord_sys == other.instance_variable_get(:@coord_sys)
|
75
85
|
end
|
76
86
|
alias == eql?
|
77
87
|
|
@@ -99,11 +109,9 @@ module RGeo
|
|
99
109
|
end
|
100
110
|
|
101
111
|
def marshal_load(data) # :nodoc:
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
coord_sys = nil
|
106
|
-
end
|
112
|
+
cs_class = CoordSys::CONFIG.default_coord_sys_class
|
113
|
+
coord_sys = data["cs"]&.then { |cs| cs_class.create_from_wkt(cs) }
|
114
|
+
|
107
115
|
initialize(
|
108
116
|
has_z_coordinate: data["hasz"],
|
109
117
|
has_m_coordinate: data["hasm"],
|
@@ -132,11 +140,9 @@ module RGeo
|
|
132
140
|
end
|
133
141
|
|
134
142
|
def init_with(coder) # :nodoc:
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
coord_sys = nil
|
139
|
-
end
|
143
|
+
cs_class = CoordSys::CONFIG.default_coord_sys_class
|
144
|
+
coord_sys = coder["cs"]&.then { |cs| cs_class.create_from_wkt(cs) }
|
145
|
+
|
140
146
|
initialize(
|
141
147
|
has_z_coordinate: coder["has_z_coordinate"],
|
142
148
|
has_m_coordinate: coder["has_m_coordinate"],
|
@@ -150,10 +156,6 @@ module RGeo
|
|
150
156
|
)
|
151
157
|
end
|
152
158
|
|
153
|
-
# Returns the SRID.
|
154
|
-
|
155
|
-
attr_reader :srid
|
156
|
-
|
157
159
|
# See RGeo::Feature::Factory#property
|
158
160
|
|
159
161
|
def property(name)
|
@@ -235,10 +237,6 @@ module RGeo
|
|
235
237
|
MultiPolygonImpl.new(self, elems)
|
236
238
|
end
|
237
239
|
|
238
|
-
# See RGeo::Feature::Factory#coord_sys
|
239
|
-
|
240
|
-
attr_reader :coord_sys
|
241
|
-
|
242
240
|
def generate_wkt(obj)
|
243
241
|
@wkt_generator.generate(obj)
|
244
242
|
end
|
@@ -166,17 +166,15 @@ module RGeo
|
|
166
166
|
# list of intersections for that edge.
|
167
167
|
s1_intersects = int.point != int.s1.s && int.point != int.s1.e
|
168
168
|
if s1_intersects
|
169
|
-
|
170
|
-
intersection_map[int.s1] = []
|
171
|
-
end
|
169
|
+
intersection_map[int.s1] ||= []
|
172
170
|
intersection_map[int.s1] << int.point
|
173
171
|
end
|
174
172
|
|
175
173
|
s2_intersects = int.point != int.s2.s && int.point != int.s2.e
|
174
|
+
|
176
175
|
next unless s2_intersects
|
177
|
-
|
178
|
-
|
179
|
-
end
|
176
|
+
|
177
|
+
intersection_map[int.s2] ||= []
|
180
178
|
intersection_map[int.s2] << int.point
|
181
179
|
end
|
182
180
|
intersection_map
|
@@ -194,11 +192,9 @@ module RGeo
|
|
194
192
|
insert_half_edge(e2)
|
195
193
|
end
|
196
194
|
|
197
|
-
def insert_half_edge(
|
198
|
-
|
199
|
-
|
200
|
-
end
|
201
|
-
@incident_edges[he.origin.coordinates] << he
|
195
|
+
def insert_half_edge(half_edge)
|
196
|
+
@incident_edges[half_edge.origin.coordinates] ||= []
|
197
|
+
@incident_edges[half_edge.origin.coordinates] << half_edge
|
202
198
|
end
|
203
199
|
|
204
200
|
# Links all half-edges where possible.
|
@@ -299,9 +295,7 @@ module RGeo
|
|
299
295
|
def add_line_string(geom)
|
300
296
|
add_edges(geom.segments)
|
301
297
|
|
302
|
-
hedge = unless geom.empty?
|
303
|
-
@incident_edges[geom.start_point.coordinates].first
|
304
|
-
end
|
298
|
+
hedge = @incident_edges[geom.start_point.coordinates].first unless geom.empty?
|
305
299
|
|
306
300
|
@geom_edges << GeomEdge.new(hedge, nil)
|
307
301
|
end
|
@@ -350,7 +344,7 @@ module RGeo
|
|
350
344
|
# @param ccw [Boolean] true for CCW, false for CW
|
351
345
|
# @return [HalfEdge, nil]
|
352
346
|
def find_hedge(ring, ccw: true)
|
353
|
-
return nil if ring.num_points
|
347
|
+
return nil if ring.num_points == 0
|
354
348
|
ccw_target = ccw ? 1 : -1
|
355
349
|
|
356
350
|
coords = ring.start_point.coordinates
|
@@ -361,7 +355,7 @@ module RGeo
|
|
361
355
|
start_seg = Segment.new(ring.start_point, ring.point_n(1))
|
362
356
|
end_seg = Segment.new(ring.point_n(ring.num_points - 2), ring.end_point)
|
363
357
|
colinear_hedges = hedges.select do |he|
|
364
|
-
start_seg.side(he.destination)
|
358
|
+
start_seg.side(he.destination) == 0 || end_seg.side(he.destination) == 0
|
365
359
|
end
|
366
360
|
|
367
361
|
colinear_hedges.find do |hedge|
|
@@ -46,9 +46,7 @@ module RGeo
|
|
46
46
|
s2 = intersection.s2
|
47
47
|
pt = intersection.point
|
48
48
|
|
49
|
-
unless (pt == s1.s && pt == s2.e) || (pt == s1.e && pt == s2.s)
|
50
|
-
@proper_intersections << intersection
|
51
|
-
end
|
49
|
+
@proper_intersections << intersection unless (pt == s1.s && pt == s2.e) || (pt == s1.e && pt == s2.s)
|
52
50
|
end
|
53
51
|
@proper_intersections
|
54
52
|
end
|
@@ -33,9 +33,7 @@ module RGeo
|
|
33
33
|
|
34
34
|
# if additional nodes were added, there must be an intersection
|
35
35
|
# through a boundary.
|
36
|
-
if poly.send(:graph).incident_edges.size > num_points
|
37
|
-
return Error::SELF_INTERSECTION
|
38
|
-
end
|
36
|
+
return Error::SELF_INTERSECTION if poly.send(:graph).incident_edges.size > num_points
|
39
37
|
|
40
38
|
rings = [poly.exterior_ring] + poly.interior_rings
|
41
39
|
return Error::SELF_INTERSECTION if rings.uniq.size != rings.size
|