proj4rb 4.1.0 → 5.0.0

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 (115) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +98 -0
  3. data/Gemfile +4 -4
  4. data/README.md +53 -0
  5. data/lib/api/proj.rb +750 -0
  6. data/lib/api/proj_experimental.rb +7 -0
  7. data/lib/api/proj_ffi.rb +47 -0
  8. data/lib/api/proj_version.rb +26 -0
  9. data/lib/examples/axis_order_normalization.rb +13 -0
  10. data/lib/examples/batch_transformation.rb +25 -0
  11. data/lib/examples/context_logging.rb +26 -0
  12. data/lib/examples/crs_identification.rb +18 -0
  13. data/lib/examples/database_query.rb +27 -0
  14. data/lib/examples/geodetic_distance.rb +38 -0
  15. data/lib/examples/geodetic_to_projected.rb +18 -0
  16. data/lib/examples/operation_factory_context.rb +19 -0
  17. data/lib/examples/pipeline_operator.rb +21 -0
  18. data/lib/examples/promote_demote_3d.rb +23 -0
  19. data/lib/examples/serialization_formats.rb +17 -0
  20. data/lib/examples/transform_bounds.rb +18 -0
  21. data/lib/examples/transformation_with_area.rb +18 -0
  22. data/lib/proj/area.rb +74 -74
  23. data/lib/proj/axis_info.rb +44 -44
  24. data/lib/proj/bounds.rb +22 -0
  25. data/lib/proj/bounds3d.rb +45 -0
  26. data/lib/proj/context.rb +57 -23
  27. data/lib/proj/conversion.rb +94 -91
  28. data/lib/proj/coordinate.rb +304 -281
  29. data/lib/proj/coordinate_metadata.rb +38 -0
  30. data/lib/proj/coordinate_operation_mixin.rb +464 -381
  31. data/lib/proj/coordinate_system.rb +143 -137
  32. data/lib/proj/crs.rb +688 -672
  33. data/lib/proj/crs_info.rb +47 -47
  34. data/lib/proj/database.rb +310 -305
  35. data/lib/proj/datum.rb +32 -32
  36. data/lib/proj/datum_ensemble.rb +34 -34
  37. data/lib/proj/domain.rb +82 -0
  38. data/lib/proj/ellipsoid.rb +77 -77
  39. data/lib/proj/error.rb +7 -8
  40. data/lib/proj/file_api_callbacks.rb +165 -0
  41. data/lib/proj/grid.rb +121 -121
  42. data/lib/proj/grid_cache.rb +65 -64
  43. data/lib/proj/grid_info.rb +19 -19
  44. data/lib/proj/life_span.rb +21 -0
  45. data/lib/proj/network_api_callbacks.rb +86 -0
  46. data/lib/proj/operation.rb +66 -42
  47. data/lib/proj/operation_factory_context.rb +4 -2
  48. data/lib/proj/options.rb +41 -0
  49. data/lib/proj/parameter.rb +37 -37
  50. data/lib/proj/parameters.rb +106 -107
  51. data/lib/proj/pj_axis_description.rb +26 -0
  52. data/lib/proj/pj_object.rb +602 -670
  53. data/lib/proj/pj_objects.rb +45 -45
  54. data/lib/proj/pj_param_description.rb +28 -0
  55. data/lib/proj/prime_meridian.rb +65 -65
  56. data/lib/proj/projection.rb +1771 -698
  57. data/lib/proj/session.rb +2 -0
  58. data/lib/proj/transformation.rb +102 -102
  59. data/lib/proj/unit.rb +81 -108
  60. data/lib/proj.rb +10 -3
  61. data/lib/proj4.rb +5 -5
  62. data/proj4rb.gemspec +10 -5
  63. data/test/abstract_test.rb +7 -28
  64. data/test/context_test.rb +210 -172
  65. data/test/context_validation_test.rb +11 -0
  66. data/test/conversion_test.rb +376 -368
  67. data/test/coordinate_metadata_test.rb +34 -0
  68. data/test/coordinate_system_test.rb +162 -144
  69. data/test/coordinate_test.rb +289 -34
  70. data/test/crs_test.rb +1112 -1072
  71. data/test/database_test.rb +407 -359
  72. data/test/datum_ensemble_test.rb +64 -64
  73. data/test/datum_test.rb +61 -54
  74. data/test/domain_test.rb +72 -0
  75. data/test/ellipsoid_test.rb +80 -80
  76. data/test/examples_test.rb +149 -0
  77. data/test/file_api_example.rb +58 -0
  78. data/test/file_api_test.rb +74 -66
  79. data/test/grid_cache_test.rb +72 -72
  80. data/test/grid_test.rb +126 -141
  81. data/test/network_api_example.rb +48 -0
  82. data/test/network_api_test.rb +33 -45
  83. data/test/operation_factory_context_test.rb +225 -201
  84. data/test/operation_test.rb +40 -29
  85. data/test/options_test.rb +17 -0
  86. data/test/parameters_test.rb +86 -40
  87. data/test/pj_object_test.rb +221 -179
  88. data/test/prime_meridian_test.rb +75 -75
  89. data/test/proj_test.rb +58 -58
  90. data/test/projection_test.rb +680 -650
  91. data/test/session_test.rb +78 -77
  92. data/test/transformation_test.rb +238 -210
  93. data/test/unit_test.rb +114 -76
  94. metadata +45 -31
  95. data/ChangeLog +0 -89
  96. data/README.rdoc +0 -207
  97. data/lib/api/api.rb +0 -117
  98. data/lib/api/api_5_0.rb +0 -338
  99. data/lib/api/api_5_1.rb +0 -7
  100. data/lib/api/api_5_2.rb +0 -5
  101. data/lib/api/api_6_0.rb +0 -146
  102. data/lib/api/api_6_1.rb +0 -5
  103. data/lib/api/api_6_2.rb +0 -10
  104. data/lib/api/api_6_3.rb +0 -6
  105. data/lib/api/api_7_0.rb +0 -69
  106. data/lib/api/api_7_1.rb +0 -73
  107. data/lib/api/api_7_2.rb +0 -14
  108. data/lib/api/api_8_0.rb +0 -6
  109. data/lib/api/api_8_1.rb +0 -24
  110. data/lib/api/api_8_2.rb +0 -6
  111. data/lib/api/api_9_1.rb +0 -7
  112. data/lib/api/api_9_2.rb +0 -9
  113. data/lib/api/api_experimental.rb +0 -201
  114. data/lib/proj/file_api.rb +0 -166
  115. data/lib/proj/network_api.rb +0 -92
@@ -1,360 +1,408 @@
1
- # encoding: UTF-8
2
-
3
- require_relative './abstract_test'
4
-
5
- class DatabaseTest < AbstractTest
6
- def create_crs
7
- Proj::Crs.new(<<~EOS)
8
- GEOGCRS["myGDA2020",
9
- DATUM["GDA2020",
10
- ELLIPSOID["GRS_1980",6378137,298.257222101,
11
- LENGTHUNIT["metre",1]]],
12
- PRIMEM["Greenwich",0,
13
- ANGLEUNIT["Degree",0.0174532925199433]],
14
- CS[ellipsoidal,2],
15
- AXIS["geodetic latitude (Lat)",north,
16
- ORDER[1],
17
- ANGLEUNIT["degree",0.0174532925199433]],
18
- AXIS["geodetic longitude (Lon)",east,
19
- ORDER[2],
20
- ANGLEUNIT["degree",0.0174532925199433]]]
21
- EOS
22
- end
23
-
24
- def test_path
25
- database = Proj::Database.new(Proj::Context.current)
26
- assert_equal("proj.db", File.basename(database.path))
27
- end
28
-
29
- def test_set_path_error
30
- database = Proj::Database.new(Proj::Context.current)
31
-
32
- error = assert_raises(Proj::Error) do
33
- database.path = "test.db"
34
- end
35
- # This error is sometimes "Unknown error (code 4096)"
36
- # assert_equal("Invalid value for an argument", error.to_s)
37
- end
38
-
39
- def test_structure
40
- database = Proj::Database.new(Proj::Context.current)
41
- structure = database.structure
42
- assert(structure.length > 70)
43
- end
44
-
45
- def test_metadata
46
- database = Proj::Database.new(Proj::Context.current)
47
- metadata = database.metadata('IGNF.VERSION')
48
- assert_equal('3.1.0', metadata)
49
- end
50
-
51
- def test_codes
52
- types_with_no_codes = [:PJ_TYPE_TEMPORAL_CRS, :PJ_TYPE_BOUND_CRS, :PJ_TYPE_UNKNOWN, :PJ_TYPE_ENGINEERING_CRS,
53
- :PJ_TYPE_TEMPORAL_DATUM, :PJ_TYPE_ENGINEERING_DATUM, :PJ_TYPE_PARAMETRIC_DATUM,
54
- :PJ_TYPE_OTHER_COORDINATE_OPERATION]
55
-
56
- database = Proj::Database.new(Proj::Context.current)
57
-
58
- Proj::Api::PJ_TYPE.symbols.each do |type|
59
- codes = database.codes('EPSG', type)
60
- if types_with_no_codes.include?(type)
61
- assert(codes.empty?)
62
- else
63
- refute(codes.empty?)
64
- end
65
- end
66
- end
67
-
68
- def test_authorities
69
- database = Proj::Database.new(Proj::Context.current)
70
- authorities = database.authorities
71
- assert_equal(7, authorities.count)
72
-
73
- authority = authorities[0]
74
- assert_equal('EPSG', authority)
75
-
76
- authority = authorities[1]
77
- assert_equal('ESRI', authority)
78
-
79
- authority = authorities[2]
80
- assert_equal('IAU_2015', authority)
81
-
82
- authority = authorities[3]
83
- assert_equal('IGNF', authority)
84
-
85
- authority = authorities[4]
86
- assert_equal('NKG', authority)
87
-
88
- authority = authorities[5]
89
- assert_equal('OGC', authority)
90
-
91
- authority = authorities[6]
92
- assert_equal('PROJ', authority)
93
- end
94
-
95
- def test_crs_info
96
- database = Proj::Database.new(Proj::Context.current)
97
- crs_infos = database.crs_info
98
-
99
- expected = case
100
- when proj9?
101
- 13107
102
- else
103
- 12609
104
- end
105
- assert_equal(expected, crs_infos.count)
106
-
107
- crs_info = crs_infos.first
108
- assert_equal("EPSG", crs_info.auth_name)
109
- assert_equal("2000", crs_info.code)
110
- assert_equal("Anguilla 1957 / British West Indies Grid", crs_info.name)
111
- assert_equal(:PJ_TYPE_PROJECTED_CRS, crs_info.crs_type)
112
- refute(crs_info.deprecated)
113
- assert(crs_info.bbox_valid)
114
- assert_equal(-63.22, crs_info.west_lon_degree)
115
- assert_equal(18.11, crs_info.south_lat_degree)
116
- assert_equal(-62.92, crs_info.east_lon_degree)
117
- assert_equal(18.33, crs_info.north_lat_degree)
118
- assert_equal("Anguilla - onshore.", crs_info.area_name)
119
- assert_equal("Transverse Mercator", crs_info.projection_method_name)
120
- assert_equal("Earth", crs_info.celestial_body_name)
121
- end
122
-
123
- def test_crs_info_epsg
124
- database = Proj::Database.new(Proj::Context.current)
125
- crs_infos = database.crs_info("EPSG")
126
-
127
- expected = case
128
- when proj9?
129
- 7251
130
- else
131
- 7056
132
- end
133
- assert_equal(expected, crs_infos.count)
134
- end
135
-
136
- def test_crs_info_geodetic
137
- database = Proj::Database.new(Proj::Context.current)
138
- params = Proj::Parameters.new
139
- params.types = [:PJ_TYPE_GEODETIC_CRS]
140
- crs_infos = database.crs_info("EPSG", params)
141
-
142
- expected = case
143
- when proj9?
144
- 943
145
- else
146
- 930
147
- end
148
-
149
- assert_equal(expected, crs_infos.count)
150
- end
151
-
152
- def test_crs_info_geographic
153
- database = Proj::Database.new(Proj::Context.current)
154
- params = Proj::Parameters.new
155
- params.types = [:PJ_TYPE_GEOGRAPHIC_2D_CRS, :PJ_TYPE_PROJECTED_CRS]
156
- crs_infos = database.crs_info("EPSG", params)
157
-
158
- expected = case
159
- when proj9?
160
- 5689
161
- else
162
- 5534
163
- end
164
-
165
- assert_equal(expected, crs_infos.count)
166
- end
167
-
168
- def test_crs_info_bounds_inclusive
169
- database = Proj::Database.new(Proj::Context.current)
170
- params = Proj::Parameters.new
171
- params.types = [:PJ_TYPE_PROJECTED_CRS]
172
- params.bbox_valid = 1
173
- params.west_lon_degree = 2
174
- params.south_lat_degree = 49
175
- params.east_lon_degree = 2.1
176
- params.north_lat_degree = 49.1
177
-
178
- crs_infos = database.crs_info("EPSG", params)
179
- assert_equal(35, crs_infos.count)
180
- end
181
-
182
- def test_crs_info_bounds_exclusive
183
- database = Proj::Database.new(Proj::Context.current)
184
- params = Proj::Parameters.new
185
- params.types = [:PJ_TYPE_PROJECTED_CRS]
186
- params.bbox_valid = 1
187
- params.west_lon_degree = 2
188
- params.south_lat_degree = 49
189
- params.east_lon_degree = 2.1
190
- params.north_lat_degree = 49.1
191
- params.crs_area_of_use_contains_bbox = 0
192
-
193
- crs_infos = database.crs_info("EPSG", params)
194
- assert_equal(38, crs_infos.count)
195
- end
196
-
197
- def test_crs_info_celestial_body
198
- database = Proj::Database.new(Proj::Context.current)
199
- params = Proj::Parameters.new
200
- params.celestial_body_name = "Earth"
201
- crs_infos = database.crs_info("EPSG", params)
202
-
203
- expected = case
204
- when proj9?
205
- 6723
206
- else
207
- 6532
208
- end
209
-
210
- assert_equal(expected, crs_infos.count)
211
- end
212
-
213
- def test_unit
214
- database = Proj::Database.new(Proj::Context.current)
215
- unit = database.unit("EPSG", "9001")
216
- assert_equal("EPSG", unit.auth_name)
217
- assert_equal("9001", unit.code)
218
- assert_equal("metre", unit.name)
219
- assert_equal("linear", unit.category)
220
- assert_equal(1.0, unit.conv_factor)
221
- refute(unit.proj_short_name)
222
- refute(unit.deprecated)
223
- end
224
-
225
- def test_geoid_models
226
- database = Proj::Database.new(Proj::Context.current)
227
- models = database.geoid_models("EPSG", "5703")
228
-
229
- assert_equal(8, models.size)
230
-
231
- expected = %w[GEOID03 GEOID06 GEOID09 GEOID12A GEOID12B GEOID18 GEOID99 GGM10]
232
- assert_equal(expected, models.strings)
233
- end
234
-
235
- def test_celestial_bodies
236
- database = Proj::Database.new(Proj::Context.current)
237
- bodies = database.celestial_bodies
238
-
239
- expected = case
240
- when proj9?
241
- 176
242
- else
243
- 170
244
- end
245
-
246
- assert_equal(expected, bodies.size)
247
-
248
- celestial_body = bodies[0]
249
- assert_equal('ESRI', celestial_body.auth_name)
250
- assert_equal('1_Ceres', celestial_body.name)
251
- end
252
-
253
- def test_celestial_bodies_authority
254
- database = Proj::Database.new(Proj::Context.current)
255
- bodies = database.celestial_bodies('ESRI')
256
-
257
- expected = case
258
- when proj9?
259
- 78
260
- else
261
- 72
262
- end
263
-
264
- assert_equal(expected, bodies.size)
265
-
266
- celestial_body = bodies[0]
267
- assert_equal('ESRI', celestial_body.auth_name)
268
- assert_equal('1_Ceres', celestial_body.name)
269
- end
270
-
271
- def test_suggest_code_for
272
- crs = create_crs
273
- database = Proj::Database.new(crs.context)
274
-
275
- code = database.suggest_code_for(crs, "HOBU", false)
276
- assert_equal("MYGDA2020", code)
277
-
278
- code = database.suggest_code_for(crs, "HOBU", true)
279
- assert_equal("1", code)
280
- end
281
-
282
- def test_celestial_body_name_geographic_crs
283
- crs = Proj::Crs.create_from_database("EPSG", "4326", :PJ_CATEGORY_CRS)
284
- database = Proj::Database.new(crs.context)
285
- name = database.celestial_body_name(crs)
286
- assert_equal("Earth", name)
287
- end
288
-
289
- def test_celestial_body_name_geographic_projected_crs
290
- crs = Proj::Crs.create_from_database("EPSG", "32631", :PJ_CATEGORY_CRS)
291
- database = Proj::Database.new(crs.context)
292
- name = database.celestial_body_name(crs)
293
- assert_equal("Earth", name)
294
- end
295
-
296
- def test_celestial_body_name_vertical_crs
297
- crs = Proj::Crs.create_from_database("EPSG", "3855", :PJ_CATEGORY_CRS)
298
- database = Proj::Database.new(crs.context)
299
- name = database.celestial_body_name(crs)
300
- assert_equal("Earth", name)
301
- end
302
-
303
- def test_celestial_body_name_compound_crs
304
- crs = Proj::Crs.create_from_database("EPSG", "9518", :PJ_CATEGORY_CRS)
305
- database = Proj::Database.new(crs.context)
306
- name = database.celestial_body_name(crs)
307
- assert_equal("Earth", name)
308
- end
309
-
310
- def test_celestial_body_name_geodetic_datum
311
- crs = Proj::Crs.create_from_database("EPSG", "6267", :PJ_CATEGORY_DATUM)
312
- database = Proj::Database.new(crs.context)
313
- name = database.celestial_body_name(crs)
314
- assert_equal("Earth", name)
315
- end
316
-
317
- def test_celestial_body_name_datum_ensemble
318
- crs = Proj::Crs.create_from_database("EPSG", "6326", :PJ_CATEGORY_DATUM_ENSEMBLE)
319
- database = Proj::Database.new(crs.context)
320
- name = database.celestial_body_name(crs)
321
- assert_equal("Earth", name)
322
- end
323
-
324
- def test_celestial_body_name_vertical_datum
325
- crs = Proj::Crs.create_from_database("EPSG", "1027", :PJ_CATEGORY_DATUM)
326
- database = Proj::Database.new(crs.context)
327
- name = database.celestial_body_name(crs)
328
- assert_equal("Earth", name)
329
- end
330
-
331
- def test_celestial_body_name_ellipsoid
332
- crs = Proj::Crs.create_from_database("EPSG", "7030", :PJ_CATEGORY_ELLIPSOID)
333
- database = Proj::Database.new(crs.context)
334
- name = database.celestial_body_name(crs)
335
- assert_equal("Earth", name)
336
- end
337
-
338
- def test_celestial_body_name_ellipsoid_not_earth
339
- crs = Proj::Crs.create_from_database("ESRI", "107903", :PJ_CATEGORY_ELLIPSOID)
340
- database = Proj::Database.new(crs.context)
341
- name = database.celestial_body_name(crs)
342
- assert_equal("Moon", name)
343
- end
344
-
345
- def test_celestial_body_name_error
346
- crs = Proj::Crs.create_from_database("EPSG", "1591", :PJ_CATEGORY_COORDINATE_OPERATION)
347
- database = Proj::Database.new(crs.context)
348
- name = database.celestial_body_name(crs)
349
- refute(name)
350
- end
351
-
352
- if proj7?
353
- # This test causes a segmentation fault on proj6
354
- def test_metadata_invalid
355
- database = Proj::Database.new(Proj::Context.current)
356
- metadata = database.metadata('foo')
357
- refute(metadata)
358
- end
359
- end
1
+ # encoding: UTF-8
2
+
3
+ require_relative './abstract_test'
4
+
5
+ class DatabaseTest < AbstractTest
6
+ def create_crs
7
+ Proj::Crs.new(<<~EOS)
8
+ GEOGCRS["myGDA2020",
9
+ DATUM["GDA2020",
10
+ ELLIPSOID["GRS_1980",6378137,298.257222101,
11
+ LENGTHUNIT["metre",1]]],
12
+ PRIMEM["Greenwich",0,
13
+ ANGLEUNIT["Degree",0.0174532925199433]],
14
+ CS[ellipsoidal,2],
15
+ AXIS["geodetic latitude (Lat)",north,
16
+ ORDER[1],
17
+ ANGLEUNIT["degree",0.0174532925199433]],
18
+ AXIS["geodetic longitude (Lon)",east,
19
+ ORDER[2],
20
+ ANGLEUNIT["degree",0.0174532925199433]]]
21
+ EOS
22
+ end
23
+
24
+ def test_path
25
+ database = Proj::Database.new(Proj::Context.current)
26
+ assert_equal("proj.db", File.basename(database.path))
27
+ end
28
+
29
+ def test_set_path_error
30
+ context = Proj::Context.new
31
+ database = Proj::Database.new(context)
32
+
33
+ error = assert_raises(Proj::Error) do
34
+ database.path = "test.db"
35
+ end
36
+ assert_includes(["Invalid value for an argument", "Unknown error (code 4096)"], error.to_s)
37
+ end
38
+
39
+ def test_structure
40
+ database = Proj::Database.new(Proj::Context.current)
41
+ structure = database.structure
42
+ assert(structure.length > 70)
43
+ end
44
+
45
+ def test_metadata
46
+ database = Proj::Database.new(Proj::Context.current)
47
+ metadata = database.metadata('IGNF.VERSION')
48
+ assert_equal('3.1.0', metadata)
49
+ end
50
+
51
+ def test_codes
52
+ if Proj::Api::PROJ_VERSION >= '9.6.0'
53
+ types_with_no_codes = [:PJ_TYPE_TEMPORAL_CRS, :PJ_TYPE_BOUND_CRS, :PJ_TYPE_UNKNOWN,
54
+ :PJ_TYPE_TEMPORAL_DATUM, :PJ_TYPE_PARAMETRIC_DATUM,
55
+ :PJ_TYPE_DERIVED_PROJECTED_CRS, :PJ_TYPE_COORDINATE_METADATA]
56
+ elsif Proj::Api::PROJ_VERSION >= '9.3.0'
57
+ types_with_no_codes = [:PJ_TYPE_TEMPORAL_CRS, :PJ_TYPE_BOUND_CRS, :PJ_TYPE_UNKNOWN, :PJ_TYPE_ENGINEERING_CRS,
58
+ :PJ_TYPE_TEMPORAL_DATUM, :PJ_TYPE_ENGINEERING_DATUM, :PJ_TYPE_PARAMETRIC_DATUM,
59
+ :PJ_TYPE_OTHER_COORDINATE_OPERATION, :PJ_TYPE_DERIVED_PROJECTED_CRS, :PJ_TYPE_COORDINATE_METADATA]
60
+ else
61
+ types_with_no_codes = [:PJ_TYPE_TEMPORAL_CRS, :PJ_TYPE_BOUND_CRS, :PJ_TYPE_UNKNOWN, :PJ_TYPE_ENGINEERING_CRS,
62
+ :PJ_TYPE_TEMPORAL_DATUM, :PJ_TYPE_ENGINEERING_DATUM, :PJ_TYPE_PARAMETRIC_DATUM,
63
+ :PJ_TYPE_OTHER_COORDINATE_OPERATION]
64
+ end
65
+
66
+ database = Proj::Database.new(Proj::Context.current)
67
+
68
+ Proj::Api::PjType.symbols.each do |type|
69
+ codes = database.codes('EPSG', type)
70
+ if types_with_no_codes.include?(type)
71
+ assert(codes.empty?)
72
+ else
73
+ refute(codes.empty?)
74
+ end
75
+ end
76
+ end
77
+
78
+ def test_authorities
79
+ database = Proj::Database.new(Proj::Context.current)
80
+ authorities = database.authorities
81
+ expected_authorities = case
82
+ when Proj::Api::PROJ_VERSION >= '9.6.0'
83
+ ['EPSG', 'ESRI', 'IAU_2015', 'IGNF', 'NKG', 'NRCAN', 'OGC', 'PROJ']
84
+ else
85
+ ['EPSG', 'ESRI', 'IAU_2015', 'IGNF', 'NKG', 'OGC', 'PROJ']
86
+ end
87
+
88
+ assert_operator(authorities.count, :>=, expected_authorities.count)
89
+ expected_authorities.each do |expected|
90
+ assert_includes(authorities, expected)
91
+ end
92
+ end
93
+
94
+ def test_crs_info
95
+ database = Proj::Database.new(Proj::Context.current)
96
+ crs_infos = database.crs_info
97
+
98
+ minimum = case
99
+ when Proj::Api::PROJ_VERSION >= '9.6.0'
100
+ 13636
101
+ when Proj::Api::PROJ_VERSION >= '9.3.0'
102
+ 13434
103
+ when Proj::Api::PROJ_VERSION >= '9.0.0'
104
+ 13107
105
+ else
106
+ 12609
107
+ end
108
+ assert_operator(crs_infos.count, :>=, minimum)
109
+
110
+ crs_info = crs_infos.first
111
+ assert_equal("EPSG", crs_info.auth_name)
112
+ assert_equal("2000", crs_info.code)
113
+ assert_equal("Anguilla 1957 / British West Indies Grid", crs_info.name)
114
+ assert_equal(:PJ_TYPE_PROJECTED_CRS, crs_info.crs_type)
115
+ refute(crs_info.deprecated)
116
+ assert(crs_info.bbox_valid)
117
+ assert_equal(-63.22, crs_info.west_lon_degree)
118
+ assert_equal(18.11, crs_info.south_lat_degree)
119
+ assert_equal(-62.92, crs_info.east_lon_degree)
120
+ assert_equal(18.33, crs_info.north_lat_degree)
121
+ assert_equal("Anguilla - onshore.", crs_info.area_name)
122
+ assert_equal("Transverse Mercator", crs_info.projection_method_name)
123
+ assert_equal("Earth", crs_info.celestial_body_name)
124
+ end
125
+
126
+ def test_crs_info_epsg
127
+ database = Proj::Database.new(Proj::Context.current)
128
+ crs_infos = database.crs_info("EPSG")
129
+
130
+ minimum = case
131
+ when Proj::Api::PROJ_VERSION >= '9.6.0'
132
+ 7644
133
+ when Proj::Api::PROJ_VERSION >= '9.3.0'
134
+ 7477
135
+ when Proj::Api::PROJ_VERSION >= '9.0.0'
136
+ 7251
137
+ else
138
+ 7056
139
+ end
140
+ assert_operator(crs_infos.count, :>=, minimum)
141
+ end
142
+
143
+ def test_crs_info_geodetic
144
+ database = Proj::Database.new(Proj::Context.current)
145
+ params = Proj::Parameters.new
146
+ params.types = [:PJ_TYPE_GEODETIC_CRS]
147
+ crs_infos = database.crs_info("EPSG", params)
148
+
149
+ minimum = case
150
+ when Proj::Api::PROJ_VERSION >= '9.6.0'
151
+ 1045
152
+ when Proj::Api::PROJ_VERSION >= '9.3.0'
153
+ 997
154
+ when Proj::Api::PROJ_VERSION >= '9.0.0'
155
+ 943
156
+ else
157
+ 930
158
+ end
159
+
160
+ assert_operator(crs_infos.count, :>=, minimum)
161
+ end
162
+
163
+ def test_crs_info_geographic
164
+ database = Proj::Database.new(Proj::Context.current)
165
+ params = Proj::Parameters.new
166
+ params.types = [:PJ_TYPE_GEOGRAPHIC_2D_CRS, :PJ_TYPE_PROJECTED_CRS]
167
+ crs_infos = database.crs_info("EPSG", params)
168
+
169
+ minimum = case
170
+ when Proj::Api::PROJ_VERSION >= '9.6.0'
171
+ 5910
172
+ when Proj::Api::PROJ_VERSION >= '9.3.0'
173
+ 5839
174
+ when Proj::Api::PROJ_VERSION >= '9.0.0'
175
+ 5689
176
+ else
177
+ 5534
178
+ end
179
+
180
+ assert_operator(crs_infos.count, :>=, minimum)
181
+ end
182
+
183
+ def test_crs_info_bounds_inclusive
184
+ database = Proj::Database.new(Proj::Context.current)
185
+ params = Proj::Parameters.new
186
+ params.types = [:PJ_TYPE_PROJECTED_CRS]
187
+ params.bbox_valid = 1
188
+ params.west_lon_degree = 2
189
+ params.south_lat_degree = 49
190
+ params.east_lon_degree = 2.1
191
+ params.north_lat_degree = 49.1
192
+
193
+ crs_infos = database.crs_info("EPSG", params)
194
+
195
+ minimum = case
196
+ when Proj::Api::PROJ_VERSION >= '9.6.0'
197
+ 42
198
+ when Proj::Api::PROJ_VERSION >= '9.3.0'
199
+ 37
200
+ else
201
+ 35
202
+ end
203
+
204
+ assert_operator(crs_infos.count, :>=, minimum)
205
+ end
206
+
207
+ def test_crs_info_bounds_exclusive
208
+ database = Proj::Database.new(Proj::Context.current)
209
+ params = Proj::Parameters.new
210
+ params.types = [:PJ_TYPE_PROJECTED_CRS]
211
+ params.bbox_valid = 1
212
+ params.west_lon_degree = 2
213
+ params.south_lat_degree = 49
214
+ params.east_lon_degree = 2.1
215
+ params.north_lat_degree = 49.1
216
+ params.crs_area_of_use_contains_bbox = 0
217
+
218
+ crs_infos = database.crs_info("EPSG", params)
219
+
220
+ minimum = case
221
+ when Proj::Api::PROJ_VERSION >= '9.6.0'
222
+ 45
223
+ when Proj::Api::PROJ_VERSION >= '9.3.0'
224
+ 40
225
+ else
226
+ 38
227
+ end
228
+
229
+ assert_operator(crs_infos.count, :>=, minimum)
230
+ end
231
+
232
+ def test_crs_info_celestial_body
233
+ database = Proj::Database.new(Proj::Context.current)
234
+ params = Proj::Parameters.new
235
+ params.celestial_body_name = "Earth"
236
+ crs_infos = database.crs_info("EPSG", params)
237
+
238
+ minimum = case
239
+ when Proj::Api::PROJ_VERSION >= '9.6.0'
240
+ 7119
241
+ when Proj::Api::PROJ_VERSION >= '9.3.0'
242
+ 6951
243
+ when Proj::Api::PROJ_VERSION >= '9.0.0'
244
+ 6723
245
+ else
246
+ 6532
247
+ end
248
+
249
+ assert_operator(crs_infos.count, :>=, minimum)
250
+ end
251
+
252
+ def test_crs_info_celestial_body_gc
253
+ database = Proj::Database.new(Proj::Context.current)
254
+ params = Proj::Parameters.new
255
+ params.celestial_body_name = "Earth"
256
+ GC.start
257
+ crs_infos = database.crs_info("EPSG", params)
258
+ assert_operator(crs_infos.count, :>, 0)
259
+ end
260
+
261
+ def test_unit
262
+ database = Proj::Database.new(Proj::Context.current)
263
+ unit = database.unit("EPSG", "9001")
264
+ assert_equal("EPSG", unit.auth_name)
265
+ assert_equal("9001", unit.code)
266
+ assert_equal("metre", unit.name)
267
+ assert_equal("linear", unit.category)
268
+ assert_equal(1.0, unit.conv_factor)
269
+ refute(unit.proj_short_name)
270
+ refute(unit.deprecated)
271
+ end
272
+
273
+ def test_geoid_models
274
+ database = Proj::Database.new(Proj::Context.current)
275
+ models = database.geoid_models("EPSG", "5703")
276
+
277
+ assert_equal(8, models.size)
278
+
279
+ expected = %w[GEOID03 GEOID06 GEOID09 GEOID12A GEOID12B GEOID18 GEOID99 GGM10]
280
+ assert_equal(expected, models.strings)
281
+ end
282
+
283
+ def test_celestial_bodies
284
+ database = Proj::Database.new(Proj::Context.current)
285
+ bodies = database.celestial_bodies
286
+
287
+ expected = case
288
+ when Proj::Api::PROJ_VERSION >= '9.0.0'
289
+ 176
290
+ else
291
+ 170
292
+ end
293
+
294
+ assert_equal(expected, bodies.size)
295
+
296
+ celestial_body = bodies[0]
297
+ assert_equal('ESRI', celestial_body.auth_name)
298
+ assert_equal('1_Ceres', celestial_body.name)
299
+ end
300
+
301
+ def test_celestial_bodies_authority
302
+ database = Proj::Database.new(Proj::Context.current)
303
+ bodies = database.celestial_bodies('ESRI')
304
+
305
+ expected = case
306
+ when Proj::Api::PROJ_VERSION >= '9.0.0'
307
+ 78
308
+ else
309
+ 72
310
+ end
311
+
312
+ assert_equal(expected, bodies.size)
313
+
314
+ celestial_body = bodies[0]
315
+ assert_equal('ESRI', celestial_body.auth_name)
316
+ assert_equal('1_Ceres', celestial_body.name)
317
+ end
318
+
319
+ def test_suggest_code_for
320
+ crs = create_crs
321
+ database = Proj::Database.new(crs.context)
322
+
323
+ code = database.suggest_code_for(crs, "HOBU", false)
324
+ assert_equal("MYGDA2020", code)
325
+
326
+ code = database.suggest_code_for(crs, "HOBU", true)
327
+ assert_equal("1", code)
328
+ end
329
+
330
+ def test_celestial_body_name_geographic_crs
331
+ crs = Proj::Crs.create_from_database("EPSG", "4326", :PJ_CATEGORY_CRS)
332
+ database = Proj::Database.new(crs.context)
333
+ name = database.celestial_body_name(crs)
334
+ assert_equal("Earth", name)
335
+ end
336
+
337
+ def test_celestial_body_name_geographic_projected_crs
338
+ crs = Proj::Crs.create_from_database("EPSG", "32631", :PJ_CATEGORY_CRS)
339
+ database = Proj::Database.new(crs.context)
340
+ name = database.celestial_body_name(crs)
341
+ assert_equal("Earth", name)
342
+ end
343
+
344
+ def test_celestial_body_name_vertical_crs
345
+ crs = Proj::Crs.create_from_database("EPSG", "3855", :PJ_CATEGORY_CRS)
346
+ database = Proj::Database.new(crs.context)
347
+ name = database.celestial_body_name(crs)
348
+ assert_equal("Earth", name)
349
+ end
350
+
351
+ def test_celestial_body_name_compound_crs
352
+ crs = Proj::Crs.create_from_database("EPSG", "9518", :PJ_CATEGORY_CRS)
353
+ database = Proj::Database.new(crs.context)
354
+ name = database.celestial_body_name(crs)
355
+ assert_equal("Earth", name)
356
+ end
357
+
358
+ def test_celestial_body_name_geodetic_datum
359
+ crs = Proj::Crs.create_from_database("EPSG", "6267", :PJ_CATEGORY_DATUM)
360
+ database = Proj::Database.new(crs.context)
361
+ name = database.celestial_body_name(crs)
362
+ assert_equal("Earth", name)
363
+ end
364
+
365
+ def test_celestial_body_name_datum_ensemble
366
+ crs = Proj::Crs.create_from_database("EPSG", "6326", :PJ_CATEGORY_DATUM_ENSEMBLE)
367
+ database = Proj::Database.new(crs.context)
368
+ name = database.celestial_body_name(crs)
369
+ assert_equal("Earth", name)
370
+ end
371
+
372
+ def test_celestial_body_name_vertical_datum
373
+ crs = Proj::Crs.create_from_database("EPSG", "1027", :PJ_CATEGORY_DATUM)
374
+ database = Proj::Database.new(crs.context)
375
+ name = database.celestial_body_name(crs)
376
+ assert_equal("Earth", name)
377
+ end
378
+
379
+ def test_celestial_body_name_ellipsoid
380
+ crs = Proj::Crs.create_from_database("EPSG", "7030", :PJ_CATEGORY_ELLIPSOID)
381
+ database = Proj::Database.new(crs.context)
382
+ name = database.celestial_body_name(crs)
383
+ assert_equal("Earth", name)
384
+ end
385
+
386
+ def test_celestial_body_name_ellipsoid_not_earth
387
+ crs = Proj::Crs.create_from_database("ESRI", "107903", :PJ_CATEGORY_ELLIPSOID)
388
+ database = Proj::Database.new(crs.context)
389
+ name = database.celestial_body_name(crs)
390
+ assert_equal("Moon", name)
391
+ end
392
+
393
+ def test_celestial_body_name_error
394
+ crs = Proj::Crs.create_from_database("EPSG", "1591", :PJ_CATEGORY_COORDINATE_OPERATION)
395
+ database = Proj::Database.new(crs.context)
396
+ name = database.celestial_body_name(crs)
397
+ refute(name)
398
+ end
399
+
400
+ if Proj::Api::PROJ_VERSION >= '7.0.0'
401
+ # This test causes a segmentation fault on proj6
402
+ def test_metadata_invalid
403
+ database = Proj::Database.new(Proj::Context.current)
404
+ metadata = database.metadata('foo')
405
+ refute(metadata)
406
+ end
407
+ end
360
408
  end