pygeodesy 24.10.24__py2.py3-none-any.whl → 24.12.12__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. {PyGeodesy-24.10.24.dist-info → PyGeodesy-24.12.12.dist-info}/METADATA +6 -6
  2. PyGeodesy-24.12.12.dist-info/RECORD +118 -0
  3. {PyGeodesy-24.10.24.dist-info → PyGeodesy-24.12.12.dist-info}/WHEEL +1 -1
  4. pygeodesy/__init__.py +5 -5
  5. pygeodesy/__main__.py +1 -1
  6. pygeodesy/albers.py +5 -5
  7. pygeodesy/auxilats/_CX_4.py +1 -1
  8. pygeodesy/auxilats/_CX_6.py +1 -1
  9. pygeodesy/auxilats/_CX_8.py +1 -1
  10. pygeodesy/auxilats/_CX_Rs.py +1 -1
  11. pygeodesy/auxilats/__init__.py +1 -1
  12. pygeodesy/auxilats/__main__.py +1 -1
  13. pygeodesy/auxilats/auxAngle.py +5 -5
  14. pygeodesy/auxilats/auxDLat.py +6 -6
  15. pygeodesy/auxilats/auxDST.py +2 -2
  16. pygeodesy/auxilats/auxLat.py +5 -5
  17. pygeodesy/auxilats/auxily.py +2 -2
  18. pygeodesy/azimuthal.py +55 -65
  19. pygeodesy/basics.py +35 -34
  20. pygeodesy/booleans.py +37 -37
  21. pygeodesy/cartesianBase.py +26 -65
  22. pygeodesy/clipy.py +1 -1
  23. pygeodesy/constants.py +7 -7
  24. pygeodesy/css.py +8 -9
  25. pygeodesy/datums.py +1 -1
  26. pygeodesy/deprecated/__init__.py +2 -2
  27. pygeodesy/deprecated/bases.py +1 -1
  28. pygeodesy/deprecated/classes.py +10 -10
  29. pygeodesy/deprecated/consterns.py +1 -1
  30. pygeodesy/deprecated/datum.py +1 -1
  31. pygeodesy/deprecated/functions.py +23 -13
  32. pygeodesy/deprecated/nvector.py +1 -1
  33. pygeodesy/deprecated/rhumbBase.py +1 -1
  34. pygeodesy/deprecated/rhumbaux.py +1 -1
  35. pygeodesy/deprecated/rhumbsolve.py +1 -1
  36. pygeodesy/deprecated/rhumbx.py +1 -1
  37. pygeodesy/dms.py +1 -1
  38. pygeodesy/ecef.py +63 -69
  39. pygeodesy/elevations.py +1 -1
  40. pygeodesy/ellipsoidalBase.py +106 -121
  41. pygeodesy/ellipsoidalBaseDI.py +115 -119
  42. pygeodesy/ellipsoidalExact.py +36 -38
  43. pygeodesy/ellipsoidalGeodSolve.py +1 -1
  44. pygeodesy/ellipsoidalKarney.py +1 -1
  45. pygeodesy/ellipsoidalNvector.py +1 -1
  46. pygeodesy/ellipsoidalVincenty.py +6 -5
  47. pygeodesy/ellipsoids.py +7 -8
  48. pygeodesy/elliptic.py +6 -6
  49. pygeodesy/epsg.py +1 -1
  50. pygeodesy/errors.py +25 -25
  51. pygeodesy/etm.py +84 -76
  52. pygeodesy/fmath.py +54 -51
  53. pygeodesy/formy.py +74 -106
  54. pygeodesy/frechet.py +1 -1
  55. pygeodesy/fstats.py +1 -1
  56. pygeodesy/fsums.py +82 -72
  57. pygeodesy/gars.py +1 -1
  58. pygeodesy/geodesici.py +4 -4
  59. pygeodesy/geodesicw.py +16 -15
  60. pygeodesy/geodesicx/_C4_24.py +2 -2
  61. pygeodesy/geodesicx/_C4_27.py +2 -2
  62. pygeodesy/geodesicx/_C4_30.py +2 -2
  63. pygeodesy/geodesicx/__init__.py +3 -3
  64. pygeodesy/geodesicx/__main__.py +1 -1
  65. pygeodesy/geodesicx/gx.py +6 -5
  66. pygeodesy/geodesicx/gxarea.py +2 -2
  67. pygeodesy/geodesicx/gxbases.py +2 -2
  68. pygeodesy/geodesicx/gxline.py +16 -12
  69. pygeodesy/geodsolve.py +8 -17
  70. pygeodesy/geohash.py +1 -1
  71. pygeodesy/geoids.py +6 -6
  72. pygeodesy/hausdorff.py +1 -1
  73. pygeodesy/heights.py +3 -3
  74. pygeodesy/internals.py +64 -80
  75. pygeodesy/interns.py +2 -3
  76. pygeodesy/iters.py +1 -1
  77. pygeodesy/karney.py +4 -4
  78. pygeodesy/ktm.py +20 -21
  79. pygeodesy/latlonBase.py +296 -346
  80. pygeodesy/lazily.py +15 -15
  81. pygeodesy/lcc.py +5 -5
  82. pygeodesy/ltp.py +55 -59
  83. pygeodesy/ltpTuples.py +208 -192
  84. pygeodesy/mgrs.py +9 -10
  85. pygeodesy/named.py +153 -3
  86. pygeodesy/namedTuples.py +58 -7
  87. pygeodesy/nvectorBase.py +122 -105
  88. pygeodesy/osgr.py +10 -13
  89. pygeodesy/points.py +1 -1
  90. pygeodesy/props.py +3 -3
  91. pygeodesy/resections.py +26 -26
  92. pygeodesy/rhumb/__init__.py +2 -2
  93. pygeodesy/rhumb/aux_.py +2 -2
  94. pygeodesy/rhumb/bases.py +2 -2
  95. pygeodesy/rhumb/ekx.py +4 -4
  96. pygeodesy/rhumb/solve.py +4 -4
  97. pygeodesy/simplify.py +291 -403
  98. pygeodesy/solveBase.py +1 -1
  99. pygeodesy/sphericalBase.py +1 -1
  100. pygeodesy/sphericalNvector.py +84 -127
  101. pygeodesy/sphericalTrigonometry.py +66 -71
  102. pygeodesy/streprs.py +10 -5
  103. pygeodesy/trf.py +1 -1
  104. pygeodesy/triaxials.py +23 -16
  105. pygeodesy/units.py +17 -17
  106. pygeodesy/unitsBase.py +1 -1
  107. pygeodesy/ups.py +4 -4
  108. pygeodesy/utily.py +202 -145
  109. pygeodesy/utm.py +10 -10
  110. pygeodesy/utmups.py +1 -1
  111. pygeodesy/utmupsBase.py +1 -1
  112. pygeodesy/vector2d.py +17 -17
  113. pygeodesy/vector3d.py +32 -23
  114. pygeodesy/vector3dBase.py +22 -19
  115. pygeodesy/webmercator.py +5 -5
  116. pygeodesy/wgrs.py +5 -5
  117. PyGeodesy-24.10.24.dist-info/RECORD +0 -118
  118. {PyGeodesy-24.10.24.dist-info → PyGeodesy-24.12.12.dist-info}/top_level.txt +0 -0
pygeodesy/ecef.py CHANGED
@@ -73,20 +73,23 @@ from pygeodesy.interns import NN, _a_, _C_, _datum_, _ellipsoid_, _f_, _height_,
73
73
  _lat_, _lon_, _M_, _name_, _singular_, _SPACE_, \
74
74
  _x_, _xyz_, _y_, _z_
75
75
  from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS
76
- from pygeodesy.named import _name__, _name1__, _NamedBase, _NamedTuple, _Pass, _xnamed
76
+ from pygeodesy.named import _name__, _name1__, _NamedBase, _NamedLocal, \
77
+ _NamedTuple, _Pass, _xnamed
77
78
  from pygeodesy.namedTuples import LatLon2Tuple, LatLon3Tuple, \
78
79
  PhiLam2Tuple, Vector3Tuple, Vector4Tuple
79
- from pygeodesy.props import deprecated_method, Property_RO, property_ROver, property_doc_
80
+ from pygeodesy.props import deprecated_method, Property_RO, property_RO, \
81
+ property_ROver, property_doc_
80
82
  # from pygeodesy.streprs import Fmt, unstr # from .fsums
81
83
  from pygeodesy.units import _isRadius, Degrees, Height, Int, Lam, Lat, Lon, Meter, \
82
84
  Phi, Scalar, Scalar_
83
- from pygeodesy.utily import atan1, atan1d, atan2d, degrees90, degrees180, \
85
+ from pygeodesy.utily import atan1, atan1d, atan2, atan2d, degrees90, degrees180, \
84
86
  sincos2, sincos2_, sincos2d, sincos2d_
87
+ # from pygeodesy.vector3d import Vector3d # _MODS
85
88
 
86
- from math import atan2, cos, degrees, fabs, radians, sqrt
89
+ from math import cos, degrees, fabs, radians, sqrt
87
90
 
88
91
  __all__ = _ALL_LAZY.ecef
89
- __version__ = '24.06.12'
92
+ __version__ = '24.12.06'
90
93
 
91
94
  _Ecef_ = 'Ecef'
92
95
  _prolate_ = 'prolate'
@@ -266,7 +269,7 @@ class _EcefBase(_NamedBase):
266
269
  '''(INTERNAL) Get the valid geocentric classes. I{once}.
267
270
  '''
268
271
  return (Ecef9Tuple, # overwrite property_ROver
269
- _MODS.cartesianBase.CartesianBase)
272
+ _MODS.vector3d.Vector3d) # _MODS.cartesianBase.CartesianBase
270
273
 
271
274
  @Property_RO
272
275
  def _isYou(self):
@@ -326,7 +329,8 @@ class EcefFarrell21(_EcefBase):
326
329
  def reverse(self, xyz, y=None, z=None, M=None, **lon00_name): # PYCHOK unused M
327
330
  '''Convert from geocentric C{(x, y, z)} to geodetic C{(lat, lon, height)} using
328
331
  I{Farrell}'s U{Table 2.1<https://Books.Google.com/books?id=fW4foWASY6wC>},
329
- page 29.
332
+ page 29, aka the I{Heikkinen application} of U{Ferrari's solution
333
+ <https://WikiPedia.org/wiki/Geographic_coordinate_conversion>}.
330
334
 
331
335
  @arg xyz: A geocentric (C{Cartesian}, L{Ecef9Tuple}) or C{scalar} ECEF C{x}
332
336
  coordinate (C{meter}).
@@ -366,9 +370,9 @@ class EcefFarrell21(_EcefBase):
366
370
  p2 = p**2
367
371
  G = p2 + ez - e2 * (a2 - b2) # p2 + ez - e4 * a2
368
372
  F = b2 * z2 * 54
369
- t = e4 * p2 * F / G**3
370
- t = cbrt(sqrt(t * (t + _2_0)) + t + _1_0)
371
- G *= fsumf_(t , _1_0, _1_0 / t)
373
+ c = e4 * p2 * F / G**3
374
+ s = cbrt(sqrt(c * (c + _2_0)) + c + _1_0)
375
+ G *= fsumf_(s , _1_0, _1_0 / s) # k
372
376
  P = F / (G**2 * _3_0)
373
377
  Q = sqrt(_2_0 * e4 * P + _1_0)
374
378
  Q1 = Q + _1_0
@@ -376,15 +380,15 @@ class EcefFarrell21(_EcefBase):
376
380
  -P * ez / (Q * Q1),
377
381
  -P * p2 * _0_5))
378
382
  r = p + e2 * r0
379
- v = b2 / (sqrt(r**2 + ez) * a)
383
+ v = b2 / (sqrt(r**2 + ez) * a) # z0 / z
380
384
 
381
385
  h = hypot(r, z) * (_1_0 - v)
382
386
  lat = atan1d((e2_ * v + _1_0) * z, p)
383
387
  lon = self._polon(y, x, p, **lon00_name)
384
388
  # note, phi and lam are swapped on page 29
385
389
 
386
- except (ValueError, ZeroDivisionError) as e:
387
- raise EcefError(x=x, y=y, z=z, cause=e)
390
+ except (ValueError, ZeroDivisionError) as X:
391
+ raise EcefError(x=x, y=y, z=z, cause=X)
388
392
 
389
393
  return Ecef9Tuple(x, y, z, lat, lon, h,
390
394
  1, None, self.datum,
@@ -638,9 +642,8 @@ class EcefSudano(_EcefBase):
638
642
  R = hypot(x, y) # Rh
639
643
  d = e - R
640
644
 
641
- _a = fabs
642
645
  lat = atan1d(z, R * E.e21)
643
- sa, ca = sincos2d(_a(lat))
646
+ sa, ca = sincos2d(fabs(lat))
644
647
  # Sudano's Eq (A-6) and (A-7) refactored/reduced,
645
648
  # replacing Rn from Eq (A-4) with n = E.a / ca:
646
649
  # N = ca**2 * ((z + E.e2 * n * sa) * ca - R * sa)
@@ -650,32 +653,30 @@ class EcefSudano(_EcefBase):
650
653
  # = ca**2 * (E.e2 * E.a / E.e2s2(sa) - R / ca**2)
651
654
  # N / D = (z * ca + (E.e2 * E.a - R) * sa) /
652
655
  # (E.e2 * E.a / E.e2s2(sa) - R / ca**2)
653
- _E = EPS_2
654
656
  tol = self.tolerance
655
657
  _S2 = Fsum(sa).fsum2f_
656
- _rt = sqrt
657
658
  for i in range(1, _TRIPS):
658
659
  ca2 = _1_0 - sa**2
659
- if ca2 < _E: # PYCHOK no cover
660
+ if ca2 < EPS_2: # PYCHOK no cover
660
661
  ca = _0_0
661
662
  break
662
- ca = _rt(ca2)
663
+ ca = sqrt(ca2)
663
664
  r = e / E.e2s2(sa) - R / ca2
664
- if _a(r) < _E:
665
+ if fabs(r) < EPS_2:
665
666
  break
666
667
  lat = None
667
- sa, r = _S2(-z * ca / r, -d * sa / r)
668
- if _a(r) < tol:
668
+ sa, t = _S2(-z * ca / r, -d * sa / r)
669
+ if fabs(t) < tol:
669
670
  break
670
671
  else:
671
672
  t = unstr(self.reverse, x=x, y=y, z=z)
672
673
  raise EcefError(t, txt=Fmt.no_convergence(r, tol))
673
674
 
674
675
  if lat is None:
675
- lat = copysign0(atan1d(_a(sa), ca), z)
676
+ lat = copysign0(atan1d(fabs(sa), ca), z)
676
677
  lon = self._polon(y, x, R, **lon00_name)
677
678
 
678
- h = fsumf_(R * ca, _a(z * sa), -E.a * E.e2s(sa)) # use Veness'
679
+ h = fsumf_(R * ca, fabs(z * sa), -E.a * E.e2s(sa)) # use Veness'
679
680
  # because Sudano's Eq (7) doesn't produce the correct height
680
681
  # h = (fabs(z) + R - E.a * cos(a + E.e21) * sa / ca) / (ca + sa)
681
682
  return Ecef9Tuple(x, y, z, lat, lon, h,
@@ -1017,12 +1018,12 @@ class EcefMatrix(_NamedTuple):
1017
1018
  return xyz_
1018
1019
 
1019
1020
 
1020
- class Ecef9Tuple(_NamedTuple):
1021
- '''9-Tuple C{(x, y, z, lat, lon, height, C, M, datum)} with I{geocentric}
1022
- C{x}, C{y} and C{z} plus I{geodetic} C{lat}, C{lon} and C{height}, case
1023
- C{C} (see the C{Ecef*.reverse} methods) and optionally, the rotation
1024
- matrix C{M} (L{EcefMatrix}) and C{datum}, with C{lat} and C{lon} in
1025
- C{degrees} and C{x}, C{y}, C{z} and C{height} in C{meter}, conventionally.
1021
+ class Ecef9Tuple(_NamedTuple, _NamedLocal):
1022
+ '''9-Tuple C{(x, y, z, lat, lon, height, C, M, datum)} with I{geocentric} C{x},
1023
+ C{y} and C{z} plus I{geodetic} C{lat}, C{lon} and C{height}, case C{C} (see
1024
+ the C{Ecef*.reverse} methods) and optionally, rotation matrix C{M} (L{EcefMatrix})
1025
+ and C{datum}, with C{lat} and C{lon} in C{degrees} and C{x}, C{y}, C{z} and
1026
+ C{height} in C{meter}, conventionally.
1026
1027
  '''
1027
1028
  _Names_ = (_x_, _y_, _z_, _lat_, _lon_, _height_, _C_, _M_, _datum_)
1028
1029
  _Units_ = ( Meter, Meter, Meter, Lat, Lon, Height, Int, _Pass, _Pass)
@@ -1038,6 +1039,10 @@ class Ecef9Tuple(_NamedTuple):
1038
1039
  '''DEPRECATED, use method L{toDatum}.'''
1039
1040
  return self.toDatum(datum2)
1040
1041
 
1042
+ @property_RO
1043
+ def _ecef9(self):
1044
+ return self
1045
+
1041
1046
  @Property_RO
1042
1047
  def lam(self):
1043
1048
  '''Get the longitude in C{radians} (C{float}).
@@ -1091,12 +1096,19 @@ class Ecef9Tuple(_NamedTuple):
1091
1096
  @Property_RO
1092
1097
  def lonVermeille(self):
1093
1098
  '''Get the longitude in C{degrees [-225..+225]} after U{Vermeille
1094
- <https://Search.ProQuest.com/docview/639493848>} (2004), p 95.
1099
+ <https://Search.ProQuest.com/docview/639493848>} 2004, p 95.
1095
1100
 
1096
1101
  @see: Property C{lamVermeille}.
1097
1102
  '''
1098
1103
  return Lon(Vermeille=degrees(self.lamVermeille))
1099
1104
 
1105
+ def _ltp_toLocal(self, ltp, Cls_and_kwds, **nam_Cls): # for C{_NamedLocal}
1106
+ '''(INTERNAL) Invoke C{ltp._xLtp(ltp)._ecef2local}.
1107
+ '''
1108
+ Cls, kwds = self._ltp_toLocal2(Cls_and_kwds, **nam_Cls) # in ._NamedLocal
1109
+ ltp = self._ltp._xLtp(ltp, self._Ltp) # both in ._NamedLocal
1110
+ return ltp._ecef2local(self, Cls, kwds)
1111
+
1100
1112
  @Property_RO
1101
1113
  def phi(self):
1102
1114
  '''Get the latitude in C{radians} (C{float}).
@@ -1137,13 +1149,13 @@ class Ecef9Tuple(_NamedTuple):
1137
1149
  L{ellipsoidalNvector.Cartesian}, L{ellipsoidalVincenty.Cartesian},
1138
1150
  L{sphericalNvector.Cartesian} or L{sphericalTrigonometry.Cartesian})
1139
1151
  or C{None}.
1140
- @kwarg Cartesian_kwds: Optional, additional B{C{Cartesian}} keyword arguments, ignored
1152
+ @kwarg Cartesian_kwds: Optionally, additional B{C{Cartesian}} keyword arguments, ignored
1141
1153
  if C{B{Cartesian} is None}.
1142
1154
 
1143
- @return: A C{B{Cartesian}(x, y, z, **B{Cartesian_kwds})} instance or
1144
- a L{Vector4Tuple}C{(x, y, z, h)} if C{B{Cartesian} is None}.
1155
+ @return: A B{C{Cartesian}} instance or a L{Vector4Tuple}C{(x, y, z, h)} if C{B{Cartesian}
1156
+ is None}.
1145
1157
 
1146
- @raise TypeError: Invalid B{C{Cartesian}} or B{C{Cartesian_kwds}}.
1158
+ @raise TypeError: Invalid B{C{Cartesian}} or B{C{Cartesian_kwds}} item.
1147
1159
  '''
1148
1160
  if Cartesian in (None, Vector4Tuple):
1149
1161
  r = self.xyzh
@@ -1177,17 +1189,15 @@ class Ecef9Tuple(_NamedTuple):
1177
1189
  def toLatLon(self, LatLon=None, **LatLon_kwds):
1178
1190
  '''Return the geodetic C{(lat, lon, height[, datum])} coordinates.
1179
1191
 
1180
- @kwarg LatLon: Optional class to return C{(lat, lon, height[, datum])}
1181
- or C{None}.
1182
- @kwarg LatLon_kwds: Optional B{C{height}}, B{C{datum}} and other
1183
- B{C{LatLon}} keyword arguments.
1192
+ @kwarg LatLon: Optional class to return C{(lat, lon, height[, datum])} or C{None}.
1193
+ @kwarg LatLon_kwds: Optional B{C{height}}, B{C{datum}} and other B{C{LatLon}}
1194
+ keyword arguments.
1184
1195
 
1185
- @return: An instance of C{B{LatLon}(lat, lon, **B{LatLon_kwds})}
1186
- or if C{B{LatLon} is None}, a L{LatLon3Tuple}C{(lat, lon,
1187
- height)} respectively L{LatLon4Tuple}C{(lat, lon, height,
1188
- datum)} depending on whether C{datum} is un-/specified.
1196
+ @return: A B{C{LatLon}} instance or if C{B{LatLon} is None}, a L{LatLon4Tuple}C{(lat,
1197
+ lon, height, datum)} or L{LatLon3Tuple}C{(lat, lon, height)} if C{datum} is
1198
+ specified or not.
1189
1199
 
1190
- @raise TypeError: Invalid B{C{LatLon}} or B{C{LatLon_kwds}}.
1200
+ @raise TypeError: Invalid B{C{LatLon}} or B{C{LatLon_kwds}} item.
1191
1201
  '''
1192
1202
  lat, lon, D = self.lat, self.lon, self.datum # PYCHOK Ecef9Tuple
1193
1203
  kwds = _name1__(LatLon_kwds, _or_nameof=self)
@@ -1205,33 +1215,17 @@ class Ecef9Tuple(_NamedTuple):
1205
1215
  _xdatum(_xattr(r, datum=D), D)
1206
1216
  return r
1207
1217
 
1208
- def toLocal(self, ltp, Xyz=None, **Xyz_kwds):
1209
- '''Convert this geocentric to I{local} C{x}, C{y} and C{z}.
1210
-
1211
- @kwarg ltp: The I{local tangent plane} (LTP) to use (L{Ltp}).
1212
- @kwarg Xyz: Optional class to return C{x}, C{y} and C{z}
1213
- (L{XyzLocal}, L{Enu}, L{Ned}) or C{None}.
1214
- @kwarg Xyz_kwds: Optional, additional B{C{Xyz}} keyword
1215
- arguments, ignored if C{B{Xyz} is None}.
1216
-
1217
- @return: An B{C{Xyz}} instance or if C{B{Xyz} is None},
1218
- a L{Local9Tuple}C{(x, y, z, lat, lon, height,
1219
- ltp, ecef, M)} with C{M=None}, always.
1220
-
1221
- @raise TypeError: Invalid B{C{ltp}}.
1222
- '''
1223
- return _MODS.ltp._xLtp(ltp)._ecef2local(self, Xyz, Xyz_kwds)
1224
-
1225
1218
  def toVector(self, Vector=None, **Vector_kwds):
1226
- '''Return the geocentric C{(x, y, z)} coordinates as vector.
1219
+ '''Return these geocentric C{(x, y, z)} coordinates as vector.
1220
+
1221
+ @kwarg Vector: Optional vector class to return C{(x, y, z)} or C{None}.
1222
+ @kwarg Vector_kwds: Optional, additional B{C{Vector}} keyword arguments,
1223
+ ignored if C{B{Vector} is None}.
1227
1224
 
1228
- @kwarg Vector: Optional vector class to return C{(x, y, z)} or
1229
- C{None}.
1230
- @kwarg Vector_kwds: Optional, additional B{C{Vector}} keyword
1231
- arguments, ignored if C{B{Vector} is None}.
1225
+ @return: A B{C{Vector}} instance or a L{Vector3Tuple}C{(x, y, z)} if
1226
+ C{B{Vector} is None}.
1232
1227
 
1233
- @return: A C{Vector}C{(x, y, z, **Vector_kwds)} instance or a
1234
- L{Vector3Tuple}C{(x, y, z)} if C{B{Vector} is None}.
1228
+ @raise TypeError: Invalid B{C{Vector}} or B{C{Vector_kwds}} item.
1235
1229
 
1236
1230
  @see: Propertes C{xyz} and C{xyzh}
1237
1231
  '''
@@ -1319,7 +1313,7 @@ __all__ += _ALL_DOCS(_EcefBase)
1319
1313
 
1320
1314
  # **) MIT License
1321
1315
  #
1322
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
1316
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1323
1317
  #
1324
1318
  # Permission is hereby granted, free of charge, to any person obtaining a
1325
1319
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/elevations.py CHANGED
@@ -254,7 +254,7 @@ if __name__ == '__main__':
254
254
 
255
255
  # **) MIT License
256
256
  #
257
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
257
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
258
258
  #
259
259
  # Permission is hereby granted, free of charge, to any person obtaining a
260
260
  # copy of this software and associated documentation files (the "Software"),