Coverage for pygeodesy/trf.py: 95%

432 statements  

« prev     ^ index     » next       coverage.py v7.2.2, created at 2024-02-05 16:22 -0500

1 

2# -*- coding: utf-8 -*- 

3 

4u'''I{Veness}' Terrestrial Reference Frames (TRF). 

5 

6Classes L{RefFrame}, registry L{RefFrames} and L{TRFError}. 

7 

8Transcoded from I{Chris Veness'} (C) 2006-2022 JavaScript originals 

9U{latlon-ellipsoidal-referenceframe.js<https://GitHub.com/ChrisVeness/geodesy/blob/master/ 

10latlon-ellipsoidal-referenceframe.js>} and U{latlon-ellipsoidal-referenceframe-txparams.js 

11<https://GitHub.com/ChrisVeness/geodesy/blob/master/latlon-ellipsoidal-referenceframe-txparams.js>}. 

12 

13Following is a copy of the comments in I{Veness}' U{latlon-ellipsoidal-referenceframe.js 

14<https://GitHub.com/ChrisVeness/geodesy/blob/master/latlon-ellipsoidal-referenceframe.js>}. 

15 

16Modern geodetic reference frames: a latitude/longitude point defines a geographic location on, 

17above or below the earth’s surface, measured in degrees from the equator and the U{International 

18Reference Meridian<https://WikiPedia.org/wiki/IERS_Reference_Meridian>} (IRM) and metres above 

19the ellipsoid within a given I{Terrestrial Reference Frame} at a given I{epoch}. 

20 

21This is scratching the surface of complexities involved in high precision geodesy, but may 

22be of interest and/or value to those with less demanding requirements. More information U{here 

23<https://www.Movable-Type.co.UK/scripts/geodesy-library.html>} and U{here 

24<https://www.Movable-Type.co.UK/scripts/geodesy-library.html#latlon-ellipsoidal-referenceframe>}. 

25 

26Note that I{ITRF solutions} do not directly use an ellipsoid, but are specified by Cartesian 

27coordinates. The GRS80 ellipsoid is recommended for transformations to geographical coordinates. 

28 

29Note WGS84(G730/G873/G1150) are coincident with ITRF at 10-centimetre level, see also U{here 

30<ftp://ITRF.ENSG.IGN.Fr/pub/itrf/WGS84.TXT>}. WGS84(G1674) and ITRF20014 / ITRF2008 I{"are likely 

31to agree at the centimeter level"}, see also U{QPS/Qinsy<https://Confluence.QPS.NL/qinsy/ 

32en/how-to-deal-with-etrs89-datum-and-time-dependent-transformation-parameters-45353274.html>}. 

33 

34@var RefFrames.ETRF2000: RefFrame(name='ETRF2000', epoch=2005, datum=Datums.GRS80) .Xforms=(0, -14) 

35@var RefFrames.ETRF2005: RefFrame(name='ETRF2005', epoch=2005, datum=Datums.GRS80) .Xforms=(0, -1) 

36@var RefFrames.ETRF2008: RefFrame(name='ETRF2008', epoch=2008, datum=Datums.GRS80) .Xforms=(0, 0) 

37@var RefFrames.ETRF2014: RefFrame(name='ETRF2014', epoch=2014, datum=Datums.GRS80) .Xforms=(0, -14) 

38@var RefFrames.ETRF2020: RefFrame(name='ETRF2020', epoch=2020, datum=Datums.GRS80) .Xforms=(0, -14) 

39@var RefFrames.ETRF88: RefFrame(name='ETRF88', epoch=1988, datum=Datums.GRS80) .Xforms=(0, 0) 

40@var RefFrames.ETRF89: RefFrame(name='ETRF89', epoch=1989, datum=Datums.GRS80) .Xforms=(0, -1) 

41@var RefFrames.ETRF90: RefFrame(name='ETRF90', epoch=1990, datum=Datums.GRS80) .Xforms=(0, -1) 

42@var RefFrames.ETRF91: RefFrame(name='ETRF91', epoch=1991, datum=Datums.GRS80) .Xforms=(0, -1) 

43@var RefFrames.ETRF92: RefFrame(name='ETRF92', epoch=1992, datum=Datums.GRS80) .Xforms=(0, -1) 

44@var RefFrames.ETRF93: RefFrame(name='ETRF93', epoch=1993, datum=Datums.GRS80) .Xforms=(0, -1) 

45@var RefFrames.ETRF94: RefFrame(name='ETRF94', epoch=1994, datum=Datums.GRS80) .Xforms=(0, -1) 

46@var RefFrames.ETRF96: RefFrame(name='ETRF96', epoch=1996, datum=Datums.GRS80) .Xforms=(0, -1) 

47@var RefFrames.ETRF97: RefFrame(name='ETRF97', epoch=1997, datum=Datums.GRS80) .Xforms=(0, -1) 

48@var RefFrames.GDA2020: RefFrame(name='GDA2020', epoch=2020, datum=Datums.GRS80) .Xforms=(0, -4) 

49@var RefFrames.GDA94: RefFrame(name='GDA94', epoch=1994, datum=Datums.GRS80) .Xforms=(0, -3) 

50@var RefFrames.ITRF2000: RefFrame(name='ITRF2000', epoch=1997, datum=Datums.GRS80) .Xforms=(15, -4) 

51@var RefFrames.ITRF2005: RefFrame(name='ITRF2005', epoch=2000, datum=Datums.GRS80) .Xforms=(8, -3) 

52@var RefFrames.ITRF2008: RefFrame(name='ITRF2008', epoch=2005, datum=Datums.GRS80) .Xforms=(17, -2) 

53@var RefFrames.ITRF2014: RefFrame(name='ITRF2014', epoch=2010, datum=Datums.GRS80) .Xforms=(16, -1) 

54@var RefFrames.ITRF2020: RefFrame(name='ITRF2020', epoch=2015, datum=Datums.GRS80) .Xforms=(16, 0) 

55@var RefFrames.ITRF88: RefFrame(name='ITRF88', epoch=1988, datum=Datums.GRS80) .Xforms=(3, -4) 

56@var RefFrames.ITRF89: RefFrame(name='ITRF89', epoch=1989, datum=Datums.GRS80) .Xforms=(4, -4) 

57@var RefFrames.ITRF90: RefFrame(name='ITRF90', epoch=1988, datum=Datums.GRS80) .Xforms=(6, -4) 

58@var RefFrames.ITRF91: RefFrame(name='ITRF91', epoch=1988, datum=Datums.GRS80) .Xforms=(4, -4) 

59@var RefFrames.ITRF92: RefFrame(name='ITRF92', epoch=1988, datum=Datums.GRS80) .Xforms=(4, -4) 

60@var RefFrames.ITRF93: RefFrame(name='ITRF93', epoch=1988, datum=Datums.GRS80) .Xforms=(4, -4) 

61@var RefFrames.ITRF94: RefFrame(name='ITRF94', epoch=1993, datum=Datums.GRS80) .Xforms=(4, -4) 

62@var RefFrames.ITRF96: RefFrame(name='ITRF96', epoch=1997, datum=Datums.GRS80) .Xforms=(5, -5) 

63@var RefFrames.ITRF97: RefFrame(name='ITRF97', epoch=1997, datum=Datums.GRS80) .Xforms=(5, -4) 

64@var RefFrames.NAD83: RefFrame(name='NAD83', epoch=1997, datum=Datums.GRS80) .Xforms=(0, -5) 

65@var RefFrames.WGS84: RefFrame(name='WGS84', epoch=1984, datum=Datums.GRS80) .Xforms=(0, -1) 

66@var RefFrames.WGS84g1150: RefFrame(name='WGS84g1150', epoch=2001, datum=Datums.GRS80) .Xforms=(0, 0) 

67@var RefFrames.WGS84g1674: RefFrame(name='WGS84g1674', epoch=2005, datum=Datums.GRS80) .Xforms=(0, 0) 

68@var RefFrames.WGS84g1762: RefFrame(name='WGS84g1762', epoch=2005, datum=Datums.GRS80) .Xforms=(0, 0) 

69''' 

70 

71from pygeodesy.basics import map1, neg, isscalar, isstr, _xinstanceof, _zip 

72from pygeodesy.constants import _0_0s, _0_0, _0_001, _0_5, _1_0, _float as _F 

73from pygeodesy.datums import Datums, _earth_datum, _minus, Transform, _WGS84 

74from pygeodesy.errors import _IsnotError, TRFError, _xkwds 

75from pygeodesy.interns import MISSING, NN, _AT_, _COMMASPACE_, _cartesian_, _conversion_, \ 

76 _datum_, _DOT_, _ellipsoidal_, _exists_, _invalid_, _MINUS_, \ 

77 _NAD83_, _no_, _PLUS_, _reframe_, _s_, _scalar_, _SPACE_, \ 

78 _sx_, _sy_, _sz_, _to_, _tx_, _ty_, _tz_, _WGS84_, _x_, \ 

79 _intern as _i 

80from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS 

81from pygeodesy.named import ADict, classname, _lazyNamedEnumItem as _lazy, _Named, \ 

82 _NamedEnum, _NamedEnumItem, _NamedTuple, Fmt, unstr 

83from pygeodesy.props import Property, Property_RO, property_RO 

84# from pygeodesy.streprs import Fmt, unstr # from .named 

85from pygeodesy.units import Epoch, Float 

86 

87from math import ceil 

88 

89__all__ = _ALL_LAZY.trf 

90__version__ = '24.02.04' 

91 

92_EP0CH = Epoch(0, low=0) 

93_Es = {_EP0CH: _EP0CH} # L{Epoch} de_dup 

94_Ps = {} # L{TRFXform7Tuple} de-dup, deleted below 

95 

96_GRS80 = Datums.GRS80 

97_inverse_ = 'inverse' 

98_MAS = _MM = _PPB = Float # Units 

99_MM2M = _0_001 # scale mm2m, ppb2ppM, mas2as 

100_mDays = (0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0) 

101_366_0 = _F(sum(_mDays)) 

102_v_ = 'v' 

103 

104_ETRF88_ = _i('ETRF88') 

105_ETRF89_ = _i('ETRF89') 

106_ETRF90_ = _i('ETRF90') 

107_ETRF91_ = _i('ETRF91') 

108_ETRF92_ = _i('ETRF92') 

109_ETRF93_ = _i('ETRF93') 

110_ETRF94_ = _i('ETRF94') 

111_ETRF96_ = _i('ETRF96') 

112_ETRF97_ = _i('ETRF97') 

113_ETRF2000_ = _i('ETRF2000') 

114_ETRF2005_ = _i('ETRF2005') 

115_ETRF2008_ = _i('ETRF2008') 

116_ETRF2014_ = _i('ETRF2014') 

117_ETRF2020_ = _i('ETRF2020') 

118_GDA94_ = _i('GDA94') 

119_GDA2020_ = _i('GDA2020') 

120_ITRF_ = _i('ITRF') 

121_ITRF88_ = _i('ITRF88') 

122_ITRF89_ = _i('ITRF89') 

123_ITRF90_ = _i('ITRF90') 

124_ITRF91_ = _i('ITRF91') 

125_ITRF92_ = _i('ITRF92') 

126_ITRF93_ = _i('ITRF93') 

127_ITRF94_ = _i('ITRF94') 

128_ITRF96_ = _i('ITRF96') 

129_ITRF97_ = _i('ITRF97') 

130_ITRF2000_ = _i('ITRF2000') 

131_ITRF2005_ = _i('ITRF2005') 

132_ITRF2008_ = _i('ITRF2008') 

133_ITRF2014_ = _i('ITRF2014') 

134_ITRF2020_ = _i('ITRF2020') 

135_WGS84g1150_ = _i('WGS84g1150') 

136_WGS84g1674_ = _i('WGS84g1674') 

137_WGS84g1762_ = _i('WGS84g1762') 

138# del _i 

139 

140 

141def _E(epoch): 

142 '''(INTERNAL) De-dup L{Epochs}s. 

143 ''' 

144 e = Epoch(_F(epoch)) 

145 return _Es.setdefault(e, e) 

146 

147 

148class RefFrame(_NamedEnumItem): 

149 '''Terrestrial Reference Frame (TRF) parameters. 

150 ''' 

151 _datum = _GRS80 # Datums.GRS80 or .WGS84 (L{Datum}) 

152 _epoch = _EP0CH # epoch, fractional year (L{Epoch}) 

153 

154 def __init__(self, epoch, datum, name=NN): 

155 '''New L{RefFrame}. 

156 

157 @arg epoch: Epoch, a fractional calendar year (C{scalar} or C{str}). 

158 @arg datum: Datum or ellipsoid (L{Datum}, {Ellipsoid}, L{Ellipsoid2} 

159 or L{a_f2Tuple}). 

160 @kwarg name: Unique, non-empty name (C{str}). 

161 

162 @raise NameError: A L{RefFrame} with that B{C{name}} already exists. 

163 

164 @raise TRFError: Invalid B{C{epoch}}. 

165 

166 @raise TypeError: Invalid B{C{datum}}. 

167 ''' 

168 if datum is not _GRS80: 

169 _earth_datum(self, datum, raiser=_datum_) 

170 self._epoch = Epoch(epoch) 

171 self._Xs = {} 

172 if name: 

173 self._register(RefFrames, name) 

174 

175 def __eq__(self, other): 

176 return isinstance(other, RefFrame) and other.epoch == self.epoch \ 

177 and other.datum == self.datum 

178 

179 def __matmul__(self, other): # PYCHOK Python 3.5+ 

180 '''Convert cartesian or ellipsoidal B{C{other}} to this reframe. 

181 

182 @raise TypeError: Invalid B{C{other}}. 

183 ''' 

184 try: # only Cartesian- and LatLonEllipsoidalBase 

185 return other.toRefFrame(self) 

186 except AttributeError: 

187 pass 

188 raise _IsnotError(_cartesian_, _ellipsoidal_, other=other) 

189 

190 @property_RO 

191 def datum(self): 

192 '''Get this reference frame's datum (L{Datum}). 

193 ''' 

194 return self._datum 

195 

196 @Property_RO 

197 def ellipsoid(self): 

198 '''Get this reference frame's ellipsoid (L{Ellipsoid} or L{Ellipsoid2}). 

199 ''' 

200 return self._datum.ellipsoid 

201 

202 @Property_RO 

203 def epoch(self): 

204 '''Get this reference frame's epoch (C{Epoch}). 

205 ''' 

206 return self._epoch 

207 

208 def toRefFrame(self, point, reframe2, **epoch2_epoch_name): 

209 '''Convert a cartesian or geodetic point from this to another reframe and epoch. 

210 

211 @return: A copy of the B{C{point}}, converted or renamed. 

212 

213 @see: Ellipsoidal methods L{LatLon.toRefFrame<ellipsoidalBase.LatLonEllipsoidalBase.toRefFrame>} 

214 and L{Cartesian.toRefFrame<ellipsoidalBase.CartesianEllipsoidalBase.toRefFrame>} 

215 for more details. 

216 ''' 

217 b = _MODS.ellipsoidalBase 

218 _xinstanceof(b.LatLonEllipsoidalBase, b.CartesianEllipsoidalBase, point=point) 

219 p = point.dup(reframe=self) if point.reframe != self else point 

220 return p.toRefFrame(reframe2, **_xkwds(epoch2_epoch_name, name=self.name)) 

221 

222 def toStr(self, epoch=None, name=NN, **unused): # PYCHOK expected 

223 '''Return this reference frame as a text string. 

224 

225 @kwarg epoch: Override this reframe's epoch (C{scalar} or C{str}). 

226 @kwarg name: Override name (C{str}) or C{None} to exclude the 

227 reframe's name. 

228 

229 @return: This L{RefFrame}'s attributes (C{str}). 

230 ''' 

231 D = self.datum 

232 e = self.epoch if epoch is None else _Epoch(epoch) 

233 t = (Fmt.EQUAL(name=repr(name or self.name)), 

234 Fmt.EQUAL(epoch=e), 

235 Fmt.EQUAL(datum=_DOT_(classname(D) + _s_, D.name))) 

236 return _COMMASPACE_.join(t[1:] if name is None else t) 

237 

238 def Xform(self, reframe2): 

239 '''Get the converter Xform I{from} this reference frame I{to} C{reframe2}. 

240 

241 @arg reframe2: Destination frame to convert I{to} (L{RefFrame} or C{str}). 

242 

243 @return: The L{TRFXform} instance or C{None} if not available. 

244 

245 @raise TypeError: Invalid B{C{reframe2}}. 

246 ''' 

247 _xinstanceof(RefFrame, str, reframe2=reframe2) 

248 n2 = reframe2 if isstr(reframe2) else reframe2.name 

249 return self._Xs.get(n2, None) 

250 

251 def Xforms(self, inverse=False): 

252 '''Return all Xforms converting I{from} or I{to} this reference frame. 

253 

254 @kwarg inverse: If C{True}, get all I{inverse, to} Xforms (C{bool}). 

255 

256 @return: An L{ADict} of I{from} C{[refName2]=}L{TRFXform}s) or if 

257 C{B{inverse}=True} of I{to} C{[refName1]=}L{TRFXform}s). 

258 ''' 

259 def _Xi(n2): 

260 for n1, r in RefFrames.items(): 

261 if n2 in r._Xs: 

262 yield n1, r 

263 

264 return ADict(_Xi(self.name)) if inverse else ADict(self._Xs) 

265 

266 

267class RefFrames(_NamedEnum): 

268 '''(INTERNAL) L{RefFrame} registry, I{must} be a sub-class 

269 to accommodate the L{_LazyNamedEnumItem} properties. 

270 ''' 

271 def _Lazy(self, epoch, datum=_GRS80, name=NN): 

272 '''(INTERNAL) Instantiate the L{RefFrame}. 

273 ''' 

274 return RefFrame(epoch, datum, name=name) 

275 

276RefFrames = RefFrames(RefFrame) # PYCHOK singleton 

277'''Some pre-defined L{RefFrame}s, all I{lazily} instantiated.''' 

278# <https://GitHub.com/ChrisVeness/geodesy/blob/master/latlon-ellipsoidal-referenceframe.js> 

279RefFrames._assert( 

280 ETRF88 = _lazy(_ETRF88_, _E(1988)), # epoch, datum? 

281 ETRF89 = _lazy(_ETRF89_, _E(1989)), # epoch, datum? 

282 ETRF90 = _lazy(_ETRF90_, _E(1990)), # epoch, datum? 

283 ETRF91 = _lazy(_ETRF91_, _E(1991)), # epoch, datum? 

284 ETRF92 = _lazy(_ETRF92_, _E(1992)), # epoch, datum? 

285 ETRF93 = _lazy(_ETRF93_, _E(1993)), # epoch, datum? 

286 ETRF94 = _lazy(_ETRF94_, _E(1994)), # epoch, datum? 

287 ETRF96 = _lazy(_ETRF96_, _E(1996)), # epoch, datum? 

288 ETRF97 = _lazy(_ETRF97_, _E(1997)), # epoch, datum? 

289 ETRF2000 = _lazy(_ETRF2000_, _E(2005)), 

290 ETRF2005 = _lazy(_ETRF2005_, _E(2005)), # epoch, datum? 

291 ETRF2008 = _lazy(_ETRF2008_, _E(2008)), # epoch, datum? 

292 ETRF2014 = _lazy(_ETRF2014_, _E(2014)), # epoch, datum? 

293 ETRF2020 = _lazy(_ETRF2020_, _E(2020)), # epoch, datum? 

294 GDA94 = _lazy(_GDA94_, _E(1994)), # Australia 

295 GDA2020 = _lazy(_GDA2020_, _E(2020)), # Australia 

296 ITRF88 = _lazy(_ITRF88_, _E(1988)), 

297 ITRF89 = _lazy(_ITRF89_, _E(1989)), 

298 ITRF90 = _lazy(_ITRF90_, _E(1988)), 

299 ITRF91 = _lazy(_ITRF91_, _E(1988)), 

300 ITRF92 = _lazy(_ITRF92_, _E(1988)), 

301 ITRF93 = _lazy(_ITRF93_, _E(1988)), 

302 ITRF94 = _lazy(_ITRF94_, _E(1993)), 

303 ITRF96 = _lazy(_ITRF96_, _E(1997)), 

304 ITRF97 = _lazy(_ITRF97_, _E(1997)), 

305 ITRF2000 = _lazy(_ITRF2000_, _E(1997)), # aka ITRF00 

306 ITRF2005 = _lazy(_ITRF2005_, _E(2000)), 

307 ITRF2008 = _lazy(_ITRF2008_, _E(2005)), # aka ITRF08 

308 ITRF2014 = _lazy(_ITRF2014_, _E(2010)), 

309 ITRF2020 = _lazy(_ITRF2020_, _E(2015)), 

310 NAD83 = _lazy(_NAD83_, _E(1997)), # aka CORS96 

311 WGS84 = _lazy(_WGS84_, _E(1984), _WGS84), 

312 WGS84g1150 = _lazy(_WGS84g1150_, _E(2001), _WGS84), 

313 WGS84g1674 = _lazy(_WGS84g1674_, _E(2005), _WGS84), 

314 WGS84g1762 = _lazy(_WGS84g1762_, _E(2005), _WGS84)) # same epoch 

315 

316 

317class TransformXform(Transform): 

318 '''Helmert transformation, extended with an C{Xform} converter. 

319 

320 @see: L{Transform<datums.Transform>} and L{Xform<TRFXform>}. 

321 ''' 

322 _Xform = None 

323 

324 def __init__(self, name=NN, **tx_ty_tz_s_sx_sy_sz): # PYCHOK signature 

325 '''New L{TransformXform}. 

326 

327 @kwarg name: Optional name (C{str}), I{not registered}. 

328 

329 @see: L{Transform<datums.Transform>} for details. 

330 

331 @note: The name of this L{TransformXform} starts with C{"-"} 

332 if its C{Xform} was applied I{inversed}. 

333 ''' 

334 Transform.__init__(self, **tx_ty_tz_s_sx_sy_sz) 

335 if name: 

336 self.name = name 

337 

338# def _rps2(self, s_): 

339# '''(INTERNAL) Rate to rate. 

340# ''' 

341# return s_, s_ 

342 

343 def toRefFrame(self, point, epoch=None, **epoch2_datum_name): # PYCHOK signature 

344 '''Convert a cartesian or geodetic point using this transform and C{refName1}, 

345 C{refName2} and C{epoch} of this transform's C{Xform}. 

346 

347 @kwarg epoch: Optional epoch ((L{Epoch}, C{scalar} or C{str})), overriding 

348 this transform's Xform's C{epoch}. 

349 

350 @return: A copy of the B{C{point}}, converted or renamed. 

351 

352 @see: Method L{RefFrame.toRefFrame<trf.RefFrame.toRefFrame>} for more details. 

353 ''' 

354 return self.Xform.toRefFrame(point, epoch=epoch, **_xkwds(epoch2_datum_name)) 

355 

356 def velocities(self, factor=_MM2M): 

357 '''Compute the X, Y and Z I{velocities} of this transform. 

358 

359 @kwarg factor: Factor to scale this Xform's C{rates} (C{scalar}), default 

360 from C{milli-meter-} to C{meter-per-year}. 

361 

362 @return: A L{Vector3Tuple}C{(x, y, z)} or C{None}. 

363 

364 @raise TypeError: Invalid B{C{factor}}. 

365 

366 @see: Alamimi, Z. "EUREF-TN-1-Jan-31-2024", U{Appendix A, equation (3) 

367 <http://ETRS89.ENSG.IGN.FR/pub/EUREF-TN-1-Jan-31-2024.pdf>}. 

368 ''' 

369 v = self.Xform 

370 if v is not None: 

371 r = v.rates * factor # eq (3) ... 

372 T = self.dup(tx=r.sx, ty=r.sy, tz=r.sz, # Xyy-dot? 

373 s1=0, name=NN(self.name, _v_)) 

374 v = T.transform(r.tx, r.ty, r.tz) # Xyy? 

375 return v 

376 

377 @Property 

378 def Xform(self): 

379 '''Get the Xform of this Helmert (L{TRFXform} or C{None}). 

380 ''' 

381 return self._Xform 

382 

383 @Xform.setter # PYCHOK setter! 

384 def Xform(self, Xform): 

385 '''Set the Xform of this Helmert (L{TRFXform}). 

386 

387 @raise TypeError: Invalid B{C{Xform}}. 

388 ''' 

389 _xinstanceof(TRFXform, Xform=Xform) 

390 self._Xform = Xform 

391 

392 

393class TRFXform7Tuple(_NamedTuple): 

394 '''7-Tuple C{(tx, ty, tz, s, sx, sy, sz)} of conversion parameters with 

395 translations C{tx}, C{ty} and C{tz} in C{milli-meter}, scale C{s} in 

396 C{ppb} and rates C{sx}, C{sy} and C{sz} in C{milli-arc-seconds-per-year}. 

397 

398 @note: The parameters are also named as C{(Tx, Ty, Tz, D, Rx, Ry, Rz)} 

399 or C{(T1, T2, T3, D, R1, R2, R3)}. 

400 

401 @see: Class L{TransformXform}'s matching keyword argument names. 

402 ''' 

403 _Names_ = (_tx_, _ty_, _tz_, _s_, _sx_, _sy_, _sz_) # == kwds 

404 _Units_ = (_MM, _MM, _MM, _PPB, _MAS, _MAS, _MAS) 

405 

406 def __add__(self, other): 

407 '''Return the sum of this and an other L{TRFXform7Tuple}. 

408 ''' 

409 _xinstanceof(TRFXform7Tuple, other=other) 

410 return TRFXform7Tuple(((s + t) for s, t in _zip(self, other)), 

411 name=_PLUS_) # .fsums._add_op_ 

412 

413 def __mul__(self, factor): 

414 if not isscalar(factor): 

415 raise _IsnotError(_scalar_, factor=factor) 

416 return type(self)(_ * factor for _ in self) 

417 

418 def __neg__(self): 

419 return self.inverse() 

420 

421 def inverse(self, name=NN): 

422 '''Return the inverse of this transform. 

423 

424 @kwarg name: Optional name (C{str}). 

425 

426 @return: Inverse (L{TransformXform}). 

427 ''' 

428 n = name or _minus(self.name) 

429 return type(self)(map(neg, self), name=n) 

430 

431 @Property_RO 

432 def isunity(self): 

433 '''Is this a C{unity, identidy} transform (C{bool}). 

434 ''' 

435 return not any(self) 

436 

437 

438class TRFXform(_Named): 

439 '''Terrestrial Reference Frame (TRF) converter between two 

440 reference frames observed at an C{epoch}. 

441 ''' 

442 epoch = _EP0CH 

443 refName1 = \ 

444 refName2 = NN 

445 rates = \ 

446 xform = TRFXform7Tuple(_0_0s(len( 

447 TRFXform7Tuple._Names_))) 

448 

449 def __init__(self, refName1, refName2, epoch=None, 

450 xform=None, rates=None, name=NN): 

451 '''New L{trfXform}. 

452 

453 @arg refName1: Source reframe (C{str}), converting I{from}. 

454 @arg refName2: Destination reframe (C{str}), converting I{to}. 

455 @kwarg epoch: Epoch, a fractional year (L{Epoch}, C{scalar} or C{str}). 

456 @kwarg xform: I{Transform} parameters (L{TRFXform7Tuple}). 

457 @kwarg rates: I{Rate} parameters (L{TRFXform7Tuple}), as B{C{xform}}, 

458 but in C{units-per-year}. 

459 @kwarg name: Optional name (C{str}) 

460 

461 @return: The new TRF converter (L{TRFXform}). 

462 

463 @raise TRFError: Invalid B{C{epoch}}, B{C{xform}} or B{C{rates}}. 

464 ''' 

465 self.refName1 = str(refName1) 

466 self.refName2 = str(refName2) 

467 _xinstanceof(TRFXform7Tuple, xform=xform, rates=rates) 

468 self.epoch = _Epoch(epoch) 

469 self.xform = xform 

470 self.rates = rates 

471 self.name = name or self.toStr() 

472 

473 def __lt__(self, other): 

474 _xinstanceof(TRFXform, other=other) 

475 return self.refName1 < other.refName1 or \ 

476 self.refName2 < other.refName2 or \ 

477 self.epoch < other.epoch 

478 

479 def __neg__(self): 

480 return self.inverse() 

481 

482 def __repr__(self): 

483 return self.toRepr() 

484 

485 def _at(self, epoch): 

486 '''(INTERNAL) Return C{self.name@epoch}. 

487 ''' 

488 n = self.name 

489 if epoch != self.epoch: 

490 _t = _AT_(NN, epoch) 

491 if not n.endswith(_t): 

492 n = NN(n, _t) 

493 return n 

494 

495 def _7Helmert(self, epoch, mm2m): 

496 '''(INTERNAL) Get the named Helmert parameters observed 

497 at C{epoch} converted by C{mm2m}, I{signed}. 

498 ''' 

499 e = epoch - self.epoch # delta in fractional years 

500 ns = TRFXform7Tuple._Names_ 

501 return dict((n, (x + e * r) * mm2m) for n, x, r in 

502 _zip(ns, self.xform, self.rates)) # strict=True 

503 

504 def inverse(self, name=NN): 

505 '''Return the inverse of this Xform. 

506 

507 @kwarg name: Optional name (C{str}). 

508 

509 @return: Inverse (L{TRFXform}). 

510 ''' 

511 return self.dup(refName1=self.refName2, xform=-self.xform, 

512 refName2=self.refName1, rates=-self.rates, 

513 name=name or _minus(self.name)) 

514 

515 def _range(self, *e1_e2): 

516 '''(INTERNAL) Epoch "range", distance. 

517 ''' 

518 def _r(e): 

519 e -= self.epoch 

520 return (-e) if e < 0 else (e * 2) 

521 

522 return sum(map(_r, e1_e2)) if e1_e2 else self.epoch 

523 

524 def toEpoch(self, epoch): 

525 '''Convert this Xform to B{C{epoch}}, if needed. 

526 

527 @arg epoch: Epoch, fractional year (C{Epoch}, C{scalar} 

528 or C{str}). 

529 

530 @return: This Xform or a copy converted to B{C{epoch}}. 

531 

532 @raise TRFError: Invalid B{C{epoch}}. 

533 ''' 

534 e = _Epoch(epoch) - self.epoch 

535 if e: 

536 t = TRFXform7Tuple((x + e * r) for x, r in 

537 _zip(self.xform, self.rates)) 

538 X = self.dup(epoch=epoch, xform=t, name=self._at(epoch)) 

539 else: 

540 X = self 

541 return X 

542 

543 def toRefFrame(self, point, epoch=None, datum=_GRS80, **epoch2_name): 

544 '''Convert a cartesian or geodetic point using this Xform's C{refName1}, 

545 C{refName2}, C{epoch} and L{Transform<trf.TransformXform>}. 

546 

547 @kwarg epoch: Optional epoch ((L{Epoch}, C{scalar} or C{str})), overriding 

548 this transform's Xform's C{epoch}. 

549 

550 @return: A copy of the B{C{point}}, converted or renamed. 

551 

552 @see: Method L{RefFrame.toRefFrame<trf.RefFrame.toRefFrame>} for more details. 

553 ''' 

554 def _r(name): 

555 r = RefFrames.get(name) 

556 if r is None or r.datum != datum: 

557 r = RefFrame(self.epoch, datum) 

558 r.name = name # unregistered 

559 return r 

560 

561 return _r(self.refName1).toRefFrame(point, 

562 _r(self.refName2), epoch=epoch, **_xkwds(epoch2_name)) 

563 

564 def toRepr(self, **unused): # PYCHOK signature 

565 '''Return the represention of this Xform (C{str}). 

566 ''' 

567 return unstr(self.classname, epoch=self.epoch, name=self.name) 

568 

569 def toStr(self, epoch=None, **unused): # PYCHOK signature 

570 '''Return this Xform as C{"fromRef@epoch_toRef"} (C{str}). 

571 

572 @kwarg epoch: Epoch (C{scalar}), overriding this Xform's epoch. 

573 ''' 

574 e = epoch or self.epoch 

575 return NN(_AT_(self.refName1, e), _x_, self.refName2) 

576 

577 def toTransform(self, epoch1, epoch2=None, inverse=False): 

578 '''Combine this Xform observed at B{C{epoch1}} into a Helmert 

579 L{TransformXform}, optionally at B{C{epoch2 or epoch1}}. 

580 

581 @arg epoch1: Epoch to observe I{from} (C{scalar}). 

582 @kwarg epoch2: Optional epoch to observe I{to} (C{scalar}). 

583 @kwarg inverse: Invert the Helmert tranformation (C{bool}). 

584 

585 @raise TRFError: Invalid B{C{epoch1}} or B{C{epoch2}}. 

586 

587 @note: Translations are converted from C{milli-meter} to 

588 C{meter}, shift rates from C{milli-arc-seconds} to 

589 C{arc-seconds} and scale from C{ppb} to C{ppM}. 

590 ''' 

591 e = Epoch(epoch2=epoch1 if epoch2 is None else epoch2) 

592 X = self if e == epoch1 else self.toEpoch(epoch1) 

593 if inverse: 

594 X = X.inverse() 

595 H = TransformXform(name=X._at(e), **X._7Helmert(e, _MM2M)) 

596 H.Xform = X 

597 return H 

598 

599 

600def date2epoch(year, month, day): 

601 '''Return the C{epoch} for a calendar day. 

602 

603 @arg year: Year of the date (C{scalar}). 

604 @arg month: Month in the B{C{year}} (C{scalar}, 1..12). 

605 @arg day: Day in the B{C{month}} (C{scalar}, 1..31). 

606 

607 @return: Epoch, the fractional year (C{float}). 

608 

609 @raise TRFError: Invalid B{C{year}}, B{C{month}} or B{C{day}}. 

610 

611 @note: Any B{C{year}} is considered a leap year, i.e. having 

612 29 days in February. 

613 ''' 

614 try: 

615 y, m, d = map1(int, year, month, day) 

616 if y > 0 and 1 <= m <= 12 and 1 <= d <= _mDays[m]: 

617 e = y + float(sum(_mDays[:m]) + d) / _366_0 

618 return Epoch(e, low=0) 

619 

620 raise ValueError # _invalid_ 

621 except (TRFError, TypeError, ValueError) as x: 

622 raise TRFError(year=year, month=month, day=day, cause=x) 

623 

624 

625def epoch2date(epoch): 

626 '''Return the date for a reference frame C{epoch}. 

627 

628 @arg epoch: Fractional year (C{scalar}). 

629 

630 @return: 3-Tuple C{(year, month, day)}. 

631 

632 @raise TRFError: Invalid B{C{epoch}}. 

633 

634 @note: Any B{C{year}} is considered a leap year, i.e. having 

635 29 days in February. 

636 ''' 

637 e = _Epoch(epoch, low=0) 

638 y = int(e) 

639 d = int(ceil(_366_0 * (e - y))) 

640 for m, n in enumerate(_mDays[1:]): 

641 if d > n: 

642 d -= n 

643 else: 

644 break 

645 return y, (m + 1), max(1, d) 

646 

647 

648def _Epoch(e, **kwds): 

649 '''(INTERNAL) Get an C{Epoch(B{e})}. 

650 ''' 

651 return Epoch(e, **kwds) if kwds or not isinstance(e, Epoch) else e 

652 

653 

654def _eT0Ds4(inst, reframe, epoch, reframe2, epoch2): 

655 '''(INTERNAL) Get epoch, a Helmert L{Transform}s or 0-tuple, datum 

656 and datum2 to convert B{C{refFrame}} observed at B{C{epoch}} 

657 into B{C{refFrame2}} observed at C{epoch2 or epoch}. 

658 ''' 

659 r = reframe or inst.reframe 

660 if not r: 

661 t = _SPACE_(_DOT_(repr(inst), _reframe_), MISSING) 

662 raise TRFError(_no_(_conversion_), txt=t) 

663 

664 _xinstanceof(RefFrame, reframe2=reframe2, reframe=r) 

665 

666 e1 = _Epoch(epoch or inst.epoch or r.epoch) 

667 e2 = e1 if epoch2 is None else Epoch(epoch2=epoch2) 

668 

669 t0 = _toTransform0(r.name, e1, reframe2.name, e2) 

670 if t0 is None: 

671 t = _SPACE_(RefFrame.__name__, _AT_(r.name, e1), 

672 _to_, _AT_(reframe2.name, e2)) 

673 raise TRFError(_no_(_conversion_), txt=t) 

674 

675 return e2, t0, r.datum, reframe2.datum 

676 

677 

678def _immediate(n1, n2, *unused): 

679 '''(INTERNAL) Get the C{n1} to C{n2} Xform or C{None}. 

680 ''' 

681 X = RefFrames.get(n1) 

682 if X: 

683 X = X._Xs.get(n2, None) 

684 return X 

685 

686 

687def _intermediate(n1, n2, *e1_e2): 

688 '''(INTERNAL) Find an Xform "between" C{n1} and C{n2}. 

689 ''' 

690 def _e(e1=0, e2=0): 

691 return e1 - e2 

692 

693 def _X4(_Xs): 

694 for n, X1 in _Xs.items(): 

695 X2 = _immediate(n, n2) 

696 if X2: 

697 yield (X1._range(*e1_e2) + X2._range(*e1_e2)), X1, X2, True 

698 X2 = _immediate(n2, n) 

699 if X2: 

700 yield (X1._range(*e1_e2) + X2._range(*e1_e2)), X1, X2, False 

701 

702 X, r = None, RefFrames.get(n1) 

703 if r: 

704 i = sorted(_X4(r._Xs)) 

705 if i: 

706 _, X1, X2, f = i.pop(0) 

707 e1, e2 = X1.epoch, X2.epoch 

708 if e1 > e2 and _e(*e1_e2) < 0: # X1 to e2 

709 X1 = X1.toEpoch(e2) 

710 e1 = e2 

711 elif e1 != e2: # X2 to e1 

712 X2 = X2.toEpoch(e1) 

713 # <https://Geodesy.NOAA.gov/TOOLS/Htdp/Pearson_Snay_2012.pdf, 

714 # Apendix, Table 7, last column "Sum of the previous ..." 

715 X = TRFXform(n1, n2, epoch=e1, 

716 xform=X1.xform + (X2.xform if f else -X2.xform), 

717 rates=X1.rates + (X2.rates if f else -X2.rates), 

718 name=NN(X1._at(e1), _PLUS_ if f else _MINUS_, 

719 X2._at(e1))) 

720 return X 

721 

722 

723def _P(*ps): # deleted below 

724 '''(INTERNAL) De-dup L{TRFXform7Tuple}s. 

725 ''' 

726 t = TRFXform7Tuple(map(_F, ps)) 

727 return _Ps.setdefault(t, t) # PYCHOK del 

728 

729 

730def _reframe(**name_reframe): 

731 '''(INTERNAL) Get a C{reframe}. 

732 ''' 

733 if len(name_reframe) == 1: 

734 for n, r in name_reframe.items(): 

735 break 

736 if isstr(r): 

737 r = RefFrames.get(r) 

738 if r and isinstance(r, RefFrame): 

739 return r 

740 raise TRFError(**name_reframe) # _invalid_ 

741 

742 

743def _toTransform0(n1, e1, n2, e2): 

744 '''(INTERNAL) Return a L{TransformXform}, 0-tuple or C{None}. 

745 ''' 

746 if n1 == n2 or (n1.startswith(_ITRF_) and n2.startswith(_WGS84_)) \ 

747 or (n2.startswith(_ITRF_) and n1.startswith(_WGS84_)): 

748 return () 

749 

750 for _f in (_immediate, _intermediate): 

751 X = _f(n1, n2, e1, e2) 

752 Y = _f(n2, n1, e1, e2) 

753 if X and Y: 

754 if X._range(e1, e2) < Y._range(e1, e2): 

755 Y = None 

756 else: 

757 X = None 

758 if X: 

759 return X.toTransform(e1, epoch2=e2) 

760 if Y: 

761 return Y.toTransform(e1, epoch2=e2, inverse=True) 

762 

763 return None 

764 

765 

766def trfTransform0(reframe, reframe2, epoch=None, epoch2=None): 

767 '''Get the L{TransformXform} to convert a C{reframe} observed at C{epoch} to 

768 C{reframe2} at observed at C{epoch2 or epoch}. 

769 

770 @arg reframe: Reference frame to convert I{from} (L{RefFrame} or C{str}). 

771 @arg reframe2: Reference frame to convert I{to} (L{RefFrame} or C{str}). 

772 @arg epoch: Epoch to observe I{from} (L{Epoch}, C{scalar} or C{str}), 

773 otherwise C{B{reframe}}'s C{epoch}. 

774 @kwarg epoch2: Optional epoch to observe to observe I{to} (L{Epoch}, C{scalar} 

775 or C{str}), otherwise B{C{epoch}} or C{B{reframe}}'s C{epoch}. 

776 

777 @return: A L{TransformXform} instance, a C{0-tuple} for I{unity, identity} or 

778 C{None} if no conversion exists. 

779 

780 @raise TRFError: Invalid B{C{reframe}}, B{C{epoch}}, B{C{reframe2}} or 

781 B{C{epoch2}}. 

782 

783 @raise TypeError: Invalid B{C{reframe}} or B{C{reframe2}}. 

784 ''' 

785 r1 = _reframe(reframe=reframe) 

786 e1 = r1.epoch if epoch is None else _Epoch(epoch) 

787 r2 = _reframe(reframe2=reframe2) 

788 e2 = e1 if epoch2 is None else Epoch(epoch2=epoch2) 

789 return _toTransform0(r1.name, e1, r2.name, e2) 

790 

791 

792def trfXform(reframe1, reframe2, epoch=None, xform=None, rates=None): 

793 '''Define a new Terrestrial Reference Frame (TRF) converter. 

794 

795 @arg reframe1: Source reframe (L{RefFrame} or C{str}), converting I{from}. 

796 @arg reframe2: Destination reframe (L{RefFrame} or C{str}), converting I{to}. 

797 @kwarg epoch: Epoch, a fractional year (L{Epoch}, C{scalar} or C{str}) 

798 or C{None} for C{B{reframe2}}'s epoch. 

799 @kwarg xform: I{Transform} parameters (L{TRFXform7Tuple}). 

800 @kwarg rates: I{Rate} parameters (L{TRFXform7Tuple}), as B{C{xform}}, 

801 but in C{units-per-year}. 

802 

803 @return: The new TRF converter (L{TRFXform}). 

804 

805 @raise TRFError: Invalid B{C{reframe1}}, B{C{reframe2}}, B{C{epoch}}, 

806 B{C{xform}} or B{C{rates}} or the TRF converter 

807 already exists. 

808 ''' 

809 r1 = _reframe(reframe1=reframe1) 

810 r2 = _reframe(reframe2=reframe2) 

811 e = r2.epoch if epoch is None else _Epoch(epoch) 

812 _xinstanceof(TRFXform7Tuple, xform=xform, rates=rates) 

813 return _trfX(r1.name, r2.name, epoch=e, xform=xform, rates=rates) 

814 

815 

816def _trfX(n1, n2, **epoch_xform_rates): 

817 '''(INTERNAL) New, I{unique} L{TRFXform} converter. 

818 ''' 

819 r1 = RefFrames.get(n1) 

820 r2 = RefFrames.get(n2) 

821 if r1 and r2: 

822 if n2 in r1._Xs: 

823 t = _exists_ 

824 elif n1 in r2._Xs: 

825 t = _SPACE_(_inverse_, _exists_) 

826 else: 

827 r1._Xs[n2] = X = TRFXform(n1, n2, **epoch_xform_rates) 

828 return X 

829 else: 

830 t = _invalid_ 

831 raise TRFError(trfX=_SPACE_(n1, _to_, n2), txt=t) # _NameError 

832 

833 

834# TRF conversions specified as an epoch and 2 sets of 7-parameters. Most from Altamimi, Z. U{"EUREF Technical 

835# Note 1: Relationship and Transformation between the International and the European Terrestrial Reference 

836# Systems"<https://ERTS89.ENSG.IFN.Fr/pub/EUREF-TN-1-Jan-31-2024.pdf>} Appendix A, more at U{Quinsy QPS <https:// 

837# confluence.QPS.NL/qinsy/files/latest/en/182618383/182618384/1/1579182881000/ITRF_Transformation_Parameters.xlsx>}. 

838# See also U{Quinsy International Terrestrial Reference Frame 2014 (ITRF2014)<https://confluence.QPS.NL/qinsy/latest/ 

839# en/international-terrestrial-reference-frame-2014-itrf2014-182618383.html>}. 

840_trfX(_ITRF2020_, _ITRF2014_, epoch=_E(2015), # <https://ITRF.IGN.Fr/docs/solutions/itrf2020/Transfo-ITRF2020_TRFs.txt> 

841 xform=_P( -1.4, -0.9, 1.4, -0.42, _0_0, _0_0, _0_0), 

842 rates=_P( _0_0, -0.1, 0.2, _0_0, _0_0, _0_0, _0_0)) 

843_trfX(_ITRF2020_, _ITRF2008_, epoch=_E(2015), 

844 xform=_P( 0.2, 1.0, 3.3, -0.29, _0_0, _0_0, _0_0), 

845 rates=_P( _0_0, -0.1, 0.1, 0.03, _0_0, _0_0, _0_0)) 

846_trfX(_ITRF2020_, _ITRF2005_, epoch=_E(2015), 

847 xform=_P( 2.7, 0.1, -1.4, 0.65, _0_0, _0_0, _0_0), 

848 rates=_P( 0.3, -0.1, 0.1, 0.03, _0_0, _0_0, _0_0)) 

849_trfX(_ITRF2020_, _ITRF2000_, epoch=_E(2015), 

850 xform=_P( -0.2, 0.8, -34.2, 2.25, _0_0, _0_0, _0_0), 

851 rates=_P( 0.1, _0_0, -1.7, 0.11, _0_0, _0_0, _0_0)) 

852_trfX(_ITRF2020_, _ITRF97_, epoch=_E(2015), 

853 xform=_P( 6.5, -3.9, -77.9, 3.98, _0_0, _0_0, 0.36), 

854 rates=_P( 0.1, -0.6, -3.1, 0.12, _0_0, _0_0, 0.02)) 

855_trfX(_ITRF2020_, _ITRF96_, epoch=_E(2015), 

856 xform=_P( 6.5, -3.9, -77.9, 3.98, _0_0, _0_0, 0.36), 

857 rates=_P( 0.1, -0.6, -3.1, 0.12, _0_0, _0_0, 0.02)) 

858_trfX(_ITRF2020_, _ITRF94_, epoch=_E(2015), 

859 xform=_P( 6.5, -3.9, -77.9, 3.98, _0_0, _0_0, 0.36), 

860 rates=_P( 0.1, -0.6, -3.1, 0.12, _0_0, _0_0, 0.02)) 

861_trfX(_ITRF2020_, _ITRF93_, epoch=_E(2015), 

862 xform=_P( -65.8, 1.9, -71.3, 4.47, -3.36, -4.33, 0.75), 

863 rates=_P( -2.8, -0.2, -2.3, 0.12, -0.11, -0.19, 0.07)) 

864_trfX(_ITRF2020_, _ITRF92_, epoch=_E(2015), 

865 xform=_P( 14.5, -1.9, -85.9, 3.27, _0_0, _0_0, 0.36), 

866 rates=_P( 0.1, -0.6, -3.1, 0.12, _0_0, _0_0, 0.02)) 

867_trfX(_ITRF2020_, _ITRF91_, epoch=_E(2015), 

868 xform=_P( 26.5, 12.1, -91.9, 4.67, _0_0, _0_0, 0.36), 

869 rates=_P( 0.1, -0.6, -3.1, 0.12, _0_0, _0_0, 0.02)) 

870_trfX(_ITRF2020_, _ITRF90_, epoch=_E(2015), 

871 xform=_P( 24.5, 8.1, -107.9, 4.97, _0_0, _0_0, 0.36), 

872 rates=_P( 0.1, -0.6, -3.1, 0.12, _0_0, _0_0, 0.02)) 

873_trfX(_ITRF2020_, _ITRF89_, epoch=_E(2015), 

874 xform=_P( 29.5, 32.1, -145.9, 8.37, _0_0, _0_0, 0.36), 

875 rates=_P( 0.1, -0.6, -3.1, 0.12, _0_0, _0_0, 0.02)) 

876_trfX(_ITRF2020_, _ITRF88_, epoch=_E(2015), 

877 xform=_P( 24.5, -3.9, -169.9, 11.47, 0.1, _0_0, 0.36), 

878 rates=_P( 0.1, -0.6, -3.1, 0.12, _0_0, _0_0, 0.02)) 

879 

880# see U{Transformation Parameters ITRF2014<http://ITRF.IGN.Fr/doc_ITRF/Transfo-ITRF2014_ITRFs.txt>} and 

881# Altamimi, Z. U{"EUREF Technical Note 1: Relationship and Transformation between the International and 

882# the European Terrestrial Reference Systems"<https://ERTS89.ENSG,IFN.Fr/pub/EUREF-TN-1.pdf>} Appendix A. 

883_trfX(_ITRF2014_, _ITRF2008_, epoch=(2010), # <http://ITRF.ENSG.IGN.Fr/ITRF_solutions/2014/tp_14-08.php> 

884 xform=_P( 1.6, 1.9, 2.4, -0.02, _0_0, _0_0, _0_0), 

885 rates=_P( _0_0, _0_0, -0.1, 0.03, _0_0, _0_0, _0_0)) 

886_trfX(_ITRF2014_, _ITRF2005_, epoch=_E(2010), 

887 xform=_P( 2.6, _1_0, -2.3, 0.92, _0_0, _0_0, _0_0), 

888 rates=_P( 0.3, _0_0, -0.1, 0.03, _0_0, _0_0, _0_0)) 

889_trfX(_ITRF2014_, _ITRF2000_, epoch=_E(2010), 

890 xform=_P( 0.7, 1.2, -26.1, 2.12, _0_0, _0_0, _0_0), 

891 rates=_P( 0.1, 0.1, -1.9, 0.11, _0_0, _0_0, _0_0)) 

892_trfX(_ITRF2014_, _ITRF97_, epoch=_E(2010), 

893 xform=_P( 7.4, -0.5, -62.8, 3.8, _0_0, _0_0, 0.26), 

894 rates=_P( 0.1, -0.5, -3.3, 0.12, _0_0, _0_0, 0.02)) 

895_trfX(_ITRF2014_, _ITRF96_, epoch=_E(2010), 

896 xform=_P( 7.4, -0.5, -62.8, 3.8, _0_0, _0_0, 0.26), 

897 rates=_P( 0.1, -0.5, -3.3, 0.12, _0_0, _0_0, 0.02)) 

898_trfX(_ITRF2014_, _ITRF94_, epoch=_E(2010), 

899 xform=_P( 7.4, -0.5, -62.8, 3.8, _0_0, _0_0, 0.26), 

900 rates=_P( 0.1, -0.5, -3.3, 0.12, _0_0, _0_0, 0.02)) 

901_trfX(_ITRF2014_, _ITRF93_, epoch=_E(2010), 

902 xform=_P( -50.4, 3.3, -60.2, 4.29, -2.81, -3.38, 0.4), 

903 rates=_P( -2.8, -0.1, -2.5, 0.12, -0.11, -0.19, 0.07)) 

904_trfX(_ITRF2014_, _ITRF92_, epoch=_E(2010), 

905 xform=_P( 15.4, 1.5, -70.8, 3.09, _0_0, _0_0, 0.26), 

906 rates=_P( 0.1, -0.5, -3.3, 0.12, _0_0, _0_0, 0.02)) 

907_trfX(_ITRF2014_, _ITRF91_, epoch=_E(2010), 

908 xform=_P( 27.4, 15.5, -76.8, 4.49, _0_0, _0_0, 0.26), 

909 rates=_P( 0.1, -0.5, -3.3, 0.12, _0_0, _0_0, 0.02)) 

910_trfX(_ITRF2014_, _ITRF90_, epoch=_E(2010), 

911 xform=_P( 25.4, 11.5, -92.8, 4.79, _0_0, _0_0, 0.26), 

912 rates=_P( 0.1, -0.5, -3.3, 0.12, _0_0, _0_0, 0.02)) 

913_trfX(_ITRF2014_, _ITRF89_, epoch=_E(2010), 

914 xform=_P( 30.4, 35.5, -130.8, 8.19, _0_0, _0_0, 0.26), 

915 rates=_P( 0.1, -0.5, -3.3, 0.12, _0_0, _0_0, 0.02)) 

916_trfX(_ITRF2014_, _ITRF88_, epoch=_E(2010), 

917 xform=_P( 25.4, -0.5, -154.8, 11.29, 0.1, _0_0, 0.26), 

918 rates=_P( 0.1, -0.5, -3.3, 0.12, _0_0, _0_0, 0.02)) 

919 

920# Pearson, C. & Snay, R. U{"Introducing HTDP 3.1 to transform coordinates across time and spatial reference 

921# frames"<https://Geodesy.NOAA.gov/TOOLS/Htdp/Pearson_Snay_2012.pdf> Table 7, 1st and 2nd column 

922_trfX(_ITRF2008_, _ITRF2005_, epoch=_E(2005), 

923 xform=_P( -0.5, -0.9, -4.7, 0.94, _0_0, _0_0, _0_0), 

924 rates=_P( 0.3, _0_0, _0_0, _0_0, _0_0, _0_0, _0_0)) 

925# _trfX(_ITRF2008_, _ITRF2005_, epoch=_E(1997), 

926# xform=_P( -2.9, -0.9, -4.7, 0.94, _0_0, _0_0, _0_0), 

927# rates=_P( 0.3, _0_0, _0_0, _0_0, _0_0, _0_0, _0_0)) 

928# see U{Transformation Parameters ITRF2008<http://ITRF.IGN.Fr/doc_ITRF/Transfo-ITRF2008_ITRFs.txt>} 

929# _trfX(_ITRF2008_, _ITRF2005_, epoch=_E(2000), # <http://ITRF.ENSG.IGN.Fr/ITRF_solutions/2008/tp_08-05.php> 

930# xform=_P( -2.0, -0.9, -4.7, 0.94, _0_0, _0_0, _0_0), 

931# rates=_P( 0.3, _0_0, _0_0, _0_0, _0_0, _0_0, _0_0)) 

932_trfX(_ITRF2008_, _ITRF2000_, epoch=_E(2000), 

933 xform=_P( -1.9, -1.7, -10.5, 1.34, _0_0, _0_0, _0_0), 

934 rates=_P( 0.1, 0.1, -1.8, 0.08, _0_0, _0_0, _0_0)) 

935_trfX(_ITRF2008_, _ITRF97_, epoch=_E(2000), 

936 xform=_P( 4.8, 2.6, -33.2, 2.92, _0_0, _0_0, 0.06), 

937 rates=_P( 0.1, -0.5, -3.2, 0.09, _0_0, _0_0, 0.02)) 

938_trfX(_ITRF2008_, _ITRF96_, epoch=_E(2000), 

939 xform=_P( 4.8, 2.6, -33.2, 2.92, _0_0, _0_0, 0.06), 

940 rates=_P( 0.1, -0.5, -3.2, 0.09, _0_0, _0_0, 0.02)) 

941_trfX(_ITRF2008_, _ITRF94_, epoch=_E(2000), 

942 xform=_P( 4.8, 2.6, -33.2, 2.92, _0_0, _0_0, 0.06), 

943 rates=_P( 0.1, -0.5, -3.2, 0.09, _0_0, _0_0, 0.02)) 

944_trfX(_ITRF2008_, _ITRF93_, epoch=_E(2000), 

945 xform=_P( -24.0, 2.4, -38.6, 3.41, -1.71, -1.48, -0.3), 

946 rates=_P( -2.8, -0.1, -2.4, 0.09, -0.11, -0.19, 0.07)) 

947_trfX(_ITRF2008_, _ITRF92_, epoch=_E(2000), 

948 xform=_P( 12.8, 4.6, -41.2, 2.21, _0_0, _0_0, 0.06), 

949 rates=_P( 0.1, -0.5, -3.2, 0.09, _0_0, _0_0, 0.02)) 

950_trfX(_ITRF2008_, _ITRF91_, epoch=_E(2000), 

951 xform=_P( 24.8, 18.6, -47.2, 3.61, _0_0, _0_0, 0.06), 

952 rates=_P( 0.1, -0.5, -3.2, 0.09, _0_0, _0_0, 0.02)) 

953_trfX(_ITRF2008_, _ITRF90_, epoch=_E(2000), 

954 xform=_P( 22.8, 14.6, -63.2, 3.91, _0_0, _0_0, 0.06), 

955 rates=_P( 0.1, -0.5, -3.2, 0.09, _0_0, _0_0, 0.02)) 

956_trfX(_ITRF2008_, _ITRF89_, epoch=_E(2000), 

957 xform=_P( 27.8, 38.6, -101.2, 7.31, _0_0, _0_0, 0.06), 

958 rates=_P( 0.1, -0.5, -3.2, 0.09, _0_0, _0_0, 0.02)) 

959_trfX(_ITRF2008_, _ITRF88_, epoch=_E(2000), 

960 xform=_P( 22.8, 2.6, -125.2, 10.41, 0.1, _0_0, 0.06), 

961 rates=_P( 0.1, -0.5, -3.2, 0.09, _0_0, _0_0, 0.02)) 

962 

963# Pearson, C. & Snay, R. U{"Introducing HTDP 3.1 to transform coordinates across time and spatial reference 

964# frames"<https://Geodesy.NOAA.gov/TOOLS/Htdp/Pearson_Snay_2012.pdf> Table 7, 3rd column 

965# _trfX(_ITRF2005_, _ITRF2000_, epoch=_E(1997), 

966# xform=_P( 0.7, -1.1, -0.4, 0.16, -0.2, 0.1 -1.8), 

967# rates=_P( -0.2, 0.1, -1.8, 0.08, _0_0, _0_0, _0_0)) 

968_trfX(_ITRF2005_, _ITRF2000_, epoch=_E(2000), # <http://ITRF.ENSG.IGN.Fr/ITRF_solutions/2005/tp_05-00.php> 

969 xform=_P( 0.1, -0.8, -5.8, 0.4, _0_0, _0_0, _0_0), 

970 rates=_P( -0.2, 0.1, -1.8, 0.08, _0_0, _0_0, _0_0)) 

971 

972_trfX(_ITRF2000_, _ITRF97_, epoch=_E(1997), 

973 xform=_P( 0.67, 0.61, -1.85, 1.55, _0_0, _0_0, _0_0), 

974 rates=_P( _0_0, -0.06, -0.14, 0.01, _0_0, _0_0, -0.02)) # 0.02? 

975_trfX(_ITRF2000_, _ITRF96_, epoch=_E(1997), 

976 xform=_P( 0.67, 0.61, -1.85, 1.55, _0_0, _0_0, _0_0), 

977 rates=_P( _0_0, -0.06, -0.14, 0.01, _0_0, _0_0, 0.02)) 

978_trfX(_ITRF2000_, _ITRF94_, epoch=_E(1997), 

979 xform=_P( 0.67, 0.61, -1.85, 1.55, _0_0, _0_0, _0_0), 

980 rates=_P( _0_0, -0.06, -0.14, 0.01, _0_0, _0_0, 0.02)) 

981_trfX(_ITRF2000_, _ITRF93_, epoch=_E(1988), 

982 xform=_P( 12.7, 6.5, -20.9, 1.95, -0.39, 0.8, -1.14), 

983 rates=_P( -2.9, -0.2, -0.6, 0.01, -0.11, -0.19, 0.07)) 

984_trfX(_ITRF2000_, _ITRF92_, epoch=_E(1988), 

985 xform=_P( 1.47, 1.35, -1.39, 0.75, _0_0, _0_0, -0.18), 

986 rates=_P( _0_0, -0.06, -0.14, 0.01, _0_0, _0_0, 0.02)) 

987_trfX(_ITRF2000_, _ITRF91_, epoch=_E(1988), 

988 xform=_P( 26.7, 27.5, -19.9, 2.15, _0_0, _0_0, -0.18), 

989 rates=_P( _0_0, -0.6, -1.4, 0.01, _0_0, _0_0, 0.02)) 

990_trfX(_ITRF2000_, _ITRF90_, epoch=_E(1988), 

991 xform=_P( 2.47, 2.35, -3.59, 2.45, _0_0, _0_0, -0.18), 

992 rates=_P( _0_0, -0.06, -0.14, 0.01, _0_0, _0_0, 0.02)) 

993_trfX(_ITRF2000_, _ITRF89_, epoch=_E(1988), 

994 xform=_P( 2.97, 4.75, -7.39, 5.85, _0_0, _0_0, -0.18), 

995 rates=_P( _0_0, -0.06, -0.14, 0.01, _0_0, _0_0, 0.02)) 

996_trfX(_ITRF2000_, _ITRF88_, epoch=_E(1988), 

997 xform=_P( 2.47, 1.15, -9.79, 8.95, 0.1, _0_0, -0.18), 

998 rates=_P( _0_0, -0.06, -0.14, 0.01, _0_0, _0_0, 0.02)) 

999 

1000# Soler, T .& Snay R.A. U{"Transforming Positions and Velocities between the International Terrestrial 

1001# Reference Frame of 2000 and North American Datum of 1983"<https://www.ResearchGate.net/publication/245291390>}, 

1002# Pearson, C. & Snay, R. U{"Introducing HTDP 3.1 to transform coordinates across time and spatial reference 

1003# frames"<https://Geodesy.NOAA.gov/TOOLS/Htdp/Pearson_Snay_2012.pdf> Table 7, 5th and 6th column 

1004_trfX(_ITRF97_, _ITRF96_, epoch=_E(1997), 

1005 xform=_P( -2.07, -0.21, 9.95, -0.93496, 0.1267, -0.22355, -0.06065,), 

1006 rates=_P( 0.69, -0.1, 1.86, -0.19201, 0.01347, -0.01514, 0.00027)) 

1007_trfX(_ITRF96_, _NAD83_, epoch=_E(1997), 

1008 xform=_P( 991.0, -190.72, -512.9, _0_0, 25.79, 9.65, 11.66,), 

1009 rates=_P( _0_0, _0_0, _0_0, _0_0, 0.0532, -0.7423, -0.0316,)) 

1010 

1011# see Altamimi, Z. U{"EUREF Technical Note 1: Relationship and Transformation between the International and 

1012# the European Terrestrial Reference Systems"<https://ERTS89.ENSG.IFN.Fr/pub/EUREF-TN-1-Jan-31-2024.pdf>} Table 1. 

1013# _trfX(_ITRF2020_, _ETRF2020_, epoch=_E(1989), # see Table 2 below 

1014# xform=_P( _0_0, _0_0, _0_0, _0_0, _0_0, _0_0, _0_0), 

1015# rates=_P( _0_0, _0_0, _0_0, _0_0, 0.086, 0.519, -0.753)) 

1016# _trfX(_ITRF2014_, _ETRF2014_, epoch=_E(1989), # see Table 3 below 

1017# xform=_P( _0_0, _0_0, _0_0, _0_0, _0_0, _0_0, _0_0), 

1018# rates=_P( _0_0, _0_0, _0_0, _0_0, 0.085, 0.531, -0.77)) 

1019_trfX(_ITRF2005_, _ETRF2005_, epoch=_E(1989), 

1020 xform=_P( 56.0, 48.0, -37.0, _0_0, _0_0, _0_0, _0_0), 

1021 rates=_P( _0_0, _0_0, _0_0, _0_0, 0.054, 0.518, -0.781)) 

1022# _trfX(_ITRF2000_, _ETRF2000_, epoch=_E(1989), # see Table 4 below 

1023# xform=_P( 54.0, 51.0, -48.0, _0_0, _0_0, _0_0, _0_0), 

1024# rates=_P( _0_0, _0_0, _0_0, _0_0, 0.081, 0.49, -0.792)) 

1025_trfX(_ITRF97_, _ETRF97_, epoch=_E(1989), 

1026 xform=_P( 41.0, 41.0, -49.0, _0_0, _0_0, _0_0, _0_0), 

1027 rates=_P( _0_0, _0_0, _0_0, _0_0, 0.2, 0.5, -0.65)) 

1028_trfX(_ITRF96_, _ETRF96_, epoch=_E(1989), 

1029 xform=_P( 41.0, 41.0, -49.0, _0_0, _0_0, _0_0, _0_0), 

1030 rates=_P( _0_0, _0_0, _0_0, _0_0, 0.2, 0.5, -0.65)) 

1031_trfX(_ITRF94_, _ETRF94_, epoch=_E(1989), 

1032 xform=_P( 41.0, 41.0, -49.0, _0_0, _0_0, _0_0, _0_0), 

1033 rates=_P( _0_0, _0_0, _0_0, _0_0, 0.2, 0.5, -0.65)) 

1034_trfX(_ITRF93_, _ETRF93_, epoch=_E(1989), 

1035 xform=_P( 19.0, 53.0, -21.0, _0_0, _0_0, _0_0, _0_0), 

1036 rates=_P( _0_0, _0_0, _0_0, _0_0, 0.32, 0.78, -0.67)) 

1037_trfX(_ITRF92_, _ETRF92_, epoch=_E(1989), 

1038 xform=_P( 38.0, 40.0, -37.0, 0.0, 0.0, 0.0, 0.0), 

1039 rates=_P( _0_0, _0_0, _0_0, _0_0, 0.21, 0.52, -0.68)) 

1040_trfX(_ITRF91_, _ETRF91_, epoch=_E(1989), 

1041 xform=_P( 21.0, 25.0, -37.0, _0_0, _0_0, _0_0, _0_0), 

1042 rates=_P( _0_0, _0_0, _0_0, _0_0, 0.21, 0.52, -0.68)) 

1043_trfX(_ITRF90_, _ETRF90_, epoch=_E(1989), 

1044 xform=_P( 19.0, 28.0, -23.0, _0_0, _0_0, _0_0, _0_0), 

1045 rates=_P( _0_0, _0_0, _0_0, _0_0, 0.11, 0.57, -0.71)) 

1046_trfX(_ITRF89_, _ETRF89_, epoch=_E(1989), 

1047 xform=_P( _0_0, _0_0, _0_0, _0_0, _0_0, _0_0, _0_0), 

1048 rates=_P( _0_0, _0_0, _0_0, _0_0, 0.11, 0.57, -0.71)) 

1049 

1050# see Altamimi, Z. U{"EUREF Technical Note 1: Relationship and Transformation between the International and 

1051# the European Terrestrial Reference Systems"<https://ERTS89.ENSG.IFN.Fr/pub/EUREF-TN-1-Jan-31-2024.pdf>} Table 2. 

1052_trfX(_ITRF2020_, _ETRF2020_, epoch=_E(2015), 

1053 xform=_P( _0_0, _0_0, _0_0, _0_0, 2.236, 13.494, -19.578), 

1054 rates=_P( _0_0, _0_0, _0_0, _0_0, 0.086, 0.519, -0.753)) 

1055_trfX(_ITRF2014_, _ETRF2020_, epoch=_E(2015), 

1056 xform=_P( 1.4, 0.9, -1.4, 0.42, 2.236, 13.494, -19.578), 

1057 rates=_P( _0_0, 0.1, -0.2, _0_0, 0.086, 0.519, -0.753)) 

1058_trfX(_ITRF2008_, _ETRF2020_, epoch=_E(2015), 

1059 xform=_P( 3.0, 2.8, 0.5, 0.55, 2.236, 13.494, -19.578), 

1060 rates=_P( _0_0, 0.1, -0.3, 0.03, 0.086, 0.519, -0.753)) 

1061_trfX(_ITRF2005_, _ETRF2020_, epoch=_E(2015), 

1062 xform=_P( 5.5, 1.9, -4.2, 1.49, 2.236, 13.494, -19.578), 

1063 rates=_P( 0.3, 0.1, -0.3, 0.03, 0.086, 0.519, -0.753)) 

1064_trfX(_ITRF2000_, _ETRF2020_, epoch=_E(2015), 

1065 xform=_P( 2.6, 2.6, -37.0, 3.09, 2.236, 13.494, -19.578), 

1066 rates=_P( 0.1, 0.2, -2.1, 0.11, 0.086, 0.519, -0.753)) 

1067_trfX(_ITRF97_, _ETRF2020_, epoch=_E(2015), 

1068 xform=_P( 9.3, -2.1, -80.7, 4.82, 2.236, 13.494, -19.218), 

1069 rates=_P( 0.1, -0.4, -3.5, 0.12, 0.086, 0.519, -0.733)) 

1070_trfX(_ITRF96_, _ETRF2020_, epoch=_E(2015), 

1071 xform=_P( 9.3, -2.1, -80.7, 4.82, 2.236, 13.494, -19.218), 

1072 rates=_P( 0.1, -0.4, -3.5, 0.12, 0.086, 0.519, -0.733)) 

1073_trfX(_ITRF94_, _ETRF2020_, epoch=_E(2015), 

1074 xform=_P( 9.3, -2.1, -80.7, 4.82, 2.236, 13.494, -19.218), 

1075 rates=_P( 0.1, -0.4, -3.5, 0.12, 0.086, 0.519, -0.733)) 

1076_trfX(_ITRF93_, _ETRF2020_, epoch=_E(2015), 

1077 xform=_P( -63.0, 3.7, -74.1, 5.31, -1.124, 9.164, -18.828), 

1078 rates=_P( -2.8, _0_0, -2.7, 0.12, -0.024, 0.329, -0.683)) 

1079_trfX(_ITRF92_, _ETRF2020_, epoch=_E(2015), 

1080 xform=_P( 17.3, -0.1, -88.7, 4.11, 2.236, 13.494, -19.218), 

1081 rates=_P( 0.1, -0.4, -3.5, 0.12, 0.086, 0.519, -0.733)) 

1082_trfX(_ITRF91_, _ETRF2020_, epoch=_E(2015), 

1083 xform=_P( 29.3, 13.9, -94.7, 5.51, 2.236, 13.494, -19.218), 

1084 rates=_P( 0.1, -0.4, -3.5, 0.12, 0.086, 0.519, -0.733)) 

1085_trfX(_ITRF90_, _ETRF2020_, epoch=_E(2015), 

1086 xform=_P( 27.3, 9.9, -110.7, 5.81, 2.236, 13.494, -19.218), 

1087 rates=_P( 0.1, -0.4, -3.5, 0.12, 0.086, 0.519, -0.733)) 

1088_trfX(_ITRF89_, _ETRF2020_, epoch=_E(2015), 

1089 xform=_P( 32.3, 33.9, -148.7, 9.21, 2.236, 13.494, -19.218), 

1090 rates=_P( 0.1, -0.4, -3.5, 0.12, 0.086, 0.519, -0.733)) 

1091_trfX(_ITRF88_, _ETRF2020_, epoch=_E(2015), 

1092 xform=_P( 27.3, -2.1, -172.7, 12.31, 2.336, 13.494, -19.218), 

1093 rates=_P( 0.1, -0.4, -3.5, 0.12, 0.086, 0.519, -0.733)) 

1094 

1095# see Altamimi, Z. U{"EUREF Technical Note 1: Relationship and Transformation between the International and 

1096# the European Terrestrial Reference Systems"<https://ERTS89.ENSG.IFN.Fr/pub/EUREF-TN-1-Jan-31-2024.pdf>} Table 3. 

1097_trfX(_ITRF2020_, _ETRF2014_, epoch=_E(2015), 

1098 xform=_P( -1.4, -0.9, 1.4, 0.42, 2.21, 13.806, -20.02), 

1099 rates=_P( _0_0, -0.1, 0.2, _0_0, 0.085, 0.531, -0.77)) 

1100_trfX(_ITRF2014_, _ETRF2014_, epoch=_E(2015), 

1101 xform=_P( _0_0, _0_0, _0_0, _0_0, 2.21, 13.806, -20.02), 

1102 rates=_P( _0_0, _0_0, _0_0, _0_0, 0.085, 0.531, -0.77)) 

1103_trfX(_ITRF2008_, _ETRF2014_, epoch=_E(2015), 

1104 xform=_P( -1.6, -1.9, -1.9, -0.13, 2.21, 13.806, -20.02), 

1105 rates=_P( _0_0, _0_0, 0.1, -0.03, 0.085, 0.531, -0.77)) 

1106_trfX(_ITRF2005_, _ETRF2014_, epoch=_E(2015), 

1107 xform=_P( -4.1, -1.0, 2.8, -1.07, 2.21, 13.806, -20.02), 

1108 rates=_P( -0.3, _0_0, 0.1, -0.03, 0.085, 0.531, -0.77)) 

1109_trfX(_ITRF2000_, _ETRF2014_, epoch=_E(2015), 

1110 xform=_P( -1.2, -1.7, 35.6, -2.67, 2.21, 13.806, -20.02), 

1111 rates=_P( -0.1, -0.1, 1.9, -0.11, 0.085, 0.531, -0.77)) 

1112_trfX(_ITRF97_, _ETRF2014_, epoch=_E(2015), 

1113 xform=_P( -7.9, 3.0, 79.3, -4.40, 2.210, 13.806, -20.38), 

1114 rates=_P( -0.1, 0.5, 3.3, -0.12, 0.085, 0.531, -0.79)) 

1115_trfX(_ITRF96_, _ETRF2014_, epoch=_E(2015), 

1116 xform=_P( -7.9, 3.0, 79.3, -4.40, 2.210, 13.806, -20.38), 

1117 rates=_P( -0.1, 0.5, 3.3, -0.12, 0.085, 0.531, -0.79)) 

1118_trfX(_ITRF94_, _ETRF2014_, epoch=_E(2015), 

1119 xform=_P( -7.9, 3.0, 79.3, -4.40, 2.210, 13.806, -20.38), 

1120 rates=_P( -0.1, 0.5, 3.3, -0.12, 0.085, 0.531, -0.79)) 

1121_trfX(_ITRF93_, _ETRF2014_, epoch=_E(2015), 

1122 xform=_P( 64.4, -2.8, 72.7, -4.89, 5.570, 18.136, -20.77), 

1123 rates=_P( 2.8, 0.1, 2.5, -0.12, 0.195, 0.721, -0.84)) 

1124_trfX(_ITRF92_, _ETRF2014_, epoch=_E(2015), 

1125 xform=_P( -15.9, 1.0, 87.3, -3.69, 2.21, 13.806, -20.38), 

1126 rates=_P( -0.1, 0.5, 3.3, -0.12, 0.085, 0.531, -0.79)) 

1127_trfX(_ITRF91_, _ETRF2014_, epoch=_E(2015), 

1128 xform=_P( -27.9, -13.0, 93.3, -5.09, 2.21, 13.806, -20.38), 

1129 rates=_P( -0.1, 0.5, 3.3, -0.12, 0.085, 0.531, -0.79)) 

1130_trfX(_ITRF90_, _ETRF2014_, epoch=_E(2015), 

1131 xform=_P( -25.9, -9.0, 109.3, -5.39, 2.21, 13.806, -20.38), 

1132 rates=_P( -0.1, 0.5, 3.3, -0.12, 0.085, 0.531, -0.79)) 

1133_trfX(_ITRF89_, _ETRF2014_, epoch=_E(2015), 

1134 xform=_P( -30.9, -33.0, 147.3, -8.79, 2.21, 13.806, -20.38), 

1135 rates=_P( -0.1, 0.5, 3.3, -0.12, 0.085, 0.531, -0.79)) 

1136_trfX(_ITRF88_, _ETRF2014_, epoch=_E(2015), 

1137 xform=_P( -25.9, 3.0, 171.3, -11.89, 2.11, 13.806, -20.38), 

1138 rates=_P( -0.1, 0.5, 3.3, -0.12, 0.085, 0.531, -0.79)) 

1139 

1140# see U{Altamimi, Z. "EUREF Technical Note 1: Relationship and Transformation between the International and 

1141# the European Terrestrial Reference Systems"<https://ERTS89.ENSG,IFN.Fr/pub/EUREF-TN-1-Jan-31-2024.pdf>} Table 4, 

1142# U{Boucher, C. & Altamimi, Z. "Memo: Specifications for reference frame fixing in the analysis of a EUREF GPS 

1143# campaign" (2011) <https://ETRS89.ENSG.IGN.Fr/memo-V8.pdf>} and U{Altamimi, Z. "Key results of ITRF2014 and 

1144# implication to ETRS89 realization", EUREF2016<https://www.EUREF.EU/symposia/2016SanSebastian/01-02-Altamimi.pdf>}. 

1145_trfX(_ITRF2020_, _ETRF2000_, epoch=_E(2015), 

1146 xform=_P( 53.8, 51.8, -82.2, 2.25, 2.106, 12.74, -20.592), 

1147 rates=_P( 0.1, _0_0, -1.7, 0.11, 0.081, 0.49, -0.792)) 

1148# _trfX(_ITRF2014_, _ETRF2000_, epoch=_E(2000), 

1149# xform=_P( 53.7, 51.2, -55.1, 1.02, 0.891, 5.39, -8.712), 

1150# rates=_P( 0.1, 0.1, -1.9, 0.11, 0.081, 0.49, -0.792)) 

1151_trfX(_ITRF2014_, _ETRF2000_, epoch=_E(2015), 

1152 xform=_P( 55.2, 52.7, -83.6, 2.67, 2.106, 12.74, -20.592), 

1153 rates=_P( 0.1, 0.1, -1.9, 0.11, 0.081, 0.49, -0.792)) 

1154# _trfX(_ITRF2008_, _ETRF2000_, epoch=_E(2000), 

1155# xform=_P( 52.1, 49.3, -58.5, 1.34, 0.891, 5.39, -8.712), 

1156# rates=_P( 0.1, 0.1, -1.8, 0.08, 0.081, 0.49, -0.792)) 

1157_trfX(_ITRF2008_, _ETRF2000_, epoch=_E(2015), 

1158 xform=_P( 53.6, 50.8, -85.5, 2.54, 2.106, 12.74, -20.592), 

1159 rates=_P( 0.1, 0.1, -1.8, 0.08, 0.081, 0.49, -0.792)) 

1160# _trfX(_ITRF2005_, _ETRF2000_, epoch=_E(2000), 

1161# xform=_P( 54.1, 50.2, -53.8, 0.4, 0.891, 5.39, -8.712), 

1162# rates=_P( -0.2, 0.1, -1.8, 0.08, 0.081, 0.49, -0.792)) 

1163_trfX(_ITRF2005_, _ETRF2000_, epoch=_E(2015), 

1164 xform=_P( 51.1, 51.7, -80.8, 1.6, 2.106, 12.74, -20.592), 

1165 rates=_P( -0.2, 0.1, -1.8, 0.08, 0.081, 0.49, -0.792)) 

1166# _trfX(_ITRF2000_, _ETRF2000_, epoch=_E(2000), 

1167# xform=_P( 54.0, 51.0, -48.0, _0_0, 0.891, 5.39, -8.712), 

1168# rates=_P( _0_0, _0_0, _0_0, _0_0, 0.081, 0.49, -0.792)) 

1169_trfX(_ITRF2000_, _ETRF2000_, epoch=_E(2015), 

1170 xform=_P( 54.0, 51.0, -48.0, _0_0, 2.106, 12.74, -20.592), 

1171 rates=_P( _0_0, _0_0, _0_0, _0_0, 0.081, 0.49, -0.792)) 

1172_trfX(_ITRF97_, _ETRF2000_, epoch=_E(2015), 

1173 xform=_P( 47.3, 55.7, -4.3, -1.73, 2.106, 12.74, -20.952), 

1174 rates=_P( _0_0, 0.6, 1.4, -0.01, 0.081, 0.49, -0.812)) 

1175_trfX(_ITRF96_, _ETRF2000_, epoch=_E(2015), 

1176 xform=_P( 47.3, 55.7, -4.3, -1.73, 2.106, 12.74, -20.952), 

1177 rates=_P( _0_0, 0.6, 1.4, -0.01, 0.081, 0.49, -0.812)) 

1178_trfX(_ITRF94_, _ETRF2000_, epoch=_E(2015), 

1179 xform=_P( 47.3, 55.7, -4.3, -1.73, 2.106, 12.74, -20.952), 

1180 rates=_P( _0_0, 0.6, 1.4, -0.01, 0.081, 0.49, -0.812)) 

1181_trfX(_ITRF93_, _ETRF2000_, epoch=_E(2015), 

1182 xform=_P( 119.6, 49.9, -10.9, -2.22, 5.466, 17.07, -21.342), 

1183 rates=_P( 2.9, 0.2, 0.6, -0.01, 0.191, 0.68, -0.862)) 

1184_trfX(_ITRF92_, _ETRF2000_, epoch=_E(2015), 

1185 xform=_P( 39.3, 53.7, 3.7, -1.02, 2.106, 12.74, -20.952), 

1186 rates=_P( _0_0, 0.6, 1.4, -0.01, 0.081, 0.49, -0.812)) 

1187_trfX(_ITRF91_, _ETRF2000_, epoch=_E(2015), 

1188 xform=_P( 27.3, 39.7, 9.7, -2.42, 2.106, 12.74, -20.952), 

1189 rates=_P( _0_0, 0.6, 1.4, -0.01, 0.081, 0.49, -0.812)) 

1190_trfX(_ITRF90_, _ETRF2000_, epoch=_E(2015), 

1191 xform=_P( 29.3, 43.7, 25.7, -2.72, 2.106, 12.74, -20.952), 

1192 rates=_P( _0_0, 0.6, 1.4, -0.01, 0.081, 0.49, -0.812)) 

1193_trfX(_ITRF89_, _ETRF2000_, epoch=_E(2015), 

1194 xform=_P( 24.3, 19.7, 63.7, -6.12, 2.106, 12.74, -20.952), 

1195 rates=_P( _0_0, 0.6, 1.4, -0.01, 0.081, 0.49, -0.812)) 

1196_trfX(_ITRF88_, _ETRF2000_, epoch=_E(2015), 

1197 xform=_P( 29.3, 55.7, 87.7, -9.22, 2.006, 12.74, -20.952), 

1198 rates=_P( _0_0, 0.6, 1.4, -0.01, 0.081, 0.49, -0.812)) 

1199 

1200# GDA2020 "Geocentric Datum of Australia 2020 Technical Manual", v1.5, 2020-12-09, Table 3.3 and 3.4 

1201# <https://www.ICSM.gov.AU/sites/default/files/2020-12/GDA2020%20Technical%20Manual%20V1.5_4.pdf> 

1202# (the GDA2020 xforms are different but the rates are the same as GDA94, further below) 

1203_trfX(_ITRF2014_, _GDA2020_, epoch=_E(2020), 

1204 xform=_P( _0_0, _0_0, _0_0, _0_0, _0_0, _0_0, _0_0), 

1205 rates=_P( _0_0, _0_0, _0_0, _0_0, 1.50379, 1.18346, 1.20716)) 

1206_trfX(_ITRF2008_, _GDA2020_, epoch=_E(2020), 

1207 xform=_P( 13.79, 4.55, 15.22, 2.5, 0.2808, 0.2677, -0.4638), 

1208 rates=_P( 1.42, 1.34, 0.9, 0.109, 1.5461, 1.182, 1.1551)) 

1209_trfX(_ITRF2005_, _GDA2020_, epoch=_E(2020), 

1210 xform=_P( 40.32, -33.85, -16.72, 4.286, -1.2893, -0.8492, -0.3342), 

1211 rates=_P( 2.25, -0.62, -0.56, 0.294, -1.4707, -1.1443, -1.1701)) 

1212_trfX(_ITRF2000_, _GDA2020_, epoch=_E(2020), 

1213 xform=_P(-105.52, 51.58, 231.68, 3.55, 4.2175, 6.3941, 0.8617), 

1214 rates=_P( -4.66, 3.55, 11.24, 0.249, 1.7454, 1.4868, 1.224)) 

1215 

1216# see Table 2 in U{Dawson, J. & Woods, A. "ITRF to GDA94 coordinate transformations", Journal of Applied 

1217# Geodesy 4 (2010), 189-199<https://www.ResearchGate.net/publication/258401581_ITRF_to_GDA94_coordinate_transformations>} 

1218# (note, sign of rotations for GDA94 reversed as "Australia assumes rotation to be of coordinate axes", 

1219# rather than the more conventional "position around the coordinate axes") 

1220_trfX(_ITRF2008_, _GDA94_, epoch=_E(1994), 

1221 xform=_P( -84.68, -19.42, 32.01, 9.71, -0.4254, 2.2578, 2.4015), 

1222 rates=_P( 1.42, 1.34, 0.9, 0.109, 1.5461, 1.182, 1.1551)) 

1223_trfX(_ITRF2005_, _GDA94_, epoch=_E(1994), 

1224 xform=_P( -79.73, -6.86, 38.03, 6.636, 0.0351, -2.1211, -2.1411), 

1225 rates=_P( 2.25, -0.62, -0.56, 0.294, -1.4707, -1.1443, -1.1701)) 

1226_trfX(_ITRF2000_, _GDA94_, epoch=_E(1994), 

1227 xform=_P( -45.91, -29.85, -20.37, 7.07, -1.6705, 0.4594, 1.9356), 

1228 rates=_P( -4.66, 3.55, 11.24, 0.249, 1.7454, 1.4868, 1.224)) 

1229 

1230# see U{Solar, T. & Snay, R.A. "Transforming Positions and Velocities between the 

1231# International Terrestrial Reference Frame of 2000 and North American Datum of 1983" 

1232# (2004)<https://www.NGS.NOAA.gov/CORS/Articles/SolerSnayASCE.pdf>} 

1233_trfX(_ITRF2000_, _NAD83_, epoch=_E(1997), # note NAD83(CORS96) 

1234 xform=_P( 995.6, -1901.3, -521.5, 0.615, -25.915, -9.426, -11.599), 

1235 rates=_P( 0.7, -0.7, _0_5, -0.182, -0.06667, 0.75744, 0.05133)) 

1236 

1237# see U{Quinsy QPS<https://confluence.QPS.NL/qinsy/files/latest/en/182618383/182618384/1/1579182881000/ 

1238# ITRF_Transformation_Parameters.xlsx>}, sheets ITRF and NAD83 and Pearson, C. & Snay, R. U{"Introducing 

1239# HTDP 3.1 to transform coordinates across time and spatial reference frames"<https://Geodesy.NOAA.gov/ 

1240# TOOLS/Htdp/Pearson_Snay_2012.pdf> Table 7, 7th column 

1241_trfX(_ITRF2008_, _NAD83_, epoch=_E(1997), 

1242 xform=_P( 993.43, -1903.31, -526.55, 1.71504, -25.91467, -9.42645, -11.59935), 

1243 rates=_P( 0.79, -0.6, -1.34, -0.10201, -0.06667, 0.75744, 0.05133)) 

1244# see U{Quinsy QPS<https://confluence.QPS.NL/qinsy/files/latest/en/182618383/182618384/1/1579182881000/ 

1245# ITRF_Transformation_Parameters.xlsx>}, sheets ITRF and NAD83 

1246_trfX(_ITRF2005_, _NAD83_, epoch=_E(1997), 

1247 xform=_P( 996.3, -1902.4, -521.9, 0.775, -25.915, -9.426, -11.599), 

1248 rates=_P( 0.5, -0.6, -1.3, -0.10201, -0.06667, 0.75744, 0.05133)) 

1249_trfX(_ITRF90_, _NAD83_, epoch=_E(1997), 

1250 xform=_P( 973.0, -1919.2, -482.9, -0.9, -25.79, -9.65, -11.66), 

1251 rates=_P( _0_0, _0_0, _0_0, _0_0, -0.053, 0.742, 0.032)) 

1252_trfX(_ITRF90_, _WGS84_, epoch=_E(1984), 

1253 xform=_P( 60.0, -517.0, -223.0, -11.0, 18.3, -0.3, 7.0), 

1254 rates=_P( _0_0, _0_0, _0_0, _0_0, _0_0, _0_0, _0_0)) 

1255 

1256del _P, _Ps # keep _E, _Es 

1257 

1258if __name__ == '__main__': 

1259 

1260 from pygeodesy.interns import _COLONSPACE_,_COMMA_, _NL_, _NLATvar_, _STAR_ 

1261 from pygeodesy.lazily import printf 

1262 from time import localtime 

1263 

1264 D = date2epoch.__name__ 

1265 E = epoch2date.__name__ 

1266 y = localtime()[0] 

1267 for m in range(1, 13): 

1268 for d in (1, 15, _mDays[m] - 1, _mDays[m]): 

1269 f = '%s(%d,%3d,%3d)' % (D, y, m, d) 

1270 e = date2epoch(y, m, d) 

1271 t = epoch2date(e) 

1272 x = NN if t == (y, m, d) else _STAR_ 

1273 e = '%.3f' % (e,) 

1274 e = '%s, %s(%s)' % (e, E, e) 

1275 t = '%d,%3d,%3d' % t 

1276 printf('# %s = %s = %s %s', f, e, t, x) 

1277 

1278 # __doc__ of this file, force all into registery 

1279 def _RFs(): 

1280 yield NN 

1281 for t in RefFrames.toRepr(all=True).split(_NL_): 

1282 t = t.strip(_COMMA_) 

1283 n = t.split(_COLONSPACE_)[0].split(_DOT_)[1] 

1284 r = RefFrames.get(n) 

1285 x = len(r.Xforms()), -len(r.Xforms(inverse=True)) 

1286 yield '%s .Xforms=%s' % (t, x) 

1287 

1288 printf(_NLATvar_.join(sorted(_RFs())), nt=1) 

1289 

1290 X, t = (), 0 # all form 

1291 for r in RefFrames.values(): 

1292 X += tuple(r._Xs.values()) 

1293 for X in sorted(X): 

1294 t += 1 

1295 printf('#%4d %-27s xform=%r', t, X.name, X.xform) 

1296 printf('#%32s rates=%r', _SPACE_, X.rates) 

1297 

1298# **) MIT License 

1299# 

1300# Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved. 

1301# 

1302# Permission is hereby granted, free of charge, to any person obtaining a 

1303# copy of this software and associated documentation files (the "Software"), 

1304# to deal in the Software without restriction, including without limitation 

1305# the rights to use, copy, modify, merge, publish, distribute, sublicense, 

1306# and/or sell copies of the Software, and to permit persons to whom the 

1307# Software is furnished to do so, subject to the following conditions: 

1308# 

1309# The above copyright notice and this permission notice shall be included 

1310# in all copies or substantial portions of the Software. 

1311# 

1312# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 

1313# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 

1314# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 

1315# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 

1316# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 

1317# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 

1318# OTHER DEALINGS IN THE SOFTWARE. 

1319 

1320# % python -m pygeodesy.trf 

1321# 

1322# date2epoch(2024, 1, 1) = 2024.003, epoch2date(2024.003) = 2024, 1, 1 

1323# date2epoch(2024, 1, 15) = 2024.041, epoch2date(2024.041) = 2024, 1, 15 

1324# date2epoch(2024, 1, 30) = 2024.082, epoch2date(2024.082) = 2024, 1, 30 

1325# date2epoch(2024, 1, 31) = 2024.085, epoch2date(2024.085) = 2024, 1, 31 

1326# date2epoch(2024, 2, 1) = 2024.087, epoch2date(2024.087) = 2024, 2, 2 * 

1327# date2epoch(2024, 2, 15) = 2024.126, epoch2date(2024.126) = 2024, 2, 16 * 

1328# date2epoch(2024, 2, 28) = 2024.161, epoch2date(2024.161) = 2024, 2, 28 

1329# date2epoch(2024, 2, 29) = 2024.164, epoch2date(2024.164) = 2024, 3, 1 * 

1330# date2epoch(2024, 3, 1) = 2024.167, epoch2date(2024.167) = 2024, 3, 2 * 

1331# date2epoch(2024, 3, 15) = 2024.205, epoch2date(2024.205) = 2024, 3, 16 * 

1332# date2epoch(2024, 3, 30) = 2024.246, epoch2date(2024.246) = 2024, 3, 31 * 

1333# date2epoch(2024, 3, 31) = 2024.249, epoch2date(2024.249) = 2024, 4, 1 * 

1334# date2epoch(2024, 4, 1) = 2024.251, epoch2date(2024.251) = 2024, 4, 1 

1335# date2epoch(2024, 4, 15) = 2024.290, epoch2date(2024.290) = 2024, 4, 15 

1336# date2epoch(2024, 4, 29) = 2024.328, epoch2date(2024.328) = 2024, 4, 29 

1337# date2epoch(2024, 4, 30) = 2024.331, epoch2date(2024.331) = 2024, 4, 30 

1338# date2epoch(2024, 5, 1) = 2024.333, epoch2date(2024.333) = 2024, 5, 1 

1339# date2epoch(2024, 5, 15) = 2024.372, epoch2date(2024.372) = 2024, 5, 15 

1340# date2epoch(2024, 5, 30) = 2024.413, epoch2date(2024.413) = 2024, 5, 30 

1341# date2epoch(2024, 5, 31) = 2024.415, epoch2date(2024.415) = 2024, 6, 1 * 

1342# date2epoch(2024, 6, 1) = 2024.418, epoch2date(2024.418) = 2024, 6, 2 * 

1343# date2epoch(2024, 6, 15) = 2024.456, epoch2date(2024.456) = 2024, 6, 16 * 

1344# date2epoch(2024, 6, 29) = 2024.495, epoch2date(2024.495) = 2024, 6, 30 * 

1345# date2epoch(2024, 6, 30) = 2024.497, epoch2date(2024.497) = 2024, 7, 1 * 

1346# date2epoch(2024, 7, 1) = 2024.500, epoch2date(2024.500) = 2024, 7, 1 

1347# date2epoch(2024, 7, 15) = 2024.538, epoch2date(2024.538) = 2024, 7, 16 * 

1348# date2epoch(2024, 7, 30) = 2024.579, epoch2date(2024.579) = 2024, 7, 30 

1349# date2epoch(2024, 7, 31) = 2024.582, epoch2date(2024.582) = 2024, 7, 31 

1350# date2epoch(2024, 8, 1) = 2024.585, epoch2date(2024.585) = 2024, 8, 1 

1351# date2epoch(2024, 8, 15) = 2024.623, epoch2date(2024.623) = 2024, 8, 15 

1352# date2epoch(2024, 8, 30) = 2024.664, epoch2date(2024.664) = 2024, 8, 31 * 

1353# date2epoch(2024, 8, 31) = 2024.667, epoch2date(2024.667) = 2024, 9, 1 * 

1354# date2epoch(2024, 9, 1) = 2024.669, epoch2date(2024.669) = 2024, 9, 2 * 

1355# date2epoch(2024, 9, 15) = 2024.708, epoch2date(2024.708) = 2024, 9, 16 * 

1356# date2epoch(2024, 9, 29) = 2024.746, epoch2date(2024.746) = 2024, 9, 30 * 

1357# date2epoch(2024, 9, 30) = 2024.749, epoch2date(2024.749) = 2024, 10, 1 * 

1358# date2epoch(2024, 10, 1) = 2024.751, epoch2date(2024.751) = 2024, 10, 1 

1359# date2epoch(2024, 10, 15) = 2024.790, epoch2date(2024.790) = 2024, 10, 15 

1360# date2epoch(2024, 10, 30) = 2024.831, epoch2date(2024.831) = 2024, 10, 30 

1361# date2epoch(2024, 10, 31) = 2024.833, epoch2date(2024.833) = 2024, 10, 31 

1362# date2epoch(2024, 11, 1) = 2024.836, epoch2date(2024.836) = 2024, 11, 1 

1363# date2epoch(2024, 11, 15) = 2024.874, epoch2date(2024.874) = 2024, 11, 15 

1364# date2epoch(2024, 11, 29) = 2024.913, epoch2date(2024.913) = 2024, 11, 29 

1365# date2epoch(2024, 11, 30) = 2024.915, epoch2date(2024.915) = 2024, 12, 1 * 

1366# date2epoch(2024, 12, 1) = 2024.918, epoch2date(2024.918) = 2024, 12, 2 * 

1367# date2epoch(2024, 12, 15) = 2024.956, epoch2date(2024.956) = 2024, 12, 16 * 

1368# date2epoch(2024, 12, 30) = 2024.997, epoch2date(2024.997) = 2024, 12, 31 * 

1369# date2epoch(2024, 12, 31) = 2025.000, epoch2date(2025.000) = 2025, 1, 1 * 

1370 

1371# 1 ITRF2000@1988xITRF88@1988 xform=(tx=2.47, ty=1.15, tz=-9.79, s=8.95, sx=0.1, sy=0.0, sz=-0.18) 

1372# rates=(tx=0.0, ty=-0.06, tz=-0.14, s=0.01, sx=0.0, sy=0.0, sz=0.02) 

1373# 2 ITRF2000@1988xITRF89@1988 xform=(tx=2.97, ty=4.75, tz=-7.39, s=5.85, sx=0.0, sy=0.0, sz=-0.18) 

1374# rates=(tx=0.0, ty=-0.06, tz=-0.14, s=0.01, sx=0.0, sy=0.0, sz=0.02) 

1375# 3 ITRF2000@1988xITRF90@1988 xform=(tx=2.47, ty=2.35, tz=-3.59, s=2.45, sx=0.0, sy=0.0, sz=-0.18) 

1376# rates=(tx=0.0, ty=-0.06, tz=-0.14, s=0.01, sx=0.0, sy=0.0, sz=0.02) 

1377# 4 ITRF2000@1988xITRF91@1988 xform=(tx=26.7, ty=27.5, tz=-19.9, s=2.15, sx=0.0, sy=0.0, sz=-0.18) 

1378# rates=(tx=0.0, ty=-0.6, tz=-1.4, s=0.01, sx=0.0, sy=0.0, sz=0.02) 

1379# 5 ITRF2000@1988xITRF92@1988 xform=(tx=1.47, ty=1.35, tz=-1.39, s=0.75, sx=0.0, sy=0.0, sz=-0.18) 

1380# rates=(tx=0.0, ty=-0.06, tz=-0.14, s=0.01, sx=0.0, sy=0.0, sz=0.02) 

1381# 6 ITRF2000@1988xITRF93@1988 xform=(tx=12.7, ty=6.5, tz=-20.9, s=1.95, sx=-0.39, sy=0.8, sz=-1.14) 

1382# rates=(tx=-2.9, ty=-0.2, tz=-0.6, s=0.01, sx=-0.11, sy=-0.19, sz=0.07) 

1383# 7 ITRF2000@1994xGDA94@1994 xform=(tx=-45.91, ty=-29.85, tz=-20.37, s=7.07, sx=-1.6705, sy=0.4594, sz=1.9356) 

1384# rates=(tx=-4.66, ty=3.55, tz=11.24, s=0.249, sx=1.7454, sy=1.4868, sz=1.224) 

1385# 8 ITRF2000@1997xITRF94@1997 xform=(tx=0.67, ty=0.61, tz=-1.85, s=1.55, sx=0.0, sy=0.0, sz=0.0) 

1386# rates=(tx=0.0, ty=-0.06, tz=-0.14, s=0.01, sx=0.0, sy=0.0, sz=0.02) 

1387# 9 ITRF2000@1997xITRF96@1997 xform=(tx=0.67, ty=0.61, tz=-1.85, s=1.55, sx=0.0, sy=0.0, sz=0.0) 

1388# rates=(tx=0.0, ty=-0.06, tz=-0.14, s=0.01, sx=0.0, sy=0.0, sz=0.02) 

1389# 10 ITRF2000@1997xITRF97@1997 xform=(tx=0.67, ty=0.61, tz=-1.85, s=1.55, sx=0.0, sy=0.0, sz=0.0) 

1390# rates=(tx=0.0, ty=-0.06, tz=-0.14, s=0.01, sx=0.0, sy=0.0, sz=-0.02) 

1391# 11 ITRF2000@1997xNAD83@1997 xform=(tx=995.6, ty=-1901.3, tz=-521.5, s=0.615, sx=-25.915, sy=-9.426, sz=-11.599) 

1392# rates=(tx=0.7, ty=-0.7, tz=0.5, s=-0.182, sx=-0.06667, sy=0.75744, sz=0.05133) 

1393# 12 ITRF2000@2015xETRF2000@2015 xform=(tx=54.0, ty=51.0, tz=-48.0, s=0.0, sx=2.106, sy=12.74, sz=-20.592) 

1394# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.081, sy=0.49, sz=-0.792) 

1395# 13 ITRF2000@2015xETRF2014@2015 xform=(tx=-1.2, ty=-1.7, tz=35.6, s=-2.67, sx=2.21, sy=13.806, sz=-20.02) 

1396# rates=(tx=-0.1, ty=-0.1, tz=1.9, s=-0.11, sx=0.085, sy=0.531, sz=-0.77) 

1397# 14 ITRF2000@2015xETRF2020@2015 xform=(tx=2.6, ty=2.6, tz=-37.0, s=3.09, sx=2.236, sy=13.494, sz=-19.578) 

1398# rates=(tx=0.1, ty=0.2, tz=-2.1, s=0.11, sx=0.086, sy=0.519, sz=-0.753) 

1399# 15 ITRF2000@2020xGDA2020@2020 xform=(tx=-105.52, ty=51.58, tz=231.68, s=3.55, sx=4.2175, sy=6.3941, sz=0.8617) 

1400# rates=(tx=-4.66, ty=3.55, tz=11.24, s=0.249, sx=1.7454, sy=1.4868, sz=1.224) 

1401# 16 ITRF2005@1989xETRF2005@1989 xform=(tx=56.0, ty=48.0, tz=-37.0, s=0.0, sx=0.0, sy=0.0, sz=0.0) 

1402# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.054, sy=0.518, sz=-0.781) 

1403# 17 ITRF2005@1994xGDA94@1994 xform=(tx=-79.73, ty=-6.86, tz=38.03, s=6.636, sx=0.0351, sy=-2.1211, sz=-2.1411) 

1404# rates=(tx=2.25, ty=-0.62, tz=-0.56, s=0.294, sx=-1.4707, sy=-1.1443, sz=-1.1701) 

1405# 18 ITRF2005@1997xNAD83@1997 xform=(tx=996.3, ty=-1902.4, tz=-521.9, s=0.775, sx=-25.915, sy=-9.426, sz=-11.599) 

1406# rates=(tx=0.5, ty=-0.6, tz=-1.3, s=-0.10201, sx=-0.06667, sy=0.75744, sz=0.05133) 

1407# 19 ITRF2005@2000xITRF2000@2000 xform=(tx=0.1, ty=-0.8, tz=-5.8, s=0.4, sx=0.0, sy=0.0, sz=0.0) 

1408# rates=(tx=-0.2, ty=0.1, tz=-1.8, s=0.08, sx=0.0, sy=0.0, sz=0.0) 

1409# 20 ITRF2005@2015xETRF2000@2015 xform=(tx=51.1, ty=51.7, tz=-80.8, s=1.6, sx=2.106, sy=12.74, sz=-20.592) 

1410# rates=(tx=-0.2, ty=0.1, tz=-1.8, s=0.08, sx=0.081, sy=0.49, sz=-0.792) 

1411# 21 ITRF2005@2015xETRF2014@2015 xform=(tx=-4.1, ty=-1.0, tz=2.8, s=-1.07, sx=2.21, sy=13.806, sz=-20.02) 

1412# rates=(tx=-0.3, ty=0.0, tz=0.1, s=-0.03, sx=0.085, sy=0.531, sz=-0.77) 

1413# 22 ITRF2005@2015xETRF2020@2015 xform=(tx=5.5, ty=1.9, tz=-4.2, s=1.49, sx=2.236, sy=13.494, sz=-19.578) 

1414# rates=(tx=0.3, ty=0.1, tz=-0.3, s=0.03, sx=0.086, sy=0.519, sz=-0.753) 

1415# 23 ITRF2005@2020xGDA2020@2020 xform=(tx=40.32, ty=-33.85, tz=-16.72, s=4.286, sx=-1.2893, sy=-0.8492, sz=-0.3342) 

1416# rates=(tx=2.25, ty=-0.62, tz=-0.56, s=0.294, sx=-1.4707, sy=-1.1443, sz=-1.1701) 

1417# 24 ITRF2008@1994xGDA94@1994 xform=(tx=-84.68, ty=-19.42, tz=32.01, s=9.71, sx=-0.4254, sy=2.2578, sz=2.4015) 

1418# rates=(tx=1.42, ty=1.34, tz=0.9, s=0.109, sx=1.5461, sy=1.182, sz=1.1551) 

1419# 25 ITRF2008@1997xNAD83@1997 xform=(tx=993.43, ty=-1903.31, tz=-526.55, s=1.71504, sx=-25.91467, sy=-9.42645, sz=-11.59935) 

1420# rates=(tx=0.79, ty=-0.6, tz=-1.34, s=-0.10201, sx=-0.06667, sy=0.75744, sz=0.05133) 

1421# 26 ITRF2008@2000xITRF2000@2000 xform=(tx=-1.9, ty=-1.7, tz=-10.5, s=1.34, sx=0.0, sy=0.0, sz=0.0) 

1422# rates=(tx=0.1, ty=0.1, tz=-1.8, s=0.08, sx=0.0, sy=0.0, sz=0.0) 

1423# 27 ITRF2008@2000xITRF88@2000 xform=(tx=22.8, ty=2.6, tz=-125.2, s=10.41, sx=0.1, sy=0.0, sz=0.06) 

1424# rates=(tx=0.1, ty=-0.5, tz=-3.2, s=0.09, sx=0.0, sy=0.0, sz=0.02) 

1425# 28 ITRF2008@2000xITRF89@2000 xform=(tx=27.8, ty=38.6, tz=-101.2, s=7.31, sx=0.0, sy=0.0, sz=0.06) 

1426# rates=(tx=0.1, ty=-0.5, tz=-3.2, s=0.09, sx=0.0, sy=0.0, sz=0.02) 

1427# 29 ITRF2008@2000xITRF90@2000 xform=(tx=22.8, ty=14.6, tz=-63.2, s=3.91, sx=0.0, sy=0.0, sz=0.06) 

1428# rates=(tx=0.1, ty=-0.5, tz=-3.2, s=0.09, sx=0.0, sy=0.0, sz=0.02) 

1429# 30 ITRF2008@2000xITRF91@2000 xform=(tx=24.8, ty=18.6, tz=-47.2, s=3.61, sx=0.0, sy=0.0, sz=0.06) 

1430# rates=(tx=0.1, ty=-0.5, tz=-3.2, s=0.09, sx=0.0, sy=0.0, sz=0.02) 

1431# 31 ITRF2008@2000xITRF92@2000 xform=(tx=12.8, ty=4.6, tz=-41.2, s=2.21, sx=0.0, sy=0.0, sz=0.06) 

1432# rates=(tx=0.1, ty=-0.5, tz=-3.2, s=0.09, sx=0.0, sy=0.0, sz=0.02) 

1433# 32 ITRF2008@2000xITRF93@2000 xform=(tx=-24.0, ty=2.4, tz=-38.6, s=3.41, sx=-1.71, sy=-1.48, sz=-0.3) 

1434# rates=(tx=-2.8, ty=-0.1, tz=-2.4, s=0.09, sx=-0.11, sy=-0.19, sz=0.07) 

1435# 33 ITRF2008@2000xITRF94@2000 xform=(tx=4.8, ty=2.6, tz=-33.2, s=2.92, sx=0.0, sy=0.0, sz=0.06) 

1436# rates=(tx=0.1, ty=-0.5, tz=-3.2, s=0.09, sx=0.0, sy=0.0, sz=0.02) 

1437# 34 ITRF2008@2000xITRF96@2000 xform=(tx=4.8, ty=2.6, tz=-33.2, s=2.92, sx=0.0, sy=0.0, sz=0.06) 

1438# rates=(tx=0.1, ty=-0.5, tz=-3.2, s=0.09, sx=0.0, sy=0.0, sz=0.02) 

1439# 35 ITRF2008@2000xITRF97@2000 xform=(tx=4.8, ty=2.6, tz=-33.2, s=2.92, sx=0.0, sy=0.0, sz=0.06) 

1440# rates=(tx=0.1, ty=-0.5, tz=-3.2, s=0.09, sx=0.0, sy=0.0, sz=0.02) 

1441# 36 ITRF2008@2005xITRF2005@2005 xform=(tx=-0.5, ty=-0.9, tz=-4.7, s=0.94, sx=0.0, sy=0.0, sz=0.0) 

1442# rates=(tx=0.3, ty=0.0, tz=0.0, s=0.0, sx=0.0, sy=0.0, sz=0.0) 

1443# 37 ITRF2008@2015xETRF2000@2015 xform=(tx=53.6, ty=50.8, tz=-85.5, s=2.54, sx=2.106, sy=12.74, sz=-20.592) 

1444# rates=(tx=0.1, ty=0.1, tz=-1.8, s=0.08, sx=0.081, sy=0.49, sz=-0.792) 

1445# 38 ITRF2008@2015xETRF2014@2015 xform=(tx=-1.6, ty=-1.9, tz=-1.9, s=-0.13, sx=2.21, sy=13.806, sz=-20.02) 

1446# rates=(tx=0.0, ty=0.0, tz=0.1, s=-0.03, sx=0.085, sy=0.531, sz=-0.77) 

1447# 39 ITRF2008@2015xETRF2020@2015 xform=(tx=3.0, ty=2.8, tz=0.5, s=0.55, sx=2.236, sy=13.494, sz=-19.578) 

1448# rates=(tx=0.0, ty=0.1, tz=-0.3, s=0.03, sx=0.086, sy=0.519, sz=-0.753) 

1449# 40 ITRF2008@2020xGDA2020@2020 xform=(tx=13.79, ty=4.55, tz=15.22, s=2.5, sx=0.2808, sy=0.2677, sz=-0.4638) 

1450# rates=(tx=1.42, ty=1.34, tz=0.9, s=0.109, sx=1.5461, sy=1.182, sz=1.1551) 

1451# 41 ITRF2014@2010xITRF2000@2010 xform=(tx=0.7, ty=1.2, tz=-26.1, s=2.12, sx=0.0, sy=0.0, sz=0.0) 

1452# rates=(tx=0.1, ty=0.1, tz=-1.9, s=0.11, sx=0.0, sy=0.0, sz=0.0) 

1453# 42 ITRF2014@2010xITRF2005@2010 xform=(tx=2.6, ty=1.0, tz=-2.3, s=0.92, sx=0.0, sy=0.0, sz=0.0) 

1454# rates=(tx=0.3, ty=0.0, tz=-0.1, s=0.03, sx=0.0, sy=0.0, sz=0.0) 

1455# 43 ITRF2014@2010xITRF2008@2010 xform=(tx=1.6, ty=1.9, tz=2.4, s=-0.02, sx=0.0, sy=0.0, sz=0.0) 

1456# rates=(tx=0.0, ty=0.0, tz=-0.1, s=0.03, sx=0.0, sy=0.0, sz=0.0) 

1457# 44 ITRF2014@2010xITRF88@2010 xform=(tx=25.4, ty=-0.5, tz=-154.8, s=11.29, sx=0.1, sy=0.0, sz=0.26) 

1458# rates=(tx=0.1, ty=-0.5, tz=-3.3, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1459# 45 ITRF2014@2010xITRF89@2010 xform=(tx=30.4, ty=35.5, tz=-130.8, s=8.19, sx=0.0, sy=0.0, sz=0.26) 

1460# rates=(tx=0.1, ty=-0.5, tz=-3.3, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1461# 46 ITRF2014@2010xITRF90@2010 xform=(tx=25.4, ty=11.5, tz=-92.8, s=4.79, sx=0.0, sy=0.0, sz=0.26) 

1462# rates=(tx=0.1, ty=-0.5, tz=-3.3, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1463# 47 ITRF2014@2010xITRF91@2010 xform=(tx=27.4, ty=15.5, tz=-76.8, s=4.49, sx=0.0, sy=0.0, sz=0.26) 

1464# rates=(tx=0.1, ty=-0.5, tz=-3.3, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1465# 48 ITRF2014@2010xITRF92@2010 xform=(tx=15.4, ty=1.5, tz=-70.8, s=3.09, sx=0.0, sy=0.0, sz=0.26) 

1466# rates=(tx=0.1, ty=-0.5, tz=-3.3, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1467# 49 ITRF2014@2010xITRF93@2010 xform=(tx=-50.4, ty=3.3, tz=-60.2, s=4.29, sx=-2.81, sy=-3.38, sz=0.4) 

1468# rates=(tx=-2.8, ty=-0.1, tz=-2.5, s=0.12, sx=-0.11, sy=-0.19, sz=0.07) 

1469# 50 ITRF2014@2010xITRF94@2010 xform=(tx=7.4, ty=-0.5, tz=-62.8, s=3.8, sx=0.0, sy=0.0, sz=0.26) 

1470# rates=(tx=0.1, ty=-0.5, tz=-3.3, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1471# 51 ITRF2014@2010xITRF96@2010 xform=(tx=7.4, ty=-0.5, tz=-62.8, s=3.8, sx=0.0, sy=0.0, sz=0.26) 

1472# rates=(tx=0.1, ty=-0.5, tz=-3.3, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1473# 52 ITRF2014@2010xITRF97@2010 xform=(tx=7.4, ty=-0.5, tz=-62.8, s=3.8, sx=0.0, sy=0.0, sz=0.26) 

1474# rates=(tx=0.1, ty=-0.5, tz=-3.3, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1475# 53 ITRF2014@2015xETRF2000@2015 xform=(tx=55.2, ty=52.7, tz=-83.6, s=2.67, sx=2.106, sy=12.74, sz=-20.592) 

1476# rates=(tx=0.1, ty=0.1, tz=-1.9, s=0.11, sx=0.081, sy=0.49, sz=-0.792) 

1477# 54 ITRF2014@2015xETRF2014@2015 xform=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=2.21, sy=13.806, sz=-20.02) 

1478# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.085, sy=0.531, sz=-0.77) 

1479# 55 ITRF2014@2015xETRF2020@2015 xform=(tx=1.4, ty=0.9, tz=-1.4, s=0.42, sx=2.236, sy=13.494, sz=-19.578) 

1480# rates=(tx=0.0, ty=0.1, tz=-0.2, s=0.0, sx=0.086, sy=0.519, sz=-0.753) 

1481# 56 ITRF2014@2020xGDA2020@2020 xform=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.0, sy=0.0, sz=0.0) 

1482# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=1.50379, sy=1.18346, sz=1.20716) 

1483# 57 ITRF2020@2015xETRF2000@2015 xform=(tx=53.8, ty=51.8, tz=-82.2, s=2.25, sx=2.106, sy=12.74, sz=-20.592) 

1484# rates=(tx=0.1, ty=0.0, tz=-1.7, s=0.11, sx=0.081, sy=0.49, sz=-0.792) 

1485# 58 ITRF2020@2015xETRF2014@2015 xform=(tx=-1.4, ty=-0.9, tz=1.4, s=0.42, sx=2.21, sy=13.806, sz=-20.02) 

1486# rates=(tx=0.0, ty=-0.1, tz=0.2, s=0.0, sx=0.085, sy=0.531, sz=-0.77) 

1487# 59 ITRF2020@2015xETRF2020@2015 xform=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=2.236, sy=13.494, sz=-19.578) 

1488# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.086, sy=0.519, sz=-0.753) 

1489# 60 ITRF2020@2015xITRF2000@2015 xform=(tx=-0.2, ty=0.8, tz=-34.2, s=2.25, sx=0.0, sy=0.0, sz=0.0) 

1490# rates=(tx=0.1, ty=0.0, tz=-1.7, s=0.11, sx=0.0, sy=0.0, sz=0.0) 

1491# 61 ITRF2020@2015xITRF2005@2015 xform=(tx=2.7, ty=0.1, tz=-1.4, s=0.65, sx=0.0, sy=0.0, sz=0.0) 

1492# rates=(tx=0.3, ty=-0.1, tz=0.1, s=0.03, sx=0.0, sy=0.0, sz=0.0) 

1493# 62 ITRF2020@2015xITRF2008@2015 xform=(tx=0.2, ty=1.0, tz=3.3, s=-0.29, sx=0.0, sy=0.0, sz=0.0) 

1494# rates=(tx=0.0, ty=-0.1, tz=0.1, s=0.03, sx=0.0, sy=0.0, sz=0.0) 

1495# 63 ITRF2020@2015xITRF2014@2015 xform=(tx=-1.4, ty=-0.9, tz=1.4, s=-0.42, sx=0.0, sy=0.0, sz=0.0) 

1496# rates=(tx=0.0, ty=-0.1, tz=0.2, s=0.0, sx=0.0, sy=0.0, sz=0.0) 

1497# 64 ITRF2020@2015xITRF88@2015 xform=(tx=24.5, ty=-3.9, tz=-169.9, s=11.47, sx=0.1, sy=0.0, sz=0.36) 

1498# rates=(tx=0.1, ty=-0.6, tz=-3.1, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1499# 65 ITRF2020@2015xITRF89@2015 xform=(tx=29.5, ty=32.1, tz=-145.9, s=8.37, sx=0.0, sy=0.0, sz=0.36) 

1500# rates=(tx=0.1, ty=-0.6, tz=-3.1, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1501# 66 ITRF2020@2015xITRF90@2015 xform=(tx=24.5, ty=8.1, tz=-107.9, s=4.97, sx=0.0, sy=0.0, sz=0.36) 

1502# rates=(tx=0.1, ty=-0.6, tz=-3.1, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1503# 67 ITRF2020@2015xITRF91@2015 xform=(tx=26.5, ty=12.1, tz=-91.9, s=4.67, sx=0.0, sy=0.0, sz=0.36) 

1504# rates=(tx=0.1, ty=-0.6, tz=-3.1, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1505# 68 ITRF2020@2015xITRF92@2015 xform=(tx=14.5, ty=-1.9, tz=-85.9, s=3.27, sx=0.0, sy=0.0, sz=0.36) 

1506# rates=(tx=0.1, ty=-0.6, tz=-3.1, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1507# 69 ITRF2020@2015xITRF93@2015 xform=(tx=-65.8, ty=1.9, tz=-71.3, s=4.47, sx=-3.36, sy=-4.33, sz=0.75) 

1508# rates=(tx=-2.8, ty=-0.2, tz=-2.3, s=0.12, sx=-0.11, sy=-0.19, sz=0.07) 

1509# 70 ITRF2020@2015xITRF94@2015 xform=(tx=6.5, ty=-3.9, tz=-77.9, s=3.98, sx=0.0, sy=0.0, sz=0.36) 

1510# rates=(tx=0.1, ty=-0.6, tz=-3.1, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1511# 71 ITRF2020@2015xITRF96@2015 xform=(tx=6.5, ty=-3.9, tz=-77.9, s=3.98, sx=0.0, sy=0.0, sz=0.36) 

1512# rates=(tx=0.1, ty=-0.6, tz=-3.1, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1513# 72 ITRF2020@2015xITRF97@2015 xform=(tx=6.5, ty=-3.9, tz=-77.9, s=3.98, sx=0.0, sy=0.0, sz=0.36) 

1514# rates=(tx=0.1, ty=-0.6, tz=-3.1, s=0.12, sx=0.0, sy=0.0, sz=0.02) 

1515# 73 ITRF88@2015xETRF2000@2015 xform=(tx=29.3, ty=55.7, tz=87.7, s=-9.22, sx=2.006, sy=12.74, sz=-20.952) 

1516# rates=(tx=0.0, ty=0.6, tz=1.4, s=-0.01, sx=0.081, sy=0.49, sz=-0.812) 

1517# 74 ITRF88@2015xETRF2014@2015 xform=(tx=-25.9, ty=3.0, tz=171.3, s=-11.89, sx=2.11, sy=13.806, sz=-20.38) 

1518# rates=(tx=-0.1, ty=0.5, tz=3.3, s=-0.12, sx=0.085, sy=0.531, sz=-0.79) 

1519# 75 ITRF88@2015xETRF2020@2015 xform=(tx=27.3, ty=-2.1, tz=-172.7, s=12.31, sx=2.336, sy=13.494, sz=-19.218) 

1520# rates=(tx=0.1, ty=-0.4, tz=-3.5, s=0.12, sx=0.086, sy=0.519, sz=-0.733) 

1521# 76 ITRF89@1989xETRF89@1989 xform=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.0, sy=0.0, sz=0.0) 

1522# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.11, sy=0.57, sz=-0.71) 

1523# 77 ITRF89@2015xETRF2000@2015 xform=(tx=24.3, ty=19.7, tz=63.7, s=-6.12, sx=2.106, sy=12.74, sz=-20.952) 

1524# rates=(tx=0.0, ty=0.6, tz=1.4, s=-0.01, sx=0.081, sy=0.49, sz=-0.812) 

1525# 78 ITRF89@2015xETRF2014@2015 xform=(tx=-30.9, ty=-33.0, tz=147.3, s=-8.79, sx=2.21, sy=13.806, sz=-20.38) 

1526# rates=(tx=-0.1, ty=0.5, tz=3.3, s=-0.12, sx=0.085, sy=0.531, sz=-0.79) 

1527# 79 ITRF89@2015xETRF2020@2015 xform=(tx=32.3, ty=33.9, tz=-148.7, s=9.21, sx=2.236, sy=13.494, sz=-19.218) 

1528# rates=(tx=0.1, ty=-0.4, tz=-3.5, s=0.12, sx=0.086, sy=0.519, sz=-0.733) 

1529# 80 ITRF90@1984xWGS84@1984 xform=(tx=60.0, ty=-517.0, tz=-223.0, s=-11.0, sx=18.3, sy=-0.3, sz=7.0) 

1530# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.0, sy=0.0, sz=0.0) 

1531# 81 ITRF90@1989xETRF90@1989 xform=(tx=19.0, ty=28.0, tz=-23.0, s=0.0, sx=0.0, sy=0.0, sz=0.0) 

1532# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.11, sy=0.57, sz=-0.71) 

1533# 82 ITRF90@1997xNAD83@1997 xform=(tx=973.0, ty=-1919.2, tz=-482.9, s=-0.9, sx=-25.79, sy=-9.65, sz=-11.66) 

1534# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=-0.053, sy=0.742, sz=0.032) 

1535# 83 ITRF90@2015xETRF2000@2015 xform=(tx=29.3, ty=43.7, tz=25.7, s=-2.72, sx=2.106, sy=12.74, sz=-20.952) 

1536# rates=(tx=0.0, ty=0.6, tz=1.4, s=-0.01, sx=0.081, sy=0.49, sz=-0.812) 

1537# 84 ITRF90@2015xETRF2014@2015 xform=(tx=-25.9, ty=-9.0, tz=109.3, s=-5.39, sx=2.21, sy=13.806, sz=-20.38) 

1538# rates=(tx=-0.1, ty=0.5, tz=3.3, s=-0.12, sx=0.085, sy=0.531, sz=-0.79) 

1539# 85 ITRF90@2015xETRF2020@2015 xform=(tx=27.3, ty=9.9, tz=-110.7, s=5.81, sx=2.236, sy=13.494, sz=-19.218) 

1540# rates=(tx=0.1, ty=-0.4, tz=-3.5, s=0.12, sx=0.086, sy=0.519, sz=-0.733) 

1541# 86 ITRF91@1989xETRF91@1989 xform=(tx=21.0, ty=25.0, tz=-37.0, s=0.0, sx=0.0, sy=0.0, sz=0.0) 

1542# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.21, sy=0.52, sz=-0.68) 

1543# 87 ITRF91@2015xETRF2000@2015 xform=(tx=27.3, ty=39.7, tz=9.7, s=-2.42, sx=2.106, sy=12.74, sz=-20.952) 

1544# rates=(tx=0.0, ty=0.6, tz=1.4, s=-0.01, sx=0.081, sy=0.49, sz=-0.812) 

1545# 88 ITRF91@2015xETRF2014@2015 xform=(tx=-27.9, ty=-13.0, tz=93.3, s=-5.09, sx=2.21, sy=13.806, sz=-20.38) 

1546# rates=(tx=-0.1, ty=0.5, tz=3.3, s=-0.12, sx=0.085, sy=0.531, sz=-0.79) 

1547# 89 ITRF91@2015xETRF2020@2015 xform=(tx=29.3, ty=13.9, tz=-94.7, s=5.51, sx=2.236, sy=13.494, sz=-19.218) 

1548# rates=(tx=0.1, ty=-0.4, tz=-3.5, s=0.12, sx=0.086, sy=0.519, sz=-0.733) 

1549# 90 ITRF92@1989xETRF92@1989 xform=(tx=38.0, ty=40.0, tz=-37.0, s=0.0, sx=0.0, sy=0.0, sz=0.0) 

1550# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.21, sy=0.52, sz=-0.68) 

1551# 91 ITRF92@2015xETRF2000@2015 xform=(tx=39.3, ty=53.7, tz=3.7, s=-1.02, sx=2.106, sy=12.74, sz=-20.952) 

1552# rates=(tx=0.0, ty=0.6, tz=1.4, s=-0.01, sx=0.081, sy=0.49, sz=-0.812) 

1553# 92 ITRF92@2015xETRF2014@2015 xform=(tx=-15.9, ty=1.0, tz=87.3, s=-3.69, sx=2.21, sy=13.806, sz=-20.38) 

1554# rates=(tx=-0.1, ty=0.5, tz=3.3, s=-0.12, sx=0.085, sy=0.531, sz=-0.79) 

1555# 93 ITRF92@2015xETRF2020@2015 xform=(tx=17.3, ty=-0.1, tz=-88.7, s=4.11, sx=2.236, sy=13.494, sz=-19.218) 

1556# rates=(tx=0.1, ty=-0.4, tz=-3.5, s=0.12, sx=0.086, sy=0.519, sz=-0.733) 

1557# 94 ITRF93@1989xETRF93@1989 xform=(tx=19.0, ty=53.0, tz=-21.0, s=0.0, sx=0.0, sy=0.0, sz=0.0) 

1558# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.32, sy=0.78, sz=-0.67) 

1559# 95 ITRF93@2015xETRF2000@2015 xform=(tx=119.6, ty=49.9, tz=-10.9, s=-2.22, sx=5.466, sy=17.07, sz=-21.342) 

1560# rates=(tx=2.9, ty=0.2, tz=0.6, s=-0.01, sx=0.191, sy=0.68, sz=-0.862) 

1561# 96 ITRF93@2015xETRF2014@2015 xform=(tx=64.4, ty=-2.8, tz=72.7, s=-4.89, sx=5.57, sy=18.136, sz=-20.77) 

1562# rates=(tx=2.8, ty=0.1, tz=2.5, s=-0.12, sx=0.195, sy=0.721, sz=-0.84) 

1563# 97 ITRF93@2015xETRF2020@2015 xform=(tx=-63.0, ty=3.7, tz=-74.1, s=5.31, sx=-1.124, sy=9.164, sz=-18.828) 

1564# rates=(tx=-2.8, ty=0.0, tz=-2.7, s=0.12, sx=-0.024, sy=0.329, sz=-0.683) 

1565# 98 ITRF94@1989xETRF94@1989 xform=(tx=41.0, ty=41.0, tz=-49.0, s=0.0, sx=0.0, sy=0.0, sz=0.0) 

1566# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.2, sy=0.5, sz=-0.65) 

1567# 99 ITRF94@2015xETRF2000@2015 xform=(tx=47.3, ty=55.7, tz=-4.3, s=-1.73, sx=2.106, sy=12.74, sz=-20.952) 

1568# rates=(tx=0.0, ty=0.6, tz=1.4, s=-0.01, sx=0.081, sy=0.49, sz=-0.812) 

1569# 100 ITRF94@2015xETRF2014@2015 xform=(tx=-7.9, ty=3.0, tz=79.3, s=-4.4, sx=2.21, sy=13.806, sz=-20.38) 

1570# rates=(tx=-0.1, ty=0.5, tz=3.3, s=-0.12, sx=0.085, sy=0.531, sz=-0.79) 

1571# 101 ITRF94@2015xETRF2020@2015 xform=(tx=9.3, ty=-2.1, tz=-80.7, s=4.82, sx=2.236, sy=13.494, sz=-19.218) 

1572# rates=(tx=0.1, ty=-0.4, tz=-3.5, s=0.12, sx=0.086, sy=0.519, sz=-0.733) 

1573# 102 ITRF96@1989xETRF96@1989 xform=(tx=41.0, ty=41.0, tz=-49.0, s=0.0, sx=0.0, sy=0.0, sz=0.0) 

1574# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.2, sy=0.5, sz=-0.65) 

1575# 103 ITRF96@1997xNAD83@1997 xform=(tx=991.0, ty=-190.72, tz=-512.9, s=0.0, sx=25.79, sy=9.65, sz=11.66) 

1576# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.0532, sy=-0.7423, sz=-0.0316) 

1577# 104 ITRF96@2015xETRF2000@2015 xform=(tx=47.3, ty=55.7, tz=-4.3, s=-1.73, sx=2.106, sy=12.74, sz=-20.952) 

1578# rates=(tx=0.0, ty=0.6, tz=1.4, s=-0.01, sx=0.081, sy=0.49, sz=-0.812) 

1579# 105 ITRF96@2015xETRF2014@2015 xform=(tx=-7.9, ty=3.0, tz=79.3, s=-4.4, sx=2.21, sy=13.806, sz=-20.38) 

1580# rates=(tx=-0.1, ty=0.5, tz=3.3, s=-0.12, sx=0.085, sy=0.531, sz=-0.79) 

1581# 106 ITRF96@2015xETRF2020@2015 xform=(tx=9.3, ty=-2.1, tz=-80.7, s=4.82, sx=2.236, sy=13.494, sz=-19.218) 

1582# rates=(tx=0.1, ty=-0.4, tz=-3.5, s=0.12, sx=0.086, sy=0.519, sz=-0.733) 

1583# 107 ITRF97@1989xETRF97@1989 xform=(tx=41.0, ty=41.0, tz=-49.0, s=0.0, sx=0.0, sy=0.0, sz=0.0) 

1584# rates=(tx=0.0, ty=0.0, tz=0.0, s=0.0, sx=0.2, sy=0.5, sz=-0.65) 

1585# 108 ITRF97@1997xITRF96@1997 xform=(tx=-2.07, ty=-0.21, tz=9.95, s=-0.93496, sx=0.1267, sy=-0.22355, sz=-0.06065) 

1586# rates=(tx=0.69, ty=-0.1, tz=1.86, s=-0.19201, sx=0.01347, sy=-0.01514, sz=0.00027) 

1587# 109 ITRF97@2015xETRF2000@2015 xform=(tx=47.3, ty=55.7, tz=-4.3, s=-1.73, sx=2.106, sy=12.74, sz=-20.952) 

1588# rates=(tx=0.0, ty=0.6, tz=1.4, s=-0.01, sx=0.081, sy=0.49, sz=-0.812) 

1589# 110 ITRF97@2015xETRF2014@2015 xform=(tx=-7.9, ty=3.0, tz=79.3, s=-4.4, sx=2.21, sy=13.806, sz=-20.38) 

1590# rates=(tx=-0.1, ty=0.5, tz=3.3, s=-0.12, sx=0.085, sy=0.531, sz=-0.79) 

1591# 111 ITRF97@2015xETRF2020@2015 xform=(tx=9.3, ty=-2.1, tz=-80.7, s=4.82, sx=2.236, sy=13.494, sz=-19.218) 

1592# rates=(tx=0.1, ty=-0.4, tz=-3.5, s=0.12, sx=0.086, sy=0.519, sz=-0.733)