proj4rb 3.0.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +26 -15
  3. data/README.rdoc +82 -44
  4. data/Rakefile +27 -27
  5. data/lib/api/api.rb +96 -118
  6. data/lib/api/api_5_0.rb +331 -300
  7. data/lib/api/api_5_1.rb +6 -6
  8. data/lib/api/api_5_2.rb +4 -4
  9. data/lib/api/api_6_0.rb +116 -14
  10. data/lib/api/api_6_1.rb +4 -4
  11. data/lib/api/api_6_2.rb +9 -6
  12. data/lib/api/api_6_3.rb +6 -0
  13. data/lib/api/api_7_0.rb +68 -0
  14. data/lib/api/api_7_1.rb +73 -0
  15. data/lib/api/api_7_2.rb +14 -0
  16. data/lib/api/api_8_0.rb +6 -0
  17. data/lib/api/api_8_1.rb +24 -0
  18. data/lib/api/api_8_2.rb +6 -0
  19. data/lib/api/api_9_1.rb +7 -0
  20. data/lib/api/api_9_2.rb +9 -0
  21. data/lib/api/api_experimental.rb +196 -0
  22. data/lib/proj/area.rb +73 -32
  23. data/lib/proj/axis_info.rb +44 -0
  24. data/lib/proj/bounds.rb +13 -0
  25. data/lib/proj/context.rb +174 -28
  26. data/lib/proj/conversion.rb +92 -0
  27. data/lib/proj/coordinate.rb +281 -197
  28. data/lib/proj/coordinate_operation_mixin.rb +381 -0
  29. data/lib/proj/coordinate_system.rb +137 -0
  30. data/lib/proj/crs.rb +672 -204
  31. data/lib/proj/crs_info.rb +47 -0
  32. data/lib/proj/database.rb +305 -0
  33. data/lib/proj/datum.rb +32 -0
  34. data/lib/proj/datum_ensemble.rb +34 -0
  35. data/lib/proj/ellipsoid.rb +77 -41
  36. data/lib/proj/error.rb +62 -9
  37. data/lib/proj/file_api.rb +166 -0
  38. data/lib/proj/grid.rb +121 -0
  39. data/lib/proj/grid_cache.rb +64 -0
  40. data/lib/proj/grid_info.rb +19 -0
  41. data/lib/proj/network_api.rb +92 -0
  42. data/lib/proj/operation.rb +42 -42
  43. data/lib/proj/operation_factory_context.rb +136 -0
  44. data/lib/proj/parameter.rb +38 -0
  45. data/lib/proj/parameters.rb +106 -0
  46. data/lib/proj/pj_object.rb +670 -80
  47. data/lib/proj/pj_objects.rb +44 -0
  48. data/lib/proj/prime_meridian.rb +65 -39
  49. data/lib/proj/projection.rb +698 -207
  50. data/lib/proj/session.rb +46 -0
  51. data/lib/proj/strings.rb +32 -0
  52. data/lib/proj/transformation.rb +101 -60
  53. data/lib/proj/unit.rb +108 -53
  54. data/lib/proj.rb +110 -9
  55. data/proj4rb.gemspec +5 -5
  56. data/test/abstract_test.rb +23 -1
  57. data/test/context_test.rb +172 -82
  58. data/test/conversion_test.rb +368 -0
  59. data/test/coordinate_system_test.rb +144 -0
  60. data/test/crs_test.rb +770 -71
  61. data/test/database_test.rb +360 -0
  62. data/test/datum_ensemble_test.rb +65 -0
  63. data/test/datum_test.rb +55 -0
  64. data/test/ellipsoid_test.rb +64 -18
  65. data/test/file_api_test.rb +66 -0
  66. data/test/grid_cache_test.rb +72 -0
  67. data/test/grid_test.rb +141 -0
  68. data/test/network_api_test.rb +45 -0
  69. data/test/operation_factory_context_test.rb +201 -0
  70. data/test/parameters_test.rb +40 -0
  71. data/test/pj_object_test.rb +179 -0
  72. data/test/prime_meridian_test.rb +76 -0
  73. data/test/proj_test.rb +46 -4
  74. data/test/projection_test.rb +646 -222
  75. data/test/session_test.rb +78 -0
  76. data/test/transformation_test.rb +149 -7
  77. data/test/unit_test.rb +57 -28
  78. metadata +51 -13
  79. data/lib/api/api_4_9.rb +0 -31
  80. data/lib/proj/config.rb +0 -70
  81. data/lib/proj/point.rb +0 -72
  82. data/test/prime_meridians_test.rb +0 -33
@@ -0,0 +1,360 @@
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.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
360
+ end
@@ -0,0 +1,65 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative './abstract_test'
4
+
5
+ class DatumEnsembleTest < AbstractTest
6
+ def get_datum_ensemble
7
+ wkt = <<~EOS
8
+ GEOGCRS["ETRS89",
9
+ ENSEMBLE["European Terrestrial Reference System 1989 ensemble",
10
+ MEMBER["European Terrestrial Reference Frame 1989"],
11
+ MEMBER["European Terrestrial Reference Frame 1990"],
12
+ MEMBER["European Terrestrial Reference Frame 1991"],
13
+ MEMBER["European Terrestrial Reference Frame 1992"],
14
+ MEMBER["European Terrestrial Reference Frame 1993"],
15
+ MEMBER["European Terrestrial Reference Frame 1994"],
16
+ MEMBER["European Terrestrial Reference Frame 1996"],
17
+ MEMBER["European Terrestrial Reference Frame 1997"],
18
+ MEMBER["European Terrestrial Reference Frame 2000"],
19
+ MEMBER["European Terrestrial Reference Frame 2005"],
20
+ MEMBER["European Terrestrial Reference Frame 2014"],
21
+ ELLIPSOID["GRS 1980",6378137,298.257222101,
22
+ LENGTHUNIT["metre",1]],
23
+ ENSEMBLEACCURACY[0.1]],
24
+ PRIMEM["Greenwich",0,
25
+ ANGLEUNIT["degree",0.0174532925199433]],
26
+ CS[ellipsoidal,2],
27
+ AXIS["geodetic latitude (Lat)",north,
28
+ ORDER[1],
29
+ ANGLEUNIT["degree",0.0174532925199433]],
30
+ AXIS["geodetic longitude (Lon)",east,
31
+ ORDER[2],
32
+ ANGLEUNIT["degree",0.0174532925199433]]]
33
+ EOS
34
+
35
+ crs = Proj::Crs.create(wkt)
36
+ crs.datum_ensemble
37
+ end
38
+
39
+ def test_count
40
+ ensemble = get_datum_ensemble
41
+ assert_equal(11, ensemble.count)
42
+ end
43
+
44
+ def test_member
45
+ ensemble = get_datum_ensemble
46
+
47
+ member = ensemble[0]
48
+ assert_equal(:PJ_TYPE_GEODETIC_REFERENCE_FRAME, member.proj_type)
49
+ assert_equal("European Terrestrial Reference Frame 1989", member.name)
50
+ end
51
+
52
+ def test_member_invalid
53
+ ensemble = get_datum_ensemble
54
+ member = ensemble[-1]
55
+ refute(member)
56
+
57
+ member = ensemble[100]
58
+ refute(member)
59
+ end
60
+
61
+ def test_accuracy
62
+ ensemble = get_datum_ensemble
63
+ assert_equal(0.1, ensemble.accuracy)
64
+ end
65
+ end
@@ -0,0 +1,55 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative './abstract_test'
4
+
5
+ class DatumTest < AbstractTest
6
+ def test_datum
7
+ datum = Proj::PjObject.create_from_database("EPSG", "1061", :PJ_CATEGORY_DATUM)
8
+ assert_equal(:PJ_TYPE_DYNAMIC_GEODETIC_REFERENCE_FRAME, datum.proj_type)
9
+ assert_equal("International Terrestrial Reference Frame 2008", datum.name)
10
+ end
11
+
12
+ def test_frame_reference_epoch
13
+ datum = Proj::PjObject.create_from_database("EPSG", "1061", :PJ_CATEGORY_DATUM)
14
+ epoch = datum.frame_reference_epoch
15
+ assert_equal(2005.0, epoch)
16
+ end
17
+
18
+ def test_ellipsoid
19
+ wkt = <<~EOS
20
+ PROJCS["WGS 84 / UTM zone 31N",
21
+ GEOGCS["WGS 84",
22
+ DATUM["WGS_1984",
23
+ SPHEROID["WGS 84",6378137,298.257223563,
24
+ AUTHORITY["EPSG","7030"]],
25
+ AUTHORITY["EPSG","6326"]],
26
+ PRIMEM["Greenwich",0,
27
+ AUTHORITY["EPSG","8901"]],
28
+ UNIT["degree",0.0174532925199433,
29
+ AUTHORITY["EPSG","9122"]],
30
+ AUTHORITY["EPSG","4326"]],
31
+ PROJECTION["Transverse_Mercator"],
32
+ PARAMETER["latitude_of_origin",0],
33
+ PARAMETER["central_meridian",3],
34
+ PARAMETER["scale_factor",0.9996],
35
+ PARAMETER["false_easting",500000],
36
+ PARAMETER["false_northing",0],
37
+ UNIT["metre",1,
38
+ AUTHORITY["EPSG","9001"]],
39
+ AXIS["Easting",EAST],
40
+ AXIS["Northing",NORTH],
41
+ AUTHORITY["EPSG","32631"]]
42
+ EOS
43
+
44
+ crs = Proj::Crs.new(wkt)
45
+ ellipsoid = crs.ellipsoid
46
+ assert_equal("WGS 84", ellipsoid.name)
47
+ assert_equal(:PJ_TYPE_ELLIPSOID, ellipsoid.proj_type)
48
+
49
+ ellipsoid_from_datum = crs.datum.ellipsoid
50
+ assert_equal("WGS 84", ellipsoid_from_datum.name)
51
+ assert_equal(:PJ_TYPE_ELLIPSOID, ellipsoid_from_datum.proj_type)
52
+
53
+ assert(ellipsoid_from_datum.equivalent_to?(ellipsoid, :PJ_COMP_STRICT))
54
+ end
55
+ end
@@ -3,32 +3,78 @@
3
3
  require_relative './abstract_test'
4
4
 
5
5
  class EllipsoidTest < AbstractTest
6
- def test_get_all
7
- ellipsoids = Proj::Ellipsoid.list.map {|ellipsoid| ellipsoid.id }
6
+ def parameter_crs
7
+ wkt = <<~EOS
8
+ PROJCS["WGS 84 / UTM zone 31N",
9
+ GEOGCS["WGS 84",
10
+ DATUM["WGS_1984",
11
+ SPHEROID["WGS 84",6378137,298.257223563,
12
+ AUTHORITY["EPSG","7030"]],
13
+ AUTHORITY["EPSG","6326"]],
14
+ PRIMEM["Greenwich",0,
15
+ AUTHORITY["EPSG","8901"]],
16
+ UNIT["degree",0.0174532925199433,
17
+ AUTHORITY["EPSG","9122"]],
18
+ AUTHORITY["EPSG","4326"]],
19
+ PROJECTION["Transverse_Mercator"],
20
+ PARAMETER["latitude_of_origin",0],
21
+ PARAMETER["central_meridian",3],
22
+ PARAMETER["scale_factor",0.9996],
23
+ PARAMETER["false_easting",500000],
24
+ PARAMETER["false_northing",0],
25
+ UNIT["metre",1,
26
+ AUTHORITY["EPSG","9001"]],
27
+ AXIS["Easting",EAST],
28
+ AXIS["Northing",NORTH],
29
+ AUTHORITY["EPSG","32631"]]
30
+ EOS
31
+ Proj::Crs.new(wkt)
32
+ end
33
+
34
+ def test_built_in
35
+ ellipsoids = Proj::Ellipsoid.built_in.map {|ellipsoid| ellipsoid[:id] }
8
36
  assert(ellipsoids.include?('WGS84'))
9
37
  assert(ellipsoids.include?('bessel'))
10
38
  assert(ellipsoids.include?('lerch'))
11
39
  end
12
40
 
13
- def test_one
14
- ellipsoid = Proj::Ellipsoid.get('bessel')
15
- assert_kind_of Proj::Ellipsoid, ellipsoid
16
- assert_equal('bessel', ellipsoid.id)
17
- assert_equal('a=6377397.155', ellipsoid.major)
18
- assert_equal('rf=299.1528128', ellipsoid.ell)
19
- assert_equal('Bessel 1841', ellipsoid.name)
20
- assert_equal('bessel', ellipsoid.to_s)
21
- assert_equal('#<Proj::Ellipsoid id="bessel", major="a=6377397.155", ell="rf=299.1528128", name="Bessel 1841">', ellipsoid.inspect)
41
+ def test_from_database
42
+ ellipsoid = Proj::Ellipsoid.create_from_database("EPSG", "7030", :PJ_CATEGORY_ELLIPSOID)
43
+ assert_instance_of(Proj::Ellipsoid, ellipsoid)
44
+ assert_equal(:PJ_TYPE_ELLIPSOID, ellipsoid.proj_type)
45
+ assert_equal("EPSG", ellipsoid.auth_name)
46
+ assert_equal("WGS 84", ellipsoid.name)
47
+ assert_equal("7030", ellipsoid.id_code)
48
+ end
49
+
50
+ def test_parameters
51
+ ellipsoid = parameter_crs.ellipsoid
52
+ params = ellipsoid.parameters
53
+
54
+ expected = {semi_major_axis: 6378137.0,
55
+ semi_minor_axis: 6356752.314245179,
56
+ semi_minor_axis_computed: true,
57
+ inverse_flattening: 298.257223563}
58
+ assert_equal(expected, params)
59
+ end
60
+
61
+ def test_semi_major_axis
62
+ meridian = parameter_crs.ellipsoid
63
+ assert_equal(6378137.0, meridian.semi_major_axis)
64
+ end
65
+
66
+ def test_semi_minor_axis
67
+ meridian = parameter_crs.ellipsoid
68
+ assert_equal(6356752.314245179, meridian.semi_minor_axis)
22
69
  end
23
70
 
24
- def test_equal
25
- e1 = Proj::Ellipsoid.get('bessel')
26
- e2 = Proj::Ellipsoid.get('bessel')
27
- assert e1 == e2
71
+ def test_semi_minor_axis_computed
72
+ meridian = parameter_crs.ellipsoid
73
+ assert(meridian.semi_minor_axis_computed)
28
74
  end
29
75
 
30
- def test_failed_get
31
- ellipsoid = Proj::Ellipsoid.get('foo')
32
- assert_nil ellipsoid
76
+ def test_inverse_flattening
77
+ meridian = parameter_crs.ellipsoid
78
+ assert_equal(298.257223563, meridian.inverse_flattening)
33
79
  end
34
80
  end
@@ -0,0 +1,66 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative './abstract_test'
4
+
5
+ class FileApiTest < AbstractTest
6
+ def setup
7
+ super
8
+ # Make sure FileAPI callbacks are not GCed
9
+ #GC.stress = true
10
+ end
11
+
12
+ def teardown
13
+ super
14
+ GC.stress = false
15
+ end
16
+
17
+
18
+ def test_read
19
+ skip "This test causes a segfault due to the way Proj cleans up on shutdown"
20
+ context = Proj::Context.new
21
+ # Network needs to be on for grid delete to work
22
+ context.network_enabled = true
23
+
24
+ # Create a grid
25
+ grid = Proj::Grid.new("dk_sdfe_dvr90.tif", context)
26
+ grid.delete
27
+
28
+ grid.download
29
+ assert(grid.downloaded?)
30
+ context.network_enabled = false
31
+
32
+ # Hook up a custom FileApiImpl
33
+ context.set_file_api(Proj::FileApiImpl)
34
+
35
+ conversion = Proj::Conversion.new(<<~EOS, context)
36
+ +proj=pipeline
37
+ +step +proj=unitconvert +xy_in=deg +xy_out=rad
38
+ +step +proj=vgridshift +grids=dk_sdfe_dvr90.tif +multiplier=1
39
+ +step +proj=unitconvert +xy_in=rad +xy_out=deg
40
+ EOS
41
+
42
+ coord = Proj::Coordinate.new(lon: 12, lat: 56, z: 0)
43
+ new_coord = conversion.forward(coord)
44
+ assert_in_delta(12, new_coord.lon)
45
+ assert_in_delta(56, new_coord.lat)
46
+ assert_in_delta(36.5909996032715, new_coord.z, 1e-10)
47
+
48
+ context.destroy
49
+ end
50
+
51
+ def test_write
52
+ skip "This test causes a segfault due to the way Proj cleans up on shutdown"
53
+
54
+ context = Proj::Context.new
55
+ context.network_enabled = true
56
+
57
+ # Create a grid
58
+ grid = Proj::Grid.new("dk_sdfe_dvr90.tif", context)
59
+ grid.delete
60
+
61
+ context.set_file_api(Proj::FileApiImpl)
62
+ grid.download
63
+
64
+ assert(grid.downloaded?)
65
+ end
66
+ end