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,76 +1,76 @@
1
- # encoding: UTF-8
2
-
3
- require_relative './abstract_test'
4
-
5
- class PrimeMeridianTest < AbstractTest
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
- prime_meridians = Proj::PrimeMeridian.built_in.map {|prime_merdian| prime_merdian[:id] }
36
- assert(prime_meridians.include?('greenwich'))
37
- assert(prime_meridians.include?('athens'))
38
- assert(prime_meridians.include?('lisbon'))
39
- assert(prime_meridians.include?('rome'))
40
- end
41
-
42
- def test_from_database
43
- meridian = Proj::PrimeMeridian.create_from_database("EPSG", "8903", :PJ_CATEGORY_PRIME_MERIDIAN)
44
- assert_instance_of(Proj::PrimeMeridian, meridian)
45
- assert_equal(:PJ_TYPE_PRIME_MERIDIAN, meridian.proj_type)
46
- assert_equal("EPSG", meridian.auth_name)
47
- assert_equal("Paris", meridian.name)
48
- assert_equal("8903", meridian.id_code)
49
- end
50
-
51
- def test_parameters
52
- meridian = parameter_crs.prime_meridian
53
- params = meridian.parameters
54
-
55
- expected = {longitude: 0.0,
56
- unit_conv_factor: 0.017453292519943295,
57
- unit_name: "degree"}
58
-
59
- assert_equal(expected, params)
60
- end
61
-
62
- def test_longitude
63
- meridian = parameter_crs.prime_meridian
64
- assert_equal(0.0, meridian.longitude)
65
- end
66
-
67
- def test_unit_conv_factor
68
- meridian = parameter_crs.prime_meridian
69
- assert_equal(0.017453292519943295, meridian.unit_conv_factor)
70
- end
71
-
72
- def test_unit_name
73
- meridian = parameter_crs.prime_meridian
74
- assert_equal("degree", meridian.unit_name)
75
- end
1
+ # encoding: UTF-8
2
+
3
+ require_relative './abstract_test'
4
+
5
+ class PrimeMeridianTest < AbstractTest
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
+ prime_meridians = Proj::PrimeMeridian.built_in.map {|prime_merdian| prime_merdian[:id] }
36
+ assert(prime_meridians.include?('greenwich'))
37
+ assert(prime_meridians.include?('athens'))
38
+ assert(prime_meridians.include?('lisbon'))
39
+ assert(prime_meridians.include?('rome'))
40
+ end
41
+
42
+ def test_from_database
43
+ meridian = Proj::PrimeMeridian.create_from_database("EPSG", "8903", :PJ_CATEGORY_PRIME_MERIDIAN)
44
+ assert_instance_of(Proj::PrimeMeridian, meridian)
45
+ assert_equal(:PJ_TYPE_PRIME_MERIDIAN, meridian.proj_type)
46
+ assert_equal("EPSG", meridian.auth_name)
47
+ assert_equal("Paris", meridian.name)
48
+ assert_equal("8903", meridian.id_code)
49
+ end
50
+
51
+ def test_parameters
52
+ meridian = parameter_crs.prime_meridian
53
+ params = meridian.parameters
54
+
55
+ expected = {longitude: 0.0,
56
+ unit_conv_factor: 0.017453292519943295,
57
+ unit_name: "degree"}
58
+
59
+ assert_equal(expected, params)
60
+ end
61
+
62
+ def test_longitude
63
+ meridian = parameter_crs.prime_meridian
64
+ assert_equal(0.0, meridian.longitude)
65
+ end
66
+
67
+ def test_unit_conv_factor
68
+ meridian = parameter_crs.prime_meridian
69
+ assert_equal(0.017453292519943295, meridian.unit_conv_factor)
70
+ end
71
+
72
+ def test_unit_name
73
+ meridian = parameter_crs.prime_meridian
74
+ assert_equal("degree", meridian.unit_name)
75
+ end
76
76
  end
data/test/proj_test.rb CHANGED
@@ -1,59 +1,59 @@
1
- # encoding: UTF-8
2
-
3
- require_relative './abstract_test'
4
-
5
- class ProjTest < AbstractTest
6
- def test_info
7
- info = Proj.info
8
- assert([4,6,7,8,9].include?(info[:major]))
9
- assert([0,1,2,3].include?(info[:minor]))
10
- assert([0,1,2,3].include?(info[:patch]))
11
- refute_nil(info[:release])
12
- refute_nil(info[:searchpath])
13
- assert(info[:paths].null?)
14
- assert(0, info[:path_count])
15
- end
16
-
17
- def test_search_paths
18
- search_paths = Proj.search_paths
19
- assert_instance_of(Array, search_paths)
20
- refute(search_paths.empty?)
21
- end
22
-
23
- def test_init_file_info
24
- info = Proj.init_file_info("EPSG")
25
- assert_equal("EPSG", info[:name].to_ptr.read_string)
26
- assert(info[:filename].to_ptr.read_string.empty?)
27
- # Info returns gibberish hex values, need to look at Proj source code
28
- # and see what is going on
29
- #assert_equal("epsg", info[:version].to_ptr.read_string)
30
- #assert_equal("", info[:origin].to_ptr.read_string)
31
- #assert_equal("", info[:lastupdate].to_ptr.read_string)
32
- end
33
-
34
- def test_version
35
- assert_instance_of(Gem::Version, Proj::Api::PROJ_VERSION)
36
- assert(Proj::Api::PROJ_VERSION.canonical_segments.first >= 5)
37
- end
38
-
39
- def test_degrees_to_radians
40
- radians = Proj.degrees_to_radians(180)
41
- assert_equal(Math::PI, radians)
42
- end
43
-
44
- def test_radians_to_degrees
45
- degrees = Proj.radians_to_degrees(-Math::PI)
46
- assert_equal(-180, degrees)
47
- end
48
-
49
- def test_degrees_minutes_seconds_to_radians
50
- value = "19°46'27\"E"
51
- radians = Proj.degrees_minutes_seconds_to_radians(value)
52
- assert_in_delta(0.34512432, radians, 1e-7)
53
- end
54
-
55
- def test_radians_to_degrees_minutes_seconds
56
- result = Proj.radians_to_degrees_minutes_seconds(Math::PI)
57
- assert_equal("180dN", result)
58
- end
1
+ # encoding: UTF-8
2
+
3
+ require_relative './abstract_test'
4
+
5
+ class ProjTest < AbstractTest
6
+ def test_info
7
+ info = Proj.info
8
+ assert(info[:major] >= 4)
9
+ assert(info[:minor] >= 0)
10
+ assert(info[:patch] >= 0)
11
+ refute_nil(info[:release])
12
+ refute_nil(info[:searchpath])
13
+ assert(info[:paths].null?)
14
+ assert(0, info[:path_count])
15
+ end
16
+
17
+ def test_search_paths
18
+ search_paths = Proj.search_paths
19
+ assert_instance_of(Array, search_paths)
20
+ refute(search_paths.empty?)
21
+ end
22
+
23
+ def test_init_file_info
24
+ info = Proj.init_file_info("EPSG")
25
+ assert_equal("EPSG", info[:name].to_ptr.read_string)
26
+ assert(info[:filename].to_ptr.read_string.empty?)
27
+ # Info returns gibberish hex values, need to look at Proj source code
28
+ # and see what is going on
29
+ #assert_equal("epsg", info[:version].to_ptr.read_string)
30
+ #assert_equal("", info[:origin].to_ptr.read_string)
31
+ #assert_equal("", info[:lastupdate].to_ptr.read_string)
32
+ end
33
+
34
+ def test_version
35
+ assert_instance_of(Gem::Version, Proj::Api::PROJ_VERSION)
36
+ assert(Proj::Api::PROJ_VERSION.canonical_segments.first >= 5)
37
+ end
38
+
39
+ def test_degrees_to_radians
40
+ radians = Proj.degrees_to_radians(180)
41
+ assert_equal(Math::PI, radians)
42
+ end
43
+
44
+ def test_radians_to_degrees
45
+ degrees = Proj.radians_to_degrees(-Math::PI)
46
+ assert_equal(-180, degrees)
47
+ end
48
+
49
+ def test_degrees_minutes_seconds_to_radians
50
+ value = "19°46'27\"E"
51
+ radians = Proj.degrees_minutes_seconds_to_radians(value)
52
+ assert_in_delta(0.34512432, radians, 1e-7)
53
+ end
54
+
55
+ def test_radians_to_degrees_minutes_seconds
56
+ result = Proj.radians_to_degrees_minutes_seconds(Math::PI)
57
+ assert_equal("180dN", result)
58
+ end
59
59
  end