proj4rb 2.2.2 → 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 (94) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +82 -66
  3. data/Gemfile +4 -4
  4. data/README.rdoc +82 -45
  5. data/lib/api/api.rb +96 -111
  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 -0
  23. data/lib/proj/axis_info.rb +44 -0
  24. data/lib/proj/bounds.rb +13 -0
  25. data/lib/proj/context.rb +249 -0
  26. data/lib/proj/conversion.rb +92 -0
  27. data/lib/{coordinate.rb → 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 -0
  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 +78 -0
  36. data/lib/proj/error.rb +71 -0
  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/{operation.rb → 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 -0
  47. data/lib/proj/pj_objects.rb +44 -0
  48. data/lib/proj/prime_meridian.rb +66 -0
  49. data/lib/proj/projection.rb +698 -0
  50. data/lib/proj/session.rb +46 -0
  51. data/lib/proj/strings.rb +32 -0
  52. data/lib/proj/transformation.rb +102 -0
  53. data/lib/proj/unit.rb +109 -0
  54. data/lib/proj.rb +118 -17
  55. data/proj4rb.gemspec +32 -32
  56. data/test/abstract_test.rb +29 -7
  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/coordinate_test.rb +34 -34
  61. data/test/crs_test.rb +1071 -372
  62. data/test/database_test.rb +360 -0
  63. data/test/datum_ensemble_test.rb +65 -0
  64. data/test/datum_test.rb +55 -0
  65. data/test/ellipsoid_test.rb +80 -34
  66. data/test/file_api_test.rb +66 -0
  67. data/test/grid_cache_test.rb +72 -0
  68. data/test/grid_test.rb +141 -0
  69. data/test/network_api_test.rb +45 -0
  70. data/test/operation_factory_context_test.rb +201 -0
  71. data/test/operation_test.rb +29 -29
  72. data/test/parameters_test.rb +40 -0
  73. data/test/pj_object_test.rb +179 -0
  74. data/test/prime_meridian_test.rb +76 -0
  75. data/test/proj_test.rb +58 -16
  76. data/test/projection_test.rb +650 -224
  77. data/test/session_test.rb +78 -0
  78. data/test/transformation_test.rb +209 -67
  79. data/test/unit_test.rb +76 -47
  80. metadata +67 -29
  81. data/lib/api/api_4_9.rb +0 -31
  82. data/lib/area.rb +0 -32
  83. data/lib/config.rb +0 -70
  84. data/lib/context.rb +0 -103
  85. data/lib/crs.rb +0 -204
  86. data/lib/ellipsoid.rb +0 -42
  87. data/lib/error.rb +0 -18
  88. data/lib/pj_object.rb +0 -80
  89. data/lib/point.rb +0 -72
  90. data/lib/prime_meridian.rb +0 -40
  91. data/lib/projection.rb +0 -207
  92. data/lib/transformation.rb +0 -61
  93. data/lib/unit.rb +0 -54
  94. data/test/prime_meridians_test.rb +0 -33
@@ -0,0 +1,179 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative './abstract_test'
4
+ class PjObjectTest < AbstractTest
5
+ def test_clone
6
+ object = Proj::PjObject.create("+proj=longlat")
7
+ clone = object.clone
8
+ assert(object.equivalent_to?(clone, :PJ_COMP_STRICT))
9
+ assert(object.context.equal?(clone.context))
10
+ end
11
+
12
+ def test_dup
13
+ object = Proj::PjObject.create("+proj=longlat")
14
+ clone = object.dup
15
+ assert(object.equivalent_to?(clone, :PJ_COMP_STRICT))
16
+ assert(object.context.equal?(clone.context))
17
+ end
18
+
19
+ def test_equivalent
20
+ from_epsg = Proj::PjObject.create_from_database("EPSG", "7844", :PJ_CATEGORY_CRS)
21
+ from_wkt = Proj::PjObject.create_from_wkt(<<~EOS)
22
+ GEOGCRS["GDA2020",
23
+ DATUM["GDA2020",
24
+ ELLIPSOID["GRS_1980",6378137,298.257222101,
25
+ LENGTHUNIT["metre",1]]],
26
+ PRIMEM["Greenwich",0,
27
+ ANGLEUNIT["Degree",0.0174532925199433]],
28
+ CS[ellipsoidal,2],
29
+ AXIS["geodetic latitude (Lat)",north,
30
+ ORDER[1],
31
+ ANGLEUNIT["degree",0.0174532925199433]],
32
+ AXIS["geodetic longitude (Lon)",east,
33
+ ORDER[2],
34
+ ANGLEUNIT["degree",0.0174532925199433]]]"
35
+ EOS
36
+
37
+ assert(from_epsg.equivalent_to?(from_wkt, :PJ_COMP_EQUIVALENT))
38
+ end
39
+
40
+ def test_accuracy_crs
41
+ object = Proj::PjObject.create_from_database("EPSG", "4326", :PJ_CATEGORY_CRS)
42
+ assert_equal(-1, object.accuracy)
43
+ end
44
+
45
+ def test_accuracy_coordinate_operation
46
+ object = Proj::PjObject.create_from_database("EPSG", "1170", :PJ_CATEGORY_COORDINATE_OPERATION)
47
+ assert_equal(16.0, object.accuracy)
48
+ end
49
+
50
+ def test_accuracy_projection
51
+ object = Proj::Conversion.new("+proj=helmert")
52
+ assert_equal(-1.0, object.accuracy)
53
+ end
54
+
55
+ def test_id_code
56
+ crs = Proj::Crs.new('EPSG:4326')
57
+ assert_equal("4326", crs.id_code)
58
+ refute(crs.id_code(1))
59
+ end
60
+
61
+ def test_remarks_transformation
62
+ transformation = Proj::PjObject.create_from_database("EPSG", "8048", :PJ_CATEGORY_COORDINATE_OPERATION)
63
+
64
+ expected = "Scale difference in ppb where 1/billion = 1E-9. See CT codes 8444-46 for NTv2 method giving equivalent results for Christmas Island, Cocos Islands and Australia respectively. See CT code 8447 for alternative including distortion model for Australia only."
65
+ assert_equal(expected, transformation.remarks)
66
+ end
67
+
68
+ def test_remarks_conversion
69
+ operation = Proj::PjObject.create_from_database("EPSG", "3811", :PJ_CATEGORY_COORDINATE_OPERATION)
70
+
71
+ expected = "Replaces Lambert 2005."
72
+ assert_equal(expected, operation.remarks)
73
+ end
74
+
75
+ def test_scope_transformation
76
+ transformation = Proj::PjObject.create_from_database("EPSG", "8048", :PJ_CATEGORY_COORDINATE_OPERATION)
77
+
78
+ expected = "Transformation of GDA94 coordinates that have been derived through GNSS CORS."
79
+ assert_equal(expected, transformation.scope)
80
+ end
81
+
82
+ def test_scope_conversion
83
+ operation = Proj::PjObject.create_from_database("EPSG", "3811", :PJ_CATEGORY_COORDINATE_OPERATION)
84
+
85
+ expected = "Engineering survey, topographic mapping."
86
+ assert_equal(expected, operation.scope)
87
+ end
88
+
89
+ def test_scope_invalid
90
+ operation = Proj::Conversion.new("+proj=noop")
91
+ refute(operation.scope)
92
+ end
93
+
94
+ def test_factors
95
+ conversion = Proj::Conversion.new("+proj=merc +ellps=WGS84")
96
+ coord = Proj::Coordinate.new(lon: Proj.degrees_to_radians(12), lat: Proj.degrees_to_radians(55))
97
+ factors = conversion.factors(coord)
98
+
99
+ assert_in_delta(1.739526610076288, factors[:meridional_scale], 1e-7)
100
+ assert_in_delta(1.739526609938368, factors[:parallel_scale], 1e-7)
101
+ assert_in_delta(3.0259528269235867, factors[:areal_scale], 1e-7)
102
+
103
+ assert_in_delta(0.0, factors[:angular_distortion], 1e-7)
104
+ assert_in_delta(1.5707963267948966, factors[:meridian_parallel_angle], 1e-7)
105
+ assert_in_delta(0.0, factors[:meridian_convergence], 1e-7)
106
+
107
+ assert_in_delta(1.7395266100073281, factors[:tissot_semimajor], 1e-7)
108
+ assert_in_delta(1.7395266100073281, factors[:tissot_semiminor], 1e-7)
109
+
110
+ assert_in_delta(0.9999999999996122, factors[:dx_dlam], 1e-7)
111
+ assert_in_delta(0.0, factors[:dx_dphi], 1e-7)
112
+ assert_in_delta(0.0, factors[:dy_dlam], 1e-7)
113
+ assert_in_delta(1.7395897312200146, factors[:dy_dphi], 1e-7)
114
+ end
115
+
116
+ def test_create_from_name
117
+ context = Proj::Context.new
118
+ objects = Proj::PjObject.create_from_name("WGS 84", context)
119
+ assert_equal(5, objects.size)
120
+ end
121
+
122
+ def test_create_from_name_with_auth_name
123
+ context = Proj::Context.new
124
+ objects = Proj::PjObject.create_from_name("WGS 84", context, auth_name: "xx")
125
+ assert_equal(0, objects.size)
126
+ end
127
+
128
+ def test_create_from_name_with_types
129
+ context = Proj::Context.new
130
+ objects = Proj::PjObject.create_from_name("WGS 84", context, types: [:PJ_TYPE_GEODETIC_CRS, :PJ_TYPE_PROJECTED_CRS])
131
+ assert_equal(3, objects.size)
132
+ end
133
+
134
+ def test_create_from_name_with_types_and_approximate_match
135
+ context = Proj::Context.new
136
+ objects = Proj::PjObject.create_from_name("WGS 84", context, approximate_match: true,
137
+ types: [:PJ_TYPE_GEODETIC_CRS, :PJ_TYPE_PROJECTED_CRS])
138
+
139
+ expected = proj9? ? 442 : 440
140
+ assert_equal(expected, objects.size)
141
+ end
142
+
143
+ def test_create_from_name_with_types_and_approximate_match_and_limit
144
+ context = Proj::Context.new
145
+ objects = Proj::PjObject.create_from_name("WGS 84", context, approximate_match: true, limit: 25,
146
+ types: [:PJ_TYPE_GEODETIC_CRS, :PJ_TYPE_PROJECTED_CRS])
147
+ assert_equal(25, objects.size)
148
+ end
149
+
150
+ def test_deprecated_true
151
+ wkt = <<~EOS
152
+ GEOGCRS["SAD69 (deprecated)",
153
+ DATUM["South_American_Datum_1969",
154
+ ELLIPSOID["GRS 1967",6378160,298.247167427,
155
+ LENGTHUNIT["metre",1,
156
+ ID["EPSG",9001]]]],
157
+ PRIMEM["Greenwich",0,
158
+ ANGLEUNIT["degree",0.0174532925199433,
159
+ ID["EPSG",9122]]],
160
+ CS[ellipsoidal,2],
161
+ AXIS["latitude",north,
162
+ ORDER[1],
163
+ ANGLEUNIT["degree",0.0174532925199433,
164
+ ID["EPSG",9122]]],
165
+ AXIS["longitude",east,
166
+ ORDER[2],
167
+ ANGLEUNIT["degree",0.0174532925199433,
168
+ ID["EPSG",9122]]]]
169
+ EOS
170
+
171
+ crs = Proj::Crs.create(wkt)
172
+ assert(crs.deprecated?)
173
+ end
174
+
175
+ def test_deprecated_false
176
+ crs = Proj::Crs.create_from_database("EPSG", "4326", :PJ_CATEGORY_CRS)
177
+ refute(crs.deprecated?)
178
+ end
179
+ end
@@ -0,0 +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
76
+ end
data/test/proj_test.rb CHANGED
@@ -1,17 +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_equal(6, info[:major])
9
- assert_equal(2, info[:minor])
10
- assert_equal(1, info[:patch])
11
- assert_equal('Rel. 6.2.1, November 1st, 2019', info[:release])
12
- assert_equal('6.2.1', info[:version])
13
- refute_nil(info[:searchpath])
14
- refute(info[:paths].null?)
15
- assert_equal(1, info[:path_count])
16
- 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([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
17
59
  end