pygeodesy 25.11.5__py2.py3-none-any.whl → 25.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 (125) hide show
  1. pygeodesy/__init__.py +25 -12
  2. pygeodesy/__main__.py +1 -1
  3. pygeodesy/albers.py +1 -1
  4. pygeodesy/angles.py +960 -0
  5. pygeodesy/auxilats/_CX_4.py +1 -1
  6. pygeodesy/auxilats/_CX_6.py +1 -1
  7. pygeodesy/auxilats/_CX_8.py +1 -1
  8. pygeodesy/auxilats/_CX_Rs.py +1 -1
  9. pygeodesy/auxilats/__init__.py +2 -2
  10. pygeodesy/auxilats/__main__.py +1 -1
  11. pygeodesy/auxilats/auxAngle.py +7 -8
  12. pygeodesy/auxilats/auxDLat.py +1 -1
  13. pygeodesy/auxilats/auxDST.py +1 -1
  14. pygeodesy/auxilats/auxLat.py +1 -1
  15. pygeodesy/auxilats/auxily.py +1 -1
  16. pygeodesy/azimuthal.py +6 -5
  17. pygeodesy/basics.py +14 -10
  18. pygeodesy/booleans.py +1 -1
  19. pygeodesy/cartesianBase.py +7 -7
  20. pygeodesy/clipy.py +1 -1
  21. pygeodesy/constants.py +27 -24
  22. pygeodesy/css.py +1 -1
  23. pygeodesy/datums.py +1 -1
  24. pygeodesy/deprecated/__init__.py +1 -1
  25. pygeodesy/deprecated/bases.py +1 -1
  26. pygeodesy/deprecated/classes.py +14 -7
  27. pygeodesy/deprecated/consterns.py +1 -1
  28. pygeodesy/deprecated/datum.py +1 -1
  29. pygeodesy/deprecated/functions.py +1 -1
  30. pygeodesy/deprecated/nvector.py +1 -1
  31. pygeodesy/deprecated/rhumbBase.py +1 -1
  32. pygeodesy/deprecated/rhumbaux.py +1 -1
  33. pygeodesy/deprecated/rhumbsolve.py +1 -1
  34. pygeodesy/deprecated/rhumbx.py +1 -1
  35. pygeodesy/dms.py +1 -1
  36. pygeodesy/ecef.py +1 -1
  37. pygeodesy/ecefLocals.py +1 -1
  38. pygeodesy/elevations.py +1 -1
  39. pygeodesy/ellipsoidalBase.py +1 -1
  40. pygeodesy/ellipsoidalBaseDI.py +1 -1
  41. pygeodesy/ellipsoidalExact.py +1 -1
  42. pygeodesy/ellipsoidalGeodSolve.py +1 -1
  43. pygeodesy/ellipsoidalKarney.py +1 -1
  44. pygeodesy/ellipsoidalNvector.py +1 -1
  45. pygeodesy/ellipsoidalVincenty.py +1 -1
  46. pygeodesy/ellipsoids.py +7 -6
  47. pygeodesy/elliptic.py +1 -1
  48. pygeodesy/epsg.py +1 -1
  49. pygeodesy/errors.py +8 -4
  50. pygeodesy/etm.py +1 -1
  51. pygeodesy/fmath.py +15 -8
  52. pygeodesy/formy.py +107 -5
  53. pygeodesy/frechet.py +1 -1
  54. pygeodesy/fstats.py +1 -1
  55. pygeodesy/fsums.py +1 -1
  56. pygeodesy/gars.py +1 -1
  57. pygeodesy/geod3solve.py +488 -0
  58. pygeodesy/geodesici.py +4 -4
  59. pygeodesy/geodesicw.py +1 -1
  60. pygeodesy/geodesicx/_C4_24.py +1 -1
  61. pygeodesy/geodesicx/_C4_27.py +1 -1
  62. pygeodesy/geodesicx/_C4_30.py +1 -1
  63. pygeodesy/geodesicx/__init__.py +1 -1
  64. pygeodesy/geodesicx/__main__.py +1 -1
  65. pygeodesy/geodesicx/gx.py +1 -1
  66. pygeodesy/geodesicx/gxarea.py +1 -1
  67. pygeodesy/geodesicx/gxbases.py +1 -1
  68. pygeodesy/geodesicx/gxline.py +1 -1
  69. pygeodesy/geodsolve.py +70 -102
  70. pygeodesy/geohash.py +1 -1
  71. pygeodesy/geoids.py +1 -1
  72. pygeodesy/hausdorff.py +1 -1
  73. pygeodesy/heights.py +1 -1
  74. pygeodesy/internals.py +1 -1
  75. pygeodesy/interns.py +3 -3
  76. pygeodesy/iters.py +1 -1
  77. pygeodesy/karney.py +132 -116
  78. pygeodesy/ktm.py +1 -1
  79. pygeodesy/latlonBase.py +1 -1
  80. pygeodesy/lazily.py +23 -12
  81. pygeodesy/lcc.py +1 -1
  82. pygeodesy/ltp.py +1 -1
  83. pygeodesy/ltpTuples.py +1 -1
  84. pygeodesy/mgrs.py +3 -3
  85. pygeodesy/named.py +14 -9
  86. pygeodesy/namedTuples.py +1 -1
  87. pygeodesy/nvectorBase.py +1 -1
  88. pygeodesy/osgr.py +1 -1
  89. pygeodesy/points.py +1 -1
  90. pygeodesy/props.py +1 -1
  91. pygeodesy/resections.py +1 -1
  92. pygeodesy/rhumb/__init__.py +8 -6
  93. pygeodesy/rhumb/aux_.py +1 -1
  94. pygeodesy/rhumb/bases.py +1 -1
  95. pygeodesy/rhumb/ekx.py +1 -1
  96. pygeodesy/rhumb/solve.py +91 -84
  97. pygeodesy/simplify.py +1 -1
  98. pygeodesy/solveBase.py +72 -49
  99. pygeodesy/sphericalBase.py +1 -1
  100. pygeodesy/sphericalNvector.py +1 -1
  101. pygeodesy/sphericalTrigonometry.py +1 -1
  102. pygeodesy/streprs.py +6 -4
  103. pygeodesy/trf.py +1 -1
  104. pygeodesy/triaxials/__init__.py +70 -0
  105. pygeodesy/triaxials/bases.py +935 -0
  106. pygeodesy/triaxials/conformal3.py +617 -0
  107. pygeodesy/triaxials/triaxial3.py +969 -0
  108. pygeodesy/{triaxials.py → triaxials/triaxial5.py} +353 -781
  109. pygeodesy/units.py +1 -1
  110. pygeodesy/unitsBase.py +1 -1
  111. pygeodesy/ups.py +2 -3
  112. pygeodesy/utily.py +17 -14
  113. pygeodesy/utm.py +1 -1
  114. pygeodesy/utmups.py +1 -1
  115. pygeodesy/utmupsBase.py +1 -1
  116. pygeodesy/vector2d.py +1 -1
  117. pygeodesy/vector3d.py +1 -1
  118. pygeodesy/vector3dBase.py +1 -1
  119. pygeodesy/webmercator.py +1 -1
  120. pygeodesy/wgrs.py +1 -1
  121. {pygeodesy-25.11.5.dist-info → pygeodesy-25.12.12.dist-info}/METADATA +12 -12
  122. pygeodesy-25.12.12.dist-info/RECORD +125 -0
  123. pygeodesy-25.11.5.dist-info/RECORD +0 -119
  124. {pygeodesy-25.11.5.dist-info → pygeodesy-25.12.12.dist-info}/WHEEL +0 -0
  125. {pygeodesy-25.11.5.dist-info → pygeodesy-25.12.12.dist-info}/top_level.txt +0 -0
@@ -120,7 +120,7 @@ del _Rcoeffs, _Rdict, _Rtuple
120
120
 
121
121
  # **) MIT License
122
122
  #
123
- # Copyright (C) 2023-2025 -- mrJean1 at Gmail -- All Rights Reserved.
123
+ # Copyright (C) 2023-2026 -- mrJean1 at Gmail -- All Rights Reserved.
124
124
  #
125
125
  # Permission is hereby granted, free of charge, to any person obtaining a
126
126
  # copy of this software and associated documentation files (the "Software"),
@@ -168,7 +168,7 @@ del _Rcoeffs, _Rdict, _Rtuple
168
168
 
169
169
  # **) MIT License
170
170
  #
171
- # Copyright (C) 2023-2025 -- mrJean1 at Gmail -- All Rights Reserved.
171
+ # Copyright (C) 2023-2026 -- mrJean1 at Gmail -- All Rights Reserved.
172
172
  #
173
173
  # Permission is hereby granted, free of charge, to any person obtaining a
174
174
  # copy of this software and associated documentation files (the "Software"),
@@ -227,7 +227,7 @@ del _Rcoeffs, _Rdict, _Rtuple
227
227
 
228
228
  # **) MIT License
229
229
  #
230
- # Copyright (C) 2023-2025 -- mrJean1 at Gmail -- All Rights Reserved.
230
+ # Copyright (C) 2023-2026 -- mrJean1 at Gmail -- All Rights Reserved.
231
231
  #
232
232
  # Permission is hereby granted, free of charge, to any person obtaining a
233
233
  # copy of this software and associated documentation files (the "Software"),
@@ -220,7 +220,7 @@ class _Rtuple(list): # MUST be list, NOT tuple!
220
220
 
221
221
  # **) MIT License
222
222
  #
223
- # Copyright (C) 2024-2025 -- mrJean1 at Gmail -- All Rights Reserved.
223
+ # Copyright (C) 2024-2026 -- mrJean1 at Gmail -- All Rights Reserved.
224
224
  #
225
225
  # Permission is hereby granted, free of charge, to any person obtaining a
226
226
  # copy of this software and associated documentation files (the "Software"),
@@ -29,11 +29,11 @@ from pygeodesy.lazily import _ALL_OTHER
29
29
  # no modules: auxAngle, auxDLat, auxDST, auxily, auxLat
30
30
  __all__ = _ALL_OTHER(Aux, AuxAngle, AuxDLat, AuxDST, AuxLat,
31
31
  AuxBeta, AuxChi, AuxMu, AuxPhi, AuxTheta, AuxXi)
32
- __version__ = '25.08.28'
32
+ __version__ = '25.12.02'
33
33
 
34
34
  # **) MIT License
35
35
  #
36
- # Copyright (C) 2023-2025 -- mrJean1 at Gmail -- All Rights Reserved.
36
+ # Copyright (C) 2023-2026 -- mrJean1 at Gmail -- All Rights Reserved.
37
37
  #
38
38
  # Permission is hereby granted, free of charge, to any person obtaining a
39
39
  # copy of this software and associated documentation files (the "Software"),
@@ -53,7 +53,7 @@ _main(ALorder=int(argv[1])) if len(argv) == 2 and argv[1].isdigit() else _main()
53
53
 
54
54
  # **) MIT License
55
55
  #
56
- # Copyright (C) 2023-2025 -- mrJean1 at Gmail -- All Rights Reserved.
56
+ # Copyright (C) 2023-2026 -- mrJean1 at Gmail -- All Rights Reserved.
57
57
  #
58
58
  # Permission is hereby granted, free of charge, to any person obtaining a
59
59
  # copy of this software and associated documentation files (the "Software"),
@@ -16,8 +16,8 @@ from __future__ import division as _; del _ # noqa: E702 ;
16
16
 
17
17
  from pygeodesy.auxilats.auxily import Aux, _Aux2Greek, AuxError
18
18
  from pygeodesy.basics import map1, map2, _xinstanceof
19
- from pygeodesy.constants import EPS, _INF_NAN_NINF, MAX, NAN, _0_0, _0_5, _1_0, \
20
- _copysign_1_0, isfinite, isnan, _over, _pos_self
19
+ from pygeodesy.constants import EPS, MAX, NAN, _0_0, _0_5, _1_0, _copysign_1_0, \
20
+ isfinite, isnan, _over, _pos_self
21
21
  # from pygeodesy.errors import AuxError # from .auxilats.auxily
22
22
  from pygeodesy.fmath import hypot, unstr
23
23
  from pygeodesy.fsums import _add_op_, _iadd_op_, _isub_op_, _sub_op_
@@ -32,11 +32,10 @@ from pygeodesy.utily import atan2, atan2d, sincos2, sincos2d
32
32
  from math import asinh, copysign, degrees, fabs, radians, sinh
33
33
 
34
34
  __all__ = ()
35
- __version__ = '25.08.31'
35
+ __version__ = '25.12.02'
36
36
 
37
- _0_INF_NAN_NINF = (0, _0_0) + _INF_NAN_NINF
38
- _MAX_2 = MAX * _0_5 # PYCHOK used!
39
- # del _INF_NAN_NINF, MAX
37
+ _MAX_2 = MAX * _0_5 # PYCHOK used!
38
+ # del MAX
40
39
 
41
40
 
42
41
  class AuxAngle(_Named):
@@ -519,7 +518,7 @@ def _yx2(yx):
519
518
  try:
520
519
  y, x = yx
521
520
  y, x = map1(float, y, x)
522
- if y in _0_INF_NAN_NINF:
521
+ if not (y and isfinite(y)):
523
522
  x = _copysign_1_0(x)
524
523
  except (TypeError, ValueError) as X:
525
524
  raise AuxError(y=y, x=x, cause=X)
@@ -530,7 +529,7 @@ __all__ += _ALL_DOCS(AuxAngle, *_AUXClass.values())
530
529
 
531
530
  # **) MIT License
532
531
  #
533
- # Copyright (C) 2023-2025 -- mrJean1 at Gmail -- All Rights Reserved.
532
+ # Copyright (C) 2023-2026 -- mrJean1 at Gmail -- All Rights Reserved.
534
533
  #
535
534
  # Permission is hereby granted, free of charge, to any person obtaining a
536
535
  # copy of this software and associated documentation files (the "Software"),
@@ -282,7 +282,7 @@ __all__ += _ALL_DOCS(AuxDLat)
282
282
 
283
283
  # **) MIT License
284
284
  #
285
- # Copyright (C) 2023-2025 -- mrJean1 at Gmail -- All Rights Reserved.
285
+ # Copyright (C) 2023-2026 -- mrJean1 at Gmail -- All Rights Reserved.
286
286
  #
287
287
  # Permission is hereby granted, free of charge, to any person obtaining a
288
288
  # copy of this software and associated documentation files (the "Software"),
@@ -274,7 +274,7 @@ __all__ += _ALL_DOCS(AuxDST)
274
274
 
275
275
  # **) MIT License
276
276
  #
277
- # Copyright (C) 2023-2025 -- mrJean1 at Gmail -- All Rights Reserved.
277
+ # Copyright (C) 2023-2026 -- mrJean1 at Gmail -- All Rights Reserved.
278
278
  #
279
279
  # Permission is hereby granted, free of charge, to any person obtaining a
280
280
  # copy of this software and associated documentation files (the "Software"),
@@ -847,7 +847,7 @@ __all__ += _ALL_DOCS(AuxLat)
847
847
 
848
848
  # **) MIT License
849
849
  #
850
- # Copyright (C) 2023-2025 -- mrJean1 at Gmail -- All Rights Reserved.
850
+ # Copyright (C) 2023-2026 -- mrJean1 at Gmail -- All Rights Reserved.
851
851
  #
852
852
  # Permission is hereby granted, free of charge, to any person obtaining a
853
853
  # copy of this software and associated documentation files (the "Software"),
@@ -235,7 +235,7 @@ del _Rkey
235
235
 
236
236
  # **) MIT License
237
237
  #
238
- # Copyright (C) 2023-2025 -- mrJean1 at Gmail -- All Rights Reserved.
238
+ # Copyright (C) 2023-2026 -- mrJean1 at Gmail -- All Rights Reserved.
239
239
  #
240
240
  # Permission is hereby granted, free of charge, to any person obtaining a
241
241
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/azimuthal.py CHANGED
@@ -48,7 +48,7 @@ from pygeodesy.constants import EPS, EPS0, EPS1, NAN, isnon0, _umod_360, \
48
48
  from pygeodesy.ellipsoidalBase import LatLonEllipsoidalBase as _LLEB, \
49
49
  _isin, _xinstanceof
50
50
  from pygeodesy.datums import _spherical_datum, _WGS84
51
- from pygeodesy.errors import _ValueError, _xdatum, _xkwds
51
+ from pygeodesy.errors import _ValueError, _xattr, _xdatum, _xkwds
52
52
  from pygeodesy.fmath import euclid, hypot as _hypot, Fsum
53
53
  # from pygeodesy.fsums import Fsum # from .fmath
54
54
  # from pygeodesy.formy import antipode # _MODS
@@ -71,7 +71,7 @@ from pygeodesy.utily import asin1, atan1, atan2, atan2b, atan2d, \
71
71
  from math import acos, degrees, fabs, sin, sqrt
72
72
 
73
73
  __all__ = _ALL_LAZY.azimuthal
74
- __version__ = '25.09.29'
74
+ __version__ = '25.11.29'
75
75
 
76
76
  _EPS_K = _EPStol * _0_1 # Karney's eps_ or _EPSmin * _0_1?
77
77
  _over_horizon_ = 'over horizon'
@@ -195,8 +195,9 @@ class _AzimuthalBase(_NamedBase):
195
195
  '''
196
196
  B = _LLEB if self.datum.isEllipsoidal else _LLB
197
197
  _xinstanceof(B, LatLon2Tuple, LatLon4Tuple, latlon0=latlon0)
198
- if hasattr(latlon0, _datum_):
199
- _xdatum(self.datum, latlon0.datum, Error=AzimuthalError)
198
+ D = _xattr(latlon0, datum=B)
199
+ if D is not B:
200
+ _xdatum(self.datum, D, Error=AzimuthalError)
200
201
  self.reset(latlon0.lat, latlon0.lon)
201
202
 
202
203
  @Property_RO
@@ -1118,7 +1119,7 @@ __all__ += _ALL_DOCS(_AzimuthalBase, _AzimuthalGeodesic, _EquidistantBase, _Gnom
1118
1119
 
1119
1120
  # **) MIT License
1120
1121
  #
1121
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1122
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
1122
1123
  #
1123
1124
  # Permission is hereby granted, free of charge, to any person obtaining a
1124
1125
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/basics.py CHANGED
@@ -37,7 +37,7 @@ from math import copysign as _copysign
37
37
  # import inspect as _inspect # _MODS
38
38
 
39
39
  __all__ = _ALL_LAZY.basics
40
- __version__ = '25.09.04'
40
+ __version__ = '25.12.02'
41
41
 
42
42
  _below_ = 'below'
43
43
  _list_tuple_types = (list, tuple)
@@ -347,8 +347,8 @@ def isfloat(obj, both=False):
347
347
 
348
348
 
349
349
  try:
350
- isidentifier = str.isidentifier # Python 3, must be str
351
- except AttributeError: # Python 2-
350
+ isidentifier = str.isidentifier # must be str
351
+ except AttributeError: # 2.0-
352
352
 
353
353
  def isidentifier(obj):
354
354
  '''Is B{C{obj}}ect a Python identifier?
@@ -445,7 +445,7 @@ def isiterabletype(obj, method='__iter__'):
445
445
 
446
446
 
447
447
  try:
448
- from keyword import iskeyword # Python 2.7+
448
+ from keyword import iskeyword # 2.7+
449
449
  except ImportError:
450
450
 
451
451
  def iskeyword(unused):
@@ -713,12 +713,16 @@ def _reverange(n, stop=-1, step=-1):
713
713
  return range(n - 1, stop, step)
714
714
 
715
715
 
716
- def signBit(x):
717
- '''Return C{signbit(B{x})}, like C++, see also L{isneg}.
716
+ try:
717
+ from math import signbit as signBit # 3.15+
718
+ except ImportError:
718
719
 
719
- @return: C{True} if C{B{x} < 0} or C{NEG0} (C{bool}).
720
- '''
721
- return (x or _copysign(1, x)) < 0
720
+ def signBit(x):
721
+ '''Return C{signbit(B{x})}, like C++, see also L{isneg}.
722
+
723
+ @return: C{True} if C{B{x} < 0} or C{NEG0} (C{bool}).
724
+ '''
725
+ return (x or _copysign(1, x)) < 0
722
726
 
723
727
 
724
728
  def _signOf(x, ref): # in .fsums
@@ -1029,7 +1033,7 @@ _XPACKAGES = _splituple(_envPYGEODESY(_xpackages_).lower()) # test/bases._X_OK
1029
1033
 
1030
1034
  # **) MIT License
1031
1035
  #
1032
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1036
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
1033
1037
  #
1034
1038
  # Permission is hereby granted, free of charge, to any person obtaining a
1035
1039
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/booleans.py CHANGED
@@ -1979,7 +1979,7 @@ __all__ += _ALL_DOCS(_BooleanBase, _Clip,
1979
1979
 
1980
1980
  # **) MIT License
1981
1981
  #
1982
- # Copyright (C) 2018-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1982
+ # Copyright (C) 2018-2026 -- mrJean1 at Gmail -- All Rights Reserved.
1983
1983
  #
1984
1984
  # Permission is hereby granted, free of charge, to any person obtaining a
1985
1985
  # copy of this software and associated documentation files (the "Software"),
@@ -11,8 +11,8 @@ U{https://www.Movable-Type.co.UK/scripts/geodesy/docs/latlon-ellipsoidal.js.html
11
11
  '''
12
12
 
13
13
  from pygeodesy.basics import _isin, _xinstanceof, typename
14
- from pygeodesy.constants import EPS, EPS0, INT0, PI2, _isfinite, isnear0, \
15
- _0_0, _1_0, _N_1_0, _2_0, _4_0, _6_0
14
+ from pygeodesy.constants import EPS, EPS0, INT0, NAN, PI2, _isfinite, \
15
+ _0_0, _1_0, _N_1_0, _2_0, _4_0, _6_0, isnear0
16
16
  from pygeodesy.datums import Datum, _earth_ellipsoid, _spherical_datum, \
17
17
  Transform, _WGS84
18
18
  # from pygeodesy.ecef import EcefKarney # _MODS
@@ -34,7 +34,7 @@ from pygeodesy.props import deprecated_method, Property, Property_RO, \
34
34
  property_doc_, property_RO, _update_all
35
35
  # from pygeodesy import resections as _resections # _MODS.into
36
36
  # from pygeodesy.streprs import Fmt # from .fsums
37
- # from pygeodesy.triaxials import Triaxial_ # _MODS
37
+ # from pygeodesy.triaxials.triaxial5 import Triaxial_ # _MODS
38
38
  from pygeodesy.units import Degrees, Height, _heigHt, _isMeter, Meter, Radians
39
39
  from pygeodesy.utily import acos1, atan2, sincos2d, sincos2_, degrees, radians
40
40
  from pygeodesy.vector3d import Vector3d, _xyzhdlln4
@@ -43,7 +43,7 @@ from pygeodesy.vector3d import Vector3d, _xyzhdlln4
43
43
  # from math import degrees, fabs, radians, sqrt # from .fmath, .utily
44
44
 
45
45
  __all__ = _ALL_LAZY.cartesianBase
46
- __version__ = '25.08.24'
46
+ __version__ = '25.11.07'
47
47
 
48
48
  _r_ = 'r'
49
49
  _resections = _MODS.into(resections=__name__)
@@ -326,7 +326,7 @@ class CartesianBase(Vector3d, _EcefLocal):
326
326
  try:
327
327
  r = self.datum.ellipsoid.height4(self, normal=True)
328
328
  except (AttributeError, ValueError): # no datum, null cartesian,
329
- r = Vector4Tuple(self.x, self.y, self.z, 0, name__=self.height4)
329
+ r = Vector4Tuple(self.x, self.y, self.z, NAN, name__=self.height4)
330
330
  return r
331
331
 
332
332
  def height4(self, earth=None, normal=True, **Cartesian_and_kwds):
@@ -361,7 +361,7 @@ class CartesianBase(Vector3d, _EcefLocal):
361
361
  d = self.datum if earth is None else earth
362
362
  if normal and d is self.datum:
363
363
  r = self._height4
364
- elif isinstance(d, _MODS.triaxials.Triaxial_):
364
+ elif isinstance(d, _MODS.triaxials.triaxial5.Triaxial_):
365
365
  r = d.height4(self, normal=normal)
366
366
  try:
367
367
  d = d.toEllipsoid(name=n)
@@ -994,7 +994,7 @@ __all__ += _ALL_DOCS(CartesianBase)
994
994
 
995
995
  # **) MIT License
996
996
  #
997
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
997
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
998
998
  #
999
999
  # Permission is hereby granted, free of charge, to any person obtaining a
1000
1000
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/clipy.py CHANGED
@@ -678,7 +678,7 @@ def clipSH3(points, corners, closed=False, inull=False):
678
678
 
679
679
  # **) MIT License
680
680
  #
681
- # Copyright (C) 2018-2025 -- mrJean1 at Gmail -- All Rights Reserved.
681
+ # Copyright (C) 2018-2026 -- mrJean1 at Gmail -- All Rights Reserved.
682
682
  #
683
683
  # Permission is hereby granted, free of charge, to any person obtaining a
684
684
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/constants.py CHANGED
@@ -14,7 +14,7 @@ from pygeodesy.basics import _copysign, isbool, iscomplex, isint, signBit
14
14
  from pygeodesy.errors import _ValueError, _xError, _xkwds_get1, _xkwds_item2
15
15
  # from pygeodesy.fsums import _isFsum_2Tuple # _MODS
16
16
  from pygeodesy.internals import _0_0, _100_0, typename
17
- from pygeodesy.interns import _DMAIN_, _INF_, _NAN_
17
+ from pygeodesy.interns import _INF_, _NAN_, _DMAIN_ # PYCHOK used!
18
18
  from pygeodesy.lazily import _ALL_MODS as _MODS, _ALL_LAZY
19
19
  # from pygeodesy.streprs import Fmt # from .unitsBase
20
20
  from pygeodesy.unitsBase import Float, Int, Radius, Fmt
@@ -26,7 +26,7 @@ except ImportError: # Python 2-
26
26
  _inf, _nan = float(_INF_), float(_NAN_)
27
27
 
28
28
  __all__ = _ALL_LAZY.constants
29
- __version__ = '25.10.15'
29
+ __version__ = '25.12.06'
30
30
 
31
31
 
32
32
  def _copysign_0_0(y):
@@ -266,27 +266,30 @@ except ImportError: # PYCHOK no cover
266
266
  MIN_EXP = Int(MIN_EXP =_log2(MIN)) # -307 base 10
267
267
  # RADIX = Int(Radix =2) # base
268
268
 
269
- EPS0 = _Float( EPS0 = EPS**2) # PYCHOK near-/non-zero comparison 4.930381e-32, or EPS or EPS_2
270
- EPS02 = _Float( EPS02 = EPS**4) # PYCHOK near-zero-squared comparison 2.430865e-63
271
- EPS_2 = _Float( EPS_2 = EPS / _2_0) # PYCHOK ≈ 1.110223024625e-16
272
- EPS1 = _Float( EPS1 =_1_0 - EPS) # PYCHOK ≈ 0.9999999999999998
273
- EPS2 = _Float( EPS2 = EPS * _2_0) # PYCHOK ≈ 4.440892098501e-16
274
- EPS4 = _Float( EPS4 = EPS * _4_0) # PYCHOK ≈ 8.881784197001e-16
275
- # _1EPS = _Float(_1EPS =_1_0 + EPS) # PYCHOK ≈ 1.0000000000000002
276
- _1_EPS = _Float(_1_EPS =_1_0 / EPS) # PYCHOK = 4503599627370496.0
277
- # _2_EPS = _Float(_2_EPS =_2_0 / EPS) # PYCHOK = 9007199254740992.0
278
- _EPS2e4 = _Float(_EPS2e4= EPS2 * 1.e4) # PYCHOK 4.440892098501e-12
279
- _EPS4e8 = _Float(_EPS4e8= EPS4 * 1.e8) # PYCHOK ≈ 8.881784197001e-08
280
- _EPSjam = _Float(_EPSjam= pow(EPS, _0_75)) # PYCHOK = 1.818989403546e-12
281
- _EPSmin = _Float(_EPSmin= sqrt(MIN)) # PYCHOK = 1.49166814624e-154
282
- _EPSqrt = _Float(_EPSqrt= sqrt(EPS)) # PYCHOK = 1.49011611938e5-08
283
- _EPStol = _Float(_EPStol=_EPSqrt * _0_1) # PYCHOK = 1.49011611938e5-09 == sqrt(EPS * _0_01)
284
-
285
- _89_999 = _Float(_89_999=_90_0 * EPS1) # just below 90.0
269
+ EPS0 = _Float( EPS0 = EPS**2) # PYCHOK near-/non-zero comparison 4.930381e-32, or EPS or EPS_2
270
+ EPS02 = _Float( EPS02 = EPS**4) # PYCHOK near-zero-squared comparison 2.430865e-63
271
+ EPS_2 = _Float( EPS_2 = EPS / _2_0) # PYCHOK ≈ 1.110223024625e-16
272
+ EPS1 = _Float( EPS1 =_1_0 - EPS) # PYCHOK ≈ 0.9999999999999998
273
+ EPS2 = _Float( EPS2 = EPS * _2_0) # PYCHOK ≈ 4.440892098501e-16
274
+ EPS4 = _Float( EPS4 = EPS * _4_0) # PYCHOK ≈ 8.881784197001e-16
275
+ EPS8 = _Float( EPS8 = EPS * _8_0) # PYCHOK ≈ 1.776356839400e-15
276
+ # _1EPS = _Float(_1EPS =_1_0 + EPS) # PYCHOK 1.0000000000000002
277
+ _1_EPS = _Float(_1_EPS =_1_0 / EPS) # PYCHOK = 4503599627370496.0
278
+ # _2_EPS = _Float(_2_EPS =_2_0 / EPS) # PYCHOK = 9007199254740992.0
279
+ _EPS2e4 = _Float(_EPS2e4 = EPS2 * 1.e4) # PYCHOK ≈ 4.440892098501e-12
280
+ _EPS4e8 = _Float(_EPS4e8 = EPS4 * 1.e8) # PYCHOK 8.881784197001e-08
281
+ _EPSjam = _Float(_EPSjam = pow(EPS, _0_75)) # PYCHOK = 1.818989403546e-12
282
+ _EPSmin = _Float(_EPSmin = sqrt(MIN)) # PYCHOK = 1.49166814624e-154
283
+ _EPSqrt = _Float(_EPSqrt = sqrt(EPS)) # PYCHOK = 1.490116119385e-08
284
+ _EPStol = _Float(_EPStol =_EPSqrt * _0_1) # PYCHOK = 1.490116119385e-09 == sqrt(EPS * _0_01)
285
+
286
+ _89_999 = _Float(_89_999 =_90_0 * EPS1) # just below 90.0
286
287
  # <https://Numbers.Computation.Free.FR/Constants/Miscellaneous/digits.html>
287
- # _1__90 = _Float(_1__90 =_1_0 / _90_0) # PYCHOK = 0.011_111_111_111_111_111_111_111_111_111_111_111_111_111_111_11111
288
- _2__PI = _Float(_2__PI =_2_0 / _pi) # PYCHOK = 0.636_619_772_367_581_343_075_535_053_490_057_448_137_838_582_96182
289
- _K0_UTM = _Float(_K0_UTM = 0.9996) # PYCHOK in .etm, .ktm, .utm, UTM scale at central meridian
288
+ # _1__90 = _Float(_1__90 =_1_0 / _90_0) # PYCHOK = 0.011_111_111_111_111_111_111_111_111_111_111_111_111_111_111_11111
289
+ _2__PI = _Float(_2__PI =_2_0 / _pi) # PYCHOK = 0.636_619_772_367_581_343_075_535_053_490_057_448_137_838_582_96182
290
+ _K0_UTM = _Float(_K0_UTM = 0.9996) # PYCHOK in .etm, .ktm, .utm, UTM scale at central meridian
291
+ _K0_UPS = _Float(_K0_UPS = 0.994) # PYCHOK in .ups, scale factor at central meridian
292
+ OVERFLOW = _Float(OVERFLOW=_1_0 / EPS0) # PYCHOK = 2.028240960365e+31
290
293
  # sqrt(2) <https://WikiPedia.org/wiki/Square_root_of_2>
291
294
  # 1.414213562373095_048_801_688_724_209_698_078_569_671_875_376_948_073_176_679_737_99
292
295
  # _1SQRT2= _Float(_1SQRT2 =sqrt(_2_0) + 1)
@@ -327,7 +330,7 @@ R_QM = _Radius(R_QM=6372797.560856) # PYCHOK earth' quadratic mean radius (C{
327
330
  R_VM = _Radius(R_VM=6366707.0194937) # PYCHOK aViation/naVigation earth radius (C{meter})
328
331
  # R_AU= Meter( R_AU=149597870700.0) # PYCHOK <https://WikiPedia.org/wiki/Astronomical_unit>
329
332
 
330
- _INF_NAN_NINF = INF, NAN, NINF
333
+ _INF_NAN_NINF = {INF, NAN, NINF, _inf, _nan}
331
334
  _pos_self = _1_0.__pos__() is _1_0 # PYCHOK in .fsums, .vector3dBase
332
335
 
333
336
 
@@ -562,7 +565,7 @@ if __name__ == _DMAIN_:
562
565
 
563
566
  # **) MIT License
564
567
  #
565
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
568
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
566
569
  #
567
570
  # Permission is hereby granted, free of charge, to any person obtaining a
568
571
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/css.py CHANGED
@@ -645,7 +645,7 @@ def toCss(latlon, cs0=None, height=None, Css=Css, **name):
645
645
 
646
646
  # **) MIT License
647
647
  #
648
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
648
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
649
649
  #
650
650
  # Permission is hereby granted, free of charge, to any person obtaining a
651
651
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/datums.py CHANGED
@@ -733,7 +733,7 @@ if __name__ == _DMAIN_:
733
733
 
734
734
  # **) MIT License
735
735
  #
736
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
736
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
737
737
  #
738
738
  # Permission is hereby granted, free of charge, to any person obtaining a
739
739
  # copy of this software and associated documentation files (the "Software"),
@@ -40,7 +40,7 @@ else: # lazily import modules and exported attrs
40
40
 
41
41
  # **) MIT License
42
42
  #
43
- # Copyright (C) 2018-2025 -- mrJean1 at Gmail -- All Rights Reserved.
43
+ # Copyright (C) 2018-2026 -- mrJean1 at Gmail -- All Rights Reserved.
44
44
  #
45
45
  # Permission is hereby granted, free of charge, to any person obtaining a
46
46
  # copy of this software and associated documentation files (the "Software"),
@@ -19,7 +19,7 @@ class LatLonHeightBase(_LatLonBase): # PYCHOK no cover
19
19
 
20
20
  # **) MIT License
21
21
  #
22
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
22
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
23
23
  #
24
24
  # Permission is hereby granted, free of charge, to any person obtaining a
25
25
  # copy of this software and associated documentation files (the "Software"),
@@ -18,12 +18,12 @@ from pygeodesy.namedTuples import Forward4Tuple as _Forward4Tuple, \
18
18
  UtmUps5Tuple as _UtmUps5Tuple, _NamedTuple
19
19
  from pygeodesy.props import deprecated_class, deprecated_method
20
20
  from pygeodesy.resections import TriAngle5Tuple as _TriAngle5Tuple
21
- from pygeodesy.triaxials import ConformalSphere, ConformalTriaxial, Conformal2Tuple
21
+ from pygeodesy.triaxials import Conformal, ConformalSphere, Conformal2Tuple
22
22
  from pygeodesy.trf import TRFXform7Tuple as _TRFXform7Tuple
23
23
  from pygeodesy.units import Bearing, Int, Lamd, Lat, Lon, Meter, Phid
24
24
 
25
25
  __all__ = _ALL_DEPRECATED.deprecated_classes
26
- __version__ = '25.10.25'
26
+ __version__ = '25.11.11'
27
27
 
28
28
 
29
29
  class _Deprecated_NamedTuple(_NamedTuple):
@@ -47,6 +47,13 @@ class ClipCS3Tuple(_Deprecated_NamedTuple): # PYCHOK no cover
47
47
  _Units_ = _ClipCS4Tuple._Units_[:3]
48
48
 
49
49
 
50
+ class ConformalTriaxial(Conformal):
51
+ '''DEPRECATED on 2025.11.11, use class L{Conformal}.'''
52
+ def __init__(self, *args, **kwds): # PYCHOK no cover
53
+ deprecated_class(self.__class__)
54
+ Conformal.__init__(self, *args, **kwds)
55
+
56
+
50
57
  class EasNorExact4Tuple(_Deprecated_NamedTuple):
51
58
  '''DEPRECATED, use class L{Forward4Tuple}, item C{gamma} for C{convergence}.'''
52
59
  _Names_ = _reNames(_Forward4Tuple._Names_, _gamma_, _convergence_)
@@ -236,11 +243,11 @@ def HeightIDWcosineForsytheAndoyerLambert(knots, **kwds): # PYCHOK no cover
236
243
  return HeightIDWcosineForsytheAndoyerLambert(knots, **kwds)
237
244
 
238
245
 
239
- class JacobiConformal(ConformalTriaxial):
240
- '''DEPRECATED on 2025.10.25, use class L{ConformalTriaxial}.'''
246
+ class JacobiConformal(Conformal):
247
+ '''DEPRECATED on 2025.10.25, use class L{Conformal}.'''
241
248
  def __init__(self, *args, **kwds): # PYCHOK no cover
242
249
  deprecated_class(self.__class__)
243
- ConformalTriaxial.__init__(self, *args, **kwds)
250
+ Conformal.__init__(self, *args, **kwds)
244
251
 
245
252
 
246
253
  class JacobiConformalSpherical(ConformalSphere):
@@ -251,7 +258,7 @@ class JacobiConformalSpherical(ConformalSphere):
251
258
 
252
259
 
253
260
  class Jacobi2Tuple(Conformal2Tuple):
254
- '''DEPRECATED on 25.10.25, use class L{Conformal2Tuple}.
261
+ '''DEPRECATED on 25.11.11, use class L{Conformal2Tuple}.
255
262
  '''
256
263
  def __new__(cls, *args, **kwds):
257
264
  deprecated_class(cls)
@@ -382,7 +389,7 @@ __all__ += _ALL_DOCS(_Deprecated_NamedTuple)
382
389
 
383
390
  # **) MIT License
384
391
  #
385
- # Copyright (C) 2018-2025 -- mrJean1 at Gmail -- All Rights Reserved.
392
+ # Copyright (C) 2018-2026 -- mrJean1 at Gmail -- All Rights Reserved.
386
393
  #
387
394
  # Permission is hereby granted, free of charge, to any person obtaining a
388
395
  # copy of this software and associated documentation files (the "Software"),
@@ -33,7 +33,7 @@ OK = _Deprecated_Str(OK='OK')
33
33
 
34
34
  # **) MIT License
35
35
  #
36
- # Copyright (C) 2018-2025 -- mrJean1 at Gmail -- All Rights Reserved.
36
+ # Copyright (C) 2018-2026 -- mrJean1 at Gmail -- All Rights Reserved.
37
37
  #
38
38
  # Permission is hereby granted, free of charge, to any person obtaining a
39
39
  # copy of this software and associated documentation files (the "Software"),
@@ -19,7 +19,7 @@ assert _ALL_OTHER(Curvature2Tuple, Datum, Ellipsoid, Transform) + tuple(_.name
19
19
 
20
20
  # **) MIT License
21
21
  #
22
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
22
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
23
23
  #
24
24
  # Permission is hereby granted, free of charge, to any person obtaining a
25
25
  # copy of this software and associated documentation files (the "Software"),
@@ -401,7 +401,7 @@ def utmZoneBand2(lat, lon): # PYCHOK no cover
401
401
 
402
402
  # **) MIT License
403
403
  #
404
- # Copyright (C) 2018-2025 -- mrJean1 at Gmail -- All Rights Reserved.
404
+ # Copyright (C) 2018-2026 -- mrJean1 at Gmail -- All Rights Reserved.
405
405
  #
406
406
  # Permission is hereby granted, free of charge, to any person obtaining a
407
407
  # copy of this software and associated documentation files (the "Software"),
@@ -27,7 +27,7 @@ assert (_ALL_OTHER(LatLonNvectorBase, Nvector, sumOf) +
27
27
 
28
28
  # **) MIT License
29
29
  #
30
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
30
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
31
31
  #
32
32
  # Permission is hereby granted, free of charge, to any person obtaining a
33
33
  # copy of this software and associated documentation files (the "Software"),
@@ -11,7 +11,7 @@ __version__ = '25.05.12'
11
11
 
12
12
  # **) MIT License
13
13
  #
14
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
14
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
15
15
  #
16
16
  # Permission is hereby granted, free of charge, to any person obtaining a
17
17
  # copy of this software and associated documentation files (the "Software"),
@@ -12,7 +12,7 @@ __version__ = '25.05.12'
12
12
 
13
13
  # **) MIT License
14
14
  #
15
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
15
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
16
16
  #
17
17
  # Permission is hereby granted, free of charge, to any person obtaining a
18
18
  # copy of this software and associated documentation files (the "Software"),
@@ -12,7 +12,7 @@ __version__ = '25.05.12'
12
12
 
13
13
  # **) MIT License
14
14
  #
15
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
15
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
16
16
  #
17
17
  # Permission is hereby granted, free of charge, to any person obtaining a
18
18
  # copy of this software and associated documentation files (the "Software"),
@@ -12,7 +12,7 @@ __version__ = '25.05.12'
12
12
 
13
13
  # **) MIT License
14
14
  #
15
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
15
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
16
16
  #
17
17
  # Permission is hereby granted, free of charge, to any person obtaining a
18
18
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/dms.py CHANGED
@@ -941,7 +941,7 @@ def toDMS(deg, form=_F_DMS, prec=2, sep=S_SEP, ddd=2, neg=_MINUS_, pos=_PLUS_, *
941
941
 
942
942
  # **) MIT License
943
943
  #
944
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
944
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
945
945
  #
946
946
  # Permission is hereby granted, free of charge, to any person obtaining a
947
947
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/ecef.py CHANGED
@@ -1369,7 +1369,7 @@ __all__ += _ALL_DOCS(_EcefBase)
1369
1369
 
1370
1370
  # **) MIT License
1371
1371
  #
1372
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1372
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
1373
1373
  #
1374
1374
  # Permission is hereby granted, free of charge, to any person obtaining a
1375
1375
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/ecefLocals.py CHANGED
@@ -165,7 +165,7 @@ __all__ += _ALL_DOCS(_EcefLocal)
165
165
 
166
166
  # **) MIT License
167
167
  #
168
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
168
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
169
169
  #
170
170
  # Permission is hereby granted, free of charge, to any person obtaining a
171
171
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/elevations.py CHANGED
@@ -255,7 +255,7 @@ if __name__ == _DMAIN_:
255
255
 
256
256
  # **) MIT License
257
257
  #
258
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
258
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
259
259
  #
260
260
  # Permission is hereby granted, free of charge, to any person obtaining a
261
261
  # copy of this software and associated documentation files (the "Software"),