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.
- checksums.yaml +4 -4
- data/ChangeLog +82 -66
- data/Gemfile +4 -4
- data/README.rdoc +82 -45
- data/lib/api/api.rb +96 -111
- data/lib/api/api_5_0.rb +331 -300
- data/lib/api/api_5_1.rb +6 -6
- data/lib/api/api_5_2.rb +4 -4
- data/lib/api/api_6_0.rb +116 -14
- data/lib/api/api_6_1.rb +4 -4
- data/lib/api/api_6_2.rb +9 -6
- data/lib/api/api_6_3.rb +6 -0
- data/lib/api/api_7_0.rb +68 -0
- data/lib/api/api_7_1.rb +73 -0
- data/lib/api/api_7_2.rb +14 -0
- data/lib/api/api_8_0.rb +6 -0
- data/lib/api/api_8_1.rb +24 -0
- data/lib/api/api_8_2.rb +6 -0
- data/lib/api/api_9_1.rb +7 -0
- data/lib/api/api_9_2.rb +9 -0
- data/lib/api/api_experimental.rb +196 -0
- data/lib/proj/area.rb +73 -0
- data/lib/proj/axis_info.rb +44 -0
- data/lib/proj/bounds.rb +13 -0
- data/lib/proj/context.rb +249 -0
- data/lib/proj/conversion.rb +92 -0
- data/lib/{coordinate.rb → proj/coordinate.rb} +281 -197
- data/lib/proj/coordinate_operation_mixin.rb +381 -0
- data/lib/proj/coordinate_system.rb +137 -0
- data/lib/proj/crs.rb +672 -0
- data/lib/proj/crs_info.rb +47 -0
- data/lib/proj/database.rb +305 -0
- data/lib/proj/datum.rb +32 -0
- data/lib/proj/datum_ensemble.rb +34 -0
- data/lib/proj/ellipsoid.rb +78 -0
- data/lib/proj/error.rb +71 -0
- data/lib/proj/file_api.rb +166 -0
- data/lib/proj/grid.rb +121 -0
- data/lib/proj/grid_cache.rb +64 -0
- data/lib/proj/grid_info.rb +19 -0
- data/lib/proj/network_api.rb +92 -0
- data/lib/{operation.rb → proj/operation.rb} +42 -42
- data/lib/proj/operation_factory_context.rb +136 -0
- data/lib/proj/parameter.rb +38 -0
- data/lib/proj/parameters.rb +106 -0
- data/lib/proj/pj_object.rb +670 -0
- data/lib/proj/pj_objects.rb +44 -0
- data/lib/proj/prime_meridian.rb +66 -0
- data/lib/proj/projection.rb +698 -0
- data/lib/proj/session.rb +46 -0
- data/lib/proj/strings.rb +32 -0
- data/lib/proj/transformation.rb +102 -0
- data/lib/proj/unit.rb +109 -0
- data/lib/proj.rb +118 -17
- data/proj4rb.gemspec +32 -32
- data/test/abstract_test.rb +29 -7
- data/test/context_test.rb +172 -82
- data/test/conversion_test.rb +368 -0
- data/test/coordinate_system_test.rb +144 -0
- data/test/coordinate_test.rb +34 -34
- data/test/crs_test.rb +1071 -372
- data/test/database_test.rb +360 -0
- data/test/datum_ensemble_test.rb +65 -0
- data/test/datum_test.rb +55 -0
- data/test/ellipsoid_test.rb +80 -34
- data/test/file_api_test.rb +66 -0
- data/test/grid_cache_test.rb +72 -0
- data/test/grid_test.rb +141 -0
- data/test/network_api_test.rb +45 -0
- data/test/operation_factory_context_test.rb +201 -0
- data/test/operation_test.rb +29 -29
- data/test/parameters_test.rb +40 -0
- data/test/pj_object_test.rb +179 -0
- data/test/prime_meridian_test.rb +76 -0
- data/test/proj_test.rb +58 -16
- data/test/projection_test.rb +650 -224
- data/test/session_test.rb +78 -0
- data/test/transformation_test.rb +209 -67
- data/test/unit_test.rb +76 -47
- metadata +67 -29
- data/lib/api/api_4_9.rb +0 -31
- data/lib/area.rb +0 -32
- data/lib/config.rb +0 -70
- data/lib/context.rb +0 -103
- data/lib/crs.rb +0 -204
- data/lib/ellipsoid.rb +0 -42
- data/lib/error.rb +0 -18
- data/lib/pj_object.rb +0 -80
- data/lib/point.rb +0 -72
- data/lib/prime_meridian.rb +0 -40
- data/lib/projection.rb +0 -207
- data/lib/transformation.rb +0 -61
- data/lib/unit.rb +0 -54
- 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
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|