pygeodesy 24.11.11__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.11.11.dist-info → PyGeodesy-24.12.12.dist-info}/METADATA +4 -4
  2. PyGeodesy-24.12.12.dist-info/RECORD +118 -0
  3. {PyGeodesy-24.11.11.dist-info → PyGeodesy-24.12.12.dist-info}/WHEEL +1 -1
  4. pygeodesy/__init__.py +4 -4
  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 +5 -5
  19. pygeodesy/basics.py +1 -1
  20. pygeodesy/booleans.py +1 -1
  21. pygeodesy/cartesianBase.py +22 -61
  22. pygeodesy/clipy.py +1 -1
  23. pygeodesy/constants.py +3 -3
  24. pygeodesy/css.py +1 -1
  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 +1 -1
  29. pygeodesy/deprecated/consterns.py +1 -1
  30. pygeodesy/deprecated/datum.py +1 -1
  31. pygeodesy/deprecated/functions.py +18 -8
  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 +53 -56
  39. pygeodesy/elevations.py +1 -1
  40. pygeodesy/ellipsoidalBase.py +3 -3
  41. pygeodesy/ellipsoidalBaseDI.py +1 -1
  42. pygeodesy/ellipsoidalExact.py +1 -1
  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 +4 -5
  48. pygeodesy/elliptic.py +6 -6
  49. pygeodesy/epsg.py +1 -1
  50. pygeodesy/errors.py +1 -1
  51. pygeodesy/etm.py +5 -5
  52. pygeodesy/fmath.py +17 -16
  53. pygeodesy/formy.py +71 -104
  54. pygeodesy/frechet.py +1 -1
  55. pygeodesy/fstats.py +1 -1
  56. pygeodesy/fsums.py +32 -33
  57. pygeodesy/gars.py +1 -1
  58. pygeodesy/geodesici.py +4 -4
  59. pygeodesy/geodesicw.py +1 -1
  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 +1 -1
  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 +1 -1
  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 +2 -3
  76. pygeodesy/iters.py +1 -1
  77. pygeodesy/karney.py +3 -3
  78. pygeodesy/ktm.py +16 -15
  79. pygeodesy/latlonBase.py +291 -341
  80. pygeodesy/lazily.py +11 -11
  81. pygeodesy/lcc.py +1 -1
  82. pygeodesy/ltp.py +46 -50
  83. pygeodesy/ltpTuples.py +145 -128
  84. pygeodesy/mgrs.py +1 -1
  85. pygeodesy/named.py +149 -3
  86. pygeodesy/namedTuples.py +58 -7
  87. pygeodesy/nvectorBase.py +122 -105
  88. pygeodesy/osgr.py +1 -1
  89. pygeodesy/points.py +1 -1
  90. pygeodesy/props.py +1 -1
  91. pygeodesy/resections.py +18 -17
  92. pygeodesy/rhumb/__init__.py +1 -1
  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 +1 -1
  97. pygeodesy/simplify.py +289 -401
  98. pygeodesy/solveBase.py +1 -1
  99. pygeodesy/sphericalBase.py +1 -1
  100. pygeodesy/sphericalNvector.py +5 -5
  101. pygeodesy/sphericalTrigonometry.py +7 -6
  102. pygeodesy/streprs.py +10 -5
  103. pygeodesy/trf.py +1 -1
  104. pygeodesy/triaxials.py +23 -16
  105. pygeodesy/units.py +16 -16
  106. pygeodesy/unitsBase.py +1 -1
  107. pygeodesy/ups.py +4 -4
  108. pygeodesy/utily.py +202 -145
  109. pygeodesy/utm.py +5 -5
  110. pygeodesy/utmups.py +1 -1
  111. pygeodesy/utmupsBase.py +1 -1
  112. pygeodesy/vector2d.py +5 -5
  113. pygeodesy/vector3d.py +14 -3
  114. pygeodesy/vector3dBase.py +5 -5
  115. pygeodesy/webmercator.py +1 -1
  116. pygeodesy/wgrs.py +1 -1
  117. PyGeodesy-24.11.11.dist-info/RECORD +0 -118
  118. {PyGeodesy-24.11.11.dist-info → PyGeodesy-24.12.12.dist-info}/top_level.txt +0 -0
pygeodesy/fsums.py CHANGED
@@ -64,7 +64,7 @@ from math import fabs, isinf, isnan, \
64
64
  ceil as _ceil, floor as _floor # PYCHOK used! .ltp
65
65
 
66
66
  __all__ = _ALL_LAZY.fsums
67
- __version__ = '24.11.11'
67
+ __version__ = '24.12.02'
68
68
 
69
69
  from pygeodesy.interns import (
70
70
  _PLUS_ as _add_op_, # in .auxilats.auxAngle
@@ -100,7 +100,7 @@ def _2finite(x, _isfine=_isfinite): # in .fstats
100
100
 
101
101
 
102
102
  def _2float(index=None, _isfine=_isfinite, **name_x): # in .fmath, .fstats
103
- '''(INTERNAL) Raise C{TypeError} or C{Overflow-/ValueError} if not finite.
103
+ '''(INTERNAL) Raise C{TypeError} or C{Overflow-/ValueError} if C{x} not finite.
104
104
  '''
105
105
  n, x = name_x.popitem() # _xkwds_item2(name_x)
106
106
  try:
@@ -233,7 +233,7 @@ def f2product(two=None):
233
233
  return t
234
234
 
235
235
 
236
- def _Fsumf_(*xs): # in .auxLat, .ltp, ...
236
+ def _Fsumf_(*xs): # in .auxLat, ...
237
237
  '''(INTERNAL) An C{Fsum(xs)}, all C{scalar}, an L{Fsum} or L{Fsum2Tuple}.
238
238
  '''
239
239
  return Fsum()._facc_scalarf(xs, up=False)
@@ -401,7 +401,7 @@ def _residue(other):
401
401
  return r
402
402
 
403
403
 
404
- def _s_r(s, r):
404
+ def _s_r2(s, r):
405
405
  '''(INTERNAL) Return C{(s, r)}, I{ordered}.
406
406
  '''
407
407
  if _isfinite(s):
@@ -415,24 +415,6 @@ def _s_r(s, r):
415
415
  return s, r
416
416
 
417
417
 
418
- def _2s_r(other):
419
- '''(INTERNAL) Return 2-tuple C{(other, r)} with C{other} as C{int},
420
- C{float} or C{as-is} and C{r} the residual of C{as-is} or 0.
421
- '''
422
- if _isFsum_2Tuple(other):
423
- s, r = other._fint2
424
- if r:
425
- s, r = other._nfprs2
426
- if r: # PYCHOK no cover
427
- s = other # L{Fsum} as-is
428
- else:
429
- r = 0
430
- s = other # C{type} as-is
431
- if isint(s, both=True):
432
- s = int(s)
433
- return s, r
434
-
435
-
436
418
  def _strcomplex(s, *args):
437
419
  '''(INTERNAL) C{Complex} 2- or 3-arg C{pow} error as C{str}.
438
420
  '''
@@ -489,6 +471,24 @@ def _threshold(threshold=_0_0, **kwds):
489
471
  raise ResidualError(threshold=threshold, cause=x)
490
472
 
491
473
 
474
+ def _2tuple2(other):
475
+ '''(INTERNAL) Return 2-tuple C{(other, r)} with C{other} as C{int},
476
+ C{float} or C{as-is} and C{r} the residual of C{as-is} or 0.
477
+ '''
478
+ if _isFsum_2Tuple(other):
479
+ s, r = other._fint2
480
+ if r:
481
+ s, r = other._nfprs2
482
+ if r: # PYCHOK no cover
483
+ s = other # L{Fsum} as-is
484
+ else:
485
+ r = 0
486
+ s = other # C{type} as-is
487
+ if isint(s, both=True):
488
+ s = int(s)
489
+ return s, r
490
+
491
+
492
492
  class Fsum(_Named): # sync __methods__ with .vector3dBase.Vector3dBase, .fstats, ...
493
493
  '''Precision floating point summation, I{running} summation and accurate multiplication.
494
494
 
@@ -1579,7 +1579,7 @@ class Fsum(_Named): # sync __methods__ with .vector3dBase.Vector3dBase, .fstats
1579
1579
  elif self.is_integer():
1580
1580
  # return an exact C{int} for C{int}**C{int}
1581
1581
  i, _ = self._fint2 # assert _ == 0
1582
- x, r = _2s_r(other) # C{int}, C{float} or other
1582
+ x, r = _2tuple2(other) # C{int}, C{float} or other
1583
1583
  f = self._Fsum_as(i)._pow_Fsum(other, op, **raiser_RESIDUAL) if r else \
1584
1584
  self._pow_2_3(i, x, other, op, **raiser_RESIDUAL)
1585
1585
  else: # mod[0] is None, power(self, other)
@@ -1645,9 +1645,9 @@ class Fsum(_Named): # sync __methods__ with .vector3dBase.Vector3dBase, .fstats
1645
1645
  # Fsum._ps_max = max(Fsum._ps_max, n)
1646
1646
  if n > 2:
1647
1647
  r = self._ps_1sum(s)
1648
- return Fsum2Tuple(*_s_r(s, r))
1648
+ return Fsum2Tuple(*_s_r2(s, r))
1649
1649
  if n > 1: # len(ps) == 2
1650
- s, r = _s_r(*_2sum(*ps, **self._isfine))
1650
+ s, r = _s_r2(*_2sum(*ps, **self._isfine))
1651
1651
  ps[:] = (r, s) if r else (s,)
1652
1652
  elif ps: # len(ps) == 1
1653
1653
  s = ps[0]
@@ -1673,9 +1673,8 @@ class Fsum(_Named): # sync __methods__ with .vector3dBase.Vector3dBase, .fstats
1673
1673
  def fset_(self, *xs):
1674
1674
  '''Apply C{B{self}.partials = Fsum(*B{xs}).partials}.
1675
1675
 
1676
- @arg xs: Optional, new values (each C{scalar} or
1677
- an L{Fsum} or L{Fsum2Tuple} instance), all
1678
- positional.
1676
+ @arg xs: Optional, new values (each C{scalar} or an L{Fsum}
1677
+ or L{Fsum2Tuple} instance), all positional.
1679
1678
 
1680
1679
  @return: This instance, replaced (C{Fsum}).
1681
1680
 
@@ -1850,7 +1849,7 @@ class Fsum(_Named): # sync __methods__ with .vector3dBase.Vector3dBase, .fstats
1850
1849
  s, r = _facc(xs, **facc_kwds)._fprs2
1851
1850
  if _isfinite(s): # _fsum(_1primed((s, -p, r, -q))
1852
1851
  d, r = _2sum(s - p, r - q, _isfine=_isOK)
1853
- r, _ = _s_r(d, r)
1852
+ r, _ = _s_r2(d, r)
1854
1853
  return s, (r if _isfinite(r) else _NONFINITEr)
1855
1854
  else:
1856
1855
  return p, _0_0
@@ -2185,7 +2184,7 @@ class Fsum(_Named): # sync __methods__ with .vector3dBase.Vector3dBase, .fstats
2185
2184
  return s
2186
2185
 
2187
2186
  b = _s(*(b._fprs2 if m is None else b._fint2))
2188
- x = _s(*_2s_r(x))
2187
+ x = _s(*_2tuple2(x))
2189
2188
 
2190
2189
  try:
2191
2190
  # 0**INF == 0.0, 1**INF == 1.0, -1**2.3 == -(1**2.3)
@@ -2608,7 +2607,7 @@ class Fsum2Tuple(_NamedTuple): # in .fstats
2608
2607
 
2609
2608
  @Property_RO
2610
2609
  def _Fsum(self): # this C{Fsum2Tuple} as L{Fsum}, in .fstats
2611
- s, r = _s_r(*self)
2610
+ s, r = _s_r2(*self)
2612
2611
  ps = (r, s) if r else (s,)
2613
2612
  return _Psum(ps, name=self.name)
2614
2613
 
@@ -2817,7 +2816,7 @@ def _xsum(which, xs, nonfinites=None, primed=0, **floats): # origin=0
2817
2816
  nonfinites = _xkwds_get1(floats, floats=nonfinites)
2818
2817
  elif nonfinites is None:
2819
2818
  nonfinites = not nonfiniterrors()
2820
- fs = _xs(xs, **_x_isfine(nonfinites, which=which))
2819
+ fs = _xs(xs, **_x_isfine(nonfinites, which=which)) # PYCHOK yield
2821
2820
  return _fsum(_1primed(fs) if primed else fs)
2822
2821
 
2823
2822
 
@@ -2848,7 +2847,7 @@ if __name__ == '__main__':
2848
2847
 
2849
2848
  # **) MIT License
2850
2849
  #
2851
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
2850
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
2852
2851
  #
2853
2852
  # Permission is hereby granted, free of charge, to any person obtaining a
2854
2853
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/gars.py CHANGED
@@ -345,7 +345,7 @@ __all__ += _ALL_DOCS(decode3, # functions
345
345
 
346
346
  # **) MIT License
347
347
  #
348
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
348
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
349
349
  #
350
350
  # Permission is hereby granted, free of charge, to any person obtaining a
351
351
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/geodesici.py CHANGED
@@ -51,12 +51,12 @@ from pygeodesy.solveBase import _SolveCapsBase, pairs
51
51
  # from pygeodesy.streprs import Fmt, unstr # from .ellipsoids
52
52
  from pygeodesy.units import Azimuth as Azi, Degrees, Float, Int, \
53
53
  _isDegrees, Lat, Lon, Meter, Meter_
54
- from pygeodesy.utily import sincos2, atan2, fabs, radians
54
+ from pygeodesy.utily import atan2, sincos2, fabs, radians
55
55
 
56
- # from math import atan2, ceil as _ceil, fabs, radians # .fsums, .utily
56
+ # from math import ceil as _ceil, fabs, radians # .fsums, .utily
57
57
 
58
58
  __all__ = _ALL_LAZY.geodesici
59
- __version__ = '24.10.22'
59
+ __version__ = '24.11.24'
60
60
 
61
61
  _0t = 0, # int
62
62
  _1_1t = -1, +1
@@ -1774,7 +1774,7 @@ if __name__ == '__main__': # MCCABE 14
1774
1774
 
1775
1775
  # **) MIT License
1776
1776
  #
1777
- # Copyright (C) 2024-2024 -- mrJean1 at Gmail -- All Rights Reserved.
1777
+ # Copyright (C) 2024-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1778
1778
  #
1779
1779
  # Permission is hereby granted, free of charge, to any person obtaining a
1780
1780
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/geodesicw.py CHANGED
@@ -588,7 +588,7 @@ def _PlumbTo(gl, lat0, lon0, est=None, tol=_TOL):
588
588
 
589
589
  # **) MIT License
590
590
  #
591
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
591
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
592
592
  #
593
593
  # Permission is hereby granted, free of charge, to any person obtaining a
594
594
  # copy of this software and associated documentation files (the "Software"),
@@ -4,7 +4,7 @@
4
4
  u'''A Python version of part of I{Karney}'s C++ module U{GeodesicExactC4
5
5
  <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1GeodesicExactC4.html>}.
6
6
 
7
- Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2023)
7
+ Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2024)
8
8
  and licensed under the MIT/X11 License. For more information, see the
9
9
  U{GeographicLib<https://GeographicLib.SourceForge.io>} documentation.
10
10
  '''
@@ -1676,7 +1676,7 @@ del _g, _Gfloats, _f, _f2
1676
1676
 
1677
1677
  # **) MIT License
1678
1678
  #
1679
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
1679
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1680
1680
  #
1681
1681
  # Permission is hereby granted, free of charge, to any person obtaining a
1682
1682
  # copy of this software and associated documentation files (the "Software"),
@@ -4,7 +4,7 @@
4
4
  u'''A Python version of part of I{Karney}'s C++ module U{GeodesicExactC4
5
5
  <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1GeodesicExactC4.html>}.
6
6
 
7
- Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2023)
7
+ Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2024)
8
8
  and licensed under the MIT/X11 License. For more information, see the
9
9
  U{GeographicLib<https://GeographicLib.SourceForge.io>} documentation.
10
10
  '''
@@ -2372,7 +2372,7 @@ del _g, _Gfloats, _f, _f2
2372
2372
 
2373
2373
  # **) MIT License
2374
2374
  #
2375
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
2375
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
2376
2376
  #
2377
2377
  # Permission is hereby granted, free of charge, to any person obtaining a
2378
2378
  # copy of this software and associated documentation files (the "Software"),
@@ -4,7 +4,7 @@
4
4
  u'''A Python version of part of I{Karney}'s C++ module U{GeodesicExactC4
5
5
  <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1GeodesicExactC4.html>}.
6
6
 
7
- Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2023)
7
+ Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2024)
8
8
  and licensed under the MIT/X11 License. For more information, see the
9
9
  U{GeographicLib<https://GeographicLib.SourceForge.io>} documentation.
10
10
  '''
@@ -3278,7 +3278,7 @@ del _g, _Gfloats, _f, _f2
3278
3278
 
3279
3279
  # **) MIT License
3280
3280
  #
3281
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
3281
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
3282
3282
  #
3283
3283
  # Permission is hereby granted, free of charge, to any person obtaining a
3284
3284
  # copy of this software and associated documentation files (the "Software"),
@@ -27,7 +27,7 @@ __version__ = '24.11.02'
27
27
 
28
28
  # **) MIT License
29
29
  #
30
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
30
+ # Copyright (C) 2016-2025 -- 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"),
@@ -65,7 +65,7 @@ _main(C4order=int(argv[1])) if len(argv) == 2 and argv[1].isdigit() else _main()
65
65
 
66
66
  # **) MIT License
67
67
  #
68
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
68
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
69
69
  #
70
70
  # Permission is hereby granted, free of charge, to any person obtaining a
71
71
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/geodesicx/gx.py CHANGED
@@ -8,7 +8,7 @@ Class L{GeodesicExact} follows the naming, methods and return values
8
8
  of class C{Geodesic} from I{Karney}'s Python U{geographiclib
9
9
  <https://GitHub.com/geographiclib/geographiclib-python>}.
10
10
 
11
- Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2023)
11
+ Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2024)
12
12
  and licensed under the MIT/X11 License. For more information, see the
13
13
  U{GeographicLib<https://GeographicLib.SourceForge.io>} documentation.
14
14
  '''
@@ -58,12 +58,13 @@ from pygeodesy.lazily import _ALL_DOCS, _ALL_MODS as _MODS
58
58
  from pygeodesy.namedTuples import Destination3Tuple, Distance3Tuple
59
59
  from pygeodesy.props import deprecated_Property, Property, Property_RO, property_RO
60
60
  # from pygeodesy.streprs import Fmt # from .fmath
61
- from pygeodesy.utily import atan2d as _atan2d_reverse, _unrollon, _Wrap, wrap360
61
+ from pygeodesy.utily import atan2, atan2d as _atan2d_reverse, _unrollon, \
62
+ _Wrap, wrap360
62
63
 
63
- from math import atan2, copysign, cos, degrees, fabs, radians, sqrt
64
+ from math import copysign, cos, degrees, fabs, radians, sqrt
64
65
 
65
66
  __all__ = ()
66
- __version__ = '24.08.13'
67
+ __version__ = '24.11.24'
67
68
 
68
69
  _MAXIT1 = 20
69
70
  _MAXIT2 = 10 + _MAXIT1 + MANT_DIG # MANT_DIG == C++ digits
@@ -1346,7 +1347,7 @@ __all__ += _ALL_DOCS(GeodesicExact, GeodesicLineExact)
1346
1347
 
1347
1348
  # **) MIT License
1348
1349
  #
1349
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
1350
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1350
1351
  #
1351
1352
  # Permission is hereby granted, free of charge, to any person obtaining a
1352
1353
  # copy of this software and associated documentation files (the "Software"),
@@ -10,7 +10,7 @@ Class L{GeodesicAreaExact} is intended to work with instances
10
10
  of class L{GeodesicExact} and of I{wrapped} class C{Geodesic},
11
11
  see module L{pygeodesy.karney}.
12
12
 
13
- Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2023)
13
+ Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2024)
14
14
  and licensed under the MIT/X11 License. For more information, see the
15
15
  U{GeographicLib<https://GeographicLib.SourceForge.io>} documentation.
16
16
  '''
@@ -518,7 +518,7 @@ __all__ += _ALL_DOCS(GeodesicAreaExact, PolygonArea)
518
518
 
519
519
  # **) MIT License
520
520
  #
521
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
521
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
522
522
  #
523
523
  # Permission is hereby granted, free of charge, to any person obtaining a
524
524
  # copy of this software and associated documentation files (the "Software"),
@@ -3,7 +3,7 @@
3
3
 
4
4
  u'''(INTERNAL) Private L{geodesicx} base class, functions and constants.
5
5
 
6
- Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2023)
6
+ Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2024)
7
7
  and licensed under the MIT/X11 License. For more information, see the
8
8
  U{GeographicLib<https://GeographicLib.SourceForge.io>} documentation.
9
9
  '''
@@ -158,7 +158,7 @@ def _xnC4(**name_nC4):
158
158
 
159
159
  # **) MIT License
160
160
  #
161
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
161
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
162
162
  #
163
163
  # Permission is hereby granted, free of charge, to any person obtaining a
164
164
  # copy of this software and associated documentation files (the "Software"),
@@ -49,14 +49,13 @@ from pygeodesy.lazily import _ALL_DOCS, _ALL_MODS as _MODS
49
49
  from pygeodesy.karney import _around, _atan2d, Caps, GDict, _fix90, \
50
50
  _K_2_0, _llz2gl, _norm2, _norm180, \
51
51
  _sincos2, _sincos2d
52
- from pygeodesy.named import Property_RO, _update_all
53
- # from pygeodesy.props import Property_RO, _update_all # from .named
54
- from pygeodesy.utily import atan2d as _atan2d_reverse, sincos2
52
+ from pygeodesy.props import Property_RO, property_ROver, _update_all
53
+ from pygeodesy.utily import atan2, atan2d as _atan2d_reverse, sincos2
55
54
 
56
- from math import atan2, cos, degrees, fabs, floor, radians, sin
55
+ from math import cos, degrees, fabs, floor, radians, sin
57
56
 
58
57
  __all__ = ()
59
- __version__ = '24.07.12'
58
+ __version__ = '24.11.24'
60
59
 
61
60
  _glXs = [] # instances of C{[_]GeodesicLineExact} to be updated
62
61
 
@@ -377,11 +376,11 @@ class _GeodesicLineExact(_GeodesicBase):
377
376
  lam12 = salp0 * self._H0e2_f1 * fsum1f_(eF.deltaH(ssig2, csig2, dn2),
378
377
  -self._H1, sig12)
379
378
  if (outmask & Cs.LONG_UNROLL):
380
- _a, t = atan2, _copysign_1_0(salp0) # east-going?
379
+ t = _copysign_1_0(salp0) # east-going?
381
380
  tchi1 = t * schi1
382
381
  tchi2 = t * schi2
383
- chi12 = t * fsum1f_(_a(ssig1, csig1), -_a(ssig2, csig2),
384
- _a(tchi2, cchi2), -_a(tchi1, cchi1), sig12)
382
+ chi12 = t * fsum1f_(atan2(ssig1, csig1), -atan2(ssig2, csig2),
383
+ atan2(tchi2, cchi2), -atan2(tchi1, cchi1), sig12)
385
384
  lon2 = self.lon1 + degrees(chi12 - lam12)
386
385
  else:
387
386
  chi12 = atan2(*_sincos12(schi1, cchi1, schi2, cchi2))
@@ -634,6 +633,13 @@ class _GeodesicLineExact(_GeodesicBase):
634
633
  # unnecessary because Einv inverts E
635
634
  # return -self._eF.deltaEinv(stau1, ctau1)
636
635
 
636
+ @property_ROver
637
+ def _toProps7(self):
638
+ '''(INTERNAL) 7-Tuple of C{toStr} properties.
639
+ '''
640
+ C = _GeodesicLineExact
641
+ return C.lat1, C.lon1, C.azi1, C.a13, C.s13, C.caps, C.geodesic
642
+
637
643
  def toStr(self, **prec_sep_name): # PYCHOK signature
638
644
  '''Return this C{GeodesicLineExact} as string.
639
645
 
@@ -642,16 +648,14 @@ class _GeodesicLineExact(_GeodesicBase):
642
648
 
643
649
  @return: C{GeodesicLineExact} (C{str}).
644
650
  '''
645
- C = _GeodesicLineExact
646
- t = C.lat1, C.lon1, C.azi1, C.a13, C.s13, C.caps, C.geodesic
647
- return self._instr(props=t, **prec_sep_name)
651
+ return self._instr(props=self._toProps7, **prec_sep_name)
648
652
 
649
653
 
650
654
  __all__ += _ALL_DOCS(_GeodesicLineExact)
651
655
 
652
656
  # **) MIT License
653
657
  #
654
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
658
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
655
659
  #
656
660
  # Permission is hereby granted, free of charge, to any person obtaining a
657
661
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/geodsolve.py CHANGED
@@ -504,7 +504,7 @@ if __name__ == '__main__':
504
504
 
505
505
  # **) MIT License
506
506
  #
507
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
507
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
508
508
  #
509
509
  # Permission is hereby granted, free of charge, to any person obtaining a
510
510
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/geohash.py CHANGED
@@ -1099,7 +1099,7 @@ if __name__ == '__main__':
1099
1099
 
1100
1100
  # **) MIT License
1101
1101
  #
1102
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
1102
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1103
1103
  #
1104
1104
  # Permission is hereby granted, free of charge, to any person obtaining a
1105
1105
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/geoids.py CHANGED
@@ -1837,7 +1837,7 @@ del _intCs # trash ints cache
1837
1837
 
1838
1838
  # **) MIT License
1839
1839
  #
1840
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
1840
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1841
1841
  #
1842
1842
  # Permission is hereby granted, free of charge, to any person obtaining a
1843
1843
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/hausdorff.py CHANGED
@@ -882,7 +882,7 @@ def randomrangenerator(seed):
882
882
 
883
883
  # **) MIT License
884
884
  #
885
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
885
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
886
886
  #
887
887
  # Permission is hereby granted, free of charge, to any person obtaining a
888
888
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/heights.py CHANGED
@@ -1110,7 +1110,7 @@ __all__ += _ALL_DOCS(_HeightBase, _HeightIDW, _HeightNamed)
1110
1110
 
1111
1111
  # **) MIT License
1112
1112
  #
1113
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
1113
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1114
1114
  #
1115
1115
  # Permission is hereby granted, free of charge, to any person obtaining a
1116
1116
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/internals.py CHANGED
@@ -718,7 +718,7 @@ if _is_DUNDER_main(__name__): # PYCHOK no cover
718
718
 
719
719
  # **) MIT License
720
720
  #
721
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
721
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
722
722
  #
723
723
  # Permission is hereby granted, free of charge, to any person obtaining a
724
724
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/interns.py CHANGED
@@ -217,7 +217,6 @@ _ellipsoidal_ = 'ellipsoidal' # PYCHOK OK
217
217
  _encode_ = 'encode' # PYCHOK OK
218
218
  _end_ = 'end' # PYCHOK OK
219
219
  _epoch_ = 'epoch' # PYCHOK OK
220
- _eps_ = 'eps' # PYCHOK OK
221
220
  _EQUAL_ = Str_('=') # PYCHOK OK
222
221
  _EQUALSPACED_ = Str_(' = ') # PYCHOK OK
223
222
  _Error_ = 'Error' # PYCHOK OK
@@ -441,7 +440,7 @@ _LR_PAIRS = {_LANGLE_: _RANGLE_,
441
440
 
442
441
  __all__ = (_NN_, # NOT MISSING!
443
442
  Str_.__name__) # classes
444
- __version__ = '24.10.19'
443
+ __version__ = '24.11.27'
445
444
 
446
445
  if __name__ == '__main__':
447
446
 
@@ -464,7 +463,7 @@ if __name__ == '__main__':
464
463
 
465
464
  # **) MIT License
466
465
  #
467
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
466
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
468
467
  #
469
468
  # Permission is hereby granted, free of charge, to any person obtaining a
470
469
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/iters.py CHANGED
@@ -527,7 +527,7 @@ __all__ += _ALL_DOCS(_BaseIter)
527
527
 
528
528
  # **) MIT License
529
529
  #
530
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
530
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
531
531
  #
532
532
  # Permission is hereby granted, free of charge, to any person obtaining a
533
533
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/karney.py CHANGED
@@ -165,7 +165,7 @@ from pygeodesy.utily import atan2d, sincos2d, tand, _unrollon, fabs
165
165
  # from math import fabs # from .utily
166
166
 
167
167
  __all__ = _ALL_LAZY.karney
168
- __version__ = '24.11.09'
168
+ __version__ = '24.11.26'
169
169
 
170
170
  _2_4_ = '2.4'
171
171
  _K_2_0 = _getenv(_PYGEODESY(_xgeographiclib, 1), _2_)
@@ -1011,7 +1011,7 @@ def _tand(x):
1011
1011
  try:
1012
1012
  return _wrapped.Math.tand(x)
1013
1013
  except AttributeError:
1014
- return tand(x)
1014
+ return tand(x) # Error=None
1015
1015
 
1016
1016
 
1017
1017
  def _unroll2(lon1, lon2, wrap=False): # see .ellipsoidalBaseDI._intersects2
@@ -1039,7 +1039,7 @@ __all__ += _ALL_DOCS(_CapsBase)
1039
1039
 
1040
1040
  # **) MIT License
1041
1041
  #
1042
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
1042
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1043
1043
  #
1044
1044
  # Permission is hereby granted, free of charge, to any person obtaining a
1045
1045
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/ktm.py CHANGED
@@ -35,7 +35,7 @@ following exceptions:
35
35
  - Evaluating the convergence and scale using the expression for the
36
36
  projection or its inverse.
37
37
 
38
- Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2023)
38
+ Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2024)
39
39
  and licensed under the MIT/X11 License. For more information, see the
40
40
  U{GeographicLib<https://GeographicLib.SourceForge.io>} documentation.
41
41
  '''
@@ -60,13 +60,13 @@ from pygeodesy.props import property_doc_, Property, Property_RO, \
60
60
  _update_all
61
61
  # from pygeodesy.streprs import pairs # from .named
62
62
  from pygeodesy.units import Degrees, Scalar_, _1mm as _TOL_10 # PYCHOK used!
63
- from pygeodesy.utily import atan1d, _loneg, sincos2, sincos2d_
63
+ from pygeodesy.utily import atan1d, atan2, _loneg, sincos2, sincos2d_
64
64
 
65
65
  from cmath import polar
66
- from math import atan2, asinh, cos, cosh, degrees, fabs, sin, sinh, sqrt, tanh
66
+ from math import asinh, cos, cosh, degrees, fabs, sin, sinh, sqrt, tanh
67
67
 
68
68
  __all__ = _ALL_LAZY.ktm
69
- __version__ = '24.11.11'
69
+ __version__ = '24.11.24'
70
70
 
71
71
 
72
72
  class KTMError(_ValueError):
@@ -148,7 +148,8 @@ class KTransverseMercator(_NamedBase):
148
148
  else:
149
149
  self.ellipsoid = a_earth
150
150
 
151
- self.lon0 = lon0
151
+ if lon0:
152
+ self.lon0 = lon0
152
153
  self.k0 = k0
153
154
  if raiser:
154
155
  self.raiser = True
@@ -425,9 +426,9 @@ class KTransverseMercator(_NamedBase):
425
426
  return _COMMASPACE_.join(pairs(d, **kwds))
426
427
 
427
428
 
428
- def _cma(a, b0, b1, Cn):
429
- '''(INTERNAL) Compute complex M{a * b0 - b1 + Cn} with complex
430
- C{a}, C{b0} and C{b1} and scalar C{Cn}.
429
+ def _cfma(a, b0, b1, Cn):
430
+ '''(INTERNAL) Complex fused-multiply-add M{a * b0 - b1 + Cn} with
431
+ complex C{a}, C{b0} and C{b1} and scalar C{Cn}.
431
432
 
432
433
  @see: CPython function U{_Py_c_prod<https://GitHub.com/python/
433
434
  cpython/blob/main/Objects/complexobject.c>}.
@@ -462,16 +463,16 @@ def _Cyxgk4(E, xi_, eta_, C):
462
463
  n -= 1
463
464
  while n > 0:
464
465
  Cn = C[n]
465
- y1 = _cma(a, y0, y1, Cn)
466
- z1 = _cma(a, z0, z1, Cn * (n * 2))
466
+ y1 = _cfma(a, y0, y1, Cn)
467
+ z1 = _cfma(a, z0, z1, Cn * (n * 2))
467
468
  n -= 1
468
469
  Cn = C[n]
469
- y0 = _cma(a, y1, y0, Cn)
470
- z0 = _cma(a, z1, z0, Cn * (n * 2))
470
+ y0 = _cfma(a, y1, y0, Cn)
471
+ z0 = _cfma(a, z1, z0, Cn * (n * 2))
471
472
  n -= 1
472
473
  # assert n == 0
473
- x = _cma(s, y0, -x, _0_0)
474
- c = _cma(c, z0, z1, _1_0)
474
+ x = _cfma(s, y0, -x, _0_0)
475
+ c = _cfma(c, z0, z1, _1_0)
475
476
 
476
477
  # Gauss-Schreiber to Gauss-Krueger TM
477
478
  # C{cmath.polar} handles INF, NAN, etc.
@@ -611,7 +612,7 @@ if __name__ == '__main__':
611
612
 
612
613
  # **) MIT License
613
614
  #
614
- # Copyright (C) 2022-2024 -- mrJean1 at Gmail -- All Rights Reserved.
615
+ # Copyright (C) 2022-2025 -- mrJean1 at Gmail -- All Rights Reserved.
615
616
  #
616
617
  # Permission is hereby granted, free of charge, to any person obtaining a
617
618
  # copy of this software and associated documentation files (the "Software"),