rgeo 0.1.10

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 (82) hide show
  1. data/History.rdoc +22 -0
  2. data/README.rdoc +124 -0
  3. data/Version +1 -0
  4. data/ext/geos_c_impl/extconf.rb +72 -0
  5. data/ext/geos_c_impl/factory.c +468 -0
  6. data/ext/geos_c_impl/factory.h +217 -0
  7. data/ext/geos_c_impl/geometry.c +644 -0
  8. data/ext/geos_c_impl/geometry.h +65 -0
  9. data/ext/geos_c_impl/geometry_collection.c +580 -0
  10. data/ext/geos_c_impl/geometry_collection.h +79 -0
  11. data/ext/geos_c_impl/globals.h +58 -0
  12. data/ext/geos_c_impl/line_string.c +468 -0
  13. data/ext/geos_c_impl/line_string.h +74 -0
  14. data/ext/geos_c_impl/main.c +65 -0
  15. data/ext/geos_c_impl/point.c +201 -0
  16. data/ext/geos_c_impl/point.h +77 -0
  17. data/ext/geos_c_impl/polygon.c +259 -0
  18. data/ext/geos_c_impl/polygon.h +76 -0
  19. data/ext/geos_c_impl/preface.h +42 -0
  20. data/lib/rgeo.rb +68 -0
  21. data/lib/rgeo/errors.rb +59 -0
  22. data/lib/rgeo/features.rb +89 -0
  23. data/lib/rgeo/features/curve.rb +155 -0
  24. data/lib/rgeo/features/factory.rb +191 -0
  25. data/lib/rgeo/features/geometry.rb +560 -0
  26. data/lib/rgeo/features/geometry_collection.rb +118 -0
  27. data/lib/rgeo/features/line.rb +65 -0
  28. data/lib/rgeo/features/line_string.rb +101 -0
  29. data/lib/rgeo/features/linear_ring.rb +65 -0
  30. data/lib/rgeo/features/multi_curve.rb +112 -0
  31. data/lib/rgeo/features/multi_line_string.rb +65 -0
  32. data/lib/rgeo/features/multi_point.rb +72 -0
  33. data/lib/rgeo/features/multi_polygon.rb +96 -0
  34. data/lib/rgeo/features/multi_surface.rb +115 -0
  35. data/lib/rgeo/features/point.rb +97 -0
  36. data/lib/rgeo/features/polygon.rb +141 -0
  37. data/lib/rgeo/features/surface.rb +121 -0
  38. data/lib/rgeo/geo_json.rb +58 -0
  39. data/lib/rgeo/geo_json/coder.rb +305 -0
  40. data/lib/rgeo/geo_json/entities.rb +284 -0
  41. data/lib/rgeo/geo_json/interface.rb +95 -0
  42. data/lib/rgeo/geography.rb +75 -0
  43. data/lib/rgeo/geography/common/geometry_collection_methods.rb +206 -0
  44. data/lib/rgeo/geography/common/geometry_methods.rb +92 -0
  45. data/lib/rgeo/geography/common/helper.rb +102 -0
  46. data/lib/rgeo/geography/common/line_string_methods.rb +187 -0
  47. data/lib/rgeo/geography/common/point_methods.rb +149 -0
  48. data/lib/rgeo/geography/common/polygon_methods.rb +122 -0
  49. data/lib/rgeo/geography/factories.rb +136 -0
  50. data/lib/rgeo/geography/factory.rb +246 -0
  51. data/lib/rgeo/geography/projected_window.rb +467 -0
  52. data/lib/rgeo/geography/simple_mercator/feature_classes.rb +320 -0
  53. data/lib/rgeo/geography/simple_mercator/feature_methods.rb +291 -0
  54. data/lib/rgeo/geography/simple_mercator/projector.rb +116 -0
  55. data/lib/rgeo/geography/simple_spherical/calculations.rb +70 -0
  56. data/lib/rgeo/geography/simple_spherical/geometry_collection_impl.rb +66 -0
  57. data/lib/rgeo/geography/simple_spherical/geometry_methods.rb +59 -0
  58. data/lib/rgeo/geography/simple_spherical/line_string_impl.rb +104 -0
  59. data/lib/rgeo/geography/simple_spherical/multi_line_string_impl.rb +67 -0
  60. data/lib/rgeo/geography/simple_spherical/multi_point_impl.rb +67 -0
  61. data/lib/rgeo/geography/simple_spherical/multi_polygon_impl.rb +67 -0
  62. data/lib/rgeo/geography/simple_spherical/point_impl.rb +85 -0
  63. data/lib/rgeo/geography/simple_spherical/polygon_impl.rb +66 -0
  64. data/lib/rgeo/geos.rb +72 -0
  65. data/lib/rgeo/geos/factory.rb +260 -0
  66. data/lib/rgeo/geos/impl_additions.rb +57 -0
  67. data/lib/rgeo/geos/interface.rb +74 -0
  68. data/lib/rgeo/version.rb +52 -0
  69. data/tests/geos/tc_factory.rb +91 -0
  70. data/tests/geos/tc_geometry_collection.rb +226 -0
  71. data/tests/geos/tc_line_string.rb +310 -0
  72. data/tests/geos/tc_misc.rb +72 -0
  73. data/tests/geos/tc_multi_line_string.rb +211 -0
  74. data/tests/geos/tc_multi_point.rb +202 -0
  75. data/tests/geos/tc_multi_polygon.rb +210 -0
  76. data/tests/geos/tc_point.rb +305 -0
  77. data/tests/geos/tc_polygon.rb +240 -0
  78. data/tests/simple_mercator/tc_point.rb +303 -0
  79. data/tests/simple_mercator/tc_window.rb +219 -0
  80. data/tests/tc_geojson.rb +230 -0
  81. data/tests/tc_oneoff.rb +61 -0
  82. metadata +162 -0
@@ -0,0 +1,206 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Common methods for GeometryCollection geography 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 Geography
40
+
41
+ module Common
42
+
43
+
44
+ module GeometryCollectionMethods
45
+
46
+
47
+ def _setup(elements_)
48
+ @elements = elements_.map{ |elem_| factory.convert(elem_) }
49
+ _validate_geometry
50
+ end
51
+
52
+
53
+ def num_geometries
54
+ @elements.size
55
+ end
56
+
57
+
58
+ def geometry_n(n_)
59
+ @elements[n_]
60
+ end
61
+
62
+
63
+ def each(&block_)
64
+ @elements.each(&block_)
65
+ end
66
+
67
+
68
+ def dimension
69
+ unless @dimension
70
+ @dimension = -1
71
+ @elements.each do |elem_|
72
+ dim_ = elem_.dimension
73
+ @dimension = dim_ if @dimension < dim_
74
+ end
75
+ end
76
+ @dimension
77
+ end
78
+
79
+
80
+ def geometry_type
81
+ Features::GeometryCollection
82
+ end
83
+
84
+
85
+ def is_empty?
86
+ @elements.size == 0
87
+ end
88
+
89
+
90
+ def cast(type_)
91
+ if type_ == self.geometry_type
92
+ self
93
+ else
94
+ case type_
95
+ when Features::MultiPoint
96
+ factory.multi_point(@elements) rescue nil
97
+ when Features::MultiLineString
98
+ factory.multi_line_string(@elements) rescue nil
99
+ when Features::MultiPolygon
100
+ factory.multi_polygon(@elements) rescue nil
101
+ when Features::GeometryCollection
102
+ factory.collection(@elements) rescue nil
103
+ else
104
+ @elements.size == 1 ? @elements[0].cast(type_) : nil
105
+ end
106
+ end
107
+ end
108
+
109
+
110
+ end
111
+
112
+
113
+ module MultiLineStringMethods
114
+
115
+
116
+ def _validate_geometry # :nodoc:
117
+ super
118
+ if any?{ |elem_| !Features::LineString.check_type(elem_) }
119
+ raise Errors::InvalidGeometry, 'Collection element is not a LineString'
120
+ end
121
+ end
122
+
123
+
124
+ def geometry_type
125
+ Features::MultiLineString
126
+ end
127
+
128
+
129
+ def is_closed?
130
+ all?{ |elem_| elem_.is_closed? }
131
+ end
132
+
133
+
134
+ def cast(type_)
135
+ if type_ == Features::LineString && @elements.size == 1
136
+ @elements[0]
137
+ else
138
+ super
139
+ end
140
+ end
141
+
142
+
143
+ end
144
+
145
+
146
+ module MultiPointMethods
147
+
148
+
149
+ def _validate_geometry # :nodoc:
150
+ super
151
+ if any?{ |elem_| !Features::Point.check_type(elem_) }
152
+ raise Errors::InvalidGeometry, "Collection element is not a Point"
153
+ end
154
+ end
155
+
156
+
157
+ def geometry_type
158
+ Features::MultiPoint
159
+ end
160
+
161
+
162
+ def cast(type_)
163
+ if type_.name == Features::Point && @elements.size == 1
164
+ @elements[0]
165
+ else
166
+ super
167
+ end
168
+ end
169
+
170
+
171
+ end
172
+
173
+
174
+ module MultiPolygonMethods
175
+
176
+
177
+ def _validate_geometry # :nodoc:
178
+ super
179
+ if any?{ |elem_| !Features::Polygon.check_type(elem_) }
180
+ raise Errors::InvalidGeometry, 'Collection element is not a Polygon'
181
+ end
182
+ end
183
+
184
+
185
+ def geometry_type
186
+ Features::MultiPolygon
187
+ end
188
+
189
+
190
+ def cast(type_)
191
+ if type_ == Features::Polygon && @elements.size == 1
192
+ @elements[0]
193
+ else
194
+ super
195
+ end
196
+ end
197
+
198
+
199
+ end
200
+
201
+
202
+ end
203
+
204
+ end
205
+
206
+ end
@@ -0,0 +1,92 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Basic methods used by all geography 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 Geography
40
+
41
+ module Common
42
+
43
+
44
+ module GeometryMethods
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
+ Helper.unparse_wkt(self)
77
+ end
78
+
79
+
80
+ def as_binary
81
+ Helper.unparse_wkb(self)
82
+ end
83
+
84
+
85
+ end
86
+
87
+
88
+ end
89
+
90
+ end
91
+
92
+ end
@@ -0,0 +1,102 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Geography helpers
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 Geography
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_.convert(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_.convert(obj_) : nil
80
+ end
81
+
82
+
83
+ def self.unparse_wkt(obj_)
84
+ helper_factory_ = self.factory
85
+ helper_factory_ ? helper_factory_.convert(obj_).as_text : nil
86
+ end
87
+
88
+
89
+ def self.unparse_wkb(obj_)
90
+ helper_factory_ = self.factory
91
+ helper_factory_ ? helper_factory_.convert(obj_).as_binary : nil
92
+ end
93
+
94
+
95
+ end
96
+
97
+
98
+ end
99
+
100
+ end
101
+
102
+ end
@@ -0,0 +1,187 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Common methods for LineString geography 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 Geography
40
+
41
+ module Common
42
+
43
+
44
+ module LineStringMethods
45
+
46
+
47
+ def _setup(points_)
48
+ @points = points_.map{ |elem_| factory.convert(elem_) }
49
+ _validate_geometry
50
+ end
51
+
52
+
53
+ def _validate_geometry
54
+ if @points.size == 1
55
+ raise Errors::InvalidGeometry, 'LineString cannot have 1 point'
56
+ end
57
+ end
58
+
59
+
60
+ def cast(type_)
61
+ if type_ == self.geometry_type
62
+ self
63
+ else
64
+ case type_
65
+ when Features::Line
66
+ if @points.size == 0 || @points.size == 2
67
+ factory.line(@points.first, @points.last) rescue nil
68
+ else
69
+ nil
70
+ end
71
+ when Features::LinearRing
72
+ factory.linear_ring(@points) rescue nil
73
+ when Features::LineString
74
+ factory.line_string(@points) rescue nil
75
+ when Features::GeometryCollection
76
+ factory.collection([self]) rescue nil
77
+ when Features::MultiLineString
78
+ factory.multi_line_string([self]) rescue nil
79
+ when Features::Polygon
80
+ ring_ = factory.linear_ring(@points) rescue nil
81
+ ring_ ? factory.polygon(ring_, nil) : nil rescue nil
82
+ else
83
+ super
84
+ end
85
+ end
86
+ end
87
+
88
+
89
+ def num_points
90
+ @points.size
91
+ end
92
+
93
+
94
+ def point_n(n_)
95
+ @points[n_]
96
+ end
97
+
98
+
99
+ def points
100
+ @points.dup
101
+ end
102
+
103
+
104
+ def dimension
105
+ 1
106
+ end
107
+
108
+
109
+ def geometry_type
110
+ Features::LineString
111
+ end
112
+
113
+
114
+ def is_empty?
115
+ @points.size == 0
116
+ end
117
+
118
+
119
+ def start_point
120
+ @points.first
121
+ end
122
+
123
+
124
+ def end_point
125
+ @points.last
126
+ end
127
+
128
+
129
+ def is_closed?
130
+ if @is_closed.nil?
131
+ @is_closed = @points.size > 2 && @points.first == @points.last
132
+ end
133
+ @is_closed
134
+ end
135
+
136
+
137
+ def is_ring?
138
+ is_closed? && is_simple?
139
+ end
140
+
141
+
142
+ end
143
+
144
+
145
+ module LineMethods
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 LinearRingMethods
165
+
166
+
167
+ def _validate_geometry # :nodoc:
168
+ super
169
+ if @points.size > 0 && !is_ring?
170
+ raise Errors::InvalidGeometry, 'LinearRing failed ring test'
171
+ end
172
+ end
173
+
174
+
175
+ def geometry_type
176
+ Features::LinearRing
177
+ end
178
+
179
+
180
+ end
181
+
182
+
183
+ end
184
+
185
+ end
186
+
187
+ end