Skip to content

Commit ceaead2

Browse files
committed
Re-apply +inv to PMM step; add better docs explaining
1 parent ab46366 commit ceaead2

File tree

1 file changed

+33
-6
lines changed

1 file changed

+33
-6
lines changed

src/nsidc/iceflow/itrf/converter.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)