rgeo 0.1.12 → 0.1.13

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,90 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Basic methods used by geometry objects
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 ImplHelpers # :nodoc:
40
+
41
+
42
+ module BasicGeometryMethods # :nodoc:
43
+
44
+ include ::RGeo::Features::Type::Instance
45
+
46
+
47
+ def inspect # :nodoc:
48
+ "#<#{self.class}:0x#{object_id.to_s(16)} #{as_text.inspect}>"
49
+ end
50
+
51
+ def to_s # :nodoc:
52
+ as_text
53
+ end
54
+
55
+
56
+ def _validate_geometry # :nodoc:
57
+ end
58
+
59
+
60
+ def _set_factory(factory_) # :nodoc:
61
+ @factory = factory_
62
+ end
63
+
64
+
65
+ def factory
66
+ @factory
67
+ end
68
+
69
+
70
+ def cast(type_)
71
+ type_ == geometry_type ? self : nil
72
+ end
73
+
74
+
75
+ def as_text
76
+ Serialization.unparse_wkt(self)
77
+ end
78
+
79
+
80
+ def as_binary
81
+ Serialization.unparse_wkb(self)
82
+ end
83
+
84
+
85
+ end
86
+
87
+
88
+ end
89
+
90
+ end
@@ -0,0 +1,188 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Common methods for LineString features
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 ImplHelpers # :nodoc:
40
+
41
+
42
+ module BasicLineStringMethods # :nodoc:
43
+
44
+
45
+ def initialize(factory_, points_)
46
+ _set_factory(factory_)
47
+ @points = points_.map do |elem_|
48
+ elem_ = Features.cast(elem_, factory_, Features::Point)
49
+ unless elem_
50
+ raise Errors::InvalidGeometry, "Could not cast #{elem_}"
51
+ end
52
+ elem_
53
+ end
54
+ _validate_geometry
55
+ end
56
+
57
+
58
+ def _validate_geometry
59
+ if @points.size == 1
60
+ raise Errors::InvalidGeometry, 'LineString cannot have 1 point'
61
+ end
62
+ end
63
+
64
+
65
+ def eql?(rhs_)
66
+ if rhs_.is_a?(self.class) && rhs_.factory.eql?(@factory) && @points.size == rhs_.num_points
67
+ rhs_.points.each_with_index{ |p_, i_| return false unless @points[i_].eql?(p_) }
68
+ else
69
+ false
70
+ end
71
+ end
72
+
73
+
74
+ def num_points
75
+ @points.size
76
+ end
77
+
78
+
79
+ def point_n(n_)
80
+ @points[n_]
81
+ end
82
+
83
+
84
+ def points
85
+ @points.dup
86
+ end
87
+
88
+
89
+ def dimension
90
+ 1
91
+ end
92
+
93
+
94
+ def geometry_type
95
+ Features::LineString
96
+ end
97
+
98
+
99
+ def is_empty?
100
+ @points.size == 0
101
+ end
102
+
103
+
104
+ def start_point
105
+ @points.first
106
+ end
107
+
108
+
109
+ def end_point
110
+ @points.last
111
+ end
112
+
113
+
114
+ def is_closed?
115
+ if @is_closed.nil?
116
+ @is_closed = @points.size > 2 && @points.first == @points.last
117
+ end
118
+ @is_closed
119
+ end
120
+
121
+
122
+ def is_ring?
123
+ is_closed? && is_simple?
124
+ end
125
+
126
+
127
+ end
128
+
129
+
130
+ module BasicLineMethods # :nodoc:
131
+
132
+
133
+ def initialize(factory_, start_, end_)
134
+ _set_factory(factory_)
135
+ cstart_ = Features.cast(start_, factory_, Features::Point)
136
+ unless cstart_
137
+ raise Errors::InvalidGeometry, "Could not cast start: #{start_}"
138
+ end
139
+ cend_ = Features.cast(end_, factory_, Features::Point)
140
+ unless cend_
141
+ raise Errors::InvalidGeometry, "Could not cast end: #{end_}"
142
+ end
143
+ @points = [cstart_, cend_]
144
+ _validate_geometry
145
+ end
146
+
147
+
148
+ def _validate_geometry # :nodoc:
149
+ super
150
+ if @points.size > 2
151
+ raise Errors::InvalidGeometry, 'Line must have 0 or 2 points'
152
+ end
153
+ end
154
+
155
+
156
+ def geometry_type
157
+ Features::Line
158
+ end
159
+
160
+
161
+ end
162
+
163
+
164
+ module BasicLinearRingMethods # :nodoc:
165
+
166
+
167
+ def _validate_geometry # :nodoc:
168
+ super
169
+ if @points.size > 0
170
+ @points << @points.first if @points.first != @points.last
171
+ if !is_ring?
172
+ raise Errors::InvalidGeometry, 'LinearRing failed ring test'
173
+ end
174
+ end
175
+ end
176
+
177
+
178
+ def geometry_type
179
+ Features::LinearRing
180
+ end
181
+
182
+
183
+ end
184
+
185
+
186
+ end
187
+
188
+ end
@@ -0,0 +1,149 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Common methods for Point features
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 ImplHelpers # :nodoc:
40
+
41
+
42
+ module BasicPointMethods # :nodoc:
43
+
44
+
45
+ def initialize(factory_, x_, y_)
46
+ _set_factory(factory_)
47
+ @x = x_.to_f
48
+ @y = y_.to_f
49
+ _validate_geometry
50
+ end
51
+
52
+
53
+ def x
54
+ @x
55
+ end
56
+
57
+
58
+ def y
59
+ @y
60
+ end
61
+
62
+
63
+ def eql?(rhs_)
64
+ rhs_.is_a?(self.class) && rhs_.factory.eql?(@factory) && @x == rhs_.x && @y == rhs_.y
65
+ end
66
+
67
+
68
+ def cast(type_)
69
+ case type_
70
+ when Features::Point
71
+ self
72
+ when Features::GeometryCollection
73
+ factory.collection([self]) rescue nil
74
+ when Features::MultiPoint
75
+ factory.multi_point([self]) rescue nil
76
+ else
77
+ super
78
+ end
79
+ end
80
+
81
+
82
+ def dimension
83
+ 0
84
+ end
85
+
86
+
87
+ def geometry_type
88
+ Features::Point
89
+ end
90
+
91
+
92
+ def is_empty?
93
+ false
94
+ end
95
+
96
+
97
+ def is_simple?
98
+ true
99
+ end
100
+
101
+
102
+ def envelope
103
+ self
104
+ end
105
+
106
+
107
+ def boundary
108
+ factory.collection([])
109
+ end
110
+
111
+
112
+ def convex_hull
113
+ self
114
+ end
115
+
116
+
117
+ def equals?(rhs_)
118
+ return false unless rhs_.is_a?(self.class) && rhs_.factory == self.factory
119
+ case rhs_
120
+ when Features::Point
121
+ if @y == 90
122
+ rhs_.y == 90
123
+ elsif @y == -90
124
+ rhs_.y == -90
125
+ else
126
+ rhs_.x == @x && rhs_.y == @y
127
+ end
128
+ when Features::LineString
129
+ rhs_.num_points > 0 && rhs_.points.all?{ |elem_| equals?(elem_) }
130
+ when Features::GeometryCollection
131
+ rhs_.num_geometries > 0 && rhs_.all?{ |elem_| equals?(elem_) }
132
+ else
133
+ false
134
+ end
135
+ end
136
+
137
+
138
+ alias_method :longitude, :x
139
+ alias_method :lon, :x
140
+ alias_method :latitude, :y
141
+ alias_method :lat, :y
142
+
143
+
144
+ end
145
+
146
+
147
+ end
148
+
149
+ end
@@ -1,6 +1,6 @@
1
1
  # -----------------------------------------------------------------------------
2
2
  #
3
- # Geography helpers
3
+ # Common methods for Polygon features
4
4
  #
5
5
  # -----------------------------------------------------------------------------
6
6
  # Copyright 2010 Daniel Azuma
@@ -36,67 +36,76 @@
36
36
 
37
37
  module RGeo
38
38
 
39
- module Geography
39
+ module ImplHelpers # :nodoc:
40
40
 
41
- module Common
42
-
43
-
44
- # This is an internal module used by Geography. You generally should
45
- # not need to call these methods directly.
46
-
47
- module Helper
48
-
49
-
50
- RADIANS_PER_DEGREE = ::Math::PI/180.0
51
- DEGREES_PER_RADIAN = 180.0/::Math::PI
52
-
53
-
54
- @basic_factory = false
55
-
56
-
57
- def self.factory
58
- if @basic_factory == false
59
- if Geos.supported?
60
- @basic_factory = Geos.factory(:srid => 0)
61
- else
62
- @basic_factory = nil
63
- end
64
- end
65
- @basic_factory
66
- end
67
-
68
-
69
- def self.parse_wkt(str_, factory_)
70
- helper_factory_ = self.factory
71
- obj_ = helper_factory_ ? helper_factory_.parse_wkt(str_) : nil
72
- obj_ ? factory_.cast(obj_) : nil
73
- end
74
-
75
-
76
- def self.parse_wkb(str_, factory_)
77
- helper_factory_ = self.factory
78
- obj_ = helper_factory_ ? helper_factory_.parse_wkb(str_) : nil
79
- obj_ ? factory_.cast(obj_) : nil
41
+
42
+ module BasicPolygonMethods # :nodoc:
43
+
44
+
45
+ def initialize(factory_, exterior_ring_, interior_rings_)
46
+ _set_factory(factory_)
47
+ @exterior_ring = Features.cast(exterior_ring_, factory_, Features::LinearRing)
48
+ unless @exterior_ring
49
+ raise Errors::InvalidGeometry, "Failed to cast exterior ring #{exterior_ring_}"
80
50
  end
81
-
82
-
83
- def self.unparse_wkt(obj_)
84
- helper_factory_ = self.factory
85
- helper_factory_ ? helper_factory_.cast(obj_).as_text : nil
51
+ @interior_rings = (interior_rings_ || []).map do |elem_|
52
+ elem_ = Features.cast(elem_, factory_, Features::LinearRing)
53
+ unless elem_
54
+ raise Errors::InvalidGeometry, "Could not cast interior ring #{elem_}"
55
+ end
56
+ elem_
86
57
  end
87
-
88
-
89
- def self.unparse_wkb(obj_)
90
- helper_factory_ = self.factory
91
- helper_factory_ ? helper_factory_.cast(obj_).as_binary : nil
58
+ _validate_geometry
59
+ end
60
+
61
+
62
+ def eql?(rhs_)
63
+ if rhs_.is_a?(self.class) && rhs_.factory.eql?(@factory) && @exterior_ring.eql?(rhs_.exterior_ring) && @interior_rings.size == rhs_.num_interior_rings
64
+ rhs_.interior_rings.each_with_index{ |r_, i_| return false unless @interior_rings[i_].eql?(r_) }
65
+ else
66
+ false
92
67
  end
93
-
94
-
68
+ end
69
+
70
+
71
+ def exterior_ring
72
+ @exterior_ring
73
+ end
74
+
75
+
76
+ def num_interior_rings
77
+ @interior_rings.size
78
+ end
79
+
80
+
81
+ def interior_ring_n(n_)
82
+ @interior_rings[n_]
83
+ end
84
+
85
+
86
+ def interior_rings
87
+ @interior_rings.dup
88
+ end
89
+
90
+
91
+ def dimension
92
+ 2
93
+ end
94
+
95
+
96
+ def geometry_type
97
+ Features::Polygon
98
+ end
99
+
100
+
101
+ def is_empty?
102
+ @exterior_ring.is_empty?
95
103
  end
96
104
 
97
105
 
98
106
  end
99
107
 
108
+
100
109
  end
101
110
 
102
111
  end