pygeodesy 25.10.10__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 (126) 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 +8 -33
  19. pygeodesy/cartesianBase.py +7 -7
  20. pygeodesy/clipy.py +17 -23
  21. pygeodesy/constants.py +86 -63
  22. pygeodesy/css.py +1 -1
  23. pygeodesy/datums.py +1 -1
  24. pygeodesy/deprecated/__init__.py +2 -2
  25. pygeodesy/deprecated/bases.py +1 -1
  26. pygeodesy/deprecated/classes.py +32 -2
  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 +3 -3
  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 +25 -13
  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/triaxial5.py +1220 -0
  109. pygeodesy/units.py +6 -1
  110. pygeodesy/unitsBase.py +1 -1
  111. pygeodesy/ups.py +2 -3
  112. pygeodesy/utily.py +19 -15
  113. pygeodesy/utm.py +1 -1
  114. pygeodesy/utmups.py +1 -1
  115. pygeodesy/utmupsBase.py +1 -1
  116. pygeodesy/vector2d.py +2 -2
  117. pygeodesy/vector3d.py +1 -1
  118. pygeodesy/vector3dBase.py +195 -51
  119. pygeodesy/webmercator.py +1 -1
  120. pygeodesy/wgrs.py +1 -1
  121. {pygeodesy-25.10.10.dist-info → pygeodesy-25.12.12.dist-info}/METADATA +13 -13
  122. pygeodesy-25.12.12.dist-info/RECORD +125 -0
  123. pygeodesy/triaxials.py +0 -1566
  124. pygeodesy-25.10.10.dist-info/RECORD +0 -119
  125. {pygeodesy-25.10.10.dist-info → pygeodesy-25.12.12.dist-info}/WHEEL +0 -0
  126. {pygeodesy-25.10.10.dist-info → pygeodesy-25.12.12.dist-info}/top_level.txt +0 -0
pygeodesy/constants.py CHANGED
@@ -11,10 +11,10 @@ L{pygeodesy.isnon0} and L{pygeodesy.remainder}.
11
11
  from __future__ import division as _; del _ # noqa: E702 ;
12
12
 
13
13
  from pygeodesy.basics import _copysign, isbool, iscomplex, isint, signBit
14
- from pygeodesy.errors import _xError, _xError2, _xkwds_get1, _xkwds_item2
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.09.11'
29
+ __version__ = '25.12.06'
30
30
 
31
31
 
32
32
  def _copysign_0_0(y):
@@ -47,7 +47,7 @@ def _copysignINF(y):
47
47
  return NINF if signBit(y) else INF
48
48
 
49
49
 
50
- def _flipsign(x, y):
50
+ def _flipsign(x, y=-1):
51
51
  '''(INTERNAL) Negate C{x} for negative C{y}.
52
52
  '''
53
53
  return (-x) if signBit(y) else x
@@ -60,65 +60,78 @@ def _Float(**name_arg):
60
60
  return Float(_float(arg), name=n)
61
61
 
62
62
 
63
- def _Radius(**name_arg):
64
- '''(INTERNAL) New named, cached C{Radius}.
63
+ def _float(x): # in .datums, .ellipsoids, ...
64
+ '''(INTERNAL) Cache initial C{float}s.
65
65
  '''
66
- n, arg = _xkwds_item2(name_arg)
67
- return Radius(_float(arg), name=n)
66
+ f = float(x)
67
+ return _floats.setdefault(f, f) # PYCHOK del _floats
68
68
 
69
69
 
70
- def float_(*fs, **sets): # sets=False
71
- '''Get scalars as C{float} or I{intern}'ed C{float}.
70
+ def float_(x, sets=False):
71
+ '''Get scalar as C{float} or I{intern}'ed C{float}.
72
72
 
73
- @arg fs: One more values (C{scalar}), all positional.
74
- @kwarg sets: Use C{B{sets}=True} to C{intern} each
75
- B{C{fs}}, otherwise don't C{intern}.
73
+ @arg x: The scalar (C{scalar}).
74
+ @kwarg sets: Use C{True} to C{intern} the B{C{f}},
75
+ otherwise don't (C{bool}).
76
76
 
77
- @return: A single C{float} if only one B{C{fs}} is
78
- given, otherwise a tuple of C{float}s.
77
+ @return: A C{float}.
79
78
 
80
- @raise TypeError: Some B{C{fs}} is not C{scalar}.
79
+ @raise ValueError: Invalid B{C{x}}.
81
80
  '''
82
- fl = []
83
- _a = fl.append
84
- _f = _floats.setdefault if _xkwds_get1(sets, sets=False) else \
85
- _floats.get
86
81
  try:
87
- for i, f in enumerate(fs):
88
- f = float(f)
89
- _a(_f(f, f))
90
- except Exception as x:
91
- E, t = _xError2(x)
92
- fs_i = Fmt.SQUARE(fs=i)
93
- raise E(fs_i, f, txt=t)
94
- return fl[0] if len(fl) == 1 else tuple(fl)
95
-
96
-
97
- def _float(f): # in .datums, .ellipsoids, ...
98
- '''(INTERNAL) Cache initial C{float}s.
99
- '''
100
- f = float(f)
101
- return _floats.setdefault(f, f) # PYCHOK del _floats
82
+ f = float(x)
83
+ if f:
84
+ _f = _floats.setdefault if sets else _floats.get
85
+ f = _f(f, f)
86
+ else:
87
+ f = _N_0_0 if signBit(f) else _0_0
88
+ except Exception as X:
89
+ raise _ValueError(x=x, cause=X)
90
+ return f
102
91
 
103
92
 
104
93
  def float0_(*xs):
105
94
  '''Yield C{B{x}s} as a non-NEG0 C{float}.
106
95
  '''
107
96
  for x in xs:
108
- yield float(x) if x else _0_0
97
+ yield float(x) or _0_0 # if x else _0_0
109
98
 
110
99
 
111
- def _float0(f): # in .auxilats.auxily, .resections, .vector3dBase, ...
100
+ def _float0(x): # in .auxilats.auxily, .resections, .vector3dBase, ...
112
101
  '''(INTERNAL) Return C{float(B{f})} or C{INT0}.
113
102
  '''
114
- if f:
115
- f = float(f)
103
+ if x:
104
+ f = float(x)
116
105
  f = _floats.get(f, f)
117
- elif f is not INT0:
118
- f = float(f) or _0_0 # force None, NN error
106
+ elif x is INT0:
107
+ f = x
108
+ else:
109
+ f = float(x) or _0_0 # force None, NN error
119
110
  return f
120
111
 
121
112
 
113
+ def floats_(*xs, **sets): # sets=False
114
+ '''Yield each scalar as C{float} or I{intern}'ed C{float}.
115
+
116
+ @arg xs: One more values (C{scalar}), all positional.
117
+ @kwarg sets: Use C{B{sets}=True} to C{intern} each
118
+ B{C{fs}}, otherwise don't C{intern}.
119
+
120
+ @raise ValueError: Some B{C{xs}} is not C{scalar}.
121
+ '''
122
+ if sets:
123
+ sets = _xkwds_get1(sets, sets=False)
124
+ _f = _floats.setdefault if sets else _floats.get
125
+ try:
126
+ for i, x in enumerate(xs):
127
+ f = float(x)
128
+ yield _f(f, f) if f else \
129
+ (_N_0_0 if signBit(f) else _0_0) # preserve NEG0
130
+ except Exception as X:
131
+ xs_i = Fmt.SQUARE(xs=i)
132
+ raise _ValueError(xs_i, x, cause=X)
133
+
134
+
122
135
  def _floatuple(*fs):
123
136
  '''(INTERNAL) Cache a tuple of C{float}s.
124
137
  '''
@@ -172,6 +185,13 @@ def _1_over(x):
172
185
  return NINF if isneg0(x) else INF
173
186
 
174
187
 
188
+ def _Radius(**name_arg):
189
+ '''(INTERNAL) New named, cached C{Radius}.
190
+ '''
191
+ n, arg = _xkwds_item2(name_arg)
192
+ return Radius(_float(arg), name=n)
193
+
194
+
175
195
  _floats = {} # PYCHOK floats cache, in .__main__
176
196
  # _float = float # PYCHOK expected
177
197
  # del _floats # XXX zap floats cache never
@@ -246,27 +266,30 @@ except ImportError: # PYCHOK no cover
246
266
  MIN_EXP = Int(MIN_EXP =_log2(MIN)) # -307 base 10
247
267
  # RADIX = Int(Radix =2) # base
248
268
 
249
- EPS0 = _Float( EPS0 = EPS**2) # PYCHOK near-/non-zero comparison 4.930381e-32, or EPS or EPS_2
250
- EPS02 = _Float( EPS02 = EPS**4) # PYCHOK near-zero-squared comparison 2.430865e-63
251
- EPS_2 = _Float( EPS_2 = EPS / _2_0) # PYCHOK ≈ 1.110223024625e-16
252
- EPS1 = _Float( EPS1 =_1_0 - EPS) # PYCHOK ≈ 0.9999999999999998
253
- EPS2 = _Float( EPS2 = EPS * _2_0) # PYCHOK ≈ 4.440892098501e-16
254
- EPS4 = _Float( EPS4 = EPS * _4_0) # PYCHOK ≈ 8.881784197001e-16
255
- # _1EPS = _Float(_1EPS =_1_0 + EPS) # PYCHOK ≈ 1.0000000000000002
256
- _1_EPS = _Float(_1_EPS =_1_0 / EPS) # PYCHOK = 4503599627370496.0
257
- # _2_EPS = _Float(_2_EPS =_2_0 / EPS) # PYCHOK = 9007199254740992.0
258
- _EPS2e4 = _Float(_EPS2e4= EPS2 * 1.e4) # PYCHOK 4.440892098501e-12
259
- _EPS4e8 = _Float(_EPS4e8= EPS4 * 1.e8) # PYCHOK ≈ 8.881784197001e-08
260
- _EPSjam = _Float(_EPSjam= pow(EPS, _0_75)) # PYCHOK = 1.818989403546e-12
261
- _EPSmin = _Float(_EPSmin= sqrt(MIN)) # PYCHOK = 1.49166814624e-154
262
- _EPSqrt = _Float(_EPSqrt= sqrt(EPS)) # PYCHOK = 1.49011611938e5-08
263
- _EPStol = _Float(_EPStol=_EPSqrt * _0_1) # PYCHOK = 1.49011611938e5-09 == sqrt(EPS * _0_01)
264
-
265
- _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
266
287
  # <https://Numbers.Computation.Free.FR/Constants/Miscellaneous/digits.html>
267
- # _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
268
- _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
269
- _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
270
293
  # sqrt(2) <https://WikiPedia.org/wiki/Square_root_of_2>
271
294
  # 1.414213562373095_048_801_688_724_209_698_078_569_671_875_376_948_073_176_679_737_99
272
295
  # _1SQRT2= _Float(_1SQRT2 =sqrt(_2_0) + 1)
@@ -307,7 +330,7 @@ R_QM = _Radius(R_QM=6372797.560856) # PYCHOK earth' quadratic mean radius (C{
307
330
  R_VM = _Radius(R_VM=6366707.0194937) # PYCHOK aViation/naVigation earth radius (C{meter})
308
331
  # R_AU= Meter( R_AU=149597870700.0) # PYCHOK <https://WikiPedia.org/wiki/Astronomical_unit>
309
332
 
310
- _INF_NAN_NINF = INF, NAN, NINF
333
+ _INF_NAN_NINF = {INF, NAN, NINF, _inf, _nan}
311
334
  _pos_self = _1_0.__pos__() is _1_0 # PYCHOK in .fsums, .vector3dBase
312
335
 
313
336
 
@@ -542,7 +565,7 @@ if __name__ == _DMAIN_:
542
565
 
543
566
  # **) MIT License
544
567
  #
545
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
568
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
546
569
  #
547
570
  # Permission is hereby granted, free of charge, to any person obtaining a
548
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"),
@@ -27,7 +27,7 @@ __all__ = (_ALL_DEPRECATED.deprecated_bases +
27
27
  _ALL_DEPRECATED.deprecated_classes +
28
28
  _ALL_DEPRECATED.deprecated_consterns +
29
29
  _ALL_DEPRECATED.deprecated_functions)
30
- __version__ = '25.05.12'
30
+ __version__ = '25.10.25'
31
31
 
32
32
  if _unLazy0:
33
33
  from pygeodesy.deprecated import bases, datum, nvector, rhumbBase, \
@@ -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,11 +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 Conformal, ConformalSphere, Conformal2Tuple
21
22
  from pygeodesy.trf import TRFXform7Tuple as _TRFXform7Tuple
22
23
  from pygeodesy.units import Bearing, Int, Lamd, Lat, Lon, Meter, Phid
23
24
 
24
25
  __all__ = _ALL_DEPRECATED.deprecated_classes
25
- __version__ = '25.04.11'
26
+ __version__ = '25.11.11'
26
27
 
27
28
 
28
29
  class _Deprecated_NamedTuple(_NamedTuple):
@@ -46,6 +47,13 @@ class ClipCS3Tuple(_Deprecated_NamedTuple): # PYCHOK no cover
46
47
  _Units_ = _ClipCS4Tuple._Units_[:3]
47
48
 
48
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
+
49
57
  class EasNorExact4Tuple(_Deprecated_NamedTuple):
50
58
  '''DEPRECATED, use class L{Forward4Tuple}, item C{gamma} for C{convergence}.'''
51
59
  _Names_ = _reNames(_Forward4Tuple._Names_, _gamma_, _convergence_)
@@ -235,6 +243,28 @@ def HeightIDWcosineForsytheAndoyerLambert(knots, **kwds): # PYCHOK no cover
235
243
  return HeightIDWcosineForsytheAndoyerLambert(knots, **kwds)
236
244
 
237
245
 
246
+ class JacobiConformal(Conformal):
247
+ '''DEPRECATED on 2025.10.25, use class L{Conformal}.'''
248
+ def __init__(self, *args, **kwds): # PYCHOK no cover
249
+ deprecated_class(self.__class__)
250
+ Conformal.__init__(self, *args, **kwds)
251
+
252
+
253
+ class JacobiConformalSpherical(ConformalSphere):
254
+ '''DEPRECATED on 2025.10.25, use class L{ConformalSphere}.'''
255
+ def __init__(self, *args, **kwds): # PYCHOK no cover
256
+ deprecated_class(self.__class__)
257
+ ConformalSphere.__init__(self, *args, **kwds)
258
+
259
+
260
+ class Jacobi2Tuple(Conformal2Tuple):
261
+ '''DEPRECATED on 25.11.11, use class L{Conformal2Tuple}.
262
+ '''
263
+ def __new__(cls, *args, **kwds):
264
+ deprecated_class(cls)
265
+ return Conformal2Tuple.__new__(cls, *args, **kwds)
266
+
267
+
238
268
  class Lam_(Lamd):
239
269
  '''DEPRECATED on 2024.06.15, use class L{Lamd}.'''
240
270
  def __init__(self, *args, **kwds): # PYCHOK no cover
@@ -359,7 +389,7 @@ __all__ += _ALL_DOCS(_Deprecated_NamedTuple)
359
389
 
360
390
  # **) MIT License
361
391
  #
362
- # Copyright (C) 2018-2025 -- mrJean1 at Gmail -- All Rights Reserved.
392
+ # Copyright (C) 2018-2026 -- mrJean1 at Gmail -- All Rights Reserved.
363
393
  #
364
394
  # Permission is hereby granted, free of charge, to any person obtaining a
365
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"),
@@ -1153,7 +1153,7 @@ __all__ += _ALL_DOCS(CartesianEllipsoidalBase, LatLonEllipsoidalBase)
1153
1153
 
1154
1154
  # **) MIT License
1155
1155
  #
1156
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1156
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
1157
1157
  #
1158
1158
  # Permission is hereby granted, free of charge, to any person obtaining a
1159
1159
  # copy of this software and associated documentation files (the "Software"),
@@ -888,7 +888,7 @@ del _1_0, _0_01
888
888
 
889
889
  # **) MIT License
890
890
  #
891
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
891
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
892
892
  #
893
893
  # Permission is hereby granted, free of charge, to any person obtaining a
894
894
  # copy of this software and associated documentation files (the "Software"),
@@ -315,7 +315,7 @@ __all__ += _ALL_OTHER(Cartesian, LatLon, # classes
315
315
 
316
316
  # **) MIT License
317
317
  #
318
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
318
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
319
319
  #
320
320
  # Permission is hereby granted, free of charge, to any person obtaining a
321
321
  # copy of this software and associated documentation files (the "Software"),
@@ -314,7 +314,7 @@ __all__ += _ALL_OTHER(Cartesian, LatLon, # classes
314
314
 
315
315
  # **) MIT License
316
316
  #
317
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
317
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
318
318
  #
319
319
  # Permission is hereby granted, free of charge, to any person obtaining a
320
320
  # copy of this software and associated documentation files (the "Software"),
@@ -354,7 +354,7 @@ __all__ += _ALL_OTHER(Cartesian, LatLon, # classes
354
354
 
355
355
  # **) MIT License
356
356
  #
357
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
357
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
358
358
  #
359
359
  # Permission is hereby granted, free of charge, to any person obtaining a
360
360
  # copy of this software and associated documentation files (the "Software"),
@@ -660,7 +660,7 @@ __all__ += _ALL_OTHER(Cartesian, LatLon, Ned, Nvector, # classes
660
660
 
661
661
  # **) MIT License
662
662
  #
663
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
663
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
664
664
  #
665
665
  # Permission is hereby granted, free of charge, to any person obtaining a
666
666
  # copy of this software and associated documentation files (the "Software"),
@@ -573,7 +573,7 @@ __all__ += _ALL_DOCS(Cartesian, LatLon, intersecant2, # from .ellipsoidalBaseDI
573
573
 
574
574
  # **) MIT License
575
575
  #
576
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
576
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
577
577
  #
578
578
  # Permission is hereby granted, free of charge, to any person obtaining a
579
579
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/ellipsoids.py CHANGED
@@ -88,7 +88,7 @@ from pygeodesy.namedTuples import Distance2Tuple, Vector3Tuple, Vector4Tuple
88
88
  from pygeodesy.props import deprecated_Property_RO, Property_RO, property_doc_, \
89
89
  deprecated_property_RO, property_RO, property_ROver
90
90
  from pygeodesy.streprs import Fmt, fstr, instr, strs, unstr
91
- # from pygeodesy.triaxials import _hartzell3 # _MODS
91
+ # from pygeodesy.triaxials.triaxial5 import _hartzell3, _plumbTo3 # _MODS
92
92
  from pygeodesy.units import Azimuth, Bearing, Distance, Float, Float_, Height, Lamd, Lat, \
93
93
  Meter, Meter2, Meter3, Phi, Phid, Radius, Radius_, Scalar
94
94
  from pygeodesy.utily import atan1, atan1d, atan2b, degrees90, m2radians, radians2m, sincos2d
@@ -96,11 +96,12 @@ from pygeodesy.utily import atan1, atan1d, atan2b, degrees90, m2radians, radians
96
96
  from math import asinh, atan, atanh, cos, degrees, exp, fabs, radians, sin, sinh, sqrt, tan # as _tan
97
97
 
98
98
  __all__ = _ALL_LAZY.ellipsoids
99
- __version__ = '25.08.31'
99
+ __version__ = '25.11.26'
100
100
 
101
101
  _f_0_0 = Float(f =_0_0) # zero flattening
102
102
  _f__0_0 = Float(f_=_0_0) # zero inverse flattening
103
103
  # see U{WGS84_f<https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1Constants.html>}
104
+ # _f_WGS84 = Float(f =_1_0 / (298257223563 / 1000000000)) # 0.003_352_810_664_747_480_5
104
105
  _f__WGS84 = Float(f_=_1_0 / (1000000000 / 298257223563)) # 298.257223562_999_97 vs 298.257223563
105
106
 
106
107
 
@@ -1133,7 +1134,7 @@ class Ellipsoid(_NamedEnumItem):
1133
1134
  methods L{Ellipsoid.height4} and L{Triaxial.hartzell4}.
1134
1135
  '''
1135
1136
  try:
1136
- v, d, i = _MODS.triaxials._hartzell3(pov, los, self._triaxial)
1137
+ v, d, i = _MODS.triaxials.triaxial5._hartzell3(pov, los, self._triaxial)
1137
1138
  except Exception as x:
1138
1139
  raise IntersectionError(pov=pov, los=los, cause=x)
1139
1140
  return Vector4Tuple(v.x, v.y, v.z, d, iteration=i, name__=self.hartzell4)
@@ -1187,7 +1188,7 @@ class Ellipsoid(_NamedEnumItem):
1187
1188
  v = v.times_(t, t, 0) # force z=0.0
1188
1189
  h = x - a # equatorial
1189
1190
  else: # normal in 1st quadrant
1190
- x, y, i = _MODS.triaxials._plumbTo3(x, y, self)
1191
+ x, y, i = _MODS.triaxials.triaxial5._plumbTo3(x, y, self)
1191
1192
  t, v = v, v.times_(x, x, y)
1192
1193
  h = t.minus(v).length
1193
1194
 
@@ -2411,7 +2412,7 @@ Ellipsoids._assert( # <https://WikiPedia.org/wiki/Earth_ellipsoid>
2411
2412
  WGS60 = _lazy('WGS60', *_T(6378165.0, 6356783.28695944, 298.3)),
2412
2413
  WGS66 = _lazy('WGS66', *_T(6378145.0, 6356759.76948868, 298.25)),
2413
2414
  WGS72 = _lazy(_WGS72_, *_T(6378135.0, _0_0, 298.26)), # b=6356750.52
2414
- WGS84 = _lazy(_WGS84_, *_T(R_MA, _0_0, _f__WGS84)), # GPS b=6356752.3142451793
2415
+ WGS84 = _lazy(_WGS84_, *_T(R_MA, _0_0, _f__WGS84)), # b=6356752.3142451793
2415
2416
  # U{NOAA/NOS/NGS/inverse<https://GitHub.com/noaa-ngs/inverse/blob/main/invers3d.f>}
2416
2417
  WGS84_NGS = _lazy('WGS84_NGS', *_T(R_MA, _0_0, 298.257222100882711243162836600094))
2417
2418
  )
@@ -2475,7 +2476,7 @@ if __name__ == _DMAIN_:
2475
2476
 
2476
2477
  # **) MIT License
2477
2478
  #
2478
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
2479
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
2479
2480
  #
2480
2481
  # Permission is hereby granted, free of charge, to any person obtaining a
2481
2482
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/elliptic.py CHANGED
@@ -1269,7 +1269,7 @@ class _RJfma(object):
1269
1269
 
1270
1270
  # **) MIT License
1271
1271
  #
1272
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1272
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
1273
1273
  #
1274
1274
  # Permission is hereby granted, free of charge, to any person obtaining a
1275
1275
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/epsg.py CHANGED
@@ -223,7 +223,7 @@ __all__ += _ALL_DOCS(decode2, encode)
223
223
 
224
224
  # **) MIT License
225
225
  #
226
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
226
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
227
227
  #
228
228
  # Permission is hereby granted, free of charge, to any person obtaining a
229
229
  # copy of this software and associated documentation files (the "Software"),