blob: a1f4423a7471de7a329fc2afb84578bed757d198 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
.. _push:
================================================================================
Push coordinate value to pipeline stack
================================================================================
.. versionadded:: 6.0.0
Save components of a coordinate from one step of a pipeline and make it
available for retrieving in another pipeline step.
+---------------------+--------------------------------------------------------+
| **Alias** | push |
+---------------------+--------------------------------------------------------+
| **Domain** | 4D |
+---------------------+--------------------------------------------------------+
| **Input type** | Any |
+---------------------+--------------------------------------------------------+
| **Output type** | Any |
+---------------------+--------------------------------------------------------+
This operations allows for components of coordinates to be saved for
application in a later step. A saved coordinate component is moved, or
*pushed*, to a memory stack that is part of a :ref:`pipeline<pipeline>`. The
pipeline coordinate stack is inspired by the stack data structure that is
commonly used in computer science. There's four stacks available: One four each
coordinate dimension. The dimensions, or coordinate components, are numbered
1--4. It is only possible to move data to and from the stack within the same
coordinate component number. Values can be moved off the stack again by using
the :ref:`pop operation<pop>`.
If the push operation is used by itself, e.g. not in a pipeline, it will
function as a no-operation that passes the coordinate through unchanged.
Examples
################################################################################
A common use of the push and :ref:`pop<pop>` operations is in 3D
:ref:`Helmert<helmert>` transformations where only the horizontal components
are needed. This is often the case when combining heights from a legacy
vertical reference with a modern geocentric reference. Below is a an example of
such a transformation, where the horizontal part is transformed with a Helmert
operation but the vertical part is kept exactly as the input was.
::
$ echo 12 56 12.3 2020 | cct +proj=pipeline \
+step +proj=push +v_3 \
+step +proj=cart +ellps=GRS80 \
+step +proj=helmert +x=3000 +y=1000 +z=2000 \
+step +proj=cart +ellps=GRS80 +inv \
+step +proj=pop +v_3 \
12.0056753463 55.9866540552 12.3000 2000.0000
Note that the third coordinate component in the output is the same as the input.
The same transformation without the push and pop operations would look like this::
$ echo 12 56 12.3 2020 | cct +proj=pipeline \
+step +proj=cart +ellps=GRS80 \
+step +proj=helmert +x=3000 +y=1000 +z=2000 \
+step +proj=cart +ellps=GRS80 +inv \
12.0057 55.9867 3427.7404 2000.0000
Here the vertical component is adjusted significantly.
Parameters
################################################################################
.. option:: +v_1
Stores the first coordinate component on the pipeline stack
.. option:: +v_2
Stores the second coordinate component on the pipeline stack
.. option:: +v_3
Stores the third coordinate component on the pipeline stack
.. option:: +v_4
Stores the fourth coordinate component on the pipeline stack
Further reading
################################################################################
#. `Stack data structure on Wikipedia <https://en.wikipedia.org/wiki/Stack_(abstract_data_type)>`_
|