Helmert transform¶
New in version 5.0.0.
The Helmert transformation changes coordinates from one reference frame to anoether by means of 3-, 4-and 7-parameter shifts, or one of their 6-, 8- and 14-parameter kinematic counterparts.
Alias |
helmert |
Domain |
2D, 3D and 4D |
Input type |
Cartesian coordinates (spatial), decimalyears (temporal). |
Output type |
Cartesian coordinates (spatial), decimalyears (temporal). |
Input type |
Cartesian coordinates |
Output type |
Cartesian coordinates |
The Helmert transform, in all it’s various incarnations, is used to perform reference frame shifts. The transformation operates in cartesian space. It can be used to transform planar coordinates from one datum to another, transform 3D cartesian coordinates from one static reference frame to another or it can be used to do fully kinematic transformations from global reference frames to local static frames.
All of the parameters described in the table above are marked as optional. This is true as long as at least one parameter is defined in the setup of the transformation. The behaviour of the transformation depends on which parameters are used in the setup. For instance, if a rate of change parameter is specified a kinematic version of the transformation is used.
The kinematic transformations require an observation time of the coordinate, as well as a central epoch for the transformation. The latter is usually documented alongside the rest of the transformation parameters for a given transformation. The central epoch is controlled with the parameter t_epoch. The observation time can either by stated as part of the coordinate when using PROJ’s 4D-functionality or it can be controlled in the transformation setup by the parameter t_obs. When t_obs is specified, all transformed coordinates are treated as if they have the same observation time.
Examples¶
Transforming coordinates from NAD72 to NAD83 using the 4 parameter 2D Helmert:
proj=helmert ellps=GRS80 x=-9597.3572 y=.6112
s=0.304794780637 theta=-1.244048
Simplified transformations from ITRF2008/IGS08 to ETRS89 using 7 parameters:
proj=helmert ellps=GRS80 x=0.67678 y=0.65495 z=-0.52827
rx=-0.022742 ry=0.012667 rz=0.022704 s=-0.01070
Transformation from ITRF2000@2017.0 to ITRF93@2017.0 using 15 parameters:
proj=helmert ellps=GRS80
x=0.0127 y=0.0065 z=-0.0209 s=0.00195
dx=-0.0029 dy=-0.0002 dz=-0.0006 ds=0.00001
rx=-0.00039 ry=0.00080 rz=-0.00114
drx=-0.00011 dry=-0.00019 drz=0.00007
t_epoch=1988.0 t_obs=2017.0 transpose
Parameters¶
Note
All parameters are optional but at least one should be used, otherwise the operation will return the coordinates unchanged.
-
+x
=<value>
¶ Translation of the x-axis given in meters.
-
+y
=<value>
¶ Translation of the x-axis given in meters.
-
+z
=<value>
¶ Translation of the z-axis given in meters.
-
+s
=<value>
¶ Scale factor given in ppm.
-
+rx
=<value>
¶ X-axis rotation in the 3D Helmert given arc seconds.
-
+ry
=<value>
¶ Y-axis rotation in the 3D Helmert given in arc seconds.
-
+rz
=<value>
¶ Z-axis rotation in the 3D Helmert given in arc seconds.
-
+theta
=<value>
¶ Rotation angle in the 2D Helmert given in arc seconds.
-
+dx
=<value>
¶ Translation rate of the x-axis given in m/year.
-
+dy
=<value>
¶ Translation rate of the y-axis given in m/year.
-
+dz
=<value>
¶ Translation rate of the z-axis given in m/year.
-
+ds
=<value>
¶ Scale rate factor given in ppm/year.
-
+drx
=<value>
¶ Rotation rate of the x-axis given in arc seconds/year.
-
+dry
=<value>
¶ Rotation rate of the y-axis given in arc seconds/year.
-
+drz
=<value>
¶ Rotation rate of the y-axis given in arc seconds/year.
-
+t_epoch
=<value>
¶ Central epoch of transformation given in decimalyear. Only used spatiotemporal transformations.
-
+t_obs
=<value>
¶ Observation time of coordinate(s) given in decicalyear. Mostly useful in 2D and 3D transformations where the observation time is not passed as part of the input coordinate. Can be used to override the observation time from the input coordinate.
-
+transpose
¶
Transpose rotation matrix and follow the Cordinate Frame rotation convention. If
+transpose
is not added the Position Vector rotation convention is used.
Mathematical description¶
In the notation used below, \(\hat{P}\) is the rate of change of a given transformation parameter \(P\). \(\dot{P}\) is the kinematically adjusted version of \(P\), described by
where \(t\) is the observation time of the coordinate and \(t_{central}\) is the central epoch of the transformation. Equation (1) can be used to propagate all transformation parameters in time.
Superscripts of vectors denote the reference frame the coordinates in the vector belong to.
2D Helmert¶
The simplest version of the Helmert transform is the 2D case. In the 2-dimensional case only the horizontal coordinates are changed. The coordinates can be translated, rotated and scale. Translation is controlled with the x and y parameters. The rotation is determined by theta and the scale is controlled with the s parameters.
Note
The scaling parameter s is unitless for the 2D Helmert, as opposed to the 3D version where the scaling parameter is given in units of ppm.
Mathematically the 2D Helmert is described as:
(2) can be extended to a time-varying kinematic version by adjusting the parameters with (1) to (2), which yields the kinematic 2D Helmert transform:
All parameters in (3) are determined by the use of (1), which applies the rate of change to each individual parameter for a given timespan between \(t\) and \(t_{central}\).
3D Helmert¶
The general form of the 3D Helmert is
Where \(T\) is a vector consisting of the three translation parameters, \(s\) is the scaling factor and \(\mathbf{R}\) is a rotation matrix. \(V^A\) and \(V^B\) are coordinate vectors, with \(V^A\) being the input coordinate and \(V^B\) is the output coordinate.
The rotation matrix is composed of three rotation matrices, one for each axis:
The three rotation matrices can be combined in one:
For \(\mathbf{R}\), this yields:
Using the small angle approxition the rotation matrix can be simplified to
Which allow us to express the most common version of the Helmert transform, using the approximated rotation matrix:
If the rotation matrix is transposed the transformation is effectively reversed.
This is cause for some confusion since there is no correct way of defining the
rotation matrix. Two conventions exists and they seem to be equally popular. PROJ
uses the Position Vector rotation convention. The rotation matrix can be transposed by
adding the +transpose
flag in the transformation setup which makes PROJ
follow the Coordinate Frame rotation convention.
Applying (1) we get the kinematic version of the approximated 3D Helmert:
The Helmert transformation can be applied without using the rotation parameters, in which case it becomes a simple translation of the origin of the coordinate system. When using the Helmert in this version equation (4) simplifies to:
That after application of (1) has the following kinematic counterpart: