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
@@ -1,58 +0,0 @@
1
- /*
2
- -----------------------------------------------------------------------------
3
-
4
- Global data structure for GEOS wrapper
5
-
6
- -----------------------------------------------------------------------------
7
- Copyright 2010 Daniel Azuma
8
-
9
- All rights reserved.
10
-
11
- Redistribution and use in source and binary forms, with or without
12
- modification, are permitted provided that the following conditions are met:
13
-
14
- * Redistributions of source code must retain the above copyright notice,
15
- this list of conditions and the following disclaimer.
16
- * Redistributions in binary form must reproduce the above copyright notice,
17
- this list of conditions and the following disclaimer in the documentation
18
- and/or other materials provided with the distribution.
19
- * Neither the name of the copyright holder, nor the names of any other
20
- contributors to this software, may be used to endorse or promote products
21
- derived from this software without specific prior written permission.
22
-
23
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33
- POSSIBILITY OF SUCH DAMAGE.
34
- -----------------------------------------------------------------------------
35
- */
36
-
37
-
38
- #ifndef RGEO_GEOS_GLOBALS_INCLUDED
39
- #define RGEO_GEOS_GLOBALS_INCLUDED
40
-
41
- #include <ruby.h>
42
-
43
- #ifdef __cplusplus
44
- extern "C" {
45
- #if 0
46
- }
47
- #endif
48
- #endif
49
-
50
-
51
- #ifdef __cplusplus
52
- #if 0
53
- {
54
- #endif
55
- }
56
- #endif
57
-
58
- #endif
@@ -1,217 +0,0 @@
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 self._check_types(enum_, type_)
48
- enum_.all? do |elem_|
49
- case elem_
50
- when type_ then true
51
- when Features::GeometryCollection then _check_types(elem_, type_)
52
- else false
53
- end
54
- end
55
- end
56
-
57
-
58
- def _setup(elements_)
59
- @elements = elements_.map{ |elem_| factory.cast(elem_) }
60
- _validate_geometry
61
- end
62
-
63
-
64
- def num_geometries
65
- @elements.size
66
- end
67
-
68
-
69
- def geometry_n(n_)
70
- @elements[n_]
71
- end
72
-
73
-
74
- def each(&block_)
75
- @elements.each(&block_)
76
- end
77
-
78
-
79
- def dimension
80
- unless @dimension
81
- @dimension = -1
82
- @elements.each do |elem_|
83
- dim_ = elem_.dimension
84
- @dimension = dim_ if @dimension < dim_
85
- end
86
- end
87
- @dimension
88
- end
89
-
90
-
91
- def geometry_type
92
- Features::GeometryCollection
93
- end
94
-
95
-
96
- def is_empty?
97
- @elements.size == 0
98
- end
99
-
100
-
101
- def cast(type_)
102
- if type_ == self.geometry_type
103
- self
104
- else
105
- case type_
106
- when Features::MultiPoint
107
- factory.multi_point(@elements) rescue nil
108
- when Features::MultiLineString
109
- factory.multi_line_string(@elements) rescue nil
110
- when Features::MultiPolygon
111
- factory.multi_polygon(@elements) rescue nil
112
- when Features::GeometryCollection
113
- factory.collection(@elements) rescue nil
114
- else
115
- @elements.size == 1 ? @elements[0].cast(type_) : nil
116
- end
117
- end
118
- end
119
-
120
-
121
- end
122
-
123
-
124
- module MultiLineStringMethods
125
-
126
-
127
- def _validate_geometry # :nodoc:
128
- super
129
- if any?{ |elem_| !Features::LineString.check_type(elem_) }
130
- raise Errors::InvalidGeometry, 'Collection element is not a LineString'
131
- end
132
- end
133
-
134
-
135
- def geometry_type
136
- Features::MultiLineString
137
- end
138
-
139
-
140
- def is_closed?
141
- all?{ |elem_| elem_.is_closed? }
142
- end
143
-
144
-
145
- def cast(type_)
146
- if type_ == Features::LineString && @elements.size == 1
147
- @elements[0]
148
- else
149
- super
150
- end
151
- end
152
-
153
-
154
- end
155
-
156
-
157
- module MultiPointMethods
158
-
159
-
160
- def _validate_geometry # :nodoc:
161
- super
162
- if any?{ |elem_| !Features::Point.check_type(elem_) }
163
- raise Errors::InvalidGeometry, "Collection element is not a Point"
164
- end
165
- end
166
-
167
-
168
- def geometry_type
169
- Features::MultiPoint
170
- end
171
-
172
-
173
- def cast(type_)
174
- if type_.name == Features::Point && @elements.size == 1
175
- @elements[0]
176
- else
177
- super
178
- end
179
- end
180
-
181
-
182
- end
183
-
184
-
185
- module MultiPolygonMethods
186
-
187
-
188
- def _validate_geometry # :nodoc:
189
- super
190
- if any?{ |elem_| !Features::Polygon.check_type(elem_) }
191
- raise Errors::InvalidGeometry, 'Collection element is not a Polygon'
192
- end
193
- end
194
-
195
-
196
- def geometry_type
197
- Features::MultiPolygon
198
- end
199
-
200
-
201
- def cast(type_)
202
- if type_ == Features::Polygon && @elements.size == 1
203
- @elements[0]
204
- else
205
- super
206
- end
207
- end
208
-
209
-
210
- end
211
-
212
-
213
- end
214
-
215
- end
216
-
217
- end
@@ -1,201 +0,0 @@
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 do |elem_|
49
- unless Features::Point.check_type(elem_)
50
- raise Errors::InvalidGeometry, 'Element #{elem_} is not a point'
51
- end
52
- factory.cast(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 cast(type_)
75
- if type_ == self.geometry_type
76
- self
77
- else
78
- case type_
79
- when Features::Line
80
- if @points.size == 0 || @points.size == 2
81
- factory.line(@points.first, @points.last) rescue nil
82
- else
83
- nil
84
- end
85
- when Features::LinearRing
86
- factory.linear_ring(@points) rescue nil
87
- when Features::LineString
88
- factory.line_string(@points) rescue nil
89
- when Features::GeometryCollection
90
- factory.collection([self]) rescue nil
91
- when Features::MultiLineString
92
- factory.multi_line_string([self]) rescue nil
93
- when Features::Polygon
94
- ring_ = factory.linear_ring(@points) rescue nil
95
- ring_ ? factory.polygon(ring_, nil) : nil rescue nil
96
- else
97
- super
98
- end
99
- end
100
- end
101
-
102
-
103
- def num_points
104
- @points.size
105
- end
106
-
107
-
108
- def point_n(n_)
109
- @points[n_]
110
- end
111
-
112
-
113
- def points
114
- @points.dup
115
- end
116
-
117
-
118
- def dimension
119
- 1
120
- end
121
-
122
-
123
- def geometry_type
124
- Features::LineString
125
- end
126
-
127
-
128
- def is_empty?
129
- @points.size == 0
130
- end
131
-
132
-
133
- def start_point
134
- @points.first
135
- end
136
-
137
-
138
- def end_point
139
- @points.last
140
- end
141
-
142
-
143
- def is_closed?
144
- if @is_closed.nil?
145
- @is_closed = @points.size > 2 && @points.first == @points.last
146
- end
147
- @is_closed
148
- end
149
-
150
-
151
- def is_ring?
152
- is_closed? && is_simple?
153
- end
154
-
155
-
156
- end
157
-
158
-
159
- module LineMethods
160
-
161
-
162
- def _validate_geometry # :nodoc:
163
- super
164
- if @points.size > 2
165
- raise Errors::InvalidGeometry, 'Line must have 0 or 2 points'
166
- end
167
- end
168
-
169
-
170
- def geometry_type
171
- Features::Line
172
- end
173
-
174
-
175
- end
176
-
177
-
178
- module LinearRingMethods
179
-
180
-
181
- def _validate_geometry # :nodoc:
182
- super
183
- if @points.size > 0 && !is_ring?
184
- raise Errors::InvalidGeometry, 'LinearRing failed ring test'
185
- end
186
- end
187
-
188
-
189
- def geometry_type
190
- Features::LinearRing
191
- end
192
-
193
-
194
- end
195
-
196
-
197
- end
198
-
199
- end
200
-
201
- end