proj4rb 2.2.1 → 2.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,40 +1,40 @@
1
- module Proj
2
- class PrimeMeridian
3
- attr_reader :id, :defn
4
-
5
- def self.list
6
- pointer_to_array = FFI::Pointer.new(Api::PJ_PRIME_MERIDIANS, Api.proj_list_prime_meridians)
7
- result = Array.new
8
- 0.step do |i|
9
- prime_meridian_info = Api::PJ_PRIME_MERIDIANS.new(pointer_to_array[i])
10
- break result if prime_meridian_info[:id].nil?
11
- result << self.new(prime_meridian_info[:id], prime_meridian_info[:defn])
12
- end
13
- end
14
-
15
- def self.get(id)
16
- self.list.find {|ellipsoid| ellipsoid.id == id}
17
- end
18
-
19
- def initialize(id, defn)
20
- @id = id
21
- @defn = defn
22
- end
23
-
24
- def <=>(other)
25
- self.id <=> other.id
26
- end
27
-
28
- def ==(other)
29
- self.id == other.id
30
- end
31
-
32
- def to_s
33
- self.id
34
- end
35
-
36
- def inspect
37
- "#<#{self.class} id=\"#{id}\", defn=\"#{defn}\">"
38
- end
39
- end
1
+ module Proj
2
+ class PrimeMeridian
3
+ attr_reader :id, :defn
4
+
5
+ def self.list
6
+ pointer_to_array = FFI::Pointer.new(Api::PJ_PRIME_MERIDIANS, Api.proj_list_prime_meridians)
7
+ result = Array.new
8
+ 0.step do |i|
9
+ prime_meridian_info = Api::PJ_PRIME_MERIDIANS.new(pointer_to_array[i])
10
+ break result if prime_meridian_info[:id].nil?
11
+ result << self.new(prime_meridian_info[:id], prime_meridian_info[:defn])
12
+ end
13
+ end
14
+
15
+ def self.get(id)
16
+ self.list.find {|ellipsoid| ellipsoid.id == id}
17
+ end
18
+
19
+ def initialize(id, defn)
20
+ @id = id
21
+ @defn = defn
22
+ end
23
+
24
+ def <=>(other)
25
+ self.id <=> other.id
26
+ end
27
+
28
+ def ==(other)
29
+ self.id == other.id
30
+ end
31
+
32
+ def to_s
33
+ self.id
34
+ end
35
+
36
+ def inspect
37
+ "#<#{self.class} id=\"#{id}\", defn=\"#{defn}\">"
38
+ end
39
+ end
40
40
  end
@@ -1,31 +1,31 @@
1
- # encoding: UTF-8
2
-
3
- require_relative 'api/api'
4
- require_relative './config'
5
-
6
- require_relative './area'
7
- require_relative './context'
8
- require_relative './coordinate'
9
- require_relative './ellipsoid'
10
- require_relative './error'
11
- require_relative './point'
12
- require_relative './prime_meridian'
13
- require_relative './unit'
14
-
15
- require_relative './pj_object'
16
- require_relative './operation'
17
- require_relative './crs'
18
- require_relative './projection'
19
- require_relative './transformation'
20
-
21
- module Proj
22
- def self.info
23
- Api.proj_info
24
- end
25
-
26
- def self.version
27
- self.info[:version]
28
- end
29
- end
30
-
1
+ # encoding: UTF-8
2
+
3
+ require_relative 'api/api'
4
+ require_relative './config'
5
+
6
+ require_relative './area'
7
+ require_relative './context'
8
+ require_relative './coordinate'
9
+ require_relative './ellipsoid'
10
+ require_relative './error'
11
+ require_relative './point'
12
+ require_relative './prime_meridian'
13
+ require_relative './unit'
14
+
15
+ require_relative './pj_object'
16
+ require_relative './operation'
17
+ require_relative './crs'
18
+ require_relative './projection'
19
+ require_relative './transformation'
20
+
21
+ module Proj
22
+ def self.info
23
+ Api.proj_info
24
+ end
25
+
26
+ def self.version
27
+ self.info[:version]
28
+ end
29
+ end
30
+
31
31
  Proj::Config.instance.set_search_paths
@@ -1,207 +1,207 @@
1
- # encoding: UTF-8
2
-
3
- module Proj
4
- # @deprecated This class is *DEPRECATED.* It will be removed when Proj 7 is released and removes the
5
- # underlying API's this class uses. Code should be ported to use Crs and Transformation objects.
6
- class Projection
7
- def self.parse(value)
8
- case value
9
- when Array
10
- value
11
- when String
12
- value.strip.split(' ')
13
- when Hash
14
- array = []
15
- value.each_pair do |key, value|
16
- key = "+#{key}"
17
- array << (value.nil? ? key : "#{key}=#{value}")
18
- end
19
- array
20
- when Projection
21
- value.getDef.split(' ')
22
- else
23
- raise ArgumentError, "Unknown type #{value.class} for projection definition"
24
- end
25
- end
26
-
27
- def self.finalize(pointer)
28
- proc do
29
- Api.pj_free(pointer)
30
- end
31
- end
32
-
33
- # Projection classes are created using Proj4 strings which consist of a number of parameters.
34
- # For more information please see the +opt arguments section at https://proj.org/apps/proj.html.
35
- #
36
- # @param value [string, array, hash] Parameters can be specified as strings, arrays or hashes.
37
- #
38
- # @example
39
- # proj = Projection.new("+proj=utm +zone=21 +units=m")
40
- # proj = Projection.new ["+proj=utm", "+zone=21", "+units=m"]
41
- # proj = Projection.new("proj" => "utm", "zone" => "21", "units" => "m")
42
- #
43
- # With all variants the plus sign in front of the keys is optional.
44
- def initialize(value)
45
- params = self.class.parse(value)
46
- p_params = FFI::MemoryPointer.new(:pointer, params.length)
47
- params.each_with_index do |param, i|
48
- p_param = FFI::MemoryPointer.from_string(param)
49
- p_params[i].write_pointer(p_param)
50
- end
51
-
52
- @pointer = Api.pj_init(params.count, p_params)
53
- self.check_error
54
-
55
- ObjectSpace.define_finalizer(self, self.class.finalize(@pointer))
56
- end
57
-
58
- def check_error
59
- ptr = Api.pj_get_errno_ref
60
- errno = ptr.read_int
61
- if errno != 0
62
- # If we don't reset the error code it hangs around. This doesn't seem documented anyplace?
63
- ptr.write_int(0)
64
- Error.check(errno)
65
- end
66
- end
67
-
68
-
69
- def to_ptr
70
- @pointer
71
- end
72
-
73
- # Returns projection definitions
74
- #
75
- # @return [String]
76
- def getDef
77
- Api.pj_get_def(self, 0)
78
- end
79
-
80
- # Returns if this is a geocentric projection
81
- #
82
- # @return [Boolean]
83
- def isGeocent?
84
- Api::pj_is_geocent(self)
85
- end
86
- alias :isGeocentric? :isGeocent?
87
-
88
- # Returns if this is a lat/long projection
89
- #
90
- # @return [Boolean]
91
- def isLatLong?
92
- Api::pj_is_latlong(self)
93
- end
94
-
95
- # Get the ID of this projection.
96
- #
97
- # @return [String]
98
- def projection
99
- getDef =~ /\+proj=(.+?) / ? $1 : nil
100
- end
101
-
102
- # Get the ID of the datum used in this projection.
103
- #
104
- # @return [String]
105
- def datum
106
- getDef =~ /\+datum=(.+?) / ? $1 : nil
107
- end
108
-
109
- # Get definition of projection in typical inspect format (#<Proj::Projection +init=... +proj=... ...>).
110
- #
111
- # @return [String]
112
- def to_s
113
- "#<#{self.class.name}#{getDef}>"
114
- end
115
-
116
- # Forward projection of a point. Returns a copy of the point object with coordinates projected.
117
- #
118
- # @param point [Point] in radians
119
- # @return [Point] in cartesian coordinates
120
- def forward(point)
121
- struct = Api.pj_fwd(point, self)
122
- self.check_error
123
- Point.from_pointer(struct)
124
- end
125
-
126
- # Convenience function for calculating a forward projection with degrees instead of radians.
127
- #
128
- # @param point [Point] in degrees
129
- # @return [Point] in cartesian coordinates
130
- def forwardDeg(point)
131
- forward(point.to_radians)
132
- end
133
-
134
- # Projects all points in a collection.
135
- #
136
- # @param collection [Enumerable<Point>] Points specified in radians
137
- # @return [Enumerable<Point>] Points specified in cartesian coordinates
138
- def forward_all(collection)
139
- collection.map do |point|
140
- forward(point)
141
- end
142
- end
143
-
144
- # Inverse projection of a point. Returns a copy of the point object with coordinates projected.
145
- #
146
- # @param point [Point] in cartesian coordinates
147
- # @return [Point] in radians
148
- def inverse(point)
149
- struct = Api.pj_inv(point, self)
150
- self.check_error
151
- Point.from_pointer(struct)
152
- end
153
-
154
- # Convenience function for calculating an inverse projection with the result in degrees instead of radians.
155
- #
156
- # @param point [Point] in cartesian coordinates
157
- # @return [Point] in degrees
158
- def inverseDeg(point)
159
- result = inverse(point)
160
- result.to_degrees
161
- end
162
-
163
- # Inverse projection of all points in a collection.
164
- #
165
- # @param collection [Enumerable<Point>] Points specified in cartesian coordinates
166
- # @return [Enumerable<Point>] Points specified in radians
167
- def inverse_all(collection)
168
- collection.map do |point|
169
- inverse(point)
170
- end
171
- end
172
-
173
- # Transforms a point from one projection to another.
174
- #
175
- # @param other [Projection]
176
- # @param point [Point]
177
- # @return [Point]
178
- def transform(other, point)
179
- p_x = FFI::MemoryPointer.new(:double, 1)
180
- p_x.write_double(point.x)
181
-
182
- p_y = FFI::MemoryPointer.new(:double, 1)
183
- p_y.write_double(point.y)
184
-
185
- p_z = FFI::MemoryPointer.new(:double, 1)
186
- p_z.write_double(0)
187
-
188
- Api.pj_transform(self, other, 1, 1, p_x, p_y, p_z)
189
- self.check_error
190
-
191
- Point.new(p_x.read_double, p_y.read_double)
192
- end
193
-
194
- # Transforms all points in a collection from one projection to
195
- # another. The +collection+ object must implement the +each+,
196
- # +clear+, and << methods (just like an Array) for this to work.
197
- #
198
- # @param other [Projection]
199
- # @param collection [Enumerable, Point]
200
- # @return [Enumerable, Point]
201
- def transform_all(other, collection)
202
- collection.map do |point|
203
- transform(other, point)
204
- end
205
- end
206
- end
1
+ # encoding: UTF-8
2
+
3
+ module Proj
4
+ # @deprecated This class is *DEPRECATED.* It will be removed when Proj 7 is released and removes the
5
+ # underlying API's this class uses. Code should be ported to use Crs and Transformation objects.
6
+ class Projection
7
+ def self.parse(value)
8
+ case value
9
+ when Array
10
+ value
11
+ when String
12
+ value.strip.split(' ')
13
+ when Hash
14
+ array = []
15
+ value.each_pair do |key, value|
16
+ key = "+#{key}"
17
+ array << (value.nil? ? key : "#{key}=#{value}")
18
+ end
19
+ array
20
+ when Projection
21
+ value.getDef.split(' ')
22
+ else
23
+ raise ArgumentError, "Unknown type #{value.class} for projection definition"
24
+ end
25
+ end
26
+
27
+ def self.finalize(pointer)
28
+ proc do
29
+ Api.pj_free(pointer)
30
+ end
31
+ end
32
+
33
+ # Projection classes are created using Proj4 strings which consist of a number of parameters.
34
+ # For more information please see the +opt arguments section at https://proj.org/apps/proj.html.
35
+ #
36
+ # @param value [string, array, hash] Parameters can be specified as strings, arrays or hashes.
37
+ #
38
+ # @example
39
+ # proj = Projection.new("+proj=utm +zone=21 +units=m")
40
+ # proj = Projection.new ["+proj=utm", "+zone=21", "+units=m"]
41
+ # proj = Projection.new("proj" => "utm", "zone" => "21", "units" => "m")
42
+ #
43
+ # With all variants the plus sign in front of the keys is optional.
44
+ def initialize(value)
45
+ params = self.class.parse(value)
46
+ p_params = FFI::MemoryPointer.new(:pointer, params.length)
47
+ params.each_with_index do |param, i|
48
+ p_param = FFI::MemoryPointer.from_string(param)
49
+ p_params[i].write_pointer(p_param)
50
+ end
51
+
52
+ @pointer = Api.pj_init(params.count, p_params)
53
+ self.check_error
54
+
55
+ ObjectSpace.define_finalizer(self, self.class.finalize(@pointer))
56
+ end
57
+
58
+ def check_error
59
+ ptr = Api.pj_get_errno_ref
60
+ errno = ptr.read_int
61
+ if errno != 0
62
+ # If we don't reset the error code it hangs around. This doesn't seem documented anyplace?
63
+ ptr.write_int(0)
64
+ Error.check(errno)
65
+ end
66
+ end
67
+
68
+
69
+ def to_ptr
70
+ @pointer
71
+ end
72
+
73
+ # Returns projection definitions
74
+ #
75
+ # @return [String]
76
+ def getDef
77
+ Api.pj_get_def(self, 0)
78
+ end
79
+
80
+ # Returns if this is a geocentric projection
81
+ #
82
+ # @return [Boolean]
83
+ def isGeocent?
84
+ Api::pj_is_geocent(self)
85
+ end
86
+ alias :isGeocentric? :isGeocent?
87
+
88
+ # Returns if this is a lat/long projection
89
+ #
90
+ # @return [Boolean]
91
+ def isLatLong?
92
+ Api::pj_is_latlong(self)
93
+ end
94
+
95
+ # Get the ID of this projection.
96
+ #
97
+ # @return [String]
98
+ def projection
99
+ getDef =~ /\+proj=(.+?) / ? $1 : nil
100
+ end
101
+
102
+ # Get the ID of the datum used in this projection.
103
+ #
104
+ # @return [String]
105
+ def datum
106
+ getDef =~ /\+datum=(.+?) / ? $1 : nil
107
+ end
108
+
109
+ # Get definition of projection in typical inspect format (#<Proj::Projection +init=... +proj=... ...>).
110
+ #
111
+ # @return [String]
112
+ def to_s
113
+ "#<#{self.class.name}#{getDef}>"
114
+ end
115
+
116
+ # Forward projection of a point. Returns a copy of the point object with coordinates projected.
117
+ #
118
+ # @param point [Point] in radians
119
+ # @return [Point] in cartesian coordinates
120
+ def forward(point)
121
+ struct = Api.pj_fwd(point, self)
122
+ self.check_error
123
+ Point.from_pointer(struct)
124
+ end
125
+
126
+ # Convenience function for calculating a forward projection with degrees instead of radians.
127
+ #
128
+ # @param point [Point] in degrees
129
+ # @return [Point] in cartesian coordinates
130
+ def forwardDeg(point)
131
+ forward(point.to_radians)
132
+ end
133
+
134
+ # Projects all points in a collection.
135
+ #
136
+ # @param collection [Enumerable<Point>] Points specified in radians
137
+ # @return [Enumerable<Point>] Points specified in cartesian coordinates
138
+ def forward_all(collection)
139
+ collection.map do |point|
140
+ forward(point)
141
+ end
142
+ end
143
+
144
+ # Inverse projection of a point. Returns a copy of the point object with coordinates projected.
145
+ #
146
+ # @param point [Point] in cartesian coordinates
147
+ # @return [Point] in radians
148
+ def inverse(point)
149
+ struct = Api.pj_inv(point, self)
150
+ self.check_error
151
+ Point.from_pointer(struct)
152
+ end
153
+
154
+ # Convenience function for calculating an inverse projection with the result in degrees instead of radians.
155
+ #
156
+ # @param point [Point] in cartesian coordinates
157
+ # @return [Point] in degrees
158
+ def inverseDeg(point)
159
+ result = inverse(point)
160
+ result.to_degrees
161
+ end
162
+
163
+ # Inverse projection of all points in a collection.
164
+ #
165
+ # @param collection [Enumerable<Point>] Points specified in cartesian coordinates
166
+ # @return [Enumerable<Point>] Points specified in radians
167
+ def inverse_all(collection)
168
+ collection.map do |point|
169
+ inverse(point)
170
+ end
171
+ end
172
+
173
+ # Transforms a point from one projection to another.
174
+ #
175
+ # @param other [Projection]
176
+ # @param point [Point]
177
+ # @return [Point]
178
+ def transform(other, point)
179
+ p_x = FFI::MemoryPointer.new(:double, 1)
180
+ p_x.write_double(point.x)
181
+
182
+ p_y = FFI::MemoryPointer.new(:double, 1)
183
+ p_y.write_double(point.y)
184
+
185
+ p_z = FFI::MemoryPointer.new(:double, 1)
186
+ p_z.write_double(0)
187
+
188
+ Api.pj_transform(self, other, 1, 1, p_x, p_y, p_z)
189
+ self.check_error
190
+
191
+ Point.new(p_x.read_double, p_y.read_double)
192
+ end
193
+
194
+ # Transforms all points in a collection from one projection to
195
+ # another. The +collection+ object must implement the +each+,
196
+ # +clear+, and << methods (just like an Array) for this to work.
197
+ #
198
+ # @param other [Projection]
199
+ # @param collection [Enumerable, Point]
200
+ # @return [Enumerable, Point]
201
+ def transform_all(other, collection)
202
+ collection.map do |point|
203
+ transform(other, point)
204
+ end
205
+ end
206
+ end
207
207
  end