rgeo 2.3.1 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +6 -0
- data/README.md +23 -14
- data/ext/geos_c_impl/analysis.c +30 -25
- data/ext/geos_c_impl/analysis.h +8 -7
- data/ext/geos_c_impl/coordinates.c +27 -21
- data/ext/geos_c_impl/coordinates.h +5 -2
- data/ext/geos_c_impl/errors.c +19 -10
- data/ext/geos_c_impl/errors.h +11 -4
- data/ext/geos_c_impl/extconf.rb +42 -28
- data/ext/geos_c_impl/factory.c +540 -451
- data/ext/geos_c_impl/factory.h +105 -95
- data/ext/geos_c_impl/geometry.c +593 -387
- data/ext/geos_c_impl/geometry.h +10 -5
- data/ext/geos_c_impl/geometry_collection.c +306 -339
- data/ext/geos_c_impl/geometry_collection.h +6 -20
- data/ext/geos_c_impl/globals.c +169 -0
- data/ext/geos_c_impl/globals.h +46 -0
- data/ext/geos_c_impl/line_string.c +271 -231
- data/ext/geos_c_impl/line_string.h +5 -8
- data/ext/geos_c_impl/main.c +16 -16
- data/ext/geos_c_impl/point.c +65 -67
- data/ext/geos_c_impl/point.h +4 -7
- data/ext/geos_c_impl/polygon.c +137 -135
- data/ext/geos_c_impl/polygon.h +11 -11
- data/ext/geos_c_impl/preface.h +16 -10
- data/ext/geos_c_impl/ruby_more.c +67 -0
- data/ext/geos_c_impl/ruby_more.h +25 -0
- data/lib/rgeo/cartesian/analysis.rb +5 -3
- data/lib/rgeo/cartesian/bounding_box.rb +74 -79
- data/lib/rgeo/cartesian/calculations.rb +64 -33
- data/lib/rgeo/cartesian/factory.rb +57 -102
- data/lib/rgeo/cartesian/feature_classes.rb +68 -46
- data/lib/rgeo/cartesian/feature_methods.rb +67 -25
- data/lib/rgeo/cartesian/interface.rb +6 -41
- data/lib/rgeo/cartesian/planar_graph.rb +373 -0
- data/lib/rgeo/cartesian/sweepline_intersector.rb +147 -0
- data/lib/rgeo/cartesian/valid_op.rb +69 -0
- data/lib/rgeo/cartesian.rb +3 -0
- data/lib/rgeo/coord_sys/cs/entities.rb +303 -99
- data/lib/rgeo/coord_sys/cs/factories.rb +0 -2
- data/lib/rgeo/coord_sys/cs/wkt_parser.rb +90 -42
- data/lib/rgeo/coord_sys.rb +1 -20
- data/lib/rgeo/error.rb +15 -0
- data/lib/rgeo/feature/curve.rb +0 -11
- data/lib/rgeo/feature/factory.rb +26 -36
- data/lib/rgeo/feature/factory_generator.rb +6 -14
- data/lib/rgeo/feature/geometry.rb +146 -66
- data/lib/rgeo/feature/geometry_collection.rb +16 -9
- data/lib/rgeo/feature/line_string.rb +4 -5
- data/lib/rgeo/feature/linear_ring.rb +0 -1
- data/lib/rgeo/feature/multi_curve.rb +0 -6
- data/lib/rgeo/feature/multi_surface.rb +3 -4
- data/lib/rgeo/feature/point.rb +4 -5
- data/lib/rgeo/feature/polygon.rb +1 -2
- data/lib/rgeo/feature/surface.rb +3 -4
- data/lib/rgeo/feature/types.rb +69 -85
- data/lib/rgeo/geographic/factory.rb +98 -125
- data/lib/rgeo/geographic/interface.rb +69 -166
- data/lib/rgeo/geographic/projected_feature_classes.rb +21 -9
- data/lib/rgeo/geographic/projected_feature_methods.rb +67 -42
- data/lib/rgeo/geographic/projected_window.rb +36 -22
- data/lib/rgeo/geographic/{proj4_projector.rb → projector.rb} +3 -5
- data/lib/rgeo/geographic/simple_mercator_projector.rb +26 -25
- data/lib/rgeo/geographic/spherical_feature_classes.rb +29 -9
- data/lib/rgeo/geographic/spherical_feature_methods.rb +86 -9
- data/lib/rgeo/geographic/spherical_math.rb +17 -20
- data/lib/rgeo/geographic.rb +1 -1
- data/lib/rgeo/geos/capi_factory.rb +87 -158
- data/lib/rgeo/geos/capi_feature_classes.rb +50 -36
- data/lib/rgeo/geos/ffi_factory.rb +105 -173
- data/lib/rgeo/geos/ffi_feature_classes.rb +34 -10
- data/lib/rgeo/geos/ffi_feature_methods.rb +105 -127
- data/lib/rgeo/geos/interface.rb +20 -59
- data/lib/rgeo/geos/utils.rb +5 -5
- data/lib/rgeo/geos/zm_factory.rb +53 -95
- data/lib/rgeo/geos/zm_feature_methods.rb +30 -33
- data/lib/rgeo/geos.rb +8 -8
- data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +9 -22
- data/lib/rgeo/impl_helper/basic_geometry_methods.rb +1 -2
- data/lib/rgeo/impl_helper/basic_line_string_methods.rb +28 -56
- data/lib/rgeo/impl_helper/basic_point_methods.rb +2 -14
- data/lib/rgeo/impl_helper/basic_polygon_methods.rb +17 -26
- data/lib/rgeo/impl_helper/utils.rb +21 -0
- data/lib/rgeo/impl_helper/valid_op.rb +350 -0
- data/lib/rgeo/impl_helper/validity_check.rb +139 -0
- data/lib/rgeo/impl_helper.rb +1 -0
- data/lib/rgeo/version.rb +1 -1
- data/lib/rgeo/wkrep/wkb_generator.rb +73 -63
- data/lib/rgeo/wkrep/wkb_parser.rb +33 -31
- data/lib/rgeo/wkrep/wkt_generator.rb +52 -45
- data/lib/rgeo/wkrep/wkt_parser.rb +48 -35
- data/lib/rgeo.rb +1 -3
- metadata +50 -13
- data/lib/rgeo/coord_sys/srs_database/entry.rb +0 -107
- data/lib/rgeo/coord_sys/srs_database/sr_org.rb +0 -64
- data/lib/rgeo/coord_sys/srs_database/url_reader.rb +0 -65
@@ -19,29 +19,48 @@ module RGeo
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def envelope
|
22
|
-
factory.unproject(projection.
|
22
|
+
factory.unproject(projection.unsafe_envelope)
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
26
|
-
|
25
|
+
def coordinate_dimension
|
26
|
+
factory.coordinate_dimension
|
27
|
+
end
|
28
|
+
|
29
|
+
def spatial_dimension
|
30
|
+
factory.spatial_dimension
|
31
|
+
end
|
32
|
+
|
33
|
+
def is_3d?
|
34
|
+
factory.property(:has_z_coordinate)
|
35
|
+
end
|
36
|
+
|
37
|
+
def measured?
|
38
|
+
factory.property(:has_m_coordinate)
|
27
39
|
end
|
28
40
|
|
29
|
-
def
|
30
|
-
|
31
|
-
empty?
|
41
|
+
def empty?
|
42
|
+
projection.empty?
|
32
43
|
end
|
33
44
|
|
34
45
|
def simple?
|
35
46
|
projection.simple?
|
36
47
|
end
|
37
48
|
|
38
|
-
def
|
39
|
-
|
40
|
-
|
49
|
+
def valid?
|
50
|
+
projection.valid?
|
51
|
+
end
|
52
|
+
|
53
|
+
def invalid_reason
|
54
|
+
projection.invalid_reason
|
55
|
+
end
|
56
|
+
|
57
|
+
# (see RGeo::ImplHelper::ValidityCheck#make_valid)
|
58
|
+
def make_valid
|
59
|
+
factory.unproject projection.make_valid
|
41
60
|
end
|
42
61
|
|
43
62
|
def boundary
|
44
|
-
boundary = projection.
|
63
|
+
boundary = projection.unsafe_boundary
|
45
64
|
boundary ? factory.unproject(boundary) : nil
|
46
65
|
end
|
47
66
|
|
@@ -50,79 +69,79 @@ module RGeo
|
|
50
69
|
end
|
51
70
|
|
52
71
|
def disjoint?(rhs)
|
53
|
-
projection.
|
72
|
+
projection.unsafe_disjoint?(Feature.cast(rhs, factory).projection)
|
54
73
|
end
|
55
74
|
|
56
75
|
def intersects?(rhs)
|
57
|
-
projection.
|
76
|
+
projection.unsafe_intersects?(Feature.cast(rhs, factory).projection)
|
58
77
|
end
|
59
78
|
|
60
79
|
def touches?(rhs)
|
61
|
-
projection.
|
80
|
+
projection.unsafe_touches?(Feature.cast(rhs, factory).projection)
|
62
81
|
end
|
63
82
|
|
64
83
|
def crosses?(rhs)
|
65
|
-
projection.
|
84
|
+
projection.unsafe_crosses?(Feature.cast(rhs, factory).projection)
|
66
85
|
end
|
67
86
|
|
68
87
|
def within?(rhs)
|
69
|
-
projection.
|
88
|
+
projection.unsafe_within?(Feature.cast(rhs, factory).projection)
|
70
89
|
end
|
71
90
|
|
72
91
|
def contains?(rhs)
|
73
|
-
projection.
|
92
|
+
projection.unsafe_contains?(Feature.cast(rhs, factory).projection)
|
74
93
|
end
|
75
94
|
|
76
95
|
def overlaps?(rhs)
|
77
|
-
projection.
|
96
|
+
projection.unsafe_overlaps?(Feature.cast(rhs, factory).projection)
|
78
97
|
end
|
79
98
|
|
80
99
|
def relate(rhs, pattern_)
|
81
|
-
projection.
|
100
|
+
projection.unsafe_relate(Feature.cast(rhs, factory).projection, pattern_)
|
82
101
|
end
|
83
102
|
|
84
103
|
def distance(rhs)
|
85
|
-
projection.
|
104
|
+
projection.unsafe_distance(Feature.cast(rhs, factory).projection)
|
86
105
|
end
|
87
106
|
|
88
107
|
def buffer(distance)
|
89
|
-
factory.unproject(projection.
|
108
|
+
factory.unproject(projection.unsafe_buffer(distance))
|
90
109
|
end
|
91
110
|
|
92
111
|
def buffer_with_style(distance, end_cap_style, join_style, mitre_limit)
|
93
|
-
factory.unproject(projection.
|
112
|
+
factory.unproject(projection.unsafe_buffer_with_style(distance, end_cap_style, join_style, mitre_limit))
|
94
113
|
end
|
95
114
|
|
96
115
|
def simplify(tolerance)
|
97
|
-
factory.unproject(projection.
|
116
|
+
factory.unproject(projection.unsafe_simplify(tolerance))
|
98
117
|
end
|
99
118
|
|
100
119
|
def simplify_preserve_topology(tolerance)
|
101
|
-
factory.unproject(projection.
|
120
|
+
factory.unproject(projection.unsafe_simplify_preserve_topology(tolerance))
|
102
121
|
end
|
103
122
|
|
104
123
|
def convex_hull
|
105
|
-
factory.unproject(projection.
|
124
|
+
factory.unproject(projection.unsafe_convex_hull)
|
106
125
|
end
|
107
126
|
|
108
127
|
def intersection(rhs)
|
109
|
-
factory.unproject(projection.
|
128
|
+
factory.unproject(projection.unsafe_intersection(Feature.cast(rhs, factory).projection))
|
110
129
|
end
|
111
130
|
|
112
131
|
def union(rhs)
|
113
|
-
factory.unproject(projection.
|
132
|
+
factory.unproject(projection.unsafe_union(Feature.cast(rhs, factory).projection))
|
114
133
|
end
|
115
134
|
|
116
135
|
def difference(rhs)
|
117
|
-
factory.unproject(projection.
|
136
|
+
factory.unproject(projection.unsafe_difference(Feature.cast(rhs, factory).projection))
|
118
137
|
end
|
119
138
|
|
120
139
|
def sym_difference(rhs)
|
121
|
-
factory.unproject(projection.
|
140
|
+
factory.unproject(projection.unsafe_sym_difference(Feature.cast(rhs, factory).projection))
|
122
141
|
end
|
123
142
|
|
124
143
|
def point_on_surface
|
125
|
-
factory.unproject(projection.
|
144
|
+
factory.unproject(projection.unsafe_point_on_surface)
|
126
145
|
end
|
127
146
|
end
|
128
147
|
|
@@ -154,7 +173,8 @@ module RGeo
|
|
154
173
|
|
155
174
|
private
|
156
175
|
|
157
|
-
|
176
|
+
# Ensure coordinates fall within a valid range.
|
177
|
+
def init_geometry
|
158
178
|
@y = 85.0511287 if @y > 85.0511287
|
159
179
|
@y = -85.0511287 if @y < -85.0511287
|
160
180
|
super
|
@@ -163,48 +183,53 @@ module RGeo
|
|
163
183
|
|
164
184
|
module ProjectedNCurveMethods # :nodoc:
|
165
185
|
def length
|
166
|
-
projection.
|
186
|
+
projection.unsafe_length
|
167
187
|
end
|
168
188
|
end
|
169
189
|
|
170
190
|
module ProjectedLineStringMethods # :nodoc:
|
171
191
|
private
|
172
192
|
|
173
|
-
|
193
|
+
# Ensure coordinates fall within a valid range.
|
194
|
+
def init_geometry
|
174
195
|
@points = @points.map(&:canonical_point)
|
175
196
|
super
|
176
197
|
end
|
177
198
|
end
|
178
199
|
|
200
|
+
module ProjectedLinearRingMethods # :nodoc:
|
201
|
+
def simple?
|
202
|
+
projection.valid?
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
179
206
|
module ProjectedNSurfaceMethods # :nodoc:
|
180
207
|
def area
|
181
|
-
projection.
|
208
|
+
projection.unsafe_area
|
182
209
|
end
|
183
210
|
|
184
211
|
def centroid
|
185
|
-
factory.unproject(projection.
|
212
|
+
factory.unproject(projection.unsafe_centroid)
|
186
213
|
end
|
187
214
|
end
|
188
215
|
|
189
216
|
module ProjectedPolygonMethods # :nodoc:
|
190
217
|
private
|
191
218
|
|
192
|
-
|
219
|
+
# Ensure projection is available.
|
220
|
+
def init_geometry
|
193
221
|
super
|
194
|
-
unless projection
|
195
|
-
raise Error::InvalidGeometry, "Polygon failed assertions"
|
196
|
-
end
|
222
|
+
raise Error::InvalidGeometry, "Polygon failed assertions" unless projection
|
197
223
|
end
|
198
224
|
end
|
199
225
|
|
200
226
|
module ProjectedMultiPolygonMethods # :nodoc:
|
201
227
|
private
|
202
228
|
|
203
|
-
|
229
|
+
# Ensure projection is available.
|
230
|
+
def init_geometry
|
204
231
|
super
|
205
|
-
unless projection
|
206
|
-
raise Error::InvalidGeometry, "MultiPolygon failed assertions"
|
207
|
-
end
|
232
|
+
raise Error::InvalidGeometry, "MultiPolygon failed assertions" unless projection
|
208
233
|
end
|
209
234
|
end
|
210
235
|
end
|
@@ -13,7 +13,6 @@ module RGeo
|
|
13
13
|
# map visualization, an envelope in a projected coordinate system, or
|
14
14
|
# a spatial constraint. It must be attached to a Geographic::Factory
|
15
15
|
# that has a projection.
|
16
|
-
|
17
16
|
class ProjectedWindow
|
18
17
|
# Create a new ProjectedWindow given the Geographic::Factory, and the
|
19
18
|
# x and y extents of the rectangle.
|
@@ -64,38 +63,33 @@ module RGeo
|
|
64
63
|
to_s
|
65
64
|
end
|
66
65
|
|
67
|
-
def eql?(
|
68
|
-
return false unless
|
69
|
-
@factory ==
|
70
|
-
@y_min =
|
66
|
+
def eql?(other) # :nodoc:
|
67
|
+
return false unless other.is_a?(ProjectedWindow)
|
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
|
71
70
|
end
|
72
71
|
alias == eql?
|
73
72
|
|
74
73
|
def hash # :nodoc:
|
75
|
-
@factory
|
74
|
+
[@factory, @x_min, @x_max, @y_min, @y_max].hash
|
76
75
|
end
|
77
76
|
|
78
77
|
# Returns the Geographic::Factory associated with this window.
|
79
78
|
# Note that this factory is the overall geography factory, not the
|
80
79
|
# projected factory (which can be obtained by calling
|
81
80
|
# Geographic::Factory#projection_factory on this factory).
|
82
|
-
|
83
81
|
attr_reader :factory
|
84
82
|
|
85
83
|
# Returns the lower limit in the x (easting) direction.
|
86
|
-
|
87
84
|
attr_reader :x_min
|
88
85
|
|
89
86
|
# Returns the upper limit in the x (easting) direction.
|
90
|
-
|
91
87
|
attr_reader :x_max
|
92
88
|
|
93
89
|
# Returns the lower limit in the y (northing) direction.
|
94
|
-
|
95
90
|
attr_reader :y_min
|
96
91
|
|
97
92
|
# Returns the upper limit in the y (northing) direction.
|
98
|
-
|
99
93
|
attr_reader :y_max
|
100
94
|
|
101
95
|
# Returns true if the projection wraps along the x axis, and this
|
@@ -146,35 +140,45 @@ module RGeo
|
|
146
140
|
# (lat/lng) space, as a Feature::Point object.
|
147
141
|
|
148
142
|
def sw_point
|
149
|
-
@
|
143
|
+
return @sw_point if defined?(@sw_point)
|
144
|
+
|
145
|
+
@sw_point = @factory.unproject(@factory.projection_factory.point(@x_min, @y_min))
|
150
146
|
end
|
151
147
|
|
152
148
|
# Returns the southeast corner of the rectangle in _unprojected_
|
153
149
|
# (lat/lng) space, as a Feature::Point object.
|
154
150
|
|
155
151
|
def se_point
|
156
|
-
@
|
152
|
+
return @se_point if defined?(@se_point)
|
153
|
+
|
154
|
+
@se_point = @factory.unproject(@factory.projection_factory.point(@x_max, @y_min))
|
157
155
|
end
|
158
156
|
|
159
157
|
# Returns the northwest corner of the rectangle in _unprojected_
|
160
158
|
# (lat/lng) space, as a Feature::Point object.
|
161
159
|
|
162
160
|
def nw_point
|
163
|
-
@
|
161
|
+
return @nw_point if defined?(@nw_point)
|
162
|
+
|
163
|
+
@nw_point = @factory.unproject(@factory.projection_factory.point(@x_min, @y_max))
|
164
164
|
end
|
165
165
|
|
166
166
|
# Returns the northeast corner of the rectangle in _unprojected_
|
167
167
|
# (lat/lng) space, as a Feature::Point object.
|
168
168
|
|
169
169
|
def ne_point
|
170
|
-
@
|
170
|
+
return @ne_point if defined?(@ne_point)
|
171
|
+
|
172
|
+
@ne_point = @factory.unproject(@factory.projection_factory.point(@x_max, @y_max))
|
171
173
|
end
|
172
174
|
|
173
175
|
# Returns the center of the rectangle in _unprojected_
|
174
176
|
# (lat/lng) space, as a Feature::Point object.
|
175
177
|
|
176
178
|
def center_point
|
177
|
-
@
|
179
|
+
return @center_point if defined?(@center_point)
|
180
|
+
|
181
|
+
@center_point = @factory.unproject(@factory.projection_factory.point(*center_xy))
|
178
182
|
end
|
179
183
|
|
180
184
|
# Returns a random point inside the rectangle in _unprojected_
|
@@ -233,7 +237,7 @@ module RGeo
|
|
233
237
|
|
234
238
|
def scaled_by(x_factor_, y_factor_ = nil)
|
235
239
|
y_factor_ ||= x_factor_
|
236
|
-
if x_factor_ != 1
|
240
|
+
if x_factor_ != 1 || y_factor_ != 1
|
237
241
|
x_, y_ = *center_xy
|
238
242
|
xr_ = x_span * 0.5 * x_factor_
|
239
243
|
yr_ = y_span * 0.5 * y_factor_
|
@@ -287,9 +291,14 @@ module RGeo
|
|
287
291
|
|
288
292
|
def with_margin(x_margin_, y_margin_ = nil)
|
289
293
|
y_margin_ ||= x_margin_
|
290
|
-
if x_margin_ != 0
|
291
|
-
ProjectedWindow.new(
|
292
|
-
@
|
294
|
+
if x_margin_ != 0 || y_margin_ != 0
|
295
|
+
ProjectedWindow.new(
|
296
|
+
@factory,
|
297
|
+
@x_min - x_margin_,
|
298
|
+
@y_min - y_margin_,
|
299
|
+
@x_max + x_margin_,
|
300
|
+
@y_max + y_margin_
|
301
|
+
)
|
293
302
|
else
|
294
303
|
self
|
295
304
|
end
|
@@ -318,8 +327,13 @@ module RGeo
|
|
318
327
|
y_margin_ ||= x_margin_
|
319
328
|
factory_ = point_.factory
|
320
329
|
projection_ = factory_.project(point_)
|
321
|
-
ProjectedWindow.new(
|
322
|
-
|
330
|
+
ProjectedWindow.new(
|
331
|
+
factory_,
|
332
|
+
projection_.x - x_margin_,
|
333
|
+
projection_.y - y_margin_,
|
334
|
+
projection_.x + x_margin_,
|
335
|
+
projection_.y + y_margin_
|
336
|
+
)
|
323
337
|
end
|
324
338
|
|
325
339
|
# Creates a new window that contains all of the given points.
|
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
module RGeo
|
10
10
|
module Geographic
|
11
|
-
class
|
11
|
+
class Projector # :nodoc:
|
12
12
|
def initialize(geography_factory, projection_factory)
|
13
13
|
@geography_factory = geography_factory
|
14
14
|
@projection_factory = projection_factory
|
@@ -42,14 +42,12 @@ module RGeo
|
|
42
42
|
new(geography_factory, projection_factory)
|
43
43
|
end
|
44
44
|
|
45
|
-
def
|
45
|
+
def create_from_opts(geography_factory, opts = {})
|
46
46
|
projection_factory =
|
47
47
|
Cartesian.preferred_factory(
|
48
|
-
proj4: proj4,
|
49
48
|
coord_sys: opts[:coord_sys], srid: opts[:srid],
|
49
|
+
coord_sys_class: opts[:coord_sys_class],
|
50
50
|
buffer_resolution: opts[:buffer_resolution],
|
51
|
-
lenient_multi_polygon_assertions: opts[:lenient_multi_polygon_assertions],
|
52
|
-
uses_lenient_assertions: opts[:uses_lenient_assertions],
|
53
51
|
has_z_coordinate: opts[:has_z_coordinate],
|
54
52
|
has_m_coordinate: opts[:has_m_coordinate],
|
55
53
|
wkt_parser: opts[:wkt_parser], wkt_generator: opts[:wkt_generator],
|
@@ -14,11 +14,8 @@ 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
|
-
|
18
|
-
coord_sys: SimpleMercatorProjector._coordsys_3857,
|
17
|
+
coord_sys: SimpleMercatorProjector._coordsys3857,
|
19
18
|
buffer_resolution: opts[:buffer_resolution],
|
20
|
-
lenient_multi_polygon_assertions: opts[:lenient_multi_polygon_assertions],
|
21
|
-
uses_lenient_assertions: opts[:uses_lenient_assertions],
|
22
19
|
has_z_coordinate: opts[:has_z_coordinate],
|
23
20
|
has_m_coordinate: opts[:has_m_coordinate])
|
24
21
|
end
|
@@ -35,8 +32,10 @@ module RGeo
|
|
35
32
|
when Feature::Point
|
36
33
|
rpd_ = ImplHelper::Math::RADIANS_PER_DEGREE
|
37
34
|
radius = EQUATORIAL_RADIUS
|
38
|
-
@projection_factory.point(
|
39
|
-
|
35
|
+
@projection_factory.point(
|
36
|
+
geometry.x * rpd_ * radius,
|
37
|
+
Math.log(Math.tan(Math::PI / 4.0 + geometry.y * rpd_ / 2.0)) * radius
|
38
|
+
)
|
40
39
|
when Feature::Line
|
41
40
|
@projection_factory.line(project(geometry.start_point), project(geometry.end_point))
|
42
41
|
when Feature::LinearRing
|
@@ -62,8 +61,10 @@ module RGeo
|
|
62
61
|
when Feature::Point
|
63
62
|
dpr = ImplHelper::Math::DEGREES_PER_RADIAN
|
64
63
|
radius = EQUATORIAL_RADIUS
|
65
|
-
@geography_factory.point(
|
66
|
-
|
64
|
+
@geography_factory.point(
|
65
|
+
geometry.x / radius * dpr,
|
66
|
+
(2.0 * Math.atan(Math.exp(geometry.y / radius)) - Math::PI / 2.0) * dpr
|
67
|
+
)
|
67
68
|
when Feature::Line
|
68
69
|
@geography_factory.line(unproject(geometry.start_point), unproject(geometry.end_point))
|
69
70
|
when Feature::LinearRing
|
@@ -71,8 +72,10 @@ module RGeo
|
|
71
72
|
when Feature::LineString
|
72
73
|
@geography_factory.line_string(geometry.points.map { |p| unproject(p) })
|
73
74
|
when Feature::Polygon
|
74
|
-
@geography_factory.polygon(
|
75
|
-
geometry.
|
75
|
+
@geography_factory.polygon(
|
76
|
+
unproject(geometry.exterior_ring),
|
77
|
+
geometry.interior_rings.map { |p| unproject(p) }
|
78
|
+
)
|
76
79
|
when Feature::MultiPoint
|
77
80
|
@geography_factory.multi_point(geometry.map { |p| unproject(p) })
|
78
81
|
when Feature::MultiLineString
|
@@ -89,24 +92,22 @@ module RGeo
|
|
89
92
|
end
|
90
93
|
|
91
94
|
def limits_window
|
92
|
-
@limits_window
|
93
|
-
-20_037_508.342789, -20_037_508.342789, 20_037_508.342789, 20_037_508.342789,
|
94
|
-
is_limits: true)
|
95
|
-
end
|
95
|
+
return @limits_window if defined?(@limits_window)
|
96
96
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
97
|
+
@limits_window = ProjectedWindow.new(
|
98
|
+
@geography_factory,
|
99
|
+
-20_037_508.342789,
|
100
|
+
-20_037_508.342789,
|
101
|
+
20_037_508.342789,
|
102
|
+
20_037_508.342789,
|
103
|
+
is_limits: true
|
104
|
+
)
|
103
105
|
end
|
104
106
|
|
105
|
-
def self.
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
@coordsys_3857
|
107
|
+
def self._coordsys3857 # :nodoc:
|
108
|
+
return @coordsys3857 if defined?(@coordsys3857)
|
109
|
+
|
110
|
+
@coordsys3857 = CoordSys::CONFIG.default_coord_sys_class.create(3857)
|
110
111
|
end
|
111
112
|
end
|
112
113
|
end
|
@@ -8,78 +8,98 @@
|
|
8
8
|
|
9
9
|
module RGeo
|
10
10
|
module Geographic
|
11
|
-
class SphericalPointImpl
|
11
|
+
class SphericalPointImpl
|
12
12
|
include Feature::Point
|
13
|
+
include ImplHelper::ValidityCheck
|
13
14
|
include ImplHelper::BasicGeometryMethods
|
14
15
|
include ImplHelper::BasicPointMethods
|
16
|
+
include ImplHelper::ValidOp
|
15
17
|
include SphericalGeometryMethods
|
16
18
|
include SphericalPointMethods
|
17
19
|
end
|
18
20
|
|
19
|
-
class SphericalLineStringImpl
|
21
|
+
class SphericalLineStringImpl
|
20
22
|
include Feature::LineString
|
23
|
+
include ImplHelper::ValidityCheck
|
21
24
|
include ImplHelper::BasicGeometryMethods
|
22
25
|
include ImplHelper::BasicLineStringMethods
|
26
|
+
include ImplHelper::ValidOp
|
23
27
|
include SphericalGeometryMethods
|
24
28
|
include SphericalLineStringMethods
|
25
29
|
end
|
26
30
|
|
27
|
-
class SphericalLineImpl
|
31
|
+
class SphericalLineImpl
|
28
32
|
include Feature::Line
|
33
|
+
include ImplHelper::ValidityCheck
|
29
34
|
include ImplHelper::BasicGeometryMethods
|
30
35
|
include ImplHelper::BasicLineStringMethods
|
31
36
|
include ImplHelper::BasicLineMethods
|
37
|
+
include ImplHelper::ValidOp
|
32
38
|
include SphericalGeometryMethods
|
33
39
|
include SphericalLineStringMethods
|
34
40
|
end
|
35
41
|
|
36
|
-
class SphericalLinearRingImpl
|
42
|
+
class SphericalLinearRingImpl
|
37
43
|
include Feature::LinearRing
|
44
|
+
include ImplHelper::ValidityCheck
|
38
45
|
include ImplHelper::BasicGeometryMethods
|
39
46
|
include ImplHelper::BasicLineStringMethods
|
40
47
|
include ImplHelper::BasicLinearRingMethods
|
48
|
+
include ImplHelper::ValidOp
|
41
49
|
include SphericalGeometryMethods
|
42
50
|
include SphericalLineStringMethods
|
43
51
|
end
|
44
52
|
|
45
|
-
class SphericalPolygonImpl
|
53
|
+
class SphericalPolygonImpl
|
46
54
|
include Feature::Polygon
|
55
|
+
include ImplHelper::ValidityCheck
|
47
56
|
include ImplHelper::BasicGeometryMethods
|
48
57
|
include ImplHelper::BasicPolygonMethods
|
58
|
+
include ImplHelper::ValidOp
|
49
59
|
include SphericalGeometryMethods
|
50
60
|
include SphericalPolygonMethods
|
51
61
|
end
|
52
62
|
|
53
|
-
class SphericalGeometryCollectionImpl
|
63
|
+
class SphericalGeometryCollectionImpl
|
54
64
|
include Feature::GeometryCollection
|
65
|
+
include ImplHelper::ValidityCheck
|
55
66
|
include ImplHelper::BasicGeometryMethods
|
56
67
|
include ImplHelper::BasicGeometryCollectionMethods
|
68
|
+
include ImplHelper::ValidOp
|
57
69
|
include SphericalGeometryMethods
|
58
70
|
end
|
59
71
|
|
60
|
-
class SphericalMultiPointImpl
|
72
|
+
class SphericalMultiPointImpl
|
61
73
|
include Feature::MultiPoint
|
74
|
+
include ImplHelper::ValidityCheck
|
62
75
|
include ImplHelper::BasicGeometryMethods
|
63
76
|
include ImplHelper::BasicGeometryCollectionMethods
|
64
77
|
include ImplHelper::BasicMultiPointMethods
|
78
|
+
include ImplHelper::ValidOp
|
65
79
|
include SphericalGeometryMethods
|
66
80
|
end
|
67
81
|
|
68
|
-
class SphericalMultiLineStringImpl
|
82
|
+
class SphericalMultiLineStringImpl
|
69
83
|
include Feature::MultiLineString
|
84
|
+
include ImplHelper::ValidityCheck
|
70
85
|
include ImplHelper::BasicGeometryMethods
|
71
86
|
include ImplHelper::BasicGeometryCollectionMethods
|
72
87
|
include ImplHelper::BasicMultiLineStringMethods
|
88
|
+
include ImplHelper::ValidOp
|
73
89
|
include SphericalGeometryMethods
|
74
90
|
include SphericalMultiLineStringMethods
|
75
91
|
end
|
76
92
|
|
77
|
-
class SphericalMultiPolygonImpl
|
93
|
+
class SphericalMultiPolygonImpl
|
78
94
|
include Feature::MultiPolygon
|
95
|
+
include ImplHelper::ValidityCheck
|
79
96
|
include ImplHelper::BasicGeometryMethods
|
80
97
|
include ImplHelper::BasicGeometryCollectionMethods
|
81
98
|
include ImplHelper::BasicMultiPolygonMethods
|
99
|
+
include ImplHelper::ValidOp
|
82
100
|
include SphericalGeometryMethods
|
83
101
|
end
|
102
|
+
|
103
|
+
ImplHelper::ValidityCheck.override_classes
|
84
104
|
end
|
85
105
|
end
|