proj4rb 3.0.0 → 4.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 (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