rgeo 0.1.12 → 0.1.13

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.
Files changed (86) hide show
  1. data/History.rdoc +9 -7
  2. data/README.rdoc +7 -5
  3. data/Version +1 -1
  4. data/ext/geos_c_impl/factory.c +12 -19
  5. data/ext/geos_c_impl/factory.h +15 -21
  6. data/ext/geos_c_impl/geometry.c +19 -36
  7. data/ext/geos_c_impl/geometry.h +2 -12
  8. data/ext/geos_c_impl/geometry_collection.c +38 -157
  9. data/ext/geos_c_impl/geometry_collection.h +2 -12
  10. data/ext/geos_c_impl/line_string.c +83 -80
  11. data/ext/geos_c_impl/line_string.h +2 -12
  12. data/ext/geos_c_impl/main.c +5 -0
  13. data/ext/geos_c_impl/point.c +2 -12
  14. data/ext/geos_c_impl/point.h +2 -12
  15. data/ext/geos_c_impl/polygon.c +5 -14
  16. data/ext/geos_c_impl/polygon.h +2 -12
  17. data/ext/geos_c_impl/preface.h +8 -0
  18. data/lib/rgeo.rb +34 -16
  19. data/lib/rgeo/{geography/simple_spherical/geometry_collection_impl.rb → cartesian.rb} +19 -26
  20. data/lib/rgeo/cartesian/calculations.rb +129 -0
  21. data/lib/rgeo/cartesian/interface.rb +85 -0
  22. data/lib/rgeo/cartesian/simple_factory.rb +159 -0
  23. data/lib/rgeo/cartesian/simple_feature_classes.rb +187 -0
  24. data/lib/rgeo/cartesian/simple_feature_methods.rb +97 -0
  25. data/lib/rgeo/features.rb +1 -0
  26. data/lib/rgeo/features/curve.rb +3 -2
  27. data/lib/rgeo/features/factory.rb +62 -37
  28. data/lib/rgeo/features/geometry.rb +10 -32
  29. data/lib/rgeo/features/geometry_collection.rb +3 -2
  30. data/lib/rgeo/features/line.rb +3 -2
  31. data/lib/rgeo/features/line_string.rb +3 -2
  32. data/lib/rgeo/features/linear_ring.rb +3 -2
  33. data/lib/rgeo/features/multi_curve.rb +3 -2
  34. data/lib/rgeo/features/multi_line_string.rb +3 -2
  35. data/lib/rgeo/features/multi_point.rb +3 -2
  36. data/lib/rgeo/features/multi_polygon.rb +3 -2
  37. data/lib/rgeo/features/multi_surface.rb +3 -2
  38. data/lib/rgeo/features/point.rb +3 -2
  39. data/lib/rgeo/features/polygon.rb +3 -2
  40. data/lib/rgeo/features/surface.rb +3 -2
  41. data/lib/rgeo/features/types.rb +198 -0
  42. data/lib/rgeo/geography.rb +4 -14
  43. data/lib/rgeo/geography/factory.rb +7 -64
  44. data/lib/rgeo/geography/{simple_spherical/geometry_methods.rb → helper.rb} +4 -13
  45. data/lib/rgeo/geography/simple_mercator/feature_classes.rb +35 -89
  46. data/lib/rgeo/geography/simple_mercator/feature_methods.rb +22 -31
  47. data/lib/rgeo/geography/simple_mercator/projector.rb +4 -8
  48. data/lib/rgeo/geography/simple_spherical/calculations.rb +11 -9
  49. data/lib/rgeo/geography/simple_spherical/feature_classes.rb +189 -0
  50. data/lib/rgeo/geography/simple_spherical/{line_string_impl.rb → feature_methods.rb} +16 -64
  51. data/lib/rgeo/geos/factory.rb +26 -40
  52. data/lib/rgeo/geos/impl_additions.rb +3 -5
  53. data/lib/rgeo/{geography/simple_spherical/polygon_impl.rb → impl_helpers.rb} +16 -26
  54. data/lib/rgeo/impl_helpers/basic_geometry_collection_methods.rb +186 -0
  55. data/lib/rgeo/impl_helpers/basic_geometry_methods.rb +90 -0
  56. data/lib/rgeo/impl_helpers/basic_line_string_methods.rb +188 -0
  57. data/lib/rgeo/impl_helpers/basic_point_methods.rb +149 -0
  58. data/lib/rgeo/{geography/common/helper.rb → impl_helpers/basic_polygon_methods.rb} +62 -53
  59. data/lib/rgeo/{geography/common/polygon_methods.rb → impl_helpers/serialization.rb} +50 -42
  60. data/tests/common/geometry_collection_tests.rb +9 -7
  61. data/tests/common/multi_line_string_tests.rb +16 -13
  62. data/tests/common/multi_point_tests.rb +16 -13
  63. data/tests/common/multi_polygon_tests.rb +8 -6
  64. data/tests/common/point_tests.rb +1 -2
  65. data/tests/common/polygon_tests.rb +9 -9
  66. data/tests/geos/tc_multi_line_string.rb +2 -2
  67. data/tests/simple_cartesian/tc_calculations.rb +138 -0
  68. data/tests/simple_cartesian/tc_geometry_collection.rb +68 -0
  69. data/tests/simple_cartesian/tc_line_string.rb +70 -0
  70. data/{lib/rgeo/geography/simple_spherical/multi_line_string_impl.rb → tests/simple_cartesian/tc_multi_line_string.rb} +19 -19
  71. data/{lib/rgeo/geography/simple_spherical/multi_polygon_impl.rb → tests/simple_cartesian/tc_multi_point.rb} +19 -19
  72. data/{lib/rgeo/geography/common/geometry_methods.rb → tests/simple_cartesian/tc_multi_polygon.rb} +19 -41
  73. data/{lib/rgeo/geography/simple_spherical/point_impl.rb → tests/simple_cartesian/tc_point.rb} +33 -35
  74. data/tests/simple_cartesian/tc_polygon.rb +67 -0
  75. data/tests/simple_spherical/tc_geometry_collection.rb +68 -0
  76. data/tests/simple_spherical/tc_line_string.rb +10 -171
  77. data/tests/simple_spherical/tc_multi_line_string.rb +67 -0
  78. data/{lib/rgeo/geography/simple_spherical/multi_point_impl.rb → tests/simple_spherical/tc_multi_point.rb} +19 -19
  79. data/tests/simple_spherical/tc_multi_polygon.rb +70 -0
  80. data/tests/simple_spherical/tc_point.rb +17 -115
  81. data/tests/simple_spherical/tc_polygon.rb +67 -0
  82. metadata +46 -18
  83. data/ext/geos_c_impl/globals.h +0 -58
  84. data/lib/rgeo/geography/common/geometry_collection_methods.rb +0 -217
  85. data/lib/rgeo/geography/common/line_string_methods.rb +0 -201
  86. data/lib/rgeo/geography/common/point_methods.rb +0 -153
@@ -55,12 +55,11 @@ module RGeo
55
55
  #
56
56
  # == Notes
57
57
  #
58
- # Geometry is defined as a module and is provided primarily
59
- # for the sake of documentation. Implementations need not necessarily
60
- # include this module itself. Therefore, you should not depend on the
58
+ # Geometry is defined as a module and is provided primarily for the
59
+ # sake of documentation. Implementations need not necessarily include
60
+ # this module itself. Therefore, you should not depend on the
61
61
  # kind_of? method to check type. Instead, use the provided check_type
62
- # class method. A corresponding === operator is also provided to
63
- # to support case-when constructs.
62
+ # class method (or === operator) defined in the Type module.
64
63
  #
65
64
  # Some implementations may support higher dimensional objects or
66
65
  # coordinate systems, despite the limits of the SFS.
@@ -73,9 +72,11 @@ module RGeo
73
72
  # Spatial equivalence is the weakest form of equivalence, indicating
74
73
  # that the two objects represent the same region of space, but may
75
74
  # be different representations of that region. For example, a
76
- # POINT(0 0) and a MULTIPOINT(0 0, 0 0) are spatially equivalent, as
77
- # are LINESTRING(0 0, 10 10) and
75
+ # POINT(0 0) and a MULTIPOINT(0 0) are spatially equivalent, as are
76
+ # LINESTRING(0 0, 10 10) and
78
77
  # GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0, 10 10, 0 0)).
78
+ # As a general rule, objects must have factories that are eql? in
79
+ # order to be spatially equivalent.
79
80
  # Objective equivalence::
80
81
  # Objective equivalence is a stronger form of equivalence, indicating
81
82
  # that the two objects are the same representation, but may be
@@ -84,7 +85,7 @@ module RGeo
84
85
  # objectively equivalent. For example, none of the examples in the
85
86
  # spatial equivalence section above are objectively equivalent.
86
87
  # However, two separate objects that both represent POINT(1 2) are
87
- # objectively equivalent.
88
+ # objectively equivalent as well as spatially equivalent.
88
89
  # Objective identity::
89
90
  # Objective identity is the strongest form, indicating that the two
90
91
  # references refer to the same object. Of course, all pairs of
@@ -99,30 +100,7 @@ module RGeo
99
100
 
100
101
  module Geometry
101
102
 
102
-
103
- module ClassMethods
104
-
105
- # Returns true if the given object is this type or a subtype
106
- # thereof, or if it is a feature object whose geometry_type is
107
- # this type or a subtype thereof.
108
- #
109
- # Note that feature objects need not actually include this module.
110
-
111
- def check_type(rhs_)
112
- rhs_ = rhs_.geometry_type if rhs_.respond_to?(:geometry_type)
113
- rhs_.kind_of?(::Module) && (rhs_ == self || rhs_.include?(self))
114
- end
115
- alias_method :===, :check_type
116
-
117
-
118
- def included(mod_) # :nodoc:
119
- mod_.extend(ClassMethods) unless mod_.kind_of?(Class)
120
- end
121
-
122
- end
123
-
124
-
125
- extend ClassMethods
103
+ extend Type
126
104
 
127
105
 
128
106
  # Returns a factory for creating features related to this one.
@@ -58,11 +58,12 @@ module RGeo
58
58
  # for the sake of documentation. Implementations need not necessarily
59
59
  # include this module itself. Therefore, you should not depend on the
60
60
  # kind_of? method to check type. Instead, use the provided check_type
61
- # class method. A corresponding === operator is also provided to
62
- # to support case-when constructs.
61
+ # class method (or === operator) defined in the Type module.
63
62
 
64
63
  module GeometryCollection
65
64
 
65
+ extend Type
66
+
66
67
  include Geometry
67
68
  include ::Enumerable
68
69
 
@@ -49,11 +49,12 @@ module RGeo
49
49
  # for the sake of documentation. Implementations need not necessarily
50
50
  # include this module itself. Therefore, you should not depend on the
51
51
  # kind_of? method to check type. Instead, use the provided check_type
52
- # class method. A corresponding === operator is also provided to
53
- # to support case-when constructs.
52
+ # class method (or === operator) defined in the Type module.
54
53
 
55
54
  module Line
56
55
 
56
+ extend Type
57
+
57
58
  include LineString
58
59
 
59
60
 
@@ -50,11 +50,12 @@ module RGeo
50
50
  # for the sake of documentation. Implementations need not necessarily
51
51
  # include this module itself. Therefore, you should not depend on the
52
52
  # kind_of? method to check type. Instead, use the provided check_type
53
- # class method. A corresponding === operator is also provided to
54
- # to support case-when constructs.
53
+ # class method (or === operator) defined in the Type module.
55
54
 
56
55
  module LineString
57
56
 
57
+ extend Type
58
+
58
59
  include Curve
59
60
 
60
61
 
@@ -49,11 +49,12 @@ module RGeo
49
49
  # for the sake of documentation. Implementations need not necessarily
50
50
  # include this module itself. Therefore, you should not depend on the
51
51
  # kind_of? method to check type. Instead, use the provided check_type
52
- # class method. A corresponding === operator is also provided to
53
- # to support case-when constructs.
52
+ # class method (or === operator) defined in the Type module.
54
53
 
55
54
  module LinearRing
56
55
 
56
+ extend Type
57
+
57
58
  include LineString
58
59
 
59
60
 
@@ -67,11 +67,12 @@ module RGeo
67
67
  # for the sake of documentation. Implementations need not necessarily
68
68
  # include this module itself. Therefore, you should not depend on the
69
69
  # kind_of? method to check type. Instead, use the provided check_type
70
- # class method. A corresponding === operator is also provided to
71
- # to support case-when constructs.
70
+ # class method (or === operator) defined in the Type module.
72
71
 
73
72
  module MultiCurve
74
73
 
74
+ extend Type
75
+
75
76
  include GeometryCollection
76
77
 
77
78
 
@@ -49,11 +49,12 @@ module RGeo
49
49
  # for the sake of documentation. Implementations need not necessarily
50
50
  # include this module itself. Therefore, you should not depend on the
51
51
  # kind_of? method to check type. Instead, use the provided check_type
52
- # class method. A corresponding === operator is also provided to
53
- # to support case-when constructs.
52
+ # class method (or === operator) defined in the Type module.
54
53
 
55
54
  module MultiLineString
56
55
 
56
+ extend Type
57
+
57
58
  include MultiCurve
58
59
 
59
60
 
@@ -56,11 +56,12 @@ module RGeo
56
56
  # for the sake of documentation. Implementations need not necessarily
57
57
  # include this module itself. Therefore, you should not depend on the
58
58
  # kind_of? method to check type. Instead, use the provided check_type
59
- # class method. A corresponding === operator is also provided to
60
- # to support case-when constructs.
59
+ # class method (or === operator) defined in the Type module.
61
60
 
62
61
  module MultiPoint
63
62
 
63
+ extend Type
64
+
64
65
  include GeometryCollection
65
66
 
66
67
 
@@ -80,11 +80,12 @@ module RGeo
80
80
  # for the sake of documentation. Implementations need not necessarily
81
81
  # include this module itself. Therefore, you should not depend on the
82
82
  # kind_of? method to check type. Instead, use the provided check_type
83
- # class method. A corresponding === operator is also provided to
84
- # to support case-when constructs.
83
+ # class method (or === operator) defined in the Type module.
85
84
 
86
85
  module MultiPolygon
87
86
 
87
+ extend Type
88
+
88
89
  include MultiSurface
89
90
 
90
91
 
@@ -58,11 +58,12 @@ module RGeo
58
58
  # for the sake of documentation. Implementations need not necessarily
59
59
  # include this module itself. Therefore, you should not depend on the
60
60
  # kind_of? method to check type. Instead, use the provided check_type
61
- # class method. A corresponding === operator is also provided to
62
- # to support case-when constructs.
61
+ # class method (or === operator) defined in the Type module.
63
62
 
64
63
  module MultiSurface
65
64
 
65
+ extend Type
66
+
66
67
  include GeometryCollection
67
68
 
68
69
 
@@ -53,13 +53,14 @@ module RGeo
53
53
  # for the sake of documentation. Implementations need not necessarily
54
54
  # include this module itself. Therefore, you should not depend on the
55
55
  # kind_of? method to check type. Instead, use the provided check_type
56
- # class method. A corresponding === operator is also provided to
57
- # to support case-when constructs.
56
+ # class method (or === operator) defined in the Type module.
58
57
  #
59
58
  # Some implementations may support higher dimensional points.
60
59
 
61
60
  module Point
62
61
 
62
+ extend Type
63
+
63
64
  include Geometry
64
65
 
65
66
 
@@ -75,11 +75,12 @@ module RGeo
75
75
  # for the sake of documentation. Implementations need not necessarily
76
76
  # include this module itself. Therefore, you should not depend on the
77
77
  # kind_of? method to check type. Instead, use the provided check_type
78
- # class method. A corresponding === operator is also provided to
79
- # to support case-when constructs.
78
+ # class method (or === operator) defined in the Type module.
80
79
 
81
80
  module Polygon
82
81
 
82
+ extend Type
83
+
83
84
  include Surface
84
85
  include ::Enumerable
85
86
 
@@ -62,13 +62,14 @@ module RGeo
62
62
  # for the sake of documentation. Implementations need not necessarily
63
63
  # include this module itself. Therefore, you should not depend on the
64
64
  # kind_of? method to check type. Instead, use the provided check_type
65
- # class method. A corresponding === operator is also provided to
66
- # to support case-when constructs.
65
+ # class method (or === operator) defined in the Type module.
67
66
  #
68
67
  # Some implementations may support higher dimensional points.
69
68
 
70
69
  module Surface
71
70
 
71
+ extend Type
72
+
72
73
  include Geometry
73
74
 
74
75
 
@@ -0,0 +1,198 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Feature type management and casting
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+ # Copyright 2010 Daniel Azuma
7
+ #
8
+ # All rights reserved.
9
+ #
10
+ # Redistribution and use in source and binary forms, with or without
11
+ # modification, are permitted provided that the following conditions are met:
12
+ #
13
+ # * Redistributions of source code must retain the above copyright notice,
14
+ # this list of conditions and the following disclaimer.
15
+ # * Redistributions in binary form must reproduce the above copyright notice,
16
+ # this list of conditions and the following disclaimer in the documentation
17
+ # and/or other materials provided with the distribution.
18
+ # * Neither the name of the copyright holder, nor the names of any other
19
+ # contributors to this software, may be used to endorse or promote products
20
+ # derived from this software without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+ # -----------------------------------------------------------------------------
34
+ ;
35
+
36
+
37
+ module RGeo
38
+
39
+ module Features
40
+
41
+
42
+ # These methods are available as class methods (not instance methods)
43
+ # of the various feature types.
44
+ # For example, you may determine whether a feature object is a
45
+ # point by calling:
46
+ #
47
+ # ::RGeo::Features::Point.check_type(object)
48
+ #
49
+ # A corresponding === operator is provided so you can use the type
50
+ # modules in a case-when clause.
51
+ #
52
+ # You may also use the presence of this module to determine whether
53
+ # a particular object is a feature type:
54
+ #
55
+ # object.kind_of?(::RGeo::Features::Type)
56
+
57
+ module Type
58
+
59
+
60
+ # All geometry implementations MUST include this submodule.
61
+ # This serves as a marker that may be used to test an object for
62
+ # feature-ness.
63
+
64
+ module Instance
65
+ end
66
+
67
+
68
+ # Returns true if the given object is this type or a subtype
69
+ # thereof, or if it is a feature object whose geometry_type is
70
+ # this type or a subtype thereof.
71
+ #
72
+ # Note that feature objects need not actually include this module.
73
+
74
+ def check_type(rhs_)
75
+ rhs_ = rhs_.geometry_type if rhs_.kind_of?(Instance)
76
+ rhs_.kind_of?(Type) && (rhs_ == self || rhs_.include?(self))
77
+ end
78
+ alias_method :===, :check_type
79
+
80
+
81
+ end
82
+
83
+
84
+ class << self
85
+
86
+
87
+ # Cast the given object according to the given parameters.
88
+ #
89
+ # You may optionally pass a factory, a feature type, and the value
90
+ # <tt>:force_new</tt> as the parameters. The given object will be
91
+ # casted into the given factory and feature type, if possible.
92
+ # If the cast is not possible to accomplish, nil is returned.
93
+ # If the factory or type is not provided, or is the same as the
94
+ # object's current attribute, that attribute is not modified.
95
+ #
96
+ # Normally, if neither the factory nor the type are set to be
97
+ # modified, the original object is returned. However, you may cause
98
+ # cast to return a duplicate of the original object by passing
99
+ # <tt>:force_new</tt> as one of the parameters. This effectively
100
+ # forces cast always to return either a new object or nil.
101
+ #
102
+ # RGeo provides a default casting algorithm. Individual feature
103
+ # implementation factories may override this and customize the
104
+ # casting behavior by defining the override_cast method. See
105
+ # ::RGeo::Features::Factory#override_cast for more details.
106
+
107
+ def cast(obj_, *params_)
108
+ # Interpret params
109
+ nfactory_ = factory_ = obj_.factory
110
+ ntype_ = type_ = obj_.geometry_type
111
+ force_new_ = nil
112
+ keep_subtype_ = nil
113
+ params_.each do |param_|
114
+ case param_
115
+ when Factory::Instance
116
+ nfactory_ = param_
117
+ when Geometry
118
+ ntype_ = param_
119
+ when :force_new
120
+ force_new_ = param_
121
+ when :keep_subtype
122
+ keep_subtype_ = param_
123
+ end
124
+ end
125
+
126
+ # Let the factory override
127
+ if nfactory_.respond_to?(:override_cast)
128
+ override_ = nfactory_.override_cast(obj_, ntype_, keep_subtype_, force_new_)
129
+ return override_ unless override_ == false
130
+ end
131
+
132
+ # Default algorithm
133
+ ntype_ = type_ if keep_subtype_ && type_.include?(ntype_)
134
+ if nfactory_ == factory_ && ntype_ == type_
135
+ force_new_ ? obj_.dup : obj_
136
+ elsif ntype_ == type_
137
+ if type_ == Point
138
+ nfactory_.point(obj_.x, obj_.y)
139
+ elsif type_ == Line
140
+ nfactory_.line(obj_.start_point, obj_.end_point)
141
+ elsif type_ == LinearRing
142
+ nfactory_.linear_ring(obj_.points)
143
+ elsif type_ == LineString
144
+ nfactory_.line_string(obj_.points)
145
+ elsif type_ == Polygon
146
+ nfactory_.polygon(obj_.exterior_ring, obj_.interior_rings)
147
+ elsif type_ == MultiPoint
148
+ nfactory_.multi_point(obj_)
149
+ elsif type_ == MultiLineString
150
+ nfactory_.multi_line_string(obj_)
151
+ elsif type_ == MultiPolygon
152
+ nfactory_.multi_polygon(obj_)
153
+ elsif type_ == GeometryCollection
154
+ nfactory_.collection(obj_)
155
+ else
156
+ nil
157
+ end
158
+ else
159
+ if ntype_ == Point && (type_ == MultiPoint || type_ == GeometryCollection) ||
160
+ (ntype_ == Line || ntype_ == LineString || ntype_ == LinearRing) && (type_ == MultiLineString || type_ == GeometryCollection) ||
161
+ ntype_ == Polygon && (type_ == MultiPolygon || type_ == GeometryCollection)
162
+ then
163
+ if obj_.num_geometries == 1
164
+ cast(obj_.geometry_n(0), nfactory_, ntype_, keep_subtype_, force_new_)
165
+ else
166
+ nil
167
+ end
168
+ elsif ntype_ == Line && type_ == LineString
169
+ if obj_.num_points == 2
170
+ nfactory_.line(obj_.point_n(0), obj_.point_n(1))
171
+ else
172
+ nil
173
+ end
174
+ elsif ntype_ == LinearRing && type_ == LineString
175
+ nfactory_.linear_ring(obj_.points)
176
+ elsif ntype_ == LineString && (type_ == Line || type_ == LinearRing)
177
+ nfactory_.line_string(obj_.points)
178
+ elsif ntype_ == MultiPoint && type_ == GeometryCollection
179
+ nfactory_.multi_point(obj_)
180
+ elsif ntype_ == MultiLineString && type_ == GeometryCollection
181
+ nfactory_.multi_line_string(obj_)
182
+ elsif ntype_ == MultiPolygon && type_ == GeometryCollection
183
+ nfactory_.multi_polygon(obj_)
184
+ elsif ntype_ == GeometryCollection && (type_ == MultiPoint || type_ == MultiLineString || type_ == MultiPolygon)
185
+ nfactory_.collection(obj_)
186
+ else
187
+ nil
188
+ end
189
+ end
190
+ end
191
+
192
+
193
+ end
194
+
195
+
196
+ end
197
+
198
+ end