proj4rb 4.1.0 → 4.1.1
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.
- checksums.yaml +4 -4
- data/ChangeLog +5 -0
- data/README.rdoc +17 -35
- data/lib/api/api.rb +1 -1
- data/lib/api/api_9_4.rb +6 -0
- data/lib/proj/coordinate_metadata.rb +38 -0
- data/lib/proj/coordinate_system.rb +2 -2
- data/lib/proj/crs.rb +8 -0
- data/lib/proj/pj_object.rb +2 -0
- data/lib/proj/projection.rb +1742 -698
- data/proj4rb.gemspec +1 -1
- data/test/abstract_test.rb +0 -23
- data/test/conversion_test.rb +9 -9
- data/test/crs_test.rb +13 -3
- data/test/database_test.rb +59 -27
- data/test/operation_factory_context_test.rb +13 -9
- data/test/pj_object_test.rb +38 -30
- data/test/projection_test.rb +187 -187
- data/test/transformation_test.rb +1 -1
- metadata +5 -3
data/proj4rb.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = 'proj4rb'
|
3
|
-
spec.version = '4.1.
|
3
|
+
spec.version = '4.1.1'
|
4
4
|
spec.summary = 'Ruby bindings for the Proj coordinate transformation library'
|
5
5
|
spec.description = <<-EOF
|
6
6
|
Ruby bindings for the Proj coordinate transformation library
|
data/test/abstract_test.rb
CHANGED
@@ -3,27 +3,4 @@ require 'minitest/autorun'
|
|
3
3
|
require 'proj'
|
4
4
|
|
5
5
|
class AbstractTest < Minitest::Test
|
6
|
-
def self.proj7?
|
7
|
-
Proj::Api::PROJ_VERSION >= Gem::Version.new("7.0.0")
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.proj8?
|
11
|
-
Proj::Api::PROJ_VERSION >= Gem::Version.new("8.0.0")
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.proj9?
|
15
|
-
Proj::Api::PROJ_VERSION >= Gem::Version.new("9.0.0")
|
16
|
-
end
|
17
|
-
|
18
|
-
def proj7?
|
19
|
-
self.class.proj7?
|
20
|
-
end
|
21
|
-
|
22
|
-
def proj8?
|
23
|
-
self.class.proj8?
|
24
|
-
end
|
25
|
-
|
26
|
-
def proj9?
|
27
|
-
self.class.proj9?
|
28
|
-
end
|
29
6
|
end
|
data/test/conversion_test.rb
CHANGED
@@ -31,8 +31,8 @@ class ConversionTest < AbstractTest
|
|
31
31
|
|
32
32
|
inverse = operation.create_inverse
|
33
33
|
proj_string = inverse.to_proj_string(:PJ_PROJ_5, multiline: true, indentation_width: 4, max_line_length: 40)
|
34
|
-
|
35
|
-
expected = if
|
34
|
+
|
35
|
+
expected = if Proj::Api::PROJ_VERSION >= '7.0.0'
|
36
36
|
<<~EOS
|
37
37
|
+proj=pipeline
|
38
38
|
+step +proj=axisswap +order=2,1
|
@@ -127,7 +127,7 @@ class ConversionTest < AbstractTest
|
|
127
127
|
conversion.grid(-1)
|
128
128
|
end
|
129
129
|
|
130
|
-
if
|
130
|
+
if Proj::Api::PROJ_VERSION >= '9.0.0'
|
131
131
|
assert_equal("File not found or invalid", error.to_s)
|
132
132
|
else
|
133
133
|
assert_equal("Unknown error (code 4096)", error.to_s)
|
@@ -141,12 +141,12 @@ class ConversionTest < AbstractTest
|
|
141
141
|
grid = conversion.grid(0)
|
142
142
|
|
143
143
|
assert_equal("ca_nrc_ntv1_can.tif", grid.name)
|
144
|
-
assert_match(/ntv1_can/, grid.full_name)
|
145
144
|
assert(grid.package_name.empty?)
|
146
145
|
assert_equal("https://cdn.proj.org/ca_nrc_ntv1_can.tif", grid.url)
|
147
146
|
assert(grid.downloadable?)
|
148
147
|
assert(grid.open_license?)
|
149
|
-
|
148
|
+
#assert_match(/ntv1_can/, grid.full_name)
|
149
|
+
#assert(grid.available?)
|
150
150
|
end
|
151
151
|
|
152
152
|
def test_xy_dist
|
@@ -275,7 +275,7 @@ class ConversionTest < AbstractTest
|
|
275
275
|
assert_in_delta(1141263.01116045, coordinate_2.y)
|
276
276
|
end
|
277
277
|
|
278
|
-
if
|
278
|
+
if Proj::Api::PROJ_VERSION >= '9.0.0'
|
279
279
|
def test_last_used_operation
|
280
280
|
wkt = <<~EOS
|
281
281
|
CONVERSION["UTM zone 31N",
|
@@ -331,11 +331,11 @@ class ConversionTest < AbstractTest
|
|
331
331
|
prime_meridian_name: "Greenwich", prime_meridian_offset: 0.0, pm_angular_units: "Degree", pm_angular_units_conv: 0.0174532925199433,
|
332
332
|
coordinate_system: coordinate_system)
|
333
333
|
|
334
|
-
mercator = Proj::Projection.mercator_variant_a(context,
|
334
|
+
mercator = Proj::Projection.mercator_variant_a(context, center_latitude: 0, center_longitude: 1,
|
335
335
|
scale: 0.99,
|
336
336
|
false_easting: 2, false_northing: 3,
|
337
|
-
|
338
|
-
linear_unit_name: "Metre",
|
337
|
+
angular_unit_name: "Degree", angular_unit_conversion_factor: 0.0174532925199433,
|
338
|
+
linear_unit_name: "Metre", linear_unit_conversion_factor: 1.0)
|
339
339
|
|
340
340
|
cartesian = Proj::CoordinateSystem.create_cartesian_2d(context, :PJ_CART2D_EASTING_NORTHING)
|
341
341
|
|
data/test/crs_test.rb
CHANGED
@@ -505,9 +505,19 @@ class CrsTest < AbstractTest
|
|
505
505
|
|
506
506
|
def test_to_json
|
507
507
|
crs = Proj::Crs.new('EPSG:26915')
|
508
|
+
|
509
|
+
schema_version = case
|
510
|
+
when Proj::Api::PROJ_VERSION >= '9.0.0'
|
511
|
+
'v0.7'
|
512
|
+
when Proj::Api::PROJ_VERSION >= '9.3.0'
|
513
|
+
'v0.5'
|
514
|
+
else
|
515
|
+
'v0.4'
|
516
|
+
end
|
517
|
+
|
508
518
|
expected = <<~EOS
|
509
519
|
{
|
510
|
-
"$schema": "https://proj.org/schemas/#{
|
520
|
+
"$schema": "https://proj.org/schemas/#{schema_version}/projjson.schema.json",
|
511
521
|
"type": "ProjectedCRS",
|
512
522
|
"name": "NAD83 / UTM zone 15N",
|
513
523
|
"base_crs": {
|
@@ -822,7 +832,7 @@ class CrsTest < AbstractTest
|
|
822
832
|
crs = Proj::Crs.create("EPSG:4326", context)
|
823
833
|
|
824
834
|
conversion = Proj::Projection.pole_rotation_grib_convention(context, south_pole_lat_in_unrotated_crs: 2, south_pole_long_in_unrotated_crs: 3,
|
825
|
-
axis_rotation: 4,
|
835
|
+
axis_rotation: 4, angular_unit_name: "Degree", angular_unit_conversion_factor: 0.0174532925199433)
|
826
836
|
|
827
837
|
coordinate_system = crs.coordinate_system
|
828
838
|
|
@@ -922,7 +932,7 @@ class CrsTest < AbstractTest
|
|
922
932
|
crses = Proj::Crs.query_geodetic_from_datum(context, datum_auth_name: "EPSG", datum_code: "6326")
|
923
933
|
|
924
934
|
expected = case
|
925
|
-
when
|
935
|
+
when Proj::Api::PROJ_VERSION >= '9.0.0'
|
926
936
|
12
|
927
937
|
else
|
928
938
|
11
|
data/test/database_test.rb
CHANGED
@@ -49,9 +49,15 @@ class DatabaseTest < AbstractTest
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def test_codes
|
52
|
-
|
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,
|
53
54
|
:PJ_TYPE_TEMPORAL_DATUM, :PJ_TYPE_ENGINEERING_DATUM, :PJ_TYPE_PARAMETRIC_DATUM,
|
54
|
-
:PJ_TYPE_OTHER_COORDINATE_OPERATION]
|
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
|
55
61
|
|
56
62
|
database = Proj::Database.new(Proj::Context.current)
|
57
63
|
|
@@ -97,10 +103,12 @@ class DatabaseTest < AbstractTest
|
|
97
103
|
crs_infos = database.crs_info
|
98
104
|
|
99
105
|
expected = case
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
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
|
104
112
|
end
|
105
113
|
assert_equal(expected, crs_infos.count)
|
106
114
|
|
@@ -125,10 +133,12 @@ class DatabaseTest < AbstractTest
|
|
125
133
|
crs_infos = database.crs_info("EPSG")
|
126
134
|
|
127
135
|
expected = case
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
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
|
132
142
|
end
|
133
143
|
assert_equal(expected, crs_infos.count)
|
134
144
|
end
|
@@ -140,10 +150,12 @@ class DatabaseTest < AbstractTest
|
|
140
150
|
crs_infos = database.crs_info("EPSG", params)
|
141
151
|
|
142
152
|
expected = case
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
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
|
147
159
|
end
|
148
160
|
|
149
161
|
assert_equal(expected, crs_infos.count)
|
@@ -156,10 +168,12 @@ class DatabaseTest < AbstractTest
|
|
156
168
|
crs_infos = database.crs_info("EPSG", params)
|
157
169
|
|
158
170
|
expected = case
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
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
|
163
177
|
end
|
164
178
|
|
165
179
|
assert_equal(expected, crs_infos.count)
|
@@ -176,7 +190,15 @@ class DatabaseTest < AbstractTest
|
|
176
190
|
params.north_lat_degree = 49.1
|
177
191
|
|
178
192
|
crs_infos = database.crs_info("EPSG", params)
|
179
|
-
|
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)
|
180
202
|
end
|
181
203
|
|
182
204
|
def test_crs_info_bounds_exclusive
|
@@ -191,7 +213,15 @@ class DatabaseTest < AbstractTest
|
|
191
213
|
params.crs_area_of_use_contains_bbox = 0
|
192
214
|
|
193
215
|
crs_infos = database.crs_info("EPSG", params)
|
194
|
-
|
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)
|
195
225
|
end
|
196
226
|
|
197
227
|
def test_crs_info_celestial_body
|
@@ -201,10 +231,12 @@ class DatabaseTest < AbstractTest
|
|
201
231
|
crs_infos = database.crs_info("EPSG", params)
|
202
232
|
|
203
233
|
expected = case
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
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
|
208
240
|
end
|
209
241
|
|
210
242
|
assert_equal(expected, crs_infos.count)
|
@@ -237,7 +269,7 @@ class DatabaseTest < AbstractTest
|
|
237
269
|
bodies = database.celestial_bodies
|
238
270
|
|
239
271
|
expected = case
|
240
|
-
when
|
272
|
+
when Proj::Api::PROJ_VERSION >= '9.0.0'
|
241
273
|
176
|
242
274
|
else
|
243
275
|
170
|
@@ -255,7 +287,7 @@ class DatabaseTest < AbstractTest
|
|
255
287
|
bodies = database.celestial_bodies('ESRI')
|
256
288
|
|
257
289
|
expected = case
|
258
|
-
when
|
290
|
+
when Proj::Api::PROJ_VERSION >= '9.0.0'
|
259
291
|
78
|
260
292
|
else
|
261
293
|
72
|
@@ -349,7 +381,7 @@ class DatabaseTest < AbstractTest
|
|
349
381
|
refute(name)
|
350
382
|
end
|
351
383
|
|
352
|
-
if
|
384
|
+
if Proj::Api::PROJ_VERSION >= '7.0.0'
|
353
385
|
# This test causes a segmentation fault on proj6
|
354
386
|
def test_metadata_invalid
|
355
387
|
database = Proj::Database.new(Proj::Context.current)
|
@@ -51,20 +51,24 @@ class OperationFactoryContextTest < AbstractTest
|
|
51
51
|
index = operations.suggested_operation(:PJ_FWD, coord)
|
52
52
|
|
53
53
|
expected = case
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
54
|
+
when Proj::Api::PROJ_VERSION >= '9.3.0'
|
55
|
+
3
|
56
|
+
when Proj::Api::PROJ_VERSION >= '9.0.0'
|
57
|
+
2
|
58
|
+
else
|
59
|
+
7
|
58
60
|
end
|
59
61
|
assert_equal(expected, index)
|
60
62
|
|
61
63
|
operation = operations[index]
|
62
64
|
|
63
65
|
expected = case
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
66
|
+
when Proj::Api::PROJ_VERSION >= '9.3.0'
|
67
|
+
"NAD27 to NAD83 (7)"
|
68
|
+
when Proj::Api::PROJ_VERSION >= '9.0.0'
|
69
|
+
"NAD27 to NAD83 (1)"
|
70
|
+
else
|
71
|
+
"Ballpark geographic offset from NAD27 to NAD83"
|
68
72
|
end
|
69
73
|
|
70
74
|
assert_equal(expected, operation.name)
|
@@ -191,7 +195,7 @@ class OperationFactoryContextTest < AbstractTest
|
|
191
195
|
assert_equal(5, operations.count)
|
192
196
|
end
|
193
197
|
|
194
|
-
if
|
198
|
+
if Proj::Api::PROJ_VERSION >= '9.0.0'
|
195
199
|
def test_set_area_of_interest_name
|
196
200
|
context = Proj::Context.new
|
197
201
|
factory_context = Proj::OperationFactoryContext.new(context)
|
data/test/pj_object_test.rb
CHANGED
@@ -19,20 +19,20 @@ class PjObjectTest < AbstractTest
|
|
19
19
|
def test_equivalent
|
20
20
|
from_epsg = Proj::PjObject.create_from_database("EPSG", "7844", :PJ_CATEGORY_CRS)
|
21
21
|
from_wkt = Proj::PjObject.create_from_wkt(<<~EOS)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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
36
|
|
37
37
|
assert(from_epsg.equivalent_to?(from_wkt, :PJ_COMP_EQUIVALENT))
|
38
38
|
end
|
@@ -136,7 +136,15 @@ class PjObjectTest < AbstractTest
|
|
136
136
|
objects = Proj::PjObject.create_from_name("WGS 84", context, approximate_match: true,
|
137
137
|
types: [:PJ_TYPE_GEODETIC_CRS, :PJ_TYPE_PROJECTED_CRS])
|
138
138
|
|
139
|
-
expected =
|
139
|
+
expected = case
|
140
|
+
when Proj::Api::PROJ_VERSION >= '9.3.0'
|
141
|
+
443
|
142
|
+
when Proj::Api::PROJ_VERSION >= '9.0.0'
|
143
|
+
442
|
144
|
+
else
|
145
|
+
440
|
146
|
+
end
|
147
|
+
|
140
148
|
assert_equal(expected, objects.size)
|
141
149
|
end
|
142
150
|
|
@@ -149,23 +157,23 @@ class PjObjectTest < AbstractTest
|
|
149
157
|
|
150
158
|
def test_deprecated_true
|
151
159
|
wkt = <<~EOS
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
160
|
+
GEOGCRS["SAD69 (deprecated)",
|
161
|
+
DATUM["South_American_Datum_1969",
|
162
|
+
ELLIPSOID["GRS 1967",6378160,298.247167427,
|
163
|
+
LENGTHUNIT["metre",1,
|
164
|
+
ID["EPSG",9001]]]],
|
165
|
+
PRIMEM["Greenwich",0,
|
166
|
+
ANGLEUNIT["degree",0.0174532925199433,
|
167
|
+
ID["EPSG",9122]]],
|
168
|
+
CS[ellipsoidal,2],
|
169
|
+
AXIS["latitude",north,
|
170
|
+
ORDER[1],
|
158
171
|
ANGLEUNIT["degree",0.0174532925199433,
|
159
172
|
ID["EPSG",9122]]],
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
ID["EPSG",9122]]],
|
165
|
-
AXIS["longitude",east,
|
166
|
-
ORDER[2],
|
167
|
-
ANGLEUNIT["degree",0.0174532925199433,
|
168
|
-
ID["EPSG",9122]]]]
|
173
|
+
AXIS["longitude",east,
|
174
|
+
ORDER[2],
|
175
|
+
ANGLEUNIT["degree",0.0174532925199433,
|
176
|
+
ID["EPSG",9122]]]]
|
169
177
|
EOS
|
170
178
|
|
171
179
|
crs = Proj::Crs.create(wkt)
|