@@ -66,7 +66,20 @@ def transform_itrf(
6666 """Transform the data's lon/lat/elev from the source ITRF to the target ITRF.
6767
6868 If a `target_epoch` is given, coordinate propagation is performed via a
69- plate motion model.
69+ plate motion model (PMM) defined for the target_itrf. The target epoch
70+ determines the number of years into the future/past the observed points
71+ should be propagated. For example, if a point's observation date
72+ (`t_observed`) is 1993.0 (1993-01-01T00:00:00) and the target_epoch is
73+ 2011.0 (2011-01-01T00:00:00), the point will be propagated forward 18
74+ years. Note that not all ITRFs have PMMs defined for them. The PMM used is
75+ defined for the target_epoch, so it is likely to be most accurate for points
76+ observed near the ITRF's defined epoch.
77+
78+ All ITRF and PMM transformations are dependent on the user's `proj`
79+ installation's ITRF init files (see
80+ https://proj.org/en/9.3/resource_files.html#init-files). For example,
81+ ITRF2014 parameters are defined here:
82+ https://github.com/OSGeo/PROJ/blob/8b65d5b14e2a8fbb8198335019488a2b2968df5c/data/ITRF2014.
7083 """
7184 if not check_itrf (target_itrf ):
7285 err_msg = (
@@ -87,11 +100,25 @@ def transform_itrf(
87100 if not plate :
88101 plate = plate_name (Point (chunk .longitude .mean (), chunk .latitude .mean ()))
89102 plate_model_step = (
90- # Perform coordinate propagation to the given epoch using the
91- # provided plate motion model (PMM). An example is given in the
92- # message of this commit:
93- # https://github.com/OSGeo/PROJ/commit/403f930355926aced5caba5bfbcc230ad152cf86
94- f"+step +init={ target_itrf } :{ plate } +t_epoch={ target_epoch } "
103+ # Perform coordinate propagation to the target epoch using the
104+ # provided plate motion model (PMM).
105+ # This step uses the target_itrf's init file to lookup the
106+ # associated plate's PMM parameters. For example, ITRF2014
107+ # parameters are defined here:
108+ # https://github.com/OSGeo/PROJ/blob/8b65d5b14e2a8fbb8198335019488a2b2968df5c/data/ITRF2014.
109+ # The step is inverted because proj defined `t_epoch` as the
110+ # "central epoch" - not the "target epoch. The transformation
111+ # uses a delta defined by `t_observed - t_epoch` that are
112+ # applied to the PMM's rate of change to propagate the point
113+ # into the past/future. See
114+ # https://proj.org/en/9.5/operations/transformations/helmert.html#mathematical-description
115+ # for more information.
116+ # For example, if a point's observation date
117+ # (`t_observed`) is 1993.0 (1993-01-01T00:00:00) and the t_epoch
118+ # is 2011.0 (2011-01-01T00:00:00), then the delta is 1993 -
119+ # 2011: -18. We need to invert the step so that the point is
120+ # propagated forward in time, from 1993 to 2011.
121+ f"+step +inv +init={ target_itrf } :{ plate } +t_epoch={ target_epoch } "
95122 )
96123
97124 itrf_transformation_step = _itrf_transformation_step (source_itrf , target_itrf )
0 commit comments