rgeo-proj4 3.1.0 → 3.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/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
|