rgeo-proj4 3.1.0 → 3.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rgeo/coord_sys/crs_to_crs.rb +66 -4
- data/lib/rgeo/coord_sys/proj4.rb +3 -60
- data/lib/rgeo/proj4/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b578b226ebc3b376a92f58cf080d34f237b5929751e6b856e493d9b6a6daa1ae
|
4
|
+
data.tar.gz: 84f4953ac2aea3783e7a807542c7aaf102b265dc454a9de97c340d70f04685c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb2bddfdc101da5c0a4b2af5d5445ce7e57f8d49505b5bb2f53376e81b5ed392d4d2183c11e6cc1e0d86fc5b2fc83cc1afe1d6a3c72fcf8924d779fbd04fdffb
|
7
|
+
data.tar.gz: 3f21328f3beff54191cf496f784a432185f9999d4b71ddeab91d772627f26bbc97deb1882cab9d9f997d16432993d2c742c3d2638005d2f372959428201f4e05
|
@@ -7,15 +7,77 @@ module RGeo
|
|
7
7
|
# A crs_to_crs transformation object is a pipeline between two known coordinate reference systems.
|
8
8
|
# https://proj.org/development/reference/functions.html#c.proj_create_crs_to_crs
|
9
9
|
class CRSToCRS
|
10
|
+
attr_writer :from, :to
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def create(from, to)
|
14
|
+
crs_to_crs = _create(from, to)
|
15
|
+
crs_to_crs.from = from
|
16
|
+
crs_to_crs.to = to
|
17
|
+
crs_to_crs
|
18
|
+
end
|
19
|
+
end
|
10
20
|
# transform the coordinates from the initial CRS to the destination CRS
|
11
21
|
def transform_coords(x, y, z)
|
12
|
-
|
22
|
+
if @from._radians? && @from._geographic?
|
23
|
+
x *= ImplHelper::Math::DEGREES_PER_RADIAN
|
24
|
+
y *= ImplHelper::Math::DEGREES_PER_RADIAN
|
25
|
+
end
|
26
|
+
result = _transform_coords(x, y, z)
|
27
|
+
if result && @to._radians? && @to._geographic?
|
28
|
+
result[0] *= ImplHelper::Math::RADIANS_PER_DEGREE
|
29
|
+
result[1] *= ImplHelper::Math::RADIANS_PER_DEGREE
|
30
|
+
end
|
31
|
+
result
|
13
32
|
end
|
14
33
|
|
15
|
-
|
16
|
-
|
17
|
-
|
34
|
+
def transform(from_geometry, to_factory)
|
35
|
+
case from_geometry
|
36
|
+
when Feature::Point
|
37
|
+
transform_point(from_geometry, to_factory)
|
38
|
+
when Feature::Line
|
39
|
+
to_factory.line(from_geometry.points.map { |p| transform_point(p, to_factory) })
|
40
|
+
when Feature::LinearRing
|
41
|
+
transform_linear_ring(from_geometry, to_factory)
|
42
|
+
when Feature::LineString
|
43
|
+
to_factory.line_string(from_geometry.points.map { |p_| transform_point(p_, to_factory) })
|
44
|
+
when Feature::Polygon
|
45
|
+
transform_polygon(from_geometry, to_factory)
|
46
|
+
when Feature::MultiPoint
|
47
|
+
to_factory.multi_point(from_geometry.map { |p| transform_point(p, to_factory) })
|
48
|
+
when Feature::MultiLineString
|
49
|
+
to_factory.multi_line_string(from_geometry.map { |g| transform(g, to_factory) })
|
50
|
+
when Feature::MultiPolygon
|
51
|
+
to_factory.multi_polygon(from_geometry.map { |p| transform_polygon(p, to_factory) })
|
52
|
+
when Feature::GeometryCollection
|
53
|
+
to_factory.collection(from_geometry.map { |g| transform(g, to_factory) })
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def transform_point(from_point, to_factory)
|
58
|
+
from_factory_ = from_point.factory
|
59
|
+
from_has_z_ = from_factory_.property(:has_z_coordinate)
|
60
|
+
from_has_m_ = from_factory_.property(:has_m_coordinate)
|
61
|
+
to_has_z_ = to_factory.property(:has_z_coordinate)
|
62
|
+
to_has_m_ = to_factory.property(:has_m_coordinate)
|
63
|
+
coords_ = transform_coords(from_point.x, from_point.y, from_has_z_ ? from_point.z : nil)
|
64
|
+
return unless coords_
|
65
|
+
extras_ = []
|
66
|
+
extras_ << coords_[2].to_f if to_has_z_
|
67
|
+
if to_has_m_
|
68
|
+
extras_ << from_has_m_ ? from_point.m : 0.0
|
18
69
|
end
|
70
|
+
to_factory.point(coords_[0], coords_[1], *extras_)
|
71
|
+
end
|
72
|
+
|
73
|
+
def transform_linear_ring(from_ring_, to_factory_)
|
74
|
+
to_factory_.linear_ring(from_ring_.points[0..-2].map { |p_| transform_point(p_, to_factory_) })
|
75
|
+
end
|
76
|
+
|
77
|
+
def transform_polygon(from_polygon_, to_factory_)
|
78
|
+
ext_ = transform_linear_ring(from_polygon_.exterior_ring, to_factory_)
|
79
|
+
int_ = from_polygon_.interior_rings.map { |r_| transform_linear_ring(r_, to_factory_) }
|
80
|
+
to_factory_.polygon(ext_, int_)
|
19
81
|
end
|
20
82
|
end
|
21
83
|
|
data/lib/rgeo/coord_sys/proj4.rb
CHANGED
@@ -222,18 +222,8 @@ module RGeo
|
|
222
222
|
# coordinate system to another. Returns an array with either two
|
223
223
|
# or three elements.
|
224
224
|
def transform_coords(from_proj_, to_proj_, x_, y_, z_ = nil)
|
225
|
-
if from_proj_._radians? && from_proj_._geographic?
|
226
|
-
x_ *= ImplHelper::Math::DEGREES_PER_RADIAN
|
227
|
-
y_ *= ImplHelper::Math::DEGREES_PER_RADIAN
|
228
|
-
end
|
229
|
-
|
230
225
|
crs_to_crs = CRSStore.get(from_proj_, to_proj_)
|
231
|
-
|
232
|
-
if result_ && to_proj_._radians? && to_proj_._geographic?
|
233
|
-
result_[0] *= ImplHelper::Math::RADIANS_PER_DEGREE
|
234
|
-
result_[1] *= ImplHelper::Math::RADIANS_PER_DEGREE
|
235
|
-
end
|
236
|
-
result_
|
226
|
+
crs_to_crs.transform_coords(x_, y_, z_)
|
237
227
|
end
|
238
228
|
|
239
229
|
# Low-level geometry transform method.
|
@@ -241,56 +231,9 @@ module RGeo
|
|
241
231
|
# The resulting geometry is constructed using the to_factory.
|
242
232
|
# Any projections associated with the factories themselves are
|
243
233
|
# ignored.
|
244
|
-
|
245
234
|
def transform(from_proj_, from_geometry_, to_proj_, to_factory_)
|
246
|
-
|
247
|
-
|
248
|
-
transform_point(from_proj_, from_geometry_, to_proj_, to_factory_)
|
249
|
-
when Feature::Line
|
250
|
-
to_factory_.line(from_geometry_.points.map { |p_| transform_point(from_proj_, p_, to_proj_, to_factory_) })
|
251
|
-
when Feature::LinearRing
|
252
|
-
transform_linear_ring(from_proj_, from_geometry_, to_proj_, to_factory_)
|
253
|
-
when Feature::LineString
|
254
|
-
to_factory_.line_string(from_geometry_.points.map { |p_| transform_point(from_proj_, p_, to_proj_, to_factory_) })
|
255
|
-
when Feature::Polygon
|
256
|
-
transform_polygon(from_proj_, from_geometry_, to_proj_, to_factory_)
|
257
|
-
when Feature::MultiPoint
|
258
|
-
to_factory_.multi_point(from_geometry_.map { |p_| transform_point(from_proj_, p_, to_proj_, to_factory_) })
|
259
|
-
when Feature::MultiLineString
|
260
|
-
to_factory_.multi_line_string(from_geometry_.map { |g_| transform(from_proj_, g_, to_proj_, to_factory_) })
|
261
|
-
when Feature::MultiPolygon
|
262
|
-
to_factory_.multi_polygon(from_geometry_.map { |p_| transform_polygon(from_proj_, p_, to_proj_, to_factory_) })
|
263
|
-
when Feature::GeometryCollection
|
264
|
-
to_factory_.collection(from_geometry_.map { |g_| transform(from_proj_, g_, to_proj_, to_factory_) })
|
265
|
-
end
|
266
|
-
end
|
267
|
-
|
268
|
-
private
|
269
|
-
|
270
|
-
def transform_point(from_proj_, from_point_, to_proj_, to_factory_)
|
271
|
-
from_factory_ = from_point_.factory
|
272
|
-
from_has_z_ = from_factory_.property(:has_z_coordinate)
|
273
|
-
from_has_m_ = from_factory_.property(:has_m_coordinate)
|
274
|
-
to_has_z_ = to_factory_.property(:has_z_coordinate)
|
275
|
-
to_has_m_ = to_factory_.property(:has_m_coordinate)
|
276
|
-
coords_ = transform_coords(from_proj_, to_proj_, from_point_.x, from_point_.y, from_has_z_ ? from_point_.z : nil)
|
277
|
-
return unless coords_
|
278
|
-
extras_ = []
|
279
|
-
extras_ << coords_[2].to_f if to_has_z_
|
280
|
-
if to_has_m_
|
281
|
-
extras_ << from_has_m_ ? from_point_.m : 0.0
|
282
|
-
end
|
283
|
-
to_factory_.point(coords_[0], coords_[1], *extras_)
|
284
|
-
end
|
285
|
-
|
286
|
-
def transform_linear_ring(from_proj_, from_ring_, to_proj_, to_factory_)
|
287
|
-
to_factory_.linear_ring(from_ring_.points[0..-2].map { |p_| transform_point(from_proj_, p_, to_proj_, to_factory_) })
|
288
|
-
end
|
289
|
-
|
290
|
-
def transform_polygon(from_proj_, from_polygon_, to_proj_, to_factory_)
|
291
|
-
ext_ = transform_linear_ring(from_proj_, from_polygon_.exterior_ring, to_proj_, to_factory_)
|
292
|
-
int_ = from_polygon_.interior_rings.map { |r_| transform_linear_ring(from_proj_, r_, to_proj_, to_factory_) }
|
293
|
-
to_factory_.polygon(ext_, int_)
|
235
|
+
crs_to_crs = CRSStore.get(from_proj_, to_proj_)
|
236
|
+
crs_to_crs.transform(from_geometry_, to_factory_)
|
294
237
|
end
|
295
238
|
end
|
296
239
|
end
|
data/lib/rgeo/proj4/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rgeo-proj4
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.
|
4
|
+
version: 3.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tee Parham, Daniel Azuma
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rgeo
|