rgeo-dschee 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +29 -0
  3. data/ext/geos_c_impl/coordinates.c +65 -0
  4. data/ext/geos_c_impl/coordinates.h +2 -0
  5. data/ext/geos_c_impl/extconf.rb +43 -0
  6. data/ext/geos_c_impl/factory.c +995 -0
  7. data/ext/geos_c_impl/factory.h +238 -0
  8. data/ext/geos_c_impl/geometry.c +1093 -0
  9. data/ext/geos_c_impl/geometry.h +23 -0
  10. data/ext/geos_c_impl/geometry_collection.c +757 -0
  11. data/ext/geos_c_impl/geometry_collection.h +46 -0
  12. data/ext/geos_c_impl/line_string.c +675 -0
  13. data/ext/geos_c_impl/line_string.h +32 -0
  14. data/ext/geos_c_impl/main.c +40 -0
  15. data/ext/geos_c_impl/point.c +236 -0
  16. data/ext/geos_c_impl/point.h +30 -0
  17. data/ext/geos_c_impl/polygon.c +359 -0
  18. data/ext/geos_c_impl/polygon.h +43 -0
  19. data/ext/geos_c_impl/preface.h +38 -0
  20. data/ext/proj4_c_impl/extconf.rb +62 -0
  21. data/ext/proj4_c_impl/main.c +315 -0
  22. data/lib/rgeo.rb +89 -0
  23. data/lib/rgeo/cartesian.rb +25 -0
  24. data/lib/rgeo/cartesian/analysis.rb +77 -0
  25. data/lib/rgeo/cartesian/bounding_box.rb +398 -0
  26. data/lib/rgeo/cartesian/calculations.rb +113 -0
  27. data/lib/rgeo/cartesian/factory.rb +347 -0
  28. data/lib/rgeo/cartesian/feature_classes.rb +100 -0
  29. data/lib/rgeo/cartesian/feature_methods.rb +88 -0
  30. data/lib/rgeo/cartesian/interface.rb +135 -0
  31. data/lib/rgeo/coord_sys.rb +43 -0
  32. data/lib/rgeo/coord_sys/cs/entities.rb +1315 -0
  33. data/lib/rgeo/coord_sys/cs/factories.rb +148 -0
  34. data/lib/rgeo/coord_sys/cs/wkt_parser.rb +272 -0
  35. data/lib/rgeo/coord_sys/proj4.rb +293 -0
  36. data/lib/rgeo/coord_sys/srs_database/interface.rb +115 -0
  37. data/lib/rgeo/coord_sys/srs_database/proj4_data.rb +140 -0
  38. data/lib/rgeo/coord_sys/srs_database/sr_org.rb +62 -0
  39. data/lib/rgeo/coord_sys/srs_database/url_reader.rb +63 -0
  40. data/lib/rgeo/error.rb +27 -0
  41. data/lib/rgeo/feature.rb +54 -0
  42. data/lib/rgeo/feature/curve.rb +111 -0
  43. data/lib/rgeo/feature/factory.rb +278 -0
  44. data/lib/rgeo/feature/factory_generator.rb +96 -0
  45. data/lib/rgeo/feature/geometry.rb +624 -0
  46. data/lib/rgeo/feature/geometry_collection.rb +95 -0
  47. data/lib/rgeo/feature/line.rb +26 -0
  48. data/lib/rgeo/feature/line_string.rb +60 -0
  49. data/lib/rgeo/feature/linear_ring.rb +26 -0
  50. data/lib/rgeo/feature/mixins.rb +143 -0
  51. data/lib/rgeo/feature/multi_curve.rb +71 -0
  52. data/lib/rgeo/feature/multi_line_string.rb +26 -0
  53. data/lib/rgeo/feature/multi_point.rb +33 -0
  54. data/lib/rgeo/feature/multi_polygon.rb +57 -0
  55. data/lib/rgeo/feature/multi_surface.rb +73 -0
  56. data/lib/rgeo/feature/point.rb +84 -0
  57. data/lib/rgeo/feature/polygon.rb +97 -0
  58. data/lib/rgeo/feature/surface.rb +79 -0
  59. data/lib/rgeo/feature/types.rb +284 -0
  60. data/lib/rgeo/geographic.rb +40 -0
  61. data/lib/rgeo/geographic/factory.rb +450 -0
  62. data/lib/rgeo/geographic/interface.rb +489 -0
  63. data/lib/rgeo/geographic/proj4_projector.rb +58 -0
  64. data/lib/rgeo/geographic/projected_feature_classes.rb +107 -0
  65. data/lib/rgeo/geographic/projected_feature_methods.rb +212 -0
  66. data/lib/rgeo/geographic/projected_window.rb +383 -0
  67. data/lib/rgeo/geographic/simple_mercator_projector.rb +110 -0
  68. data/lib/rgeo/geographic/spherical_feature_classes.rb +100 -0
  69. data/lib/rgeo/geographic/spherical_feature_methods.rb +134 -0
  70. data/lib/rgeo/geographic/spherical_math.rb +188 -0
  71. data/lib/rgeo/geos.rb +89 -0
  72. data/lib/rgeo/geos/capi_factory.rb +470 -0
  73. data/lib/rgeo/geos/capi_feature_classes.rb +129 -0
  74. data/lib/rgeo/geos/ffi_factory.rb +592 -0
  75. data/lib/rgeo/geos/ffi_feature_classes.rb +83 -0
  76. data/lib/rgeo/geos/ffi_feature_methods.rb +574 -0
  77. data/lib/rgeo/geos/interface.rb +202 -0
  78. data/lib/rgeo/geos/utils.rb +74 -0
  79. data/lib/rgeo/geos/zm_factory.rb +405 -0
  80. data/lib/rgeo/geos/zm_feature_classes.rb +80 -0
  81. data/lib/rgeo/geos/zm_feature_methods.rb +344 -0
  82. data/lib/rgeo/impl_helper.rb +19 -0
  83. data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +185 -0
  84. data/lib/rgeo/impl_helper/basic_geometry_methods.rb +61 -0
  85. data/lib/rgeo/impl_helper/basic_line_string_methods.rb +146 -0
  86. data/lib/rgeo/impl_helper/basic_point_methods.rb +104 -0
  87. data/lib/rgeo/impl_helper/basic_polygon_methods.rb +87 -0
  88. data/lib/rgeo/impl_helper/math.rb +14 -0
  89. data/lib/rgeo/impl_helper/utils.rb +29 -0
  90. data/lib/rgeo/version.rb +3 -0
  91. data/lib/rgeo/wkrep.rb +37 -0
  92. data/lib/rgeo/wkrep/wkb_generator.rb +201 -0
  93. data/lib/rgeo/wkrep/wkb_parser.rb +251 -0
  94. data/lib/rgeo/wkrep/wkt_generator.rb +207 -0
  95. data/lib/rgeo/wkrep/wkt_parser.rb +415 -0
  96. data/lib/rgeo/yaml.rb +23 -0
  97. data/test/cartesian_analysis_test.rb +65 -0
  98. data/test/cartesian_bbox_test.rb +123 -0
  99. data/test/common/factory_tests.rb +78 -0
  100. data/test/common/geometry_collection_tests.rb +237 -0
  101. data/test/common/line_string_tests.rb +330 -0
  102. data/test/common/multi_line_string_tests.rb +182 -0
  103. data/test/common/multi_point_tests.rb +200 -0
  104. data/test/common/multi_polygon_tests.rb +191 -0
  105. data/test/common/point_tests.rb +370 -0
  106. data/test/common/polygon_tests.rb +261 -0
  107. data/test/coord_sys/ogc_cs_test.rb +342 -0
  108. data/test/coord_sys/proj4_srs_data_test.rb +41 -0
  109. data/test/coord_sys/proj4_test.rb +150 -0
  110. data/test/coord_sys/sr_org_test.rb +32 -0
  111. data/test/coord_sys/url_reader_test.rb +42 -0
  112. data/test/geos_capi/factory_test.rb +31 -0
  113. data/test/geos_capi/geometry_collection_test.rb +24 -0
  114. data/test/geos_capi/line_string_test.rb +24 -0
  115. data/test/geos_capi/misc_test.rb +116 -0
  116. data/test/geos_capi/multi_line_string_test.rb +24 -0
  117. data/test/geos_capi/multi_point_test.rb +24 -0
  118. data/test/geos_capi/multi_polygon_test.rb +39 -0
  119. data/test/geos_capi/parsing_unparsing_test.rb +40 -0
  120. data/test/geos_capi/point_test.rb +72 -0
  121. data/test/geos_capi/polygon_test.rb +154 -0
  122. data/test/geos_capi/zmfactory_test.rb +57 -0
  123. data/test/geos_ffi/factory_test.rb +31 -0
  124. data/test/geos_ffi/geometry_collection_test.rb +24 -0
  125. data/test/geos_ffi/line_string_test.rb +24 -0
  126. data/test/geos_ffi/misc_test.rb +63 -0
  127. data/test/geos_ffi/multi_line_string_test.rb +24 -0
  128. data/test/geos_ffi/multi_point_test.rb +24 -0
  129. data/test/geos_ffi/multi_polygon_test.rb +33 -0
  130. data/test/geos_ffi/parsing_unparsing_test.rb +41 -0
  131. data/test/geos_ffi/point_test.rb +77 -0
  132. data/test/geos_ffi/polygon_test.rb +46 -0
  133. data/test/geos_ffi/zmfactory_test.rb +58 -0
  134. data/test/mixins_test.rb +141 -0
  135. data/test/oneoff_test.rb +26 -0
  136. data/test/projected_geographic/factory_test.rb +25 -0
  137. data/test/projected_geographic/geometry_collection_test.rb +24 -0
  138. data/test/projected_geographic/line_string_test.rb +24 -0
  139. data/test/projected_geographic/multi_line_string_test.rb +26 -0
  140. data/test/projected_geographic/multi_point_test.rb +30 -0
  141. data/test/projected_geographic/multi_polygon_test.rb +25 -0
  142. data/test/projected_geographic/point_test.rb +51 -0
  143. data/test/projected_geographic/polygon_test.rb +24 -0
  144. data/test/simple_cartesian/calculations_test.rb +99 -0
  145. data/test/simple_cartesian/factory_test.rb +27 -0
  146. data/test/simple_cartesian/geometry_collection_test.rb +30 -0
  147. data/test/simple_cartesian/line_string_test.rb +31 -0
  148. data/test/simple_cartesian/multi_line_string_test.rb +28 -0
  149. data/test/simple_cartesian/multi_point_test.rb +31 -0
  150. data/test/simple_cartesian/multi_polygon_test.rb +31 -0
  151. data/test/simple_cartesian/point_test.rb +50 -0
  152. data/test/simple_cartesian/polygon_test.rb +28 -0
  153. data/test/simple_mercator/factory_test.rb +25 -0
  154. data/test/simple_mercator/geometry_collection_test.rb +24 -0
  155. data/test/simple_mercator/line_string_test.rb +24 -0
  156. data/test/simple_mercator/multi_line_string_test.rb +26 -0
  157. data/test/simple_mercator/multi_point_test.rb +29 -0
  158. data/test/simple_mercator/multi_polygon_test.rb +25 -0
  159. data/test/simple_mercator/point_test.rb +55 -0
  160. data/test/simple_mercator/polygon_test.rb +24 -0
  161. data/test/simple_mercator/window_test.rb +173 -0
  162. data/test/spherical_geographic/calculations_test.rb +167 -0
  163. data/test/spherical_geographic/factory_test.rb +27 -0
  164. data/test/spherical_geographic/geometry_collection_test.rb +31 -0
  165. data/test/spherical_geographic/line_string_test.rb +31 -0
  166. data/test/spherical_geographic/multi_line_string_test.rb +29 -0
  167. data/test/spherical_geographic/multi_point_test.rb +31 -0
  168. data/test/spherical_geographic/multi_polygon_test.rb +31 -0
  169. data/test/spherical_geographic/point_test.rb +78 -0
  170. data/test/spherical_geographic/polygon_test.rb +28 -0
  171. data/test/types_test.rb +42 -0
  172. data/test/wkrep/wkb_generator_test.rb +185 -0
  173. data/test/wkrep/wkb_parser_test.rb +293 -0
  174. data/test/wkrep/wkt_generator_test.rb +294 -0
  175. data/test/wkrep/wkt_parser_test.rb +412 -0
  176. metadata +386 -0
@@ -0,0 +1,261 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Common tests for polygon implementations
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+
7
+ require "rgeo"
8
+
9
+ module RGeo
10
+ module Tests # :nodoc:
11
+ module Common # :nodoc:
12
+ module PolygonTests # :nodoc:
13
+ def test_creation_simple
14
+ point1_ = @factory.point(0, 0)
15
+ point2_ = @factory.point(0, 1)
16
+ point3_ = @factory.point(1, 0)
17
+ exterior_ = @factory.linear_ring([point1_, point2_, point3_, point1_])
18
+ polygon_ = @factory.polygon(exterior_)
19
+ assert_not_nil(polygon_)
20
+ assert(::RGeo::Feature::Polygon === polygon_)
21
+ assert_equal(::RGeo::Feature::Polygon, polygon_.geometry_type)
22
+ assert(exterior_.eql?(polygon_.exterior_ring))
23
+ assert_equal(0, polygon_.num_interior_rings)
24
+ assert_nil(polygon_.interior_ring_n(0))
25
+ assert_nil(polygon_.interior_ring_n(-1))
26
+ end
27
+
28
+ def test_creation_one_hole
29
+ point1_ = @factory.point(0, 0)
30
+ point2_ = @factory.point(0, 10)
31
+ point3_ = @factory.point(10, 10)
32
+ point4_ = @factory.point(10, 0)
33
+ point5_ = @factory.point(4, 4)
34
+ point6_ = @factory.point(5, 6)
35
+ point7_ = @factory.point(6, 4)
36
+ exterior_ = @factory.linear_ring([point1_, point2_, point3_, point4_, point1_])
37
+ interior_ = @factory.linear_ring([point5_, point6_, point7_, point5_])
38
+ polygon_ = @factory.polygon(exterior_, [interior_])
39
+ assert_not_nil(polygon_)
40
+ assert(::RGeo::Feature::Polygon === polygon_)
41
+ assert_equal(::RGeo::Feature::Polygon, polygon_.geometry_type)
42
+ assert(exterior_.eql?(polygon_.exterior_ring))
43
+ assert_equal(1, polygon_.num_interior_rings)
44
+ assert(interior_.eql?(polygon_.interior_ring_n(0)))
45
+ assert_nil(polygon_.interior_ring_n(1))
46
+ assert_nil(polygon_.interior_ring_n(-1))
47
+ end
48
+
49
+ def test_required_equivalences
50
+ point1_ = @factory.point(0, 0)
51
+ point2_ = @factory.point(0, 1)
52
+ point3_ = @factory.point(1, 0)
53
+ exterior1_ = @factory.linear_ring([point1_, point2_, point3_, point1_])
54
+ poly1_ = @factory.polygon(exterior1_)
55
+ point4_ = @factory.point(0, 0)
56
+ point5_ = @factory.point(0, 1)
57
+ point6_ = @factory.point(1, 0)
58
+ exterior2_ = @factory.linear_ring([point4_, point5_, point6_, point4_])
59
+ poly2_ = @factory.polygon(exterior2_)
60
+ assert(poly1_.eql?(poly2_))
61
+ assert(poly1_ == poly2_)
62
+ end
63
+
64
+ def test_fully_equal
65
+ point1_ = @factory.point(0, 0)
66
+ point2_ = @factory.point(0, 1)
67
+ point3_ = @factory.point(1, 0)
68
+ exterior1_ = @factory.linear_ring([point1_, point2_, point3_, point1_])
69
+ poly1_ = @factory.polygon(exterior1_)
70
+ point4_ = @factory.point(0, 0)
71
+ point5_ = @factory.point(0, 1)
72
+ point6_ = @factory.point(1, 0)
73
+ exterior2_ = @factory.linear_ring([point4_, point5_, point6_, point4_])
74
+ poly2_ = @factory.polygon(exterior2_)
75
+ assert(poly1_.rep_equals?(poly2_))
76
+ assert(poly1_.equals?(poly2_))
77
+ end
78
+
79
+ def test_geometrically_equal_but_ordered_different
80
+ point1_ = @factory.point(0, 0)
81
+ point2_ = @factory.point(0, 1)
82
+ point3_ = @factory.point(1, 0)
83
+ exterior1_ = @factory.linear_ring([point1_, point2_, point3_, point1_])
84
+ poly1_ = @factory.polygon(exterior1_)
85
+ exterior2_ = @factory.linear_ring([point2_, point3_, point1_, point2_])
86
+ poly2_ = @factory.polygon(exterior2_)
87
+ assert(!poly1_.rep_equals?(poly2_))
88
+ assert(poly1_.equals?(poly2_))
89
+ end
90
+
91
+ def test_geometrically_equal_but_different_directions
92
+ point1_ = @factory.point(0, 0)
93
+ point2_ = @factory.point(0, 1)
94
+ point3_ = @factory.point(1, 0)
95
+ exterior1_ = @factory.linear_ring([point1_, point2_, point3_, point1_])
96
+ poly1_ = @factory.polygon(exterior1_)
97
+ exterior2_ = @factory.linear_ring([point1_, point3_, point2_, point1_])
98
+ poly2_ = @factory.polygon(exterior2_)
99
+ assert(!poly1_.rep_equals?(poly2_))
100
+ assert(poly1_.equals?(poly2_))
101
+ end
102
+
103
+ def test_hashes_equal_for_representationally_equivalent_objects
104
+ point1_ = @factory.point(0, 0)
105
+ point2_ = @factory.point(0, 1)
106
+ point3_ = @factory.point(1, 0)
107
+ exterior1_ = @factory.linear_ring([point1_, point2_, point3_, point1_])
108
+ poly1_ = @factory.polygon(exterior1_)
109
+ point4_ = @factory.point(0, 0)
110
+ point5_ = @factory.point(0, 1)
111
+ point6_ = @factory.point(1, 0)
112
+ exterior2_ = @factory.linear_ring([point4_, point5_, point6_, point4_])
113
+ poly2_ = @factory.polygon(exterior2_)
114
+ assert_equal(poly1_.hash, poly2_.hash)
115
+ end
116
+
117
+ def test_wkt_creation_simple
118
+ parsed_poly_ = @factory.parse_wkt("POLYGON((0 0, 0 1, 1 0, 0 0))")
119
+ point1_ = @factory.point(0, 0)
120
+ point2_ = @factory.point(0, 1)
121
+ point3_ = @factory.point(1, 0)
122
+ exterior_ = @factory.linear_ring([point1_, point2_, point3_, point1_])
123
+ built_poly_ = @factory.polygon(exterior_)
124
+ assert(built_poly_.eql?(parsed_poly_))
125
+ end
126
+
127
+ def test_wkt_creation_one_hole
128
+ parsed_poly_ = @factory.parse_wkt("POLYGON((0 0, 0 10, 10 10, 10 0, 0 0), (4 4, 5 6, 6 4, 4 4))")
129
+ point1_ = @factory.point(0, 0)
130
+ point2_ = @factory.point(0, 10)
131
+ point3_ = @factory.point(10, 10)
132
+ point4_ = @factory.point(10, 0)
133
+ point5_ = @factory.point(4, 4)
134
+ point6_ = @factory.point(5, 6)
135
+ point7_ = @factory.point(6, 4)
136
+ exterior_ = @factory.linear_ring([point1_, point2_, point3_, point4_, point1_])
137
+ interior_ = @factory.linear_ring([point5_, point6_, point7_, point5_])
138
+ built_poly_ = @factory.polygon(exterior_, [interior_])
139
+ assert(built_poly_.eql?(parsed_poly_))
140
+ end
141
+
142
+ def test_clone
143
+ point1_ = @factory.point(0, 0)
144
+ point2_ = @factory.point(0, 1)
145
+ point3_ = @factory.point(1, 0)
146
+ exterior_ = @factory.linear_ring([point1_, point2_, point3_, point1_])
147
+ poly1_ = @factory.polygon(exterior_)
148
+ poly2_ = poly1_.clone
149
+ assert(poly1_.eql?(poly2_))
150
+ assert(exterior_.eql?(poly2_.exterior_ring))
151
+ assert_equal(0, poly2_.num_interior_rings)
152
+ end
153
+
154
+ def test_type_check
155
+ point1_ = @factory.point(0, 0)
156
+ point2_ = @factory.point(0, 1)
157
+ point3_ = @factory.point(1, 0)
158
+ exterior_ = @factory.linear_ring([point1_, point2_, point3_, point1_])
159
+ poly_ = @factory.polygon(exterior_)
160
+ assert(::RGeo::Feature::Geometry.check_type(poly_))
161
+ assert(!::RGeo::Feature::Point.check_type(poly_))
162
+ assert(!::RGeo::Feature::GeometryCollection.check_type(poly_))
163
+ assert(::RGeo::Feature::Surface.check_type(poly_))
164
+ assert(::RGeo::Feature::Polygon.check_type(poly_))
165
+ end
166
+
167
+ def test_as_text_wkt_round_trip
168
+ point1_ = @factory.point(0, 0)
169
+ point2_ = @factory.point(0, 1)
170
+ point3_ = @factory.point(1, 0)
171
+ exterior_ = @factory.linear_ring([point1_, point2_, point3_, point1_])
172
+ poly1_ = @factory.polygon(exterior_)
173
+ text_ = poly1_.as_text
174
+ poly2_ = @factory.parse_wkt(text_)
175
+ assert(poly1_.eql?(poly2_))
176
+ end
177
+
178
+ def test_as_binary_wkb_round_trip
179
+ point1_ = @factory.point(0, 0)
180
+ point2_ = @factory.point(0, 1)
181
+ point3_ = @factory.point(1, 0)
182
+ exterior_ = @factory.linear_ring([point1_, point2_, point3_, point1_])
183
+ poly1_ = @factory.polygon(exterior_)
184
+ binary_ = poly1_.as_binary
185
+ poly2_ = @factory.parse_wkb(binary_)
186
+ assert(poly1_.eql?(poly2_))
187
+ end
188
+
189
+ def test_dimension
190
+ point1_ = @factory.point(0, 0)
191
+ point2_ = @factory.point(0, 10)
192
+ point3_ = @factory.point(10, 10)
193
+ point4_ = @factory.point(10, 0)
194
+ point5_ = @factory.point(4, 4)
195
+ point6_ = @factory.point(5, 6)
196
+ point7_ = @factory.point(6, 4)
197
+ exterior_ = @factory.linear_ring([point1_, point2_, point3_, point4_, point1_])
198
+ interior_ = @factory.linear_ring([point5_, point6_, point7_, point5_])
199
+ poly_ = @factory.polygon(exterior_, [interior_])
200
+ assert_equal(2, poly_.dimension)
201
+ end
202
+
203
+ def test_is_empty
204
+ point1_ = @factory.point(0, 0)
205
+ point2_ = @factory.point(0, 1)
206
+ point3_ = @factory.point(1, 0)
207
+ exterior_ = @factory.linear_ring([point1_, point2_, point3_, point1_])
208
+ poly1_ = @factory.polygon(exterior_)
209
+ assert(!poly1_.is_empty?)
210
+ poly2_ = @factory.polygon(@factory.linear_ring([]))
211
+ assert(poly2_.is_empty?)
212
+ end
213
+
214
+ def test_polygon_coordinates
215
+ coordinates = [
216
+ [[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0], [0.0, 0.0]],
217
+ [[0.25, 0.25], [0.75, 0.25], [0.75, 0.75], [0.25, 0.75], [0.25, 0.25]]
218
+ ]
219
+
220
+ ring = @factory.line_string(coordinates.first.map { |(x, y)| @factory.point x, y })
221
+ inner_ring = @factory.line_string(coordinates.last.map { |(x, y)| @factory.point x, y })
222
+ polygon = @factory.polygon ring, [inner_ring]
223
+ assert_equal(polygon.coordinates, coordinates)
224
+ end
225
+
226
+ def test_ignores_consecutive_repeated_points
227
+ point1_ = @factory.point(0, 0)
228
+ point2_ = @factory.point(0, 0)
229
+ point3_ = @factory.point(0, 1)
230
+ point4_ = @factory.point(0, 1)
231
+ point5_ = @factory.point(0, 1)
232
+ point6_ = @factory.point(1, 0)
233
+ point7_ = @factory.point(1, 0)
234
+ point8_ = @factory.point(1, 0)
235
+ exterior_ = @factory.linear_ring([point1_, point2_, point3_, point4_, point5_, point6_, point7_, point8_])
236
+
237
+ poly1_ = @factory.polygon(exterior_)
238
+ assert(!poly1_.nil?)
239
+
240
+ line_string = poly1_.exterior_ring
241
+
242
+ case line_string.class.name
243
+ when "RGeo::Tests::GeosCAPI::TestPolygon"
244
+ when "RGeo::Geos::FFILinearRingImpl"
245
+ when "RGeo::Geos::CAPILinearRingImpl"
246
+ when "RGeo::Tests::GeosFFI::TestPolygon"
247
+ assert(line_string.points.count == 9)
248
+ else
249
+ assert(line_string.num_points == 4)
250
+ end
251
+
252
+ points = line_string.points
253
+ assert(points.first.x == points.last.x)
254
+ assert(points.first.y == points.last.y)
255
+ assert(points.first.z == points.last.z)
256
+ end
257
+
258
+ end
259
+ end
260
+ end
261
+ end
@@ -0,0 +1,342 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Tests for OGC CS classes
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+
7
+ require "test/unit"
8
+ require "rgeo"
9
+
10
+ module RGeo
11
+ module Tests # :nodoc:
12
+ module CoordSys # :nodoc:
13
+ class TestOgcCs < ::Test::Unit::TestCase # :nodoc:
14
+ # Handle differences in floating-point output.
15
+
16
+ def _lenient_regex_for(str_)
17
+ ::Regexp.new(str_.gsub(/(\d)\.(\d{10,})/) do |_m_|
18
+ before_ = Regexp.last_match(1)
19
+ after_ = Regexp.last_match(2)[0, 10]
20
+ "#{before_}.#{after_}\\d*"
21
+ end.gsub(/(\.|\[|\]|\(|\)|\$|\^|\||\+)/) { |_m_| "\\#{Regexp.last_match(1)}" })
22
+ end
23
+
24
+ def test_axis_info_by_value
25
+ obj_ = ::RGeo::CoordSys::CS::AxisInfo.create("N", ::RGeo::CoordSys::CS::AO_NORTH)
26
+ assert_equal("N", obj_.name)
27
+ assert_equal(::RGeo::CoordSys::CS::AO_NORTH, obj_.orientation)
28
+ assert_equal('AXIS["N",NORTH]', obj_.to_wkt)
29
+ end
30
+
31
+ def test_axis_info_by_name
32
+ obj_ = ::RGeo::CoordSys::CS::AxisInfo.create("S", "SOUTH")
33
+ assert_equal("S", obj_.name)
34
+ assert_equal(::RGeo::CoordSys::CS::AO_SOUTH, obj_.orientation)
35
+ assert_equal('AXIS["S",SOUTH]', obj_.to_wkt)
36
+ obj2_ = ::RGeo::CoordSys::CS::AxisInfo.create("S", ::RGeo::CoordSys::CS::AO_SOUTH)
37
+ assert_equal(obj_, obj2_)
38
+ end
39
+
40
+ def test_parameter
41
+ obj_ = ::RGeo::CoordSys::CS::ProjectionParameter.create("false_easting", 400_000)
42
+ assert_equal("false_easting", obj_.name)
43
+ assert_equal(400_000, obj_.value)
44
+ assert_equal('PARAMETER["false_easting",400000.0]', obj_.to_wkt)
45
+ end
46
+
47
+ def test_towgs84
48
+ obj_ = ::RGeo::CoordSys::CS::WGS84ConversionInfo.create(1, 2, 3, 4, 5, 6, 7)
49
+ assert_equal(1, obj_.dx)
50
+ assert_equal(2, obj_.dy)
51
+ assert_equal(3, obj_.dz)
52
+ assert_equal(4, obj_.ex)
53
+ assert_equal(5, obj_.ey)
54
+ assert_equal(6, obj_.ez)
55
+ assert_equal(7, obj_.ppm)
56
+ assert_equal("TOWGS84[1.0,2.0,3.0,4.0,5.0,6.0,7.0]", obj_.to_wkt)
57
+ end
58
+
59
+ def test_unit
60
+ obj_ = ::RGeo::CoordSys::CS::Unit.create("metre", 1)
61
+ assert_equal("metre", obj_.name)
62
+ assert_equal(1, obj_.conversion_factor)
63
+ assert_nil(obj_.authority)
64
+ assert_equal('UNIT["metre",1.0]', obj_.to_wkt)
65
+ end
66
+
67
+ def test_unit_with_authority
68
+ obj_ = ::RGeo::CoordSys::CS::Unit.create("metre", 1, "EPSG", 9001)
69
+ assert_equal("metre", obj_.name)
70
+ assert_equal(1, obj_.conversion_factor)
71
+ assert_equal("EPSG", obj_.authority)
72
+ assert_equal("9001", obj_.authority_code)
73
+ assert_equal('UNIT["metre",1.0,AUTHORITY["EPSG","9001"]]', obj_.to_wkt)
74
+ end
75
+
76
+ def test_linear_unit
77
+ obj_ = ::RGeo::CoordSys::CS::LinearUnit.create("metre", 1)
78
+ assert_equal(1, obj_.meters_per_unit)
79
+ assert_equal('UNIT["metre",1.0]', obj_.to_wkt)
80
+ end
81
+
82
+ def test_angular_unit
83
+ obj_ = ::RGeo::CoordSys::CS::AngularUnit.create("radian", 1)
84
+ assert_equal(1, obj_.radians_per_unit)
85
+ assert_equal('UNIT["radian",1.0]', obj_.to_wkt)
86
+ end
87
+
88
+ def test_prime_meridian
89
+ obj1_ = ::RGeo::CoordSys::CS::AngularUnit.create("radian", 1)
90
+ obj_ = ::RGeo::CoordSys::CS::PrimeMeridian.create("Greenwich", obj1_, 0, "EPSG", "8901")
91
+ assert_equal("Greenwich", obj_.name)
92
+ assert_equal(0, obj_.longitude)
93
+ assert_equal('PRIMEM["Greenwich",0.0,AUTHORITY["EPSG","8901"]]', obj_.to_wkt)
94
+ end
95
+
96
+ def test_create_flattened_sphere
97
+ obj1_ = ::RGeo::CoordSys::CS::LinearUnit.create("metre", 1)
98
+ obj_ = ::RGeo::CoordSys::CS::Ellipsoid.create_flattened_sphere("WGS 84", 6_378_137, 298.257223563, obj1_, "EPSG", "7030")
99
+ assert_equal("WGS 84", obj_.name)
100
+ assert_equal(6_378_137, obj_.semi_major_axis)
101
+ assert_in_delta(298.257223563, obj_.inverse_flattening, 0.1)
102
+ assert_in_delta(6_356_752.314245, obj_.semi_minor_axis, 0.1)
103
+ assert_equal("EPSG", obj_.authority)
104
+ assert_equal("7030", obj_.authority_code)
105
+ assert_equal('SPHEROID["WGS 84",6378137.0,298.257223563,AUTHORITY["EPSG","7030"]]', obj_.to_wkt)
106
+ end
107
+
108
+ def test_create_unflattened_sphere
109
+ obj1_ = ::RGeo::CoordSys::CS::LinearUnit.create("metre", 1)
110
+ obj_ = ::RGeo::CoordSys::CS::Ellipsoid.create_flattened_sphere("Popular Visualisation Sphere", 6_378_137, 0, obj1_, "EPSG", "7059")
111
+ assert_equal("Popular Visualisation Sphere", obj_.name)
112
+ assert_equal(6_378_137, obj_.semi_major_axis)
113
+ assert_equal(0, obj_.inverse_flattening)
114
+ assert_equal(6_378_137, obj_.semi_minor_axis)
115
+ assert_equal("EPSG", obj_.authority)
116
+ assert_equal("7059", obj_.authority_code)
117
+ assert_equal('SPHEROID["Popular Visualisation Sphere",6378137.0,0.0,AUTHORITY["EPSG","7059"]]', obj_.to_wkt)
118
+ end
119
+
120
+ def test_create_ellipsoid
121
+ obj1_ = ::RGeo::CoordSys::CS::LinearUnit.create("metre", 1)
122
+ obj_ = ::RGeo::CoordSys::CS::Ellipsoid.create_ellipsoid("WGS 84", 6_378_137, 6_356_752.314245, obj1_, "EPSG", "7030")
123
+ assert_in_delta(298.257223563, obj_.inverse_flattening, 0.1)
124
+ end
125
+
126
+ def test_create_spherical_ellipsoid
127
+ obj1_ = ::RGeo::CoordSys::CS::LinearUnit.create("metre", 1)
128
+ obj_ = ::RGeo::CoordSys::CS::Ellipsoid.create_ellipsoid("Popular Visualisation Sphere", 6_378_137, 6_378_137, obj1_, "EPSG", "7059")
129
+ assert_equal(0, obj_.inverse_flattening)
130
+ end
131
+
132
+ def test_local_datum
133
+ obj_ = ::RGeo::CoordSys::CS::LocalDatum.create("Random Local Datum", ::RGeo::CoordSys::CS::LD_MIN)
134
+ assert_equal("Random Local Datum", obj_.name)
135
+ assert_equal(::RGeo::CoordSys::CS::LD_MIN, obj_.datum_type)
136
+ assert_equal('LOCAL_DATUM["Random Local Datum",10000]', obj_.to_wkt)
137
+ end
138
+
139
+ def test_local_datum_with_extension
140
+ obj_ = ::RGeo::CoordSys::CS::LocalDatum.create("Random Local Datum", ::RGeo::CoordSys::CS::LD_MIN, nil, nil, nil, nil, nil, foo: :bar)
141
+ assert_equal("bar", obj_.extension(:foo))
142
+ assert_nil(obj_.extension(:bar))
143
+ assert_equal('LOCAL_DATUM["Random Local Datum",10000,EXTENSION["foo","bar"]]', obj_.to_wkt)
144
+ end
145
+
146
+ def test_vertical_datum
147
+ obj_ = ::RGeo::CoordSys::CS::VerticalDatum.create("Ordnance Datum Newlyn", ::RGeo::CoordSys::CS::VD_GEOID_MODE_DERIVED, "EPSG", "5101")
148
+ assert_equal("Ordnance Datum Newlyn", obj_.name)
149
+ assert_equal(::RGeo::CoordSys::CS::VD_GEOID_MODE_DERIVED, obj_.datum_type)
150
+ assert_equal("EPSG", obj_.authority)
151
+ assert_equal("5101", obj_.authority_code)
152
+ assert_equal('VERT_DATUM["Ordnance Datum Newlyn",2005,AUTHORITY["EPSG","5101"]]', obj_.to_wkt)
153
+ end
154
+
155
+ def test_horizontal_datum
156
+ obj1_ = ::RGeo::CoordSys::CS::LinearUnit.create("metre", 1)
157
+ obj2_ = ::RGeo::CoordSys::CS::Ellipsoid.create_ellipsoid("Popular Visualisation Sphere", 6_378_137, 6_378_137, obj1_, "EPSG", "7059")
158
+ obj3_ = ::RGeo::CoordSys::CS::WGS84ConversionInfo.create(0, 0, 0, 0, 0, 0, 0)
159
+ obj_ = ::RGeo::CoordSys::CS::HorizontalDatum.create("Popular_Visualisation_Datum", ::RGeo::CoordSys::CS::HD_GEOCENTRIC, obj2_, obj3_, "EPSG", "6055")
160
+ assert_equal("Popular_Visualisation_Datum", obj_.name)
161
+ assert_equal(::RGeo::CoordSys::CS::HD_GEOCENTRIC, obj_.datum_type)
162
+ assert_equal("EPSG", obj_.authority)
163
+ assert_equal("6055", obj_.authority_code)
164
+ assert_equal('DATUM["Popular_Visualisation_Datum",SPHEROID["Popular Visualisation Sphere",6378137.0,0.0,AUTHORITY["EPSG","7059"]],TOWGS84[0.0,0.0,0.0,0.0,0.0,0.0,0.0],AUTHORITY["EPSG","6055"]]', obj_.to_wkt)
165
+ end
166
+
167
+ def test_projection
168
+ obj_ = ::RGeo::CoordSys::CS::Projection.create("Transverse_Mercator", "Transverse_Mercator", [])
169
+ assert_equal("Transverse_Mercator", obj_.name)
170
+ assert_equal("Transverse_Mercator", obj_.class_name)
171
+ assert_equal(0, obj_.num_parameters)
172
+ assert_equal('PROJECTION["Transverse_Mercator"]', obj_.to_wkt)
173
+ end
174
+
175
+ def test_local_coordinate_system
176
+ obj1_ = ::RGeo::CoordSys::CS::LocalDatum.create("Random Local Datum", ::RGeo::CoordSys::CS::LD_MIN)
177
+ obj2_ = ::RGeo::CoordSys::CS::LinearUnit.create("metre", 1, "EPSG", 9001)
178
+ obj3_ = ::RGeo::CoordSys::CS::AxisInfo.create("N", ::RGeo::CoordSys::CS::AO_NORTH)
179
+ obj4_ = ::RGeo::CoordSys::CS::AxisInfo.create("E", ::RGeo::CoordSys::CS::AO_EAST)
180
+ obj_ = ::RGeo::CoordSys::CS::LocalCoordinateSystem.create("My CS", obj1_, obj2_, [obj3_, obj4_])
181
+ assert_equal("My CS", obj_.name)
182
+ assert_equal(2, obj_.dimension)
183
+ assert_equal("Random Local Datum", obj_.local_datum.name)
184
+ assert_equal("N", obj_.get_axis(0).name)
185
+ assert_equal("E", obj_.get_axis(1).name)
186
+ assert_equal("metre", obj_.get_units(0).name)
187
+ assert_equal("metre", obj_.get_units(1).name)
188
+ assert_equal('LOCAL_CS["My CS",LOCAL_DATUM["Random Local Datum",10000],UNIT["metre",1.0,AUTHORITY["EPSG","9001"]],AXIS["N",NORTH],AXIS["E",EAST]]', obj_.to_wkt)
189
+ end
190
+
191
+ def test_geocentric_coordinate_system
192
+ obj1_ = ::RGeo::CoordSys::CS::Ellipsoid.create_flattened_sphere("WGS 84", 6_378_137, 298.257223563, nil, "EPSG", "7030")
193
+ obj2_ = ::RGeo::CoordSys::CS::HorizontalDatum.create("World Geodetic System 1984", ::RGeo::CoordSys::CS::HD_GEOCENTRIC, obj1_, nil, "EPSG", "6326")
194
+ obj3_ = ::RGeo::CoordSys::CS::PrimeMeridian.create("Greenwich", nil, 0.0, "EPSG", "8901")
195
+ obj4_ = ::RGeo::CoordSys::CS::LinearUnit.create("m", 1.0)
196
+ obj5_ = ::RGeo::CoordSys::CS::AxisInfo.create("Geocentric X", ::RGeo::CoordSys::CS::AO_OTHER)
197
+ obj6_ = ::RGeo::CoordSys::CS::AxisInfo.create("Geocentric Y", ::RGeo::CoordSys::CS::AO_EAST)
198
+ obj7_ = ::RGeo::CoordSys::CS::AxisInfo.create("Geocentric Z", ::RGeo::CoordSys::CS::AO_NORTH)
199
+ obj_ = ::RGeo::CoordSys::CS::GeocentricCoordinateSystem.create("WGS 84 (geocentric)", obj2_, obj3_, obj4_, obj5_, obj6_, obj7_, "EPSG", 4328)
200
+ assert_equal("WGS 84 (geocentric)", obj_.name)
201
+ assert_equal(3, obj_.dimension)
202
+ assert_equal("World Geodetic System 1984", obj_.horizontal_datum.name)
203
+ assert_equal("Greenwich", obj_.prime_meridian.name)
204
+ assert_equal("m", obj_.linear_unit.name)
205
+ assert_equal("Geocentric X", obj_.get_axis(0).name)
206
+ assert_equal("Geocentric Y", obj_.get_axis(1).name)
207
+ assert_equal("Geocentric Z", obj_.get_axis(2).name)
208
+ assert_equal("m", obj_.get_units(0).name)
209
+ assert_equal("m", obj_.get_units(1).name)
210
+ assert_equal("m", obj_.get_units(2).name)
211
+ assert_equal('GEOCCS["WGS 84 (geocentric)",DATUM["World Geodetic System 1984",SPHEROID["WGS 84",6378137.0,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0.0,AUTHORITY["EPSG","8901"]],UNIT["m",1.0],AXIS["Geocentric X",OTHER],AXIS["Geocentric Y",EAST],AXIS["Geocentric Z",NORTH],AUTHORITY["EPSG","4328"]]', obj_.to_wkt)
212
+ end
213
+
214
+ def test_vertical_coordinate_system
215
+ obj1_ = ::RGeo::CoordSys::CS::VerticalDatum.create("Ordnance Datum Newlyn", ::RGeo::CoordSys::CS::VD_GEOID_MODE_DERIVED, "EPSG", 5101)
216
+ obj2_ = ::RGeo::CoordSys::CS::LinearUnit.create("metre", 1, "EPSG", 9001)
217
+ obj3_ = ::RGeo::CoordSys::CS::AxisInfo.create("Up", ::RGeo::CoordSys::CS::AO_UP)
218
+ obj_ = ::RGeo::CoordSys::CS::VerticalCoordinateSystem.create("Newlyn", obj1_, obj2_, obj3_, "EPSG", 5701)
219
+ assert_equal("Newlyn", obj_.name)
220
+ assert_equal(1, obj_.dimension)
221
+ assert_equal("Ordnance Datum Newlyn", obj_.vertical_datum.name)
222
+ assert_equal("metre", obj_.vertical_unit.name)
223
+ assert_equal("Up", obj_.get_axis(0).name)
224
+ assert_equal("metre", obj_.get_units(0).name)
225
+ assert_equal('VERT_CS["Newlyn",VERT_DATUM["Ordnance Datum Newlyn",2005,AUTHORITY["EPSG","5101"]],UNIT["metre",1.0,AUTHORITY["EPSG","9001"]],AXIS["Up",UP],AUTHORITY["EPSG","5701"]]', obj_.to_wkt)
226
+ end
227
+
228
+ def test_geographic_coordinate_system
229
+ obj1_ = ::RGeo::CoordSys::CS::Ellipsoid.create_flattened_sphere("WGS 84", 6_378_137, 298.257223563, nil, "EPSG", "7030")
230
+ obj2_ = ::RGeo::CoordSys::CS::AngularUnit.create("degree", 0.01745329251994328, "EPSG", 9122)
231
+ obj3_ = ::RGeo::CoordSys::CS::HorizontalDatum.create("WGS_1984", ::RGeo::CoordSys::CS::HD_GEOCENTRIC, obj1_, nil, "EPSG", "6326")
232
+ obj4_ = ::RGeo::CoordSys::CS::PrimeMeridian.create("Greenwich", nil, 0, "EPSG", "8901")
233
+ obj_ = ::RGeo::CoordSys::CS::GeographicCoordinateSystem.create("WGS 84", obj2_, obj3_, obj4_, nil, nil, "EPSG", 4326)
234
+ assert_equal("WGS 84", obj_.name)
235
+ assert_equal(2, obj_.dimension)
236
+ assert_equal("WGS_1984", obj_.horizontal_datum.name)
237
+ assert_equal("Greenwich", obj_.prime_meridian.name)
238
+ assert_equal("degree", obj_.angular_unit.name)
239
+ assert_nil(obj_.get_axis(0))
240
+ assert_nil(obj_.get_axis(1))
241
+ assert_equal("degree", obj_.get_units(0).name)
242
+ assert_equal("degree", obj_.get_units(1).name)
243
+ assert_match(_lenient_regex_for('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137.0,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0.0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]'), obj_.to_wkt)
244
+ end
245
+
246
+ def test_projected_coordinate_system
247
+ obj1_ = ::RGeo::CoordSys::CS::Ellipsoid.create_flattened_sphere("Airy 1830", 6_377_563.396, 299.3249646, nil, "EPSG", "7001")
248
+ obj2_ = ::RGeo::CoordSys::CS::WGS84ConversionInfo.create(375, -111, 431, 0, 0, 0, 0)
249
+ obj3_ = ::RGeo::CoordSys::CS::AngularUnit.create("DMSH", 0.0174532925199433, "EPSG", 9108)
250
+ obj4_ = ::RGeo::CoordSys::CS::HorizontalDatum.create("OSGB_1936", ::RGeo::CoordSys::CS::HD_CLASSIC, obj1_, obj2_, "EPSG", "6277")
251
+ obj5_ = ::RGeo::CoordSys::CS::PrimeMeridian.create("Greenwich", nil, 0, "EPSG", "8901")
252
+ obj6_ = ::RGeo::CoordSys::CS::AxisInfo.create("Lat", ::RGeo::CoordSys::CS::AO_NORTH)
253
+ obj7_ = ::RGeo::CoordSys::CS::AxisInfo.create("Long", ::RGeo::CoordSys::CS::AO_EAST)
254
+ obj8_ = ::RGeo::CoordSys::CS::GeographicCoordinateSystem.create("OSGB 1936", obj3_, obj4_, obj5_, obj6_, obj7_, "EPSG", 4277)
255
+ obj9_ = ::RGeo::CoordSys::CS::ProjectionParameter.create("latitude_of_origin", 49)
256
+ obj10_ = ::RGeo::CoordSys::CS::ProjectionParameter.create("central_meridian", -2)
257
+ obj11_ = ::RGeo::CoordSys::CS::ProjectionParameter.create("scale_factor", 0.999601272)
258
+ obj12_ = ::RGeo::CoordSys::CS::ProjectionParameter.create("false_easting", 400_000)
259
+ obj13_ = ::RGeo::CoordSys::CS::ProjectionParameter.create("false_northing", -100_000)
260
+ obj14_ = ::RGeo::CoordSys::CS::Projection.create("Transverse_Mercator", "Transverse_Mercator", [obj9_, obj10_, obj11_, obj12_, obj13_])
261
+ obj15_ = ::RGeo::CoordSys::CS::LinearUnit.create("metre", 1, "EPSG", 9001)
262
+ obj16_ = ::RGeo::CoordSys::CS::AxisInfo.create("E", ::RGeo::CoordSys::CS::AO_EAST)
263
+ obj17_ = ::RGeo::CoordSys::CS::AxisInfo.create("N", ::RGeo::CoordSys::CS::AO_NORTH)
264
+ obj_ = ::RGeo::CoordSys::CS::ProjectedCoordinateSystem.create("OSGB 1936 / British National Grid", obj8_, obj14_, obj15_, obj16_, obj17_, "EPSG", 27_700)
265
+ assert_equal("OSGB 1936 / British National Grid", obj_.name)
266
+ assert_equal(2, obj_.dimension)
267
+ assert_equal("OSGB_1936", obj_.horizontal_datum.name)
268
+ assert_equal("OSGB 1936", obj_.geographic_coordinate_system.name)
269
+ assert_equal("Transverse_Mercator", obj_.projection.name)
270
+ assert_equal(5, obj_.projection.num_parameters)
271
+ assert_equal("latitude_of_origin", obj_.projection.get_parameter(0).name)
272
+ assert_equal(49, obj_.projection.get_parameter(0).value)
273
+ assert_equal("false_northing", obj_.projection.get_parameter(4).name)
274
+ assert_equal(-100_000, obj_.projection.get_parameter(4).value)
275
+ assert_equal("metre", obj_.linear_unit.name)
276
+ assert_equal("E", obj_.get_axis(0).name)
277
+ assert_equal("N", obj_.get_axis(1).name)
278
+ assert_equal("metre", obj_.get_units(0).name)
279
+ assert_equal("metre", obj_.get_units(1).name)
280
+ assert_equal('PROJCS["OSGB 1936 / British National Grid",GEOGCS["OSGB 1936",DATUM["OSGB_1936",SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]],TOWGS84[375.0,-111.0,431.0,0.0,0.0,0.0,0.0],AUTHORITY["EPSG","6277"]],PRIMEM["Greenwich",0.0,AUTHORITY["EPSG","8901"]],UNIT["DMSH",0.0174532925199433,AUTHORITY["EPSG","9108"]],AXIS["Lat",NORTH],AXIS["Long",EAST],AUTHORITY["EPSG","4277"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",49.0],PARAMETER["central_meridian",-2.0],PARAMETER["scale_factor",0.999601272],PARAMETER["false_easting",400000.0],PARAMETER["false_northing",-100000.0],UNIT["metre",1.0,AUTHORITY["EPSG","9001"]],AXIS["E",EAST],AXIS["N",NORTH],AUTHORITY["EPSG","27700"]]', obj_.to_wkt)
281
+ end
282
+
283
+ def test_parse_epsg_6055
284
+ input_ = 'DATUM["Popular_Visualisation_Datum",SPHEROID["Popular Visualisation Sphere",6378137.0,0.0,AUTHORITY["EPSG","7059"]],TOWGS84[0.0,0.0,0.0,0.0,0.0,0.0,0.0],AUTHORITY["EPSG","6055"]]'
285
+ obj_ = ::RGeo::CoordSys::CS.create_from_wkt(input_)
286
+ assert_kind_of(::RGeo::CoordSys::CS::HorizontalDatum, obj_)
287
+ assert_equal("Popular_Visualisation_Datum", obj_.name)
288
+ assert_equal(::RGeo::CoordSys::CS::HD_GEOCENTRIC, obj_.datum_type)
289
+ assert_equal("EPSG", obj_.authority)
290
+ assert_equal("6055", obj_.authority_code)
291
+ assert_equal("Popular Visualisation Sphere", obj_.ellipsoid.name)
292
+ assert_equal(6_378_137, obj_.ellipsoid.semi_major_axis)
293
+ assert_equal(0, obj_.ellipsoid.inverse_flattening)
294
+ assert_equal(6_378_137, obj_.ellipsoid.semi_minor_axis)
295
+ assert_equal("EPSG", obj_.ellipsoid.authority)
296
+ assert_equal("7059", obj_.ellipsoid.authority_code)
297
+ assert_equal(0, obj_.wgs84_parameters.dx)
298
+ assert_equal(input_, obj_.to_wkt)
299
+ end
300
+
301
+ def test_parse_epsg_7405
302
+ input_ = 'COMPD_CS["OSGB36 / British National Grid + ODN",PROJCS["OSGB 1936 / British National Grid",GEOGCS["OSGB 1936",DATUM["OSGB 1936",SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]],TOWGS84[446.448,-125.157,542.06,0.15,0.247,0.842,-4.2261596151967575],AUTHORITY["EPSG","6277"]],PRIMEM["Greenwich",0.0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.017453292519943295],AXIS["Geodetic latitude",NORTH],AXIS["Geodetic longitude",EAST],AUTHORITY["EPSG","4277"]],PROJECTION["Transverse Mercator",AUTHORITY["EPSG","9807"]],PARAMETER["central_meridian",-2.0],PARAMETER["latitude_of_origin",49.0],PARAMETER["scale_factor",0.9996012717],PARAMETER["false_easting",400000.0],PARAMETER["false_northing",-100000.0],UNIT["m",1.0],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","27700"]],VERT_CS["Newlyn",VERT_DATUM["Ordnance Datum Newlyn",2005,AUTHORITY["EPSG","5101"]],UNIT["m",1.0],AXIS["Gravity-related height",UP],AUTHORITY["EPSG","5701"]],AUTHORITY["EPSG","7405"]]'
303
+ obj_ = ::RGeo::CoordSys::CS.create_from_wkt(input_)
304
+ assert_kind_of(::RGeo::CoordSys::CS::CompoundCoordinateSystem, obj_)
305
+ assert_kind_of(::RGeo::CoordSys::CS::ProjectedCoordinateSystem, obj_.head)
306
+ assert_kind_of(::RGeo::CoordSys::CS::VerticalCoordinateSystem, obj_.tail)
307
+ assert_equal(3, obj_.dimension)
308
+ assert_match(_lenient_regex_for(input_), obj_.to_wkt)
309
+ end
310
+
311
+ def test_parse_local_datum_with_extension
312
+ input_ = 'LOCAL_DATUM["Random Local Datum",10000,EXTENSION["foo","bar"]]'
313
+ obj_ = ::RGeo::CoordSys::CS.create_from_wkt(input_)
314
+ assert_kind_of(::RGeo::CoordSys::CS::LocalDatum, obj_)
315
+ assert_equal("bar", obj_.extension(:foo))
316
+ assert_nil(obj_.extension(:bar))
317
+ assert_equal(input_, obj_.to_wkt)
318
+ end
319
+
320
+ def test_marshal_roundtrip
321
+ input_ = 'COMPD_CS["OSGB36 / British National Grid + ODN",PROJCS["OSGB 1936 / British National Grid",GEOGCS["OSGB 1936",DATUM["OSGB 1936",SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]],TOWGS84[446.448,-125.157,542.06,0.15,0.247,0.842,-4.2261596151967575],AUTHORITY["EPSG","6277"]],PRIMEM["Greenwich",0.0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.017453292519943295],AXIS["Geodetic latitude",NORTH],AXIS["Geodetic longitude",EAST],AUTHORITY["EPSG","4277"]],PROJECTION["Transverse Mercator",AUTHORITY["EPSG","9807"]],PARAMETER["central_meridian",-2.0],PARAMETER["latitude_of_origin",49.0],PARAMETER["scale_factor",0.9996012717],PARAMETER["false_easting",400000.0],PARAMETER["false_northing",-100000.0],UNIT["m",1.0],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","27700"]],VERT_CS["Newlyn",VERT_DATUM["Ordnance Datum Newlyn",2005,AUTHORITY["EPSG","5101"]],UNIT["m",1.0],AXIS["Gravity-related height",UP],AUTHORITY["EPSG","5701"]],AUTHORITY["EPSG","7405"]]'
322
+ obj1_ = ::RGeo::CoordSys::CS.create_from_wkt(input_)
323
+ dump_ = ::Marshal.dump(obj1_)
324
+ obj2_ = ::Marshal.load(dump_)
325
+ assert_equal(obj1_, obj2_)
326
+ end
327
+
328
+ if ::RGeo.yaml_supported?
329
+
330
+ def test_yaml_roundtrip
331
+ input_ = 'COMPD_CS["OSGB36 / British National Grid + ODN",PROJCS["OSGB 1936 / British National Grid",GEOGCS["OSGB 1936",DATUM["OSGB 1936",SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]],TOWGS84[446.448,-125.157,542.06,0.15,0.247,0.842,-4.2261596151967575],AUTHORITY["EPSG","6277"]],PRIMEM["Greenwich",0.0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.017453292519943295],AXIS["Geodetic latitude",NORTH],AXIS["Geodetic longitude",EAST],AUTHORITY["EPSG","4277"]],PROJECTION["Transverse Mercator",AUTHORITY["EPSG","9807"]],PARAMETER["central_meridian",-2.0],PARAMETER["latitude_of_origin",49.0],PARAMETER["scale_factor",0.9996012717],PARAMETER["false_easting",400000.0],PARAMETER["false_northing",-100000.0],UNIT["m",1.0],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","27700"]],VERT_CS["Newlyn",VERT_DATUM["Ordnance Datum Newlyn",2005,AUTHORITY["EPSG","5101"]],UNIT["m",1.0],AXIS["Gravity-related height",UP],AUTHORITY["EPSG","5701"]],AUTHORITY["EPSG","7405"]]'
332
+ obj1_ = ::RGeo::CoordSys::CS.create_from_wkt(input_)
333
+ dump_ = ::Psych.dump(obj1_)
334
+ obj2_ = ::Psych.load(dump_)
335
+ assert_equal(obj1_, obj2_)
336
+ end
337
+
338
+ end
339
+ end
340
+ end
341
+ end
342
+ end