proj4rb 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +5 -5
  2. data/ChangeLog +46 -0
  3. data/Gemfile +4 -0
  4. data/README.rdoc +158 -148
  5. data/Rakefile +26 -41
  6. data/lib/area.rb +32 -0
  7. data/lib/config.rb +70 -0
  8. data/lib/context.rb +103 -0
  9. data/lib/coordinate.rb +197 -0
  10. data/lib/crs.rb +206 -0
  11. data/lib/ellipsoid.rb +42 -0
  12. data/lib/error.rb +18 -0
  13. data/lib/operation.rb +43 -0
  14. data/lib/pj_object.rb +82 -0
  15. data/lib/point.rb +72 -0
  16. data/lib/prime_meridian.rb +40 -0
  17. data/lib/proj.rb +31 -0
  18. data/lib/proj4.rb +3 -469
  19. data/lib/projection.rb +207 -0
  20. data/lib/transformation.rb +61 -0
  21. data/lib/unit.rb +54 -0
  22. data/proj4rb.gemspec +31 -0
  23. data/test/abstract_test.rb +7 -0
  24. data/test/context_test.rb +82 -0
  25. data/test/coordinate_test.rb +35 -0
  26. data/test/crs_test.rb +373 -0
  27. data/test/ellipsoid_test.rb +34 -0
  28. data/test/operation_test.rb +29 -0
  29. data/test/prime_meridians_test.rb +33 -0
  30. data/test/proj_test.rb +17 -0
  31. data/test/projection_test.rb +224 -0
  32. data/test/transformation_test.rb +68 -0
  33. data/test/unit_test.rb +47 -0
  34. metadata +82 -77
  35. data/data/GL27 +0 -22
  36. data/data/MD +0 -0
  37. data/data/TN +0 -0
  38. data/data/WI +0 -0
  39. data/data/WO +0 -0
  40. data/data/conus +0 -0
  41. data/data/epsg +0 -5443
  42. data/data/epsg-deprecated +0 -2
  43. data/data/esri +0 -5937
  44. data/data/esri.extra +0 -948
  45. data/data/hawaii +0 -0
  46. data/data/nad.lst +0 -142
  47. data/data/nad27 +0 -809
  48. data/data/nad83 +0 -744
  49. data/data/ntv1_can.dat +0 -0
  50. data/data/null +0 -0
  51. data/data/other.extra +0 -49
  52. data/data/proj_def.dat +0 -17
  53. data/data/prvi +0 -0
  54. data/data/stgeorge +0 -0
  55. data/data/stlrnc +0 -0
  56. data/data/stpaul +0 -0
  57. data/data/world +0 -212
  58. data/example/basic.rb +0 -18
  59. data/example/list-datums.rb +0 -17
  60. data/example/list-ellipsoids.rb +0 -17
  61. data/example/list-errors.rb +0 -11
  62. data/example/list-prime-meridians.rb +0 -17
  63. data/example/list-projection-types.rb +0 -17
  64. data/example/list-units.rb +0 -17
  65. data/example/version.rb +0 -8
  66. data/ext/Makefile +0 -238
  67. data/ext/extconf.rb +0 -16
  68. data/ext/mkmf.log +0 -103
  69. data/ext/out.log +0 -0
  70. data/ext/proj4_ruby-x64-mingw32.def +0 -2
  71. data/ext/proj4_ruby.so +0 -0
  72. data/ext/projrb.c +0 -566
  73. data/ext/projrb.o +0 -0
  74. data/ext/vc/proj4_ruby.sln +0 -19
  75. data/ext/vc/proj4_ruby.vcproj +0 -208
  76. data/test/test_constants.rb +0 -18
  77. data/test/test_create_projection.rb +0 -63
  78. data/test/test_datums.rb +0 -45
  79. data/test/test_ellipsoids.rb +0 -46
  80. data/test/test_errors.rb +0 -66
  81. data/test/test_init_projection.rb +0 -109
  82. data/test/test_prime_meridians.rb +0 -45
  83. data/test/test_projection_type.rb +0 -44
  84. data/test/test_simple_projection.rb +0 -58
  85. data/test/test_suite.rb +0 -14
  86. data/test/test_transform.rb +0 -115
  87. data/test/test_units.rb +0 -46
@@ -0,0 +1,35 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative './abstract_test'
4
+
5
+ class CoordinateTest < AbstractTest
6
+ def test_create_xyzt
7
+ coord = Proj::Coordinate.new(:x => 1, :y => 2, :z => 3, :t => 4)
8
+ assert_equal('v0: 1.0, v1: 2.0, v2: 3.0, v3: 4.0', coord.to_s)
9
+ end
10
+
11
+ def test_create_uvwt
12
+ coord = Proj::Coordinate.new(:u => 5, :v => 6, :w => 7, :t => 8)
13
+ assert_equal('v0: 5.0, v1: 6.0, v2: 7.0, v3: 8.0', coord.to_s)
14
+ end
15
+
16
+ def test_create_lpzt
17
+ coord = Proj::Coordinate.new(:lam => 9, :phi => 10, :z => 11, :t => 12)
18
+ assert_equal('v0: 9.0, v1: 10.0, v2: 11.0, v3: 12.0', coord.to_s)
19
+ end
20
+
21
+ def test_create_geod
22
+ coord = Proj::Coordinate.new(:s => 13, :a1 => 14, :a2 => 15)
23
+ assert_equal('v0: 13.0, v1: 14.0, v2: 15.0, v3: 0.0', coord.to_s)
24
+ end
25
+
26
+ def test_create_opk
27
+ coord = Proj::Coordinate.new(:o => 16, :p => 17, :k => 18)
28
+ assert_equal('v0: 16.0, v1: 17.0, v2: 18.0, v3: 0.0', coord.to_s)
29
+ end
30
+
31
+ def test_create_enu
32
+ coord = Proj::Coordinate.new(:e => 19, :n => 20, :u => 21)
33
+ assert_equal('v0: 19.0, v1: 20.0, v2: 21.0, v3: 0.0', coord.to_s)
34
+ end
35
+ end
@@ -0,0 +1,373 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative './abstract_test'
4
+
5
+ class CrsTest < AbstractTest
6
+ def test_create_from_epsg
7
+ crs = Proj::Crs.new('EPSG:4326')
8
+ assert_equal(:PJ_TYPE_GEOGRAPHIC_2D_CRS, crs.proj_type)
9
+ assert_equal('+proj=longlat +datum=WGS84 +no_defs +type=crs', crs.to_proj_string)
10
+
11
+ assert_nil(crs.id)
12
+ assert_equal('WGS 84', crs.description)
13
+ assert_empty(crs.definition)
14
+ refute(crs.has_inverse?)
15
+ assert_equal(-1.0, crs.accuracy)
16
+ end
17
+
18
+ def test_create_from_urn
19
+ crs = Proj::Crs.new('urn:ogc:def:crs:EPSG::4326')
20
+ assert_equal(:PJ_TYPE_GEOGRAPHIC_2D_CRS, crs.proj_type)
21
+ assert_equal('+proj=longlat +datum=WGS84 +no_defs +type=crs', crs.to_proj_string)
22
+ end
23
+
24
+ def test_create_from_wkt
25
+ crs = Proj::Crs.new(<<~EOS)
26
+ GEOGCRS["WGS 84",
27
+ DATUM["World Geodetic System 1984",
28
+ ELLIPSOID["WGS 84",6378137,298.257223563,
29
+ LENGTHUNIT["metre",1]]],
30
+ PRIMEM["Greenwich",0,
31
+ ANGLEUNIT["degree",0.0174532925199433]],
32
+ CS[ellipsoidal,2],
33
+ AXIS["geodetic latitude (Lat)",north,
34
+ ORDER[1],
35
+ ANGLEUNIT["degree",0.0174532925199433]],
36
+ AXIS["geodetic longitude (Lon)",east,
37
+ ORDER[2],
38
+ ANGLEUNIT["degree",0.0174532925199433]],
39
+ USAGE[
40
+ SCOPE["unknown"],
41
+ AREA["World"],
42
+ BBOX[-90,-180,90,180]],
43
+ ID["EPSG",4326]]
44
+ EOS
45
+
46
+ assert_equal(:PJ_TYPE_GEOGRAPHIC_2D_CRS, crs.proj_type)
47
+ assert_equal('+proj=longlat +datum=WGS84 +no_defs +type=crs', crs.to_proj_string)
48
+ end
49
+
50
+ def test_create_from_proj4
51
+ crs = Proj::Crs.new('+proj=longlat +datum=WGS84 +no_defs +type=crs')
52
+ assert_equal(:PJ_TYPE_GEOGRAPHIC_2D_CRS, crs.proj_type)
53
+ assert_equal('+proj=longlat +datum=WGS84 +no_defs +type=crs', crs.to_proj_string)
54
+ end
55
+
56
+ def test_compound
57
+ crs = Proj::Crs.new('EPSG:2393+5717')
58
+ assert_equal(:PJ_TYPE_COMPOUND_CRS, crs.proj_type)
59
+ assert_equal('+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=3500000 +y_0=0 +ellps=intl +units=m +vunits=m +no_defs +type=crs', crs.to_proj_string)
60
+
61
+ crs = Proj::Crs.new('urn:ogc:def:crs,crs:EPSG::2393,crs:EPSG::5717')
62
+ assert_equal(:PJ_TYPE_COMPOUND_CRS, crs.proj_type)
63
+ assert_equal('+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=3500000 +y_0=0 +ellps=intl +units=m +vunits=m +no_defs +type=crs', crs.to_proj_string)
64
+ end
65
+
66
+ def test_not_crs
67
+ error = assert_raises(Proj::Error) do
68
+ Proj::Crs.new('+proj=utm +zone=32 +datum=WGS84')
69
+ end
70
+ assert_equal('Invalid crs definition. Proj created an instance of: PJ_TYPE_OTHER_COORDINATE_OPERATION.', error.message)
71
+ end
72
+
73
+ def test_finalize
74
+ 500.times do
75
+ crs = Proj::Crs.new('EPSG:4326')
76
+ assert(crs.to_ptr)
77
+ GC.start
78
+ end
79
+ assert(true)
80
+ end
81
+
82
+ def test_geodetic_crs
83
+ crs = Proj::Crs.new('EPSG:4326')
84
+ geodetic = crs.geodetic_crs
85
+ assert_equal(:PJ_TYPE_GEOGRAPHIC_2D_CRS, geodetic.proj_type)
86
+ assert_equal('+proj=longlat +datum=WGS84 +no_defs +type=crs', geodetic.to_proj_string)
87
+ end
88
+
89
+ def test_datum
90
+ crs = Proj::Crs.new('EPSG:4326')
91
+ datum = crs.datum
92
+ assert_equal(:PJ_TYPE_GEODETIC_REFERENCE_FRAME, datum.proj_type)
93
+ end
94
+
95
+ def test_horizontal_datum
96
+ crs = Proj::Crs.new('EPSG:4326')
97
+ datum = crs.horizontal_datum
98
+ assert_equal(:PJ_TYPE_GEODETIC_REFERENCE_FRAME, datum.proj_type)
99
+ end
100
+
101
+ def test_coordinate_system
102
+ crs = Proj::Crs.new('EPSG:4326')
103
+ cs = crs.coordinate_system
104
+ assert_equal(:PJ_TYPE_UNKNOWN, cs.proj_type)
105
+ end
106
+
107
+ def test_axis_count
108
+ crs = Proj::Crs.new('EPSG:4326')
109
+ count = crs.axis_count
110
+ assert_equal(2, count)
111
+ end
112
+
113
+ def test_axis_info
114
+ crs = Proj::Crs.new('EPSG:4326')
115
+ info = crs.axis_info
116
+ expected = [{:name=>"Geodetic latitude",
117
+ :abbreviation=>"Lat",
118
+ :direction=>"north",
119
+ :unit_conv_factor=>0.017453292519943295,
120
+ :unit_name=>"degree",
121
+ :unit_auth_name=>"EPSG",
122
+ :unit_code=>"9122"},
123
+ {:name=>"Geodetic longitude",
124
+ :abbreviation=>"Lon",
125
+ :direction=>"east",
126
+ :unit_conv_factor=>0.017453292519943295,
127
+ :unit_name=>"degree",
128
+ :unit_auth_name=>"EPSG",
129
+ :unit_code=>"9122"}]
130
+
131
+ assert_equal(expected, info)
132
+ end
133
+
134
+ def test_crs_type
135
+ crs = Proj::Crs.new('EPSG:4326')
136
+ crs_type = crs.crs_type
137
+ assert_equal(:PJ_CS_TYPE_ELLIPSOIDAL, crs_type)
138
+ end
139
+
140
+ def test_ellipsoid
141
+ crs = Proj::Crs.new('EPSG:4326')
142
+ ellipsoid = crs.ellipsoid
143
+ assert_equal(:PJ_TYPE_ELLIPSOID, ellipsoid.proj_type)
144
+ end
145
+
146
+ def test_prime_meridian
147
+ crs = Proj::Crs.new('EPSG:4326')
148
+ prime_meridian = crs.prime_meridian
149
+ assert_equal('Greenwich', prime_meridian.name)
150
+ end
151
+
152
+ #def test_operation
153
+ # crs = Proj::Crs.new('EPSG:4326')
154
+ # operation = crs.operation
155
+ # assert_equal('Greenwich', operation.name)
156
+ #end
157
+
158
+ def test_area
159
+ crs = Proj::Crs.new('EPSG:4326')
160
+ assert_kind_of(Proj::Area, crs.area)
161
+ assert_equal('World', crs.area.name)
162
+ assert_in_delta(-180.0, crs.area.west_lon_degree, 0.1)
163
+ assert_in_delta(-90.0, crs.area.south_lat_degree, 0.1)
164
+ assert_in_delta(180.0, crs.area.east_lon_degree, 0.1)
165
+ assert_in_delta(90.0, crs.area.north_lat_degree, 0.1)
166
+ end
167
+
168
+ def test_to_proj_string
169
+ crs = Proj::Crs.new('EPSG:26915')
170
+ assert_equal('+proj=utm +zone=15 +datum=NAD83 +units=m +no_defs +type=crs', crs.to_proj_string)
171
+ end
172
+
173
+ def test_to_wkt
174
+ crs = Proj::Crs.new('EPSG:26915')
175
+
176
+ expected = <<~EOS
177
+ PROJCRS["NAD83 / UTM zone 15N",
178
+ BASEGEOGCRS["NAD83",
179
+ DATUM["North American Datum 1983",
180
+ ELLIPSOID["GRS 1980",6378137,298.257222101,
181
+ LENGTHUNIT["metre",1]]],
182
+ PRIMEM["Greenwich",0,
183
+ ANGLEUNIT["degree",0.0174532925199433]],
184
+ ID["EPSG",4269]],
185
+ CONVERSION["UTM zone 15N",
186
+ METHOD["Transverse Mercator",
187
+ ID["EPSG",9807]],
188
+ PARAMETER["Latitude of natural origin",0,
189
+ ANGLEUNIT["degree",0.0174532925199433],
190
+ ID["EPSG",8801]],
191
+ PARAMETER["Longitude of natural origin",-93,
192
+ ANGLEUNIT["degree",0.0174532925199433],
193
+ ID["EPSG",8802]],
194
+ PARAMETER["Scale factor at natural origin",0.9996,
195
+ SCALEUNIT["unity",1],
196
+ ID["EPSG",8805]],
197
+ PARAMETER["False easting",500000,
198
+ LENGTHUNIT["metre",1],
199
+ ID["EPSG",8806]],
200
+ PARAMETER["False northing",0,
201
+ LENGTHUNIT["metre",1],
202
+ ID["EPSG",8807]]],
203
+ CS[Cartesian,2],
204
+ AXIS["(E)",east,
205
+ ORDER[1],
206
+ LENGTHUNIT["metre",1]],
207
+ AXIS["(N)",north,
208
+ ORDER[2],
209
+ LENGTHUNIT["metre",1]],
210
+ USAGE[
211
+ SCOPE["unknown"],
212
+ AREA["North America - 96\xC2\xB0W to 90\xC2\xB0W and NAD83 by country"],
213
+ BBOX[25.61,-96,84,-90]],
214
+ ID["EPSG",26915]]
215
+ EOS
216
+
217
+ assert_equal(expected.strip, crs.to_wkt)
218
+ end
219
+
220
+ def test_to_json
221
+ crs = Proj::Crs.new('EPSG:26915')
222
+ expected = <<~EOS
223
+ {
224
+ "$schema": "https://proj.org/schemas/v0.1/projjson.schema.json",
225
+ "type": "ProjectedCRS",
226
+ "name": "NAD83 / UTM zone 15N",
227
+ "base_crs": {
228
+ "name": "NAD83",
229
+ "datum": {
230
+ "type": "GeodeticReferenceFrame",
231
+ "name": "North American Datum 1983",
232
+ "ellipsoid": {
233
+ "name": "GRS 1980",
234
+ "semi_major_axis": 6378137,
235
+ "inverse_flattening": 298.257222101
236
+ }
237
+ },
238
+ "coordinate_system": {
239
+ "subtype": "ellipsoidal",
240
+ "axis": [
241
+ {
242
+ "name": "Geodetic latitude",
243
+ "abbreviation": "Lat",
244
+ "direction": "north",
245
+ "unit": "degree"
246
+ },
247
+ {
248
+ "name": "Geodetic longitude",
249
+ "abbreviation": "Lon",
250
+ "direction": "east",
251
+ "unit": "degree"
252
+ }
253
+ ]
254
+ },
255
+ "id": {
256
+ "authority": "EPSG",
257
+ "code": 4269
258
+ }
259
+ },
260
+ "conversion": {
261
+ "name": "UTM zone 15N",
262
+ "method": {
263
+ "name": "Transverse Mercator",
264
+ "id": {
265
+ "authority": "EPSG",
266
+ "code": 9807
267
+ }
268
+ },
269
+ "parameters": [
270
+ {
271
+ "name": "Latitude of natural origin",
272
+ "value": 0,
273
+ "unit": "degree",
274
+ "id": {
275
+ "authority": "EPSG",
276
+ "code": 8801
277
+ }
278
+ },
279
+ {
280
+ "name": "Longitude of natural origin",
281
+ "value": -93,
282
+ "unit": "degree",
283
+ "id": {
284
+ "authority": "EPSG",
285
+ "code": 8802
286
+ }
287
+ },
288
+ {
289
+ "name": "Scale factor at natural origin",
290
+ "value": 0.9996,
291
+ "unit": "unity",
292
+ "id": {
293
+ "authority": "EPSG",
294
+ "code": 8805
295
+ }
296
+ },
297
+ {
298
+ "name": "False easting",
299
+ "value": 500000,
300
+ "unit": "metre",
301
+ "id": {
302
+ "authority": "EPSG",
303
+ "code": 8806
304
+ }
305
+ },
306
+ {
307
+ "name": "False northing",
308
+ "value": 0,
309
+ "unit": "metre",
310
+ "id": {
311
+ "authority": "EPSG",
312
+ "code": 8807
313
+ }
314
+ }
315
+ ]
316
+ },
317
+ "coordinate_system": {
318
+ "subtype": "Cartesian",
319
+ "axis": [
320
+ {
321
+ "name": "Easting",
322
+ "abbreviation": "E",
323
+ "direction": "east",
324
+ "unit": "metre"
325
+ },
326
+ {
327
+ "name": "Northing",
328
+ "abbreviation": "N",
329
+ "direction": "north",
330
+ "unit": "metre"
331
+ }
332
+ ]
333
+ },
334
+ "area": "North America - 96°W to 90°W and NAD83 by country",
335
+ "bbox": {
336
+ "south_latitude": 25.61,
337
+ "west_longitude": -96,
338
+ "north_latitude": 84,
339
+ "east_longitude": -90
340
+ },
341
+ "id": {
342
+ "authority": "EPSG",
343
+ "code": 26915
344
+ }
345
+ }
346
+ EOS
347
+
348
+ assert_equal(expected.strip, crs.to_json)
349
+ end
350
+
351
+ def test_inspect
352
+ crs = Proj::Crs.new('EPSG:26915')
353
+
354
+ expected = <<~EOS
355
+ <Proj::Crs>: EPSG:26915
356
+ NAD83 / UTM zone 15N
357
+ Axis Info [PJ_CS_TYPE_CARTESIAN]:
358
+ - E[east]: Easting (metre)
359
+ - N[north]: Northing (metre)
360
+ Area of Use:
361
+ - name: North America - 96°W to 90°W and NAD83 by country
362
+ - bounds: (-96.0, 25.61, -90.0, 84.0)
363
+ Coordinate operation:
364
+ - name: ?
365
+ - method: ?
366
+ Datum: North American Datum 1983
367
+ - Ellipsoid: GRS 1980
368
+ - Prime Meridian: Greenwich
369
+ EOS
370
+
371
+ assert_equal(expected, crs.inspect)
372
+ end
373
+ end
@@ -0,0 +1,34 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative './abstract_test'
4
+
5
+ class EllipsoidTest < AbstractTest
6
+ def test_get_all
7
+ ellipsoids = Proj::Ellipsoid.list.map {|ellipsoid| ellipsoid.id }
8
+ assert(ellipsoids.include?('WGS84'))
9
+ assert(ellipsoids.include?('bessel'))
10
+ assert(ellipsoids.include?('lerch'))
11
+ end
12
+
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)
22
+ end
23
+
24
+ def test_equal
25
+ e1 = Proj::Ellipsoid.get('bessel')
26
+ e2 = Proj::Ellipsoid.get('bessel')
27
+ assert e1 == e2
28
+ end
29
+
30
+ def test_failed_get
31
+ ellipsoid = Proj::Ellipsoid.get('foo')
32
+ assert_nil ellipsoid
33
+ end
34
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: UTF-8
2
+
3
+ require_relative './abstract_test'
4
+
5
+ class OperationTest < AbstractTest
6
+ def test_get_all
7
+ operations = Proj::Operation.list.map {|operation| operation.id}
8
+ assert(operations.include?('aea'))
9
+ assert(operations.include?('wintri'))
10
+ end
11
+
12
+ def test_one
13
+ operation = Proj::Operation.get('rouss')
14
+ assert_kind_of(Proj::Operation, operation)
15
+ assert_equal('rouss', operation.id)
16
+ assert_equal("Roussilhe Stereographic\n\tAzi, Ell", operation.description)
17
+ end
18
+
19
+ def test_equal
20
+ e1 = Proj::Operation.get('rouss')
21
+ e2 = Proj::Operation.get('rouss')
22
+ assert(e1 == e2)
23
+ end
24
+
25
+ def test_failed_get
26
+ operation = Proj::Operation.get('foo')
27
+ assert_nil(operation)
28
+ end
29
+ end