proj4rb 4.1.1 → 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 (116) 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 -38
  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 -680
  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 -672
  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 +54 -25
  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 -5
  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 -1082
  71. data/test/database_test.rb +407 -391
  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 -205
  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 -187
  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 +44 -32
  95. data/ChangeLog +0 -94
  96. data/README.rdoc +0 -189
  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_9_4.rb +0 -6
  114. data/lib/api/api_experimental.rb +0 -201
  115. data/lib/proj/file_api.rb +0 -166
  116. data/lib/proj/network_api.rb +0 -92
@@ -1,392 +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
- if Proj::Api::PROJ_VERSION >= '9.3.0'
53
- types_with_no_codes = [:PJ_TYPE_TEMPORAL_CRS, :PJ_TYPE_BOUND_CRS, :PJ_TYPE_UNKNOWN, :PJ_TYPE_ENGINEERING_CRS,
54
- :PJ_TYPE_TEMPORAL_DATUM, :PJ_TYPE_ENGINEERING_DATUM, :PJ_TYPE_PARAMETRIC_DATUM,
55
- :PJ_TYPE_OTHER_COORDINATE_OPERATION, :PJ_TYPE_DERIVED_PROJECTED_CRS, :PJ_TYPE_COORDINATE_METADATA]
56
- else
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]
60
- end
61
-
62
- database = Proj::Database.new(Proj::Context.current)
63
-
64
- Proj::Api::PJ_TYPE.symbols.each do |type|
65
- codes = database.codes('EPSG', type)
66
- if types_with_no_codes.include?(type)
67
- assert(codes.empty?)
68
- else
69
- refute(codes.empty?)
70
- end
71
- end
72
- end
73
-
74
- def test_authorities
75
- database = Proj::Database.new(Proj::Context.current)
76
- authorities = database.authorities
77
- assert_equal(7, authorities.count)
78
-
79
- authority = authorities[0]
80
- assert_equal('EPSG', authority)
81
-
82
- authority = authorities[1]
83
- assert_equal('ESRI', authority)
84
-
85
- authority = authorities[2]
86
- assert_equal('IAU_2015', authority)
87
-
88
- authority = authorities[3]
89
- assert_equal('IGNF', authority)
90
-
91
- authority = authorities[4]
92
- assert_equal('NKG', authority)
93
-
94
- authority = authorities[5]
95
- assert_equal('OGC', authority)
96
-
97
- authority = authorities[6]
98
- assert_equal('PROJ', authority)
99
- end
100
-
101
- def test_crs_info
102
- database = Proj::Database.new(Proj::Context.current)
103
- crs_infos = database.crs_info
104
-
105
- expected = case
106
- when Proj::Api::PROJ_VERSION >= '9.3.0'
107
- 13434
108
- when Proj::Api::PROJ_VERSION >= '9.0.0'
109
- 13107
110
- else
111
- 12609
112
- end
113
- assert_equal(expected, crs_infos.count)
114
-
115
- crs_info = crs_infos.first
116
- assert_equal("EPSG", crs_info.auth_name)
117
- assert_equal("2000", crs_info.code)
118
- assert_equal("Anguilla 1957 / British West Indies Grid", crs_info.name)
119
- assert_equal(:PJ_TYPE_PROJECTED_CRS, crs_info.crs_type)
120
- refute(crs_info.deprecated)
121
- assert(crs_info.bbox_valid)
122
- assert_equal(-63.22, crs_info.west_lon_degree)
123
- assert_equal(18.11, crs_info.south_lat_degree)
124
- assert_equal(-62.92, crs_info.east_lon_degree)
125
- assert_equal(18.33, crs_info.north_lat_degree)
126
- assert_equal("Anguilla - onshore.", crs_info.area_name)
127
- assert_equal("Transverse Mercator", crs_info.projection_method_name)
128
- assert_equal("Earth", crs_info.celestial_body_name)
129
- end
130
-
131
- def test_crs_info_epsg
132
- database = Proj::Database.new(Proj::Context.current)
133
- crs_infos = database.crs_info("EPSG")
134
-
135
- expected = case
136
- when Proj::Api::PROJ_VERSION >= '9.3.0'
137
- 7477
138
- when Proj::Api::PROJ_VERSION >= '9.0.0'
139
- 7251
140
- else
141
- 7056
142
- end
143
- assert_equal(expected, crs_infos.count)
144
- end
145
-
146
- def test_crs_info_geodetic
147
- database = Proj::Database.new(Proj::Context.current)
148
- params = Proj::Parameters.new
149
- params.types = [:PJ_TYPE_GEODETIC_CRS]
150
- crs_infos = database.crs_info("EPSG", params)
151
-
152
- expected = case
153
- when Proj::Api::PROJ_VERSION >= '9.3.0'
154
- 997
155
- when Proj::Api::PROJ_VERSION >= '9.0.0'
156
- 943
157
- else
158
- 930
159
- end
160
-
161
- assert_equal(expected, crs_infos.count)
162
- end
163
-
164
- def test_crs_info_geographic
165
- database = Proj::Database.new(Proj::Context.current)
166
- params = Proj::Parameters.new
167
- params.types = [:PJ_TYPE_GEOGRAPHIC_2D_CRS, :PJ_TYPE_PROJECTED_CRS]
168
- crs_infos = database.crs_info("EPSG", params)
169
-
170
- expected = case
171
- when Proj::Api::PROJ_VERSION >= '9.3.0'
172
- 5839
173
- when Proj::Api::PROJ_VERSION >= '9.0.0'
174
- 5689
175
- else
176
- 5534
177
- end
178
-
179
- assert_equal(expected, crs_infos.count)
180
- end
181
-
182
- def test_crs_info_bounds_inclusive
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
-
192
- crs_infos = database.crs_info("EPSG", params)
193
-
194
- expected = case
195
- when Proj::Api::PROJ_VERSION >= '9.3.0'
196
- 37
197
- else
198
- 35
199
- end
200
-
201
- assert_equal(expected, crs_infos.count)
202
- end
203
-
204
- def test_crs_info_bounds_exclusive
205
- database = Proj::Database.new(Proj::Context.current)
206
- params = Proj::Parameters.new
207
- params.types = [:PJ_TYPE_PROJECTED_CRS]
208
- params.bbox_valid = 1
209
- params.west_lon_degree = 2
210
- params.south_lat_degree = 49
211
- params.east_lon_degree = 2.1
212
- params.north_lat_degree = 49.1
213
- params.crs_area_of_use_contains_bbox = 0
214
-
215
- crs_infos = database.crs_info("EPSG", params)
216
-
217
- expected = case
218
- when Proj::Api::PROJ_VERSION >= '9.3.0'
219
- 40
220
- else
221
- 38
222
- end
223
-
224
- assert_equal(expected, crs_infos.count)
225
- end
226
-
227
- def test_crs_info_celestial_body
228
- database = Proj::Database.new(Proj::Context.current)
229
- params = Proj::Parameters.new
230
- params.celestial_body_name = "Earth"
231
- crs_infos = database.crs_info("EPSG", params)
232
-
233
- expected = case
234
- when Proj::Api::PROJ_VERSION >= '9.3.0'
235
- 6951
236
- when Proj::Api::PROJ_VERSION >= '9.0.0'
237
- 6723
238
- else
239
- 6532
240
- end
241
-
242
- assert_equal(expected, crs_infos.count)
243
- end
244
-
245
- def test_unit
246
- database = Proj::Database.new(Proj::Context.current)
247
- unit = database.unit("EPSG", "9001")
248
- assert_equal("EPSG", unit.auth_name)
249
- assert_equal("9001", unit.code)
250
- assert_equal("metre", unit.name)
251
- assert_equal("linear", unit.category)
252
- assert_equal(1.0, unit.conv_factor)
253
- refute(unit.proj_short_name)
254
- refute(unit.deprecated)
255
- end
256
-
257
- def test_geoid_models
258
- database = Proj::Database.new(Proj::Context.current)
259
- models = database.geoid_models("EPSG", "5703")
260
-
261
- assert_equal(8, models.size)
262
-
263
- expected = %w[GEOID03 GEOID06 GEOID09 GEOID12A GEOID12B GEOID18 GEOID99 GGM10]
264
- assert_equal(expected, models.strings)
265
- end
266
-
267
- def test_celestial_bodies
268
- database = Proj::Database.new(Proj::Context.current)
269
- bodies = database.celestial_bodies
270
-
271
- expected = case
272
- when Proj::Api::PROJ_VERSION >= '9.0.0'
273
- 176
274
- else
275
- 170
276
- end
277
-
278
- assert_equal(expected, bodies.size)
279
-
280
- celestial_body = bodies[0]
281
- assert_equal('ESRI', celestial_body.auth_name)
282
- assert_equal('1_Ceres', celestial_body.name)
283
- end
284
-
285
- def test_celestial_bodies_authority
286
- database = Proj::Database.new(Proj::Context.current)
287
- bodies = database.celestial_bodies('ESRI')
288
-
289
- expected = case
290
- when Proj::Api::PROJ_VERSION >= '9.0.0'
291
- 78
292
- else
293
- 72
294
- end
295
-
296
- assert_equal(expected, bodies.size)
297
-
298
- celestial_body = bodies[0]
299
- assert_equal('ESRI', celestial_body.auth_name)
300
- assert_equal('1_Ceres', celestial_body.name)
301
- end
302
-
303
- def test_suggest_code_for
304
- crs = create_crs
305
- database = Proj::Database.new(crs.context)
306
-
307
- code = database.suggest_code_for(crs, "HOBU", false)
308
- assert_equal("MYGDA2020", code)
309
-
310
- code = database.suggest_code_for(crs, "HOBU", true)
311
- assert_equal("1", code)
312
- end
313
-
314
- def test_celestial_body_name_geographic_crs
315
- crs = Proj::Crs.create_from_database("EPSG", "4326", :PJ_CATEGORY_CRS)
316
- database = Proj::Database.new(crs.context)
317
- name = database.celestial_body_name(crs)
318
- assert_equal("Earth", name)
319
- end
320
-
321
- def test_celestial_body_name_geographic_projected_crs
322
- crs = Proj::Crs.create_from_database("EPSG", "32631", :PJ_CATEGORY_CRS)
323
- database = Proj::Database.new(crs.context)
324
- name = database.celestial_body_name(crs)
325
- assert_equal("Earth", name)
326
- end
327
-
328
- def test_celestial_body_name_vertical_crs
329
- crs = Proj::Crs.create_from_database("EPSG", "3855", :PJ_CATEGORY_CRS)
330
- database = Proj::Database.new(crs.context)
331
- name = database.celestial_body_name(crs)
332
- assert_equal("Earth", name)
333
- end
334
-
335
- def test_celestial_body_name_compound_crs
336
- crs = Proj::Crs.create_from_database("EPSG", "9518", :PJ_CATEGORY_CRS)
337
- database = Proj::Database.new(crs.context)
338
- name = database.celestial_body_name(crs)
339
- assert_equal("Earth", name)
340
- end
341
-
342
- def test_celestial_body_name_geodetic_datum
343
- crs = Proj::Crs.create_from_database("EPSG", "6267", :PJ_CATEGORY_DATUM)
344
- database = Proj::Database.new(crs.context)
345
- name = database.celestial_body_name(crs)
346
- assert_equal("Earth", name)
347
- end
348
-
349
- def test_celestial_body_name_datum_ensemble
350
- crs = Proj::Crs.create_from_database("EPSG", "6326", :PJ_CATEGORY_DATUM_ENSEMBLE)
351
- database = Proj::Database.new(crs.context)
352
- name = database.celestial_body_name(crs)
353
- assert_equal("Earth", name)
354
- end
355
-
356
- def test_celestial_body_name_vertical_datum
357
- crs = Proj::Crs.create_from_database("EPSG", "1027", :PJ_CATEGORY_DATUM)
358
- database = Proj::Database.new(crs.context)
359
- name = database.celestial_body_name(crs)
360
- assert_equal("Earth", name)
361
- end
362
-
363
- def test_celestial_body_name_ellipsoid
364
- crs = Proj::Crs.create_from_database("EPSG", "7030", :PJ_CATEGORY_ELLIPSOID)
365
- database = Proj::Database.new(crs.context)
366
- name = database.celestial_body_name(crs)
367
- assert_equal("Earth", name)
368
- end
369
-
370
- def test_celestial_body_name_ellipsoid_not_earth
371
- crs = Proj::Crs.create_from_database("ESRI", "107903", :PJ_CATEGORY_ELLIPSOID)
372
- database = Proj::Database.new(crs.context)
373
- name = database.celestial_body_name(crs)
374
- assert_equal("Moon", name)
375
- end
376
-
377
- def test_celestial_body_name_error
378
- crs = Proj::Crs.create_from_database("EPSG", "1591", :PJ_CATEGORY_COORDINATE_OPERATION)
379
- database = Proj::Database.new(crs.context)
380
- name = database.celestial_body_name(crs)
381
- refute(name)
382
- end
383
-
384
- if Proj::Api::PROJ_VERSION >= '7.0.0'
385
- # This test causes a segmentation fault on proj6
386
- def test_metadata_invalid
387
- database = Proj::Database.new(Proj::Context.current)
388
- metadata = database.metadata('foo')
389
- refute(metadata)
390
- end
391
- 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
392
408
  end