rgeo 0.1.18 → 0.1.19
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +11 -0
- data/README.rdoc +17 -30
- data/Version +1 -1
- data/ext/geos_c_impl/factory.c +4 -9
- data/ext/geos_c_impl/factory.h +8 -8
- data/ext/geos_c_impl/geometry.c +19 -2
- data/ext/geos_c_impl/geometry_collection.c +1 -1
- data/ext/geos_c_impl/polygon.c +2 -2
- data/lib/active_record/connection_adapters/mysql2spatial_adapter.rb +8 -6
- data/lib/active_record/connection_adapters/mysqlspatial_adapter.rb +8 -6
- data/lib/rgeo/active_record/arel_modifications.rb +4 -0
- data/lib/rgeo/active_record/base_modifications.rb +37 -2
- data/lib/rgeo/active_record/mysql_common.rb +2 -2
- data/lib/rgeo/cartesian.rb +6 -22
- data/lib/rgeo/cartesian/analysis.rb +3 -0
- data/lib/rgeo/cartesian/bounding_box.rb +337 -0
- data/lib/rgeo/cartesian/feature_classes.rb +11 -11
- data/lib/rgeo/cartesian/feature_methods.rb +5 -0
- data/lib/rgeo/cartesian/interface.rb +21 -4
- data/lib/rgeo/features/geometry.rb +0 -15
- data/lib/rgeo/geography/interface.rb +33 -6
- data/lib/rgeo/geography/simple_mercator/feature_classes.rb +30 -17
- data/lib/rgeo/geography/simple_mercator/feature_methods.rb +1 -1
- data/lib/rgeo/geography/simple_spherical/feature_classes.rb +38 -11
- data/lib/rgeo/geos.rb +2 -0
- data/lib/rgeo/geos/factory.rb +37 -21
- data/lib/rgeo/geos/impl_additions.rb +20 -0
- data/lib/rgeo/geos/interface.rb +17 -8
- data/lib/rgeo/geos/zm_factory.rb +241 -0
- data/lib/rgeo/geos/zm_impl.rb +432 -0
- data/lib/rgeo/impl_helpers/basic_geometry_collection_methods.rb +39 -0
- data/lib/rgeo/impl_helpers/basic_geometry_methods.rb +0 -5
- data/lib/rgeo/impl_helpers/basic_line_string_methods.rb +10 -1
- data/lib/rgeo/impl_helpers/basic_point_methods.rb +1 -13
- data/lib/rgeo/impl_helpers/basic_polygon_methods.rb +10 -0
- data/tests/common/geometry_collection_tests.rb +16 -0
- data/tests/common/point_tests.rb +27 -1
- data/tests/geos/tc_point.rb +2 -0
- data/tests/geos/tc_zmfactory.rb +85 -0
- data/tests/simple_cartesian/tc_geometry_collection.rb +1 -0
- data/tests/simple_cartesian/tc_point.rb +2 -1
- data/tests/simple_mercator/tc_point.rb +2 -0
- data/tests/simple_spherical/tc_geometry_collection.rb +2 -0
- data/tests/simple_spherical/tc_point.rb +2 -1
- data/tests/tc_oneoff.rb +0 -1
- data/tests/wkrep/tc_wkb_generator.rb +4 -4
- data/tests/wkrep/tc_wkb_parser.rb +2 -2
- data/tests/wkrep/tc_wkt_generator.rb +4 -4
- data/tests/wkrep/tc_wkt_parser.rb +5 -5
- metadata +23 -3
@@ -42,12 +42,12 @@ module RGeo
|
|
42
42
|
|
43
43
|
|
44
44
|
# Creates and returns a cartesian factory of the preferred
|
45
|
-
# implementation.
|
45
|
+
# Cartesian implementation.
|
46
46
|
#
|
47
47
|
# The actual implementation returned depends on which ruby
|
48
48
|
# interpreter is running and what libraries are available.
|
49
49
|
# RGeo will try to provide a fully-functional and performant
|
50
|
-
# implementation if possible. If not, the simple
|
50
|
+
# implementation if possible. If not, the simple Cartesian
|
51
51
|
# implementation will be returned.
|
52
52
|
#
|
53
53
|
# The given options are passed to the factory's constructor.
|
@@ -64,8 +64,25 @@ module RGeo
|
|
64
64
|
alias_method :factory, :preferred_factory
|
65
65
|
|
66
66
|
|
67
|
-
# Returns a factory for the simple
|
68
|
-
#
|
67
|
+
# Returns a factory for the simple Cartesian implementation. This
|
68
|
+
# implementation provides all SFS 1.1 types, and also allows Z and
|
69
|
+
# M coordinates. It does not depend on external libraries, and is
|
70
|
+
# thus always available, but it does not implement many of the more
|
71
|
+
# advanced geometric operations. These limitations are:
|
72
|
+
#
|
73
|
+
# * Relational operators such as Features::Geometry#intersects? are
|
74
|
+
# not implemented for most types.
|
75
|
+
# * Relational constructors such as Features::Geometry#union are
|
76
|
+
# not implemented for most types.
|
77
|
+
# * Buffer and convex hull calculations are not implemented for most
|
78
|
+
# types. Boundaries are available except for GeometryCollection.
|
79
|
+
# * Length calculations are available, but areas are not. Distances
|
80
|
+
# are available only between points.
|
81
|
+
# * Equality and simplicity evaluation are implemented for some but
|
82
|
+
# not all types.
|
83
|
+
# * Assertions for polygons and multipolygons are not implemented.
|
84
|
+
#
|
85
|
+
# Unimplemented operations will return nil if invoked.
|
69
86
|
#
|
70
87
|
# Options include:
|
71
88
|
#
|
@@ -115,21 +115,6 @@ module RGeo
|
|
115
115
|
end
|
116
116
|
|
117
117
|
|
118
|
-
# Cast this geometry to the given type (which must be one of the
|
119
|
-
# type modules in the Features module) and return the resulting
|
120
|
-
# object. Returns nil if the cast fails because the types are not
|
121
|
-
# compatible or the object does not satisfy the assertions for the
|
122
|
-
# new type.
|
123
|
-
#
|
124
|
-
# Generally, this is only useful for casting general classes to
|
125
|
-
# subclasses; e.g. a GeometryCollection to a MultiPoint, or a
|
126
|
-
# LineString to a LinearRing.
|
127
|
-
|
128
|
-
def cast(type_)
|
129
|
-
raise Errors::MethodUnimplemented
|
130
|
-
end
|
131
|
-
|
132
|
-
|
133
118
|
# Returns true if this geometric object is objectively equivalent
|
134
119
|
# to the given object.
|
135
120
|
|
@@ -44,13 +44,32 @@ module RGeo
|
|
44
44
|
# Geographic features provided by this factory perform calculations
|
45
45
|
# assuming a spherical earth. In other words, geodesics are treated
|
46
46
|
# as great circle arcs, and size and geometric calculations are
|
47
|
-
# treated accordingly. Distance
|
48
|
-
#
|
47
|
+
# treated accordingly. Distance calculations report results in
|
48
|
+
# meters. This makes this implementation ideal for everyday
|
49
49
|
# calculations on the globe where accuracy within about 0.5 percent
|
50
50
|
# is sufficient.
|
51
51
|
#
|
52
|
-
#
|
53
|
-
#
|
52
|
+
# === Limitations
|
53
|
+
#
|
54
|
+
# This implementation does not implement many of the more advanced
|
55
|
+
# geometric operations. In particular:
|
56
|
+
#
|
57
|
+
# * Relational operators such as Features::Geometry#intersects? are
|
58
|
+
# not implemented for most types.
|
59
|
+
# * Relational constructors such as Features::Geometry#union are
|
60
|
+
# not implemented for most types.
|
61
|
+
# * Buffer, convex hull, and envelope calculations are not
|
62
|
+
# implemented for most types. Boundaries are available except for
|
63
|
+
# GeometryCollection.
|
64
|
+
# * Length calculations are available, but areas are not. Distances
|
65
|
+
# are available only between points.
|
66
|
+
# * Equality and simplicity evaluation are implemented for some but
|
67
|
+
# not all types.
|
68
|
+
# * Assertions for polygons and multipolygons are not implemented.
|
69
|
+
#
|
70
|
+
# Unimplemented operations will return nil if invoked.
|
71
|
+
#
|
72
|
+
# === SRID for simple_spherical
|
54
73
|
#
|
55
74
|
# Simple_spherical features report SRID=4326, indicating EPSG 4326
|
56
75
|
# (i.e. the WGS84 spheroid and the lat/lon system commonly used by
|
@@ -72,7 +91,10 @@ module RGeo
|
|
72
91
|
# than those generated by, e.g., PostGIS (unless you direct PostGIS
|
73
92
|
# to use spherical geodesics).
|
74
93
|
#
|
75
|
-
# Options
|
94
|
+
# === Options
|
95
|
+
#
|
96
|
+
# You may use the following options when creating a simple_spherical
|
97
|
+
# factory:
|
76
98
|
#
|
77
99
|
# <tt>:lenient_multi_polygon_assertions</tt>::
|
78
100
|
# If set to true, assertion checking on MultiPolygon is disabled.
|
@@ -119,6 +141,8 @@ module RGeo
|
|
119
141
|
# Distance and area computations return results in meters, whereas
|
120
142
|
# all coordinates are represented in degrees latitude and longitude.
|
121
143
|
#
|
144
|
+
# === About the coordinate system
|
145
|
+
#
|
122
146
|
# This is not a true projected spatial reference: point coordinates
|
123
147
|
# are still represented in degrees latitude and longitude. However,
|
124
148
|
# computations are done in the projected spatial reference. (That
|
@@ -149,7 +173,10 @@ module RGeo
|
|
149
173
|
# visualization APIs, so we've decided to fudge on this in the
|
150
174
|
# interest of being true to our expected application use cases.
|
151
175
|
#
|
152
|
-
# Options
|
176
|
+
# === Options
|
177
|
+
#
|
178
|
+
# You may use the following options when creating a simple_mercator
|
179
|
+
# factory:
|
153
180
|
#
|
154
181
|
# <tt>:lenient_multi_polygon_assertions</tt>::
|
155
182
|
# If set to true, assertion checking on MultiPolygon is disabled.
|
@@ -46,8 +46,8 @@ module RGeo
|
|
46
46
|
|
47
47
|
include ::RGeo::Features::Point
|
48
48
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
49
|
-
include ::RGeo::Geography::SimpleMercator::GeometryMethods
|
50
49
|
include ::RGeo::ImplHelpers::BasicPointMethods
|
50
|
+
include ::RGeo::Geography::SimpleMercator::GeometryMethods
|
51
51
|
|
52
52
|
|
53
53
|
def _validate_geometry
|
@@ -70,17 +70,30 @@ module RGeo
|
|
70
70
|
end
|
71
71
|
|
72
72
|
|
73
|
+
def canonical_x
|
74
|
+
x_ = @x % 360.0
|
75
|
+
x_ -= 360.0 if x_ >= 180.0
|
76
|
+
x_
|
77
|
+
end
|
78
|
+
alias_method :canonical_longitude, :canonical_x
|
79
|
+
alias_method :canonical_lon, :canonical_x
|
80
|
+
|
81
|
+
|
73
82
|
def canonical_point
|
74
83
|
if @x >= -180.0 && @x < 180.0
|
75
84
|
self
|
76
85
|
else
|
77
|
-
|
78
|
-
x_ -= 360.0 if x_ >= 180.0
|
79
|
-
PointImpl.new(@factory, x_, @y)
|
86
|
+
PointImpl.new(@factory, canonical_x, @y)
|
80
87
|
end
|
81
88
|
end
|
82
89
|
|
83
90
|
|
91
|
+
alias_method :longitude, :x
|
92
|
+
alias_method :lon, :x
|
93
|
+
alias_method :latitude, :y
|
94
|
+
alias_method :lat, :y
|
95
|
+
|
96
|
+
|
84
97
|
end
|
85
98
|
|
86
99
|
|
@@ -89,10 +102,10 @@ module RGeo
|
|
89
102
|
|
90
103
|
include ::RGeo::Features::LineString
|
91
104
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
105
|
+
include ::RGeo::ImplHelpers::BasicLineStringMethods
|
92
106
|
include ::RGeo::Geography::SimpleMercator::GeometryMethods
|
93
107
|
include ::RGeo::Geography::SimpleMercator::NCurveMethods
|
94
108
|
include ::RGeo::Geography::SimpleMercator::CurveMethods
|
95
|
-
include ::RGeo::ImplHelpers::BasicLineStringMethods
|
96
109
|
include ::RGeo::Geography::SimpleMercator::LineStringMethods
|
97
110
|
|
98
111
|
|
@@ -109,12 +122,12 @@ module RGeo
|
|
109
122
|
|
110
123
|
include ::RGeo::Features::Line
|
111
124
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
125
|
+
include ::RGeo::ImplHelpers::BasicLineStringMethods
|
126
|
+
include ::RGeo::ImplHelpers::BasicLinearRingMethods
|
112
127
|
include ::RGeo::Geography::SimpleMercator::GeometryMethods
|
113
128
|
include ::RGeo::Geography::SimpleMercator::NCurveMethods
|
114
129
|
include ::RGeo::Geography::SimpleMercator::CurveMethods
|
115
|
-
include ::RGeo::ImplHelpers::BasicLineStringMethods
|
116
130
|
include ::RGeo::Geography::SimpleMercator::LineStringMethods
|
117
|
-
include ::RGeo::ImplHelpers::BasicLinearRingMethods
|
118
131
|
|
119
132
|
|
120
133
|
def _make_projection(projection_factory_) # :nodoc:
|
@@ -130,12 +143,12 @@ module RGeo
|
|
130
143
|
|
131
144
|
include ::RGeo::Features::Line
|
132
145
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
146
|
+
include ::RGeo::ImplHelpers::BasicLineStringMethods
|
147
|
+
include ::RGeo::ImplHelpers::BasicLineMethods
|
133
148
|
include ::RGeo::Geography::SimpleMercator::GeometryMethods
|
134
149
|
include ::RGeo::Geography::SimpleMercator::NCurveMethods
|
135
150
|
include ::RGeo::Geography::SimpleMercator::CurveMethods
|
136
|
-
include ::RGeo::ImplHelpers::BasicLineStringMethods
|
137
151
|
include ::RGeo::Geography::SimpleMercator::LineStringMethods
|
138
|
-
include ::RGeo::ImplHelpers::BasicLineMethods
|
139
152
|
|
140
153
|
|
141
154
|
def _make_projection(projection_factory_) # :nodoc:
|
@@ -151,10 +164,10 @@ module RGeo
|
|
151
164
|
|
152
165
|
include ::RGeo::Features::Polygon
|
153
166
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
167
|
+
include ::RGeo::ImplHelpers::BasicPolygonMethods
|
154
168
|
include ::RGeo::Geography::SimpleMercator::GeometryMethods
|
155
169
|
include ::RGeo::Geography::SimpleMercator::NSurfaceMethods
|
156
170
|
include ::RGeo::Geography::SimpleMercator::SurfaceMethods
|
157
|
-
include ::RGeo::ImplHelpers::BasicPolygonMethods
|
158
171
|
|
159
172
|
|
160
173
|
def _validate_geometry
|
@@ -179,8 +192,8 @@ module RGeo
|
|
179
192
|
|
180
193
|
include ::RGeo::Features::GeometryCollection
|
181
194
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
182
|
-
include ::RGeo::Geography::SimpleMercator::GeometryMethods
|
183
195
|
include ::RGeo::ImplHelpers::BasicGeometryCollectionMethods
|
196
|
+
include ::RGeo::Geography::SimpleMercator::GeometryMethods
|
184
197
|
include ::RGeo::Geography::SimpleMercator::GeometryCollectionMethods
|
185
198
|
|
186
199
|
|
@@ -197,10 +210,10 @@ module RGeo
|
|
197
210
|
|
198
211
|
include ::RGeo::Features::GeometryCollection
|
199
212
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
200
|
-
include ::RGeo::Geography::SimpleMercator::GeometryMethods
|
201
213
|
include ::RGeo::ImplHelpers::BasicGeometryCollectionMethods
|
202
|
-
include ::RGeo::Geography::SimpleMercator::GeometryCollectionMethods
|
203
214
|
include ::RGeo::ImplHelpers::BasicMultiPointMethods
|
215
|
+
include ::RGeo::Geography::SimpleMercator::GeometryMethods
|
216
|
+
include ::RGeo::Geography::SimpleMercator::GeometryCollectionMethods
|
204
217
|
|
205
218
|
|
206
219
|
def _make_projection(projection_factory_) # :nodoc:
|
@@ -216,11 +229,11 @@ module RGeo
|
|
216
229
|
|
217
230
|
include ::RGeo::Features::GeometryCollection
|
218
231
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
232
|
+
include ::RGeo::ImplHelpers::BasicGeometryCollectionMethods
|
233
|
+
include ::RGeo::ImplHelpers::BasicMultiLineStringMethods
|
219
234
|
include ::RGeo::Geography::SimpleMercator::GeometryMethods
|
220
235
|
include ::RGeo::Geography::SimpleMercator::NCurveMethods
|
221
|
-
include ::RGeo::ImplHelpers::BasicGeometryCollectionMethods
|
222
236
|
include ::RGeo::Geography::SimpleMercator::GeometryCollectionMethods
|
223
|
-
include ::RGeo::ImplHelpers::BasicMultiLineStringMethods
|
224
237
|
|
225
238
|
|
226
239
|
def _make_projection(projection_factory_) # :nodoc:
|
@@ -236,11 +249,11 @@ module RGeo
|
|
236
249
|
|
237
250
|
include ::RGeo::Features::GeometryCollection
|
238
251
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
252
|
+
include ::RGeo::ImplHelpers::BasicGeometryCollectionMethods
|
253
|
+
include ::RGeo::ImplHelpers::BasicMultiPolygonMethods
|
239
254
|
include ::RGeo::Geography::SimpleMercator::GeometryMethods
|
240
255
|
include ::RGeo::Geography::SimpleMercator::NSurfaceMethods
|
241
|
-
include ::RGeo::ImplHelpers::BasicGeometryCollectionMethods
|
242
256
|
include ::RGeo::Geography::SimpleMercator::GeometryCollectionMethods
|
243
|
-
include ::RGeo::ImplHelpers::BasicMultiPolygonMethods
|
244
257
|
|
245
258
|
|
246
259
|
def _validate_geometry
|
@@ -46,8 +46,8 @@ module RGeo
|
|
46
46
|
|
47
47
|
include ::RGeo::Features::Point
|
48
48
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
49
|
-
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
50
49
|
include ::RGeo::ImplHelpers::BasicPointMethods
|
50
|
+
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
51
51
|
|
52
52
|
|
53
53
|
def _validate_geometry
|
@@ -75,6 +75,33 @@ module RGeo
|
|
75
75
|
end
|
76
76
|
|
77
77
|
|
78
|
+
def equals?(rhs_)
|
79
|
+
return false unless rhs_.is_a?(self.class) && rhs_.factory == self.factory
|
80
|
+
case rhs_
|
81
|
+
when Features::Point
|
82
|
+
if @y == 90
|
83
|
+
rhs_.y == 90
|
84
|
+
elsif @y == -90
|
85
|
+
rhs_.y == -90
|
86
|
+
else
|
87
|
+
rhs_.x == @x && rhs_.y == @y
|
88
|
+
end
|
89
|
+
when Features::LineString
|
90
|
+
rhs_.num_points > 0 && rhs_.points.all?{ |elem_| equals?(elem_) }
|
91
|
+
when Features::GeometryCollection
|
92
|
+
rhs_.num_geometries > 0 && rhs_.all?{ |elem_| equals?(elem_) }
|
93
|
+
else
|
94
|
+
false
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
alias_method :longitude, :x
|
100
|
+
alias_method :lon, :x
|
101
|
+
alias_method :latitude, :y
|
102
|
+
alias_method :lat, :y
|
103
|
+
|
104
|
+
|
78
105
|
end
|
79
106
|
|
80
107
|
|
@@ -83,8 +110,8 @@ module RGeo
|
|
83
110
|
|
84
111
|
include ::RGeo::Features::LineString
|
85
112
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
86
|
-
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
87
113
|
include ::RGeo::ImplHelpers::BasicLineStringMethods
|
114
|
+
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
88
115
|
include ::RGeo::Geography::SimpleSpherical::LineStringMethods
|
89
116
|
|
90
117
|
|
@@ -96,10 +123,10 @@ module RGeo
|
|
96
123
|
|
97
124
|
include ::RGeo::Features::Line
|
98
125
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
99
|
-
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
100
126
|
include ::RGeo::ImplHelpers::BasicLineStringMethods
|
101
|
-
include ::RGeo::Geography::SimpleSpherical::LineStringMethods
|
102
127
|
include ::RGeo::ImplHelpers::BasicLineMethods
|
128
|
+
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
129
|
+
include ::RGeo::Geography::SimpleSpherical::LineStringMethods
|
103
130
|
|
104
131
|
|
105
132
|
end
|
@@ -110,10 +137,10 @@ module RGeo
|
|
110
137
|
|
111
138
|
include ::RGeo::Features::Line
|
112
139
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
113
|
-
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
114
140
|
include ::RGeo::ImplHelpers::BasicLineStringMethods
|
115
|
-
include ::RGeo::Geography::SimpleSpherical::LineStringMethods
|
116
141
|
include ::RGeo::ImplHelpers::BasicLinearRingMethods
|
142
|
+
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
143
|
+
include ::RGeo::Geography::SimpleSpherical::LineStringMethods
|
117
144
|
|
118
145
|
|
119
146
|
end
|
@@ -124,8 +151,8 @@ module RGeo
|
|
124
151
|
|
125
152
|
include ::RGeo::Features::Polygon
|
126
153
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
127
|
-
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
128
154
|
include ::RGeo::ImplHelpers::BasicPolygonMethods
|
155
|
+
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
129
156
|
|
130
157
|
|
131
158
|
end
|
@@ -136,8 +163,8 @@ module RGeo
|
|
136
163
|
|
137
164
|
include ::RGeo::Features::GeometryCollection
|
138
165
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
139
|
-
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
140
166
|
include ::RGeo::ImplHelpers::BasicGeometryCollectionMethods
|
167
|
+
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
141
168
|
|
142
169
|
|
143
170
|
end
|
@@ -148,9 +175,9 @@ module RGeo
|
|
148
175
|
|
149
176
|
include ::RGeo::Features::GeometryCollection
|
150
177
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
151
|
-
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
152
178
|
include ::RGeo::ImplHelpers::BasicGeometryCollectionMethods
|
153
179
|
include ::RGeo::ImplHelpers::BasicMultiPointMethods
|
180
|
+
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
154
181
|
|
155
182
|
|
156
183
|
end
|
@@ -161,9 +188,9 @@ module RGeo
|
|
161
188
|
|
162
189
|
include ::RGeo::Features::GeometryCollection
|
163
190
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
164
|
-
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
165
191
|
include ::RGeo::ImplHelpers::BasicGeometryCollectionMethods
|
166
192
|
include ::RGeo::ImplHelpers::BasicMultiLineStringMethods
|
193
|
+
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
167
194
|
|
168
195
|
|
169
196
|
end
|
@@ -174,9 +201,9 @@ module RGeo
|
|
174
201
|
|
175
202
|
include ::RGeo::Features::GeometryCollection
|
176
203
|
include ::RGeo::ImplHelpers::BasicGeometryMethods
|
177
|
-
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
178
204
|
include ::RGeo::ImplHelpers::BasicGeometryCollectionMethods
|
179
205
|
include ::RGeo::ImplHelpers::BasicMultiPolygonMethods
|
206
|
+
include ::RGeo::Geography::SimpleSpherical::GeometryMethods
|
180
207
|
|
181
208
|
|
182
209
|
end
|
data/lib/rgeo/geos.rb
CHANGED
data/lib/rgeo/geos/factory.rb
CHANGED
@@ -43,6 +43,7 @@ module RGeo
|
|
43
43
|
|
44
44
|
class Factory
|
45
45
|
|
46
|
+
|
46
47
|
include Features::Factory::Instance
|
47
48
|
|
48
49
|
|
@@ -65,7 +66,8 @@ module RGeo
|
|
65
66
|
end
|
66
67
|
buffer_resolution_ = opts_[:buffer_resolution].to_i
|
67
68
|
buffer_resolution_ = 1 if buffer_resolution_ < 1
|
68
|
-
_create(flags_, opts_[:srid].to_i, buffer_resolution_)
|
69
|
+
result_ = _create(flags_, opts_[:srid].to_i, buffer_resolution_)
|
70
|
+
result_
|
69
71
|
end
|
70
72
|
alias_method :new, :create
|
71
73
|
|
@@ -73,6 +75,19 @@ module RGeo
|
|
73
75
|
end
|
74
76
|
|
75
77
|
|
78
|
+
def inspect # :nodoc:
|
79
|
+
"#<#{self.class}:0x#{object_id.to_s(16)} srid=#{_srid} bufres=#{_buffer_resolution} flags=#{_flags}>"
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
# Factory equivalence test.
|
84
|
+
|
85
|
+
def eql?(rhs_)
|
86
|
+
rhs_.is_a?(Factory) && rhs_.srid == _srid && rhs_._buffer_resolution == _buffer_resolution && rhs_._flags == _flags
|
87
|
+
end
|
88
|
+
alias_method :==, :eql?
|
89
|
+
|
90
|
+
|
76
91
|
# Returns the SRID of geometries created by this factory.
|
77
92
|
|
78
93
|
def srid
|
@@ -95,14 +110,6 @@ module RGeo
|
|
95
110
|
end
|
96
111
|
|
97
112
|
|
98
|
-
# Factory equivalence test.
|
99
|
-
|
100
|
-
def eql?(rhs_)
|
101
|
-
rhs_.is_a?(Factory) && rhs_.srid == _srid && rhs_._buffer_resolution == _buffer_resolution && rhs_._flags == _flags
|
102
|
-
end
|
103
|
-
alias_method :==, :eql?
|
104
|
-
|
105
|
-
|
106
113
|
# See ::RGeo::Features::Factory#has_capability?
|
107
114
|
|
108
115
|
def has_capability?(name_)
|
@@ -211,24 +218,33 @@ module RGeo
|
|
211
218
|
return nil unless Geos.supported?
|
212
219
|
keep_subtype_ = flags_[:keep_subtype]
|
213
220
|
force_new_ = flags_[:force_new]
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
221
|
+
type_ = original_.geometry_type
|
222
|
+
ntype_ = type_ if keep_subtype_ && type_.include?(ntype_)
|
223
|
+
case original_
|
224
|
+
when GeometryImpl
|
225
|
+
# Optimization if we're just changing factories, but the
|
226
|
+
# factories are zm-compatible.
|
227
|
+
if original_.factory != self && ntype_ == type_ &&
|
228
|
+
original_.factory._flags & 0x6 == _flags & 0x6
|
229
|
+
then
|
218
230
|
result_ = original_.dup
|
219
231
|
result_._set_factory(self)
|
220
232
|
return result_
|
221
233
|
end
|
234
|
+
# LineString conversion optimization.
|
222
235
|
if (original_.factory != self || ntype_ != type_) &&
|
223
|
-
|
236
|
+
original_.factory._flags & 0x6 == _flags & 0x6 &&
|
237
|
+
type_.subtype_of?(Features::LineString) && ntype_.subtype_of?(Features::LineString)
|
224
238
|
then
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
239
|
+
return IMPL_CLASSES[ntype_]._copy_from(self, original_)
|
240
|
+
end
|
241
|
+
when ZMGeometryImpl
|
242
|
+
# Optimization for just removing a coordinate from an otherwise
|
243
|
+
# compatible factory
|
244
|
+
if _flags & 0x6 == 0x2 && self == original_.factory.z_factory
|
245
|
+
return Features.cast(original_.z_geometry, ntype_, flags_)
|
246
|
+
elsif _flags & 0x6 == 0x4 && self == original_.factory.m_factory
|
247
|
+
return Features.cast(original_.m_geometry, ntype_, flags_)
|
232
248
|
end
|
233
249
|
end
|
234
250
|
false
|