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
pygeodesy/namedTuples.py CHANGED
@@ -763,7 +763,7 @@ def _v2Cls(v, Cls, Cartesian_kwds): # in .vector3d
763
763
 
764
764
  # **) MIT License
765
765
  #
766
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
766
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
767
767
  #
768
768
  # Permission is hereby granted, free of charge, to any person obtaining a
769
769
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/nvectorBase.py CHANGED
@@ -687,7 +687,7 @@ __all__ += _ALL_DOCS(LatLonNvectorBase, NvectorBase, sumOf) # classes
687
687
 
688
688
  # **) MIT License
689
689
  #
690
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
690
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
691
691
  #
692
692
  # Permission is hereby granted, free of charge, to any person obtaining a
693
693
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/osgr.py CHANGED
@@ -723,7 +723,7 @@ if __name__ == _DMAIN_:
723
723
 
724
724
  # **) MIT License
725
725
  #
726
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
726
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
727
727
  #
728
728
  # Permission is hereby granted, free of charge, to any person obtaining a
729
729
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/points.py CHANGED
@@ -1666,7 +1666,7 @@ __all__ += _ALL_DOCS(_Array2LatLon, _Basequence)
1666
1666
 
1667
1667
  # **) MIT License
1668
1668
  #
1669
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1669
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
1670
1670
  #
1671
1671
  # Permission is hereby granted, free of charge, to any person obtaining a
1672
1672
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/props.py CHANGED
@@ -701,7 +701,7 @@ _throwarning = DeprecationWarnings.throw
701
701
 
702
702
  # **) MIT License
703
703
  #
704
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
704
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
705
705
  #
706
706
  # Permission is hereby granted, free of charge, to any person obtaining a
707
707
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/resections.py CHANGED
@@ -1028,7 +1028,7 @@ def _zidw(x, y, useZ, *ABC):
1028
1028
 
1029
1029
  # **) MIT License
1030
1030
  #
1031
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1031
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
1032
1032
  #
1033
1033
  # Permission is hereby granted, free of charge, to any person obtaining a
1034
1034
  # copy of this software and associated documentation files (the "Software"),
@@ -3,21 +3,23 @@
3
3
 
4
4
  u'''Package of lazily imported C{rhumb} modules L{rhumb.aux_}, L{rhumb.ekx} and L{rhumb.solve}.
5
5
 
6
- @note: C{S12} area calculations in classes L{RhumbAux} and L{RhumbLineAux} depend on class L{AuxDST}
7
- which requires U{numpy<https://PyPI.org/project/numpy>} to be installed, version 1.16 or newer.
6
+ @note: C{S12} area calculations in classes L{RhumbAux} and L{RhumbLineAux} depend on class
7
+ L{AuxDST} which requires U{numpy<https://PyPI.org/project/numpy>} to be installed,
8
+ version 1.16 or newer.
8
9
  '''
9
10
  from pygeodesy.lazily import _ALL_LAZY, _ALL_OTHER, _lazy_import_as, _unLazy0
10
11
 
11
12
  __all__ = _ALL_LAZY.rhumb
12
- __version__ = '25.08.28'
13
+ __version__ = '25.12.06'
13
14
 
14
15
  if _unLazy0: # or _isfrozen
15
16
  from pygeodesy.rhumb.aux_ import RhumbAux, RhumbLineAux
16
17
  from pygeodesy.rhumb.ekx import Rhumb, RhumbLine
17
- from pygeodesy.rhumb.solve import RhumbSolve, RhumbLineSolve, RhumbSolve7Tuple
18
+ from pygeodesy.rhumb.solve import RhumbSolve, RhumbLineSolve, \
19
+ RhumbSolve7Tuple, Rhumb8Tuple # in .karney
18
20
 
19
21
  __all__ += _ALL_OTHER(RhumbAux, RhumbLineAux, Rhumb, RhumbLine,
20
- RhumbSolve, RhumbLineSolve, RhumbSolve7Tuple)
22
+ RhumbSolve, RhumbLineSolve, RhumbSolve7Tuple, Rhumb8Tuple)
21
23
  assert _ALL_LAZY.rhumb_aux_ + _ALL_LAZY.rhumb_ekx + _ALL_LAZY.rhumb_solve == __all__
22
24
 
23
25
  else: # lazily import modules and exported attrs
@@ -25,7 +27,7 @@ else: # lazily import modules and exported attrs
25
27
 
26
28
  # **) MIT License
27
29
  #
28
- # Copyright (C) 2018-2025 -- mrJean1 at Gmail -- All Rights Reserved.
30
+ # Copyright (C) 2018-2026 -- mrJean1 at Gmail -- All Rights Reserved.
29
31
  #
30
32
  # Permission is hereby granted, free of charge, to any person obtaining a
31
33
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/rhumb/aux_.py CHANGED
@@ -356,7 +356,7 @@ __all__ += _ALL_DOCS(Caps)
356
356
 
357
357
  # **) MIT License
358
358
  #
359
- # Copyright (C) 2023-2025 -- mrJean1 at Gmail -- All Rights Reserved.
359
+ # Copyright (C) 2023-2026 -- mrJean1 at Gmail -- All Rights Reserved.
360
360
  #
361
361
  # Permission is hereby granted, free of charge, to any person obtaining a
362
362
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/rhumb/bases.py CHANGED
@@ -1134,7 +1134,7 @@ if __name__ == _DMAIN_:
1134
1134
 
1135
1135
  # **) MIT License
1136
1136
  #
1137
- # Copyright (C) 2022-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1137
+ # Copyright (C) 2022-2026 -- mrJean1 at Gmail -- All Rights Reserved.
1138
1138
  #
1139
1139
  # Permission is hereby granted, free of charge, to any person obtaining a
1140
1140
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/rhumb/ekx.py CHANGED
@@ -546,7 +546,7 @@ __all__ += _ALL_DOCS(Caps)
546
546
 
547
547
  # **) MIT License
548
548
  #
549
- # Copyright (C) 2022-2025 -- mrJean1 at Gmail -- All Rights Reserved.
549
+ # Copyright (C) 2022-2026 -- mrJean1 at Gmail -- All Rights Reserved.
550
550
  #
551
551
  # Permission is hereby granted, free of charge, to any person obtaining a
552
552
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/rhumb/solve.py CHANGED
@@ -11,27 +11,29 @@ as an (exact) rhumb or rhumb line from I{either GeographicLib 2.0 or 2.2+}.
11
11
  from pygeodesy.basics import _xinstanceof
12
12
  from pygeodesy.constants import _180_0, _N_180_0, _over, _0_0 # PYCHOK used!
13
13
  from pygeodesy.errors import RhumbError # PYCHOK used!
14
- from pygeodesy.interns import NN, _a12_, _azi12_, _DMAIN_, _lat2_, _lon2_, _s12_, \
15
- _S12_, _UNDER_
16
- from pygeodesy.karney import Caps, GDict, _norm180, Rhumb8Tuple, _sincos2d, _Xables
17
- from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS
14
+ from pygeodesy.interns import NN, _a12_, _azi12_, _DMAIN_, _lat2_, \
15
+ _lon2_, _s12_, _S12_, _UNDER_
16
+ from pygeodesy.karney import Caps, GDict, _norm180, Rhumb8Tuple, \
17
+ _sincos2d, _Xables
18
+ from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY # _ALL_MODS as _MODS
18
19
  from pygeodesy.namedTuples import Destination3Tuple, Distance3Tuple
19
- from pygeodesy.props import deprecated_method, Property, Property_RO
20
+ from pygeodesy.props import Property, Property_RO
20
21
  from pygeodesy.solveBase import _SolveGDictBase, _SolveGDictLineBase
21
22
  from pygeodesy.utily import _unrollon, _Wrap, wrap360
22
23
 
23
24
  __all__ = _ALL_LAZY.rhumb_solve
24
- __version__ = '25.05.07'
25
+ __version__ = '25.12.06'
25
26
 
26
27
 
27
28
  class _RhumbSolveBase(_SolveGDictBase):
28
29
  '''(INTERNAL) Base class for L{RhumbSolve} and L{RhumbLineSolve}.
29
30
  '''
30
- _Error = RhumbError
31
- _Names_Direct = _lat2_, _lon2_, _S12_
32
- _Names_Inverse = _azi12_, _s12_, _S12_
33
- _Xable_name = _Xables.RhumbSolve.__name__ # typename
34
- _Xable_path = _Xables.RhumbSolve()
31
+ _Error = RhumbError
32
+ _Names_Direct = \
33
+ _Names_Distance = _lat2_, _lon2_, _S12_
34
+ _Names_Inverse = _azi12_, _s12_, _S12_
35
+ _Xable_name = _Xables.RhumbSolve.__name__ # typename
36
+ _Xable_path = _Xables.RhumbSolve()
35
37
 
36
38
  @Property_RO
37
39
  def _cmdBasic(self):
@@ -62,19 +64,6 @@ class _RhumbSolveBase(_SolveGDictBase):
62
64
  def _s_option(self): # == not -E for GeodSolve
63
65
  return () if self.Exact else ('-s',)
64
66
 
65
- def toStr(self, **prec_sep): # PYCHOK signature
66
- '''Return this C{RhumbSolve} as string.
67
-
68
- @kwarg prec_sep: Keyword argumens C{B{prec}=6} and C{B{sep}=", "}
69
- for the C{float} C{prec}ision, number of decimal digits
70
- (0..9) and the C{sep}arator string to join. Trailing
71
- zero decimals are stripped for B{C{prec}} values of 1
72
- and above, but kept for negative B{C{prec}} values.
73
-
74
- @return: RhumbSolve items (C{str}).
75
- '''
76
- return self._toStr(RhumbSolve=self.RhumbSolve, **prec_sep)
77
-
78
67
  # @Property_RO
79
68
  # def _u_option(self):
80
69
  # return '-u' if self.unroll else ()
@@ -229,6 +218,15 @@ class RhumbSolve(_RhumbSolveBase):
229
218
 
230
219
  Line = DirectLine
231
220
 
221
+ def toStr(self, **prec_sep_other): # PYCHOK signature
222
+ '''Return this C{RhumbSolve} as string.
223
+
224
+ @kwarg prec_sep: See L{toStr<pygeodesy.solveBase._SolveBase.toStr>}.
225
+
226
+ @return: RhumbSolve items (C{str}).
227
+ '''
228
+ return _RhumbSolveBase.toStr(self, RhumbSolve=self.RhumbSolve, **prec_sep_other)
229
+
232
230
 
233
231
  class RhumbLineSolve(_RhumbSolveBase, _SolveGDictLineBase):
234
232
  '''Wrapper to invoke I{Karney}'s U{RhumbSolve<https://GeographicLib.SourceForge.io/C++/doc/RhumbSolve.1.html>}
@@ -281,7 +279,7 @@ class RhumbLineSolve(_RhumbSolveBase, _SolveGDictLineBase):
281
279
  # azi12, a12, s12, S12}.
282
280
  # '''
283
281
  # s = a12 * self._mpd
284
- # a = self._GDictInvoke(self._cmdArc, self._Names_Direct, s)
282
+ # a = self._GDictInvoke(self._cmdArc, self._Names_Distance, s)
285
283
  # r = GDict(a12=a12, s12=s, **self._lla1)
286
284
  # r.updated(a)
287
285
  # return r
@@ -316,24 +314,19 @@ class RhumbLineSolve(_RhumbSolveBase, _SolveGDictLineBase):
316
314
  @return: A L{GDict} with 7 items C{lat1, lon1, lat2, lon2,
317
315
  azi12, s12, S12}.
318
316
  '''
319
- d = self._GDictInvoke(self._cmdDistance, self._Names_Direct, s12)
317
+ d = self._GDictInvoke(self._cmdDistance, self._Names_Distance, s12)
320
318
  r = GDict(s12=s12, **self._lla1) # a12=_over(s12, self._mpd)
321
319
  r.update(d)
322
320
  return r
323
321
 
324
- def toStr(self, **prec_sep): # PYCHOK signature
322
+ def toStr(self, **prec_sep_other): # PYCHOK signature
325
323
  '''Return this C{RhumbLineSolve} as string.
326
324
 
327
- @kwarg prec_sep: Keyword argumens C{B{prec}=6} and C{B{sep}=", "}
328
- for the C{float} C{prec}ision, number of decimal digits
329
- (0..9) and the C{sep}arator string to join. Trailing
330
- zero decimals are stripped for B{C{prec}} values of 1
331
- and above, but kept for negative B{C{prec}} values.
325
+ @kwarg prec_sep: See L{toStr<pygeodesy.solveBase._SolveBase.toStr>}.
332
326
 
333
327
  @return: RhumbLineSolve items (C{str}).
334
328
  '''
335
- return _SolveGDictLineBase._toStr(self, azi12=self.azi12, rhumb=self._solve,
336
- RhumbSolve=self.RhumbSolve, **prec_sep)
329
+ return _SolveGDictLineBase.toStr(self, rhumb=self._solve, **prec_sep_other)
337
330
 
338
331
 
339
332
  class RhumbSolve7Tuple(Rhumb8Tuple):
@@ -346,12 +339,6 @@ class RhumbSolve7Tuple(Rhumb8Tuple):
346
339
  _Names_ = Rhumb8Tuple._Names_[:7] # drop a12
347
340
  _Units_ = Rhumb8Tuple._Units_[:7]
348
341
 
349
- @deprecated_method
350
- def _to7Tuple(self): # PYCHOK no cover
351
- '''DEPRECATED, I{don't use!}
352
- '''
353
- return _MODS.deprecated.classes.Rhumb7Tuple(self[:7])
354
-
355
342
 
356
343
  __all__ += _ALL_DOCS(_RhumbSolveBase)
357
344
 
@@ -391,7 +378,7 @@ if __name__ == _DMAIN_:
391
378
  break
392
379
 
393
380
  rS = RhumbSolve(name='Test')
394
- rS.verbose = '--verbose' in argv # or '-v' in argv
381
+ rS.verbose = v = '--verbose' in argv # or '-v' in argv
395
382
 
396
383
  if not _Xables.X_OK(rS.RhumbSolve): # not set
397
384
  rS.RhumbSolve = _Xables.RhumbSolve(_Xables.bin_)
@@ -404,76 +391,83 @@ if __name__ == _DMAIN_:
404
391
  exit()
405
392
 
406
393
  r = rS.Direct(40.6, -73.8, 51, 5.5e6)
407
- printf('Direct: %r', r, nl=1)
408
- printf('Direct3: %r', rS.Direct3(40.6, -73.8, 51, 5.5e6))
394
+ printf('Direct: %r', r)
395
+ printf('Direct3: %r', rS.Direct3(40.6, -73.8, 51, 5.5e6), nt=v)
409
396
 
410
- printf('Inverse: %r', rS.Inverse( 40.6, -73.8, 51.6, -0.5), nl=1)
397
+ printf('Inverse: %r', rS.Inverse( 40.6, -73.8, 51.6, -0.5))
411
398
  printf('Inverse1: %r', rS.Inverse1(40.6, -73.8, 51.6, -0.5))
412
- printf('Inverse3: %r', rS.Inverse3(40.6, -73.8, 51.6, -0.5))
399
+ printf('Inverse3: %r', rS.Inverse3(40.6, -73.8, 51.6, -0.5), nt=v)
413
400
 
414
- printf('Inverse: %r', rS.Inverse( 40.6, -73.8, 35.8, 140.3), nl=1)
401
+ printf('Inverse: %r', rS.Inverse( 40.6, -73.8, 35.8, 140.3))
415
402
  printf('Inverse1: %r', rS.Inverse1(40.6, -73.8, 35.8, 140.3))
416
- printf('Inverse3: %r', rS.Inverse3(40.6, -73.8, 35.8, 140.3))
403
+ printf('Inverse3: %r', rS.Inverse3(40.6, -73.8, 35.8, 140.3), nt=v)
417
404
 
418
405
  rlS = RhumbLineSolve(rS, 40.6, -73.8, 51, name='LineTest')
406
+ printf('Line: %r', rlS)
419
407
  p = rlS.Position(5.5e6)
420
- printf('Position: %s %r', p == r, p, nl=1)
408
+ printf('Position: %r %s', p, p == r)
421
409
  # p = rlS.ArcPosition(49.475527)
422
- # printf('ArcPosition: %s %r', p == r, p)
410
+ # printf('ArcPosition: %r %s', p, p == r)
423
411
 
424
412
 
425
413
  # % python3 -m pygeodesy.rhumb.solve
426
414
 
427
- # version: /opt/local/bin/RhumbSolve: GeographicLib version 2.2
428
-
429
- # Direct: GDict(azi12=51, lat1=40.6, lat2=71.6889, lon1=-73.8, lon2=0.25552, s12=5500000.0, S12=44095641862956.109375)
415
+ # version: /opt/local/bin/RhumbSolve: GeographicLib version 2.7
416
+ # Direct: GDict(azi12=51, lat1=40.6, lat2=71.6889, lon1=-73.8, lon2=0.25552, s12=5500000.0, S12=44095641862956.132812)
430
417
  # Direct3: Destination3Tuple(lat=71.6889, lon=0.25552, final=51.0)
431
-
432
- # Inverse: GDict(a12=51.929543, azi12=77.76839, lat1=40.6, lat2=51.6, lon1=-73.8, lon2=-0.5, s12=5771083.383328, S12=37395209100030.390625)
418
+ # Inverse: GDict(a12=51.929543, azi12=77.76839, lat1=40.6, lat2=51.6, lon1=-73.8, lon2=-0.5, s12=5771083.383328, S12=37395209100030.382812)
433
419
  # Inverse1: 51.929542507561905
434
420
  # Inverse3: Distance3Tuple(distance=5771083.383328, initial=77.76839, final=77.76839)
435
-
436
421
  # Inverse: GDict(a12=115.02062, azi12=-92.388888, lat1=40.6, lat2=35.8, lon1=-73.8, lon2=140.3, s12=12782581.067684, S12=-63760642939072.5)
437
422
  # Inverse1: 115.02061966879248
438
423
  # Inverse3: Distance3Tuple(distance=12782581.067684, initial=267.611112, final=267.611112)
439
-
440
- # Position: True GDict(azi12=51, lat1=40.6, lat2=71.6889, lon1=-73.8, lon2=0.25552, s12=5500000.0, S12=44095641862956.109375)
424
+ # Line: RhumbLineSolve(invokation=1, rhumb=RhumbSolve(ellipsoid=Ellipsoid(name='WGS84', a=6378137, f=0.00335281, f_=298.25722356, b=6356752.31424518), invokation=9, RhumbSolve='/opt/local/bin/RhumbSolve', status=0), status=0)
425
+ # Position: GDict(azi12=51, lat1=40.6, lat2=71.6889, lon1=-73.8, lon2=0.25552, s12=5500000.0, S12=44095641862956.132812) True
441
426
 
442
427
 
443
428
  # % python3 -m pygeodesy.rhumb.solve --verbose
444
429
 
445
- # RhumbSolve 'Test' 1: /opt/local/bin/RhumbSolve --version (invoke)
446
- # RhumbSolve 'Test' 1: /opt/local/bin/RhumbSolve: GeographicLib version 2.2 (0)
447
- # version: /opt/local/bin/RhumbSolve: GeographicLib version 2.2
448
- # RhumbSolve 'Test' 2: /opt/local/bin/RhumbSolve -p 10 \ 40.600000000000001 -73.799999999999997 51.0 5500000.0 (Direct)
449
- # RhumbSolve 'Test' 2: lat2=71.688899882813018, lon2=0.255519824423402, S12=44095641862956.109 (0)
450
-
451
- # Direct: GDict(azi12=51, lat1=40.6, lat2=71.6889, lon1=-73.8, lon2=0.25552, s12=5500000.0, S12=44095641862956.109375)
452
- # RhumbSolve 'Test' 3: /opt/local/bin/RhumbSolve -p 10 \ 40.600000000000001 -73.799999999999997 51.0 5500000.0 (Direct3)
453
- # RhumbSolve 'Test' 3: lat2=71.688899882813018, lon2=0.255519824423402, S12=44095641862956.109 (0)
430
+ # RhumbSolve 'Test'@1: /opt/local/bin/RhumbSolve --version (invoke)
431
+ # RhumbSolve 'Test'@1: '/opt/local/bin/RhumbSolve: GeographicLib version 2.7' (0, stdout/-err)
432
+ # RhumbSolve 'Test'@1: /opt/local/bin/RhumbSolve: GeographicLib version 2.7 (0)
433
+ # version: /opt/local/bin/RhumbSolve: GeographicLib version 2.7
434
+ # RhumbSolve 'Test'@2: /opt/local/bin/RhumbSolve -p 10 \ 40.6 -73.8 51.0 5500000.0 (Direct)
435
+ # RhumbSolve 'Test'@2: '71.688899882813033 0.255519824423445 44095641862956.133' (0, stdout/-err)
436
+ # RhumbSolve 'Test'@2: lat2=71.688899882813033, lon2=0.255519824423445, S12=44095641862956.133 (0)
437
+ # Direct: GDict(azi12=51, lat1=40.6, lat2=71.6889, lon1=-73.8, lon2=0.25552, s12=5500000.0, S12=44095641862956.132812)
438
+ # RhumbSolve 'Test'@3: /opt/local/bin/RhumbSolve -p 10 \ 40.6 -73.8 51.0 5500000.0 (Direct3)
439
+ # RhumbSolve 'Test'@3: '71.688899882813033 0.255519824423445 44095641862956.133' (0, stdout/-err)
440
+ # RhumbSolve 'Test'@3: lat2=71.688899882813033, lon2=0.255519824423445, S12=44095641862956.133 (0)
454
441
  # Direct3: Destination3Tuple(lat=71.6889, lon=0.25552, final=51.0)
455
- # RhumbSolve 'Test' 4: /opt/local/bin/RhumbSolve -p 10 -i \ 40.600000000000001 -73.799999999999997 51.600000000000001 -0.5 (Inverse)
456
- # RhumbSolve 'Test' 4: azi12=77.768389710255661, s12=5771083.383328028, S12=37395209100030.391 (0)
457
-
458
- # Inverse: GDict(a12=51.929543, azi12=77.76839, lat1=40.6, lat2=51.6, lon1=-73.8, lon2=-0.5, s12=5771083.383328, S12=37395209100030.390625)
459
- # RhumbSolve 'Test' 5: /opt/local/bin/RhumbSolve -p 10 -i \ 40.600000000000001 -73.799999999999997 51.600000000000001 -0.5 (Inverse1)
460
- # RhumbSolve 'Test' 5: azi12=77.768389710255661, s12=5771083.383328028, S12=37395209100030.391 (0)
442
+ #
443
+ # RhumbSolve 'Test'@4: /opt/local/bin/RhumbSolve -p 10 -i \ 40.6 -73.8 51.6 -0.5 (Inverse)
444
+ # RhumbSolve 'Test'@4: '77.768389710255676 5771083.3833280280 37395209100030.383' (0, stdout/-err)
445
+ # RhumbSolve 'Test'@4: azi12=77.768389710255676, s12=5771083.383328028, S12=37395209100030.383 (0)
446
+ # Inverse: GDict(a12=51.929543, azi12=77.76839, lat1=40.6, lat2=51.6, lon1=-73.8, lon2=-0.5, s12=5771083.383328, S12=37395209100030.382812)
447
+ # RhumbSolve 'Test'@5: /opt/local/bin/RhumbSolve -p 10 -i \ 40.6 -73.8 51.6 -0.5 (Inverse1)
448
+ # RhumbSolve 'Test'@5: '77.768389710255676 5771083.3833280280 37395209100030.383' (0, stdout/-err)
449
+ # RhumbSolve 'Test'@5: azi12=77.768389710255676, s12=5771083.383328028, S12=37395209100030.383 (0)
461
450
  # Inverse1: 51.929542507561905
462
- # RhumbSolve 'Test' 6: /opt/local/bin/RhumbSolve -p 10 -i \ 40.600000000000001 -73.799999999999997 51.600000000000001 -0.5 (Inverse3)
463
- # RhumbSolve 'Test' 6: azi12=77.768389710255661, s12=5771083.383328028, S12=37395209100030.391 (0)
451
+ # RhumbSolve 'Test'@6: /opt/local/bin/RhumbSolve -p 10 -i \ 40.6 -73.8 51.6 -0.5 (Inverse3)
452
+ # RhumbSolve 'Test'@6: '77.768389710255676 5771083.3833280280 37395209100030.383' (0, stdout/-err)
453
+ # RhumbSolve 'Test'@6: azi12=77.768389710255676, s12=5771083.383328028, S12=37395209100030.383 (0)
464
454
  # Inverse3: Distance3Tuple(distance=5771083.383328, initial=77.76839, final=77.76839)
465
- # RhumbSolve 'Test' 7: /opt/local/bin/RhumbSolve -p 10 -i \ 40.600000000000001 -73.799999999999997 35.799999999999997 140.300000000000011 (Inverse)
466
- # RhumbSolve 'Test' 7: azi12=-92.388887981699654, s12=12782581.0676841699, S12=-63760642939072.5 (0)
467
-
455
+ #
456
+ # RhumbSolve 'Test'@7: /opt/local/bin/RhumbSolve -p 10 -i \ 40.6 -73.8 35.8 140.30000000000001 (Inverse)
457
+ # RhumbSolve 'Test'@7: '-92.388887981699654 12782581.0676841699 -63760642939072.500' (0, stdout/-err)
458
+ # RhumbSolve 'Test'@7: azi12=-92.388887981699654, s12=12782581.0676841699, S12=-63760642939072.5 (0)
468
459
  # Inverse: GDict(a12=115.02062, azi12=-92.388888, lat1=40.6, lat2=35.8, lon1=-73.8, lon2=140.3, s12=12782581.067684, S12=-63760642939072.5)
469
- # RhumbSolve 'Test' 8: /opt/local/bin/RhumbSolve -p 10 -i \ 40.600000000000001 -73.799999999999997 35.799999999999997 140.300000000000011 (Inverse1)
470
- # RhumbSolve 'Test' 8: azi12=-92.388887981699654, s12=12782581.0676841699, S12=-63760642939072.5 (0)
460
+ # RhumbSolve 'Test'@8: /opt/local/bin/RhumbSolve -p 10 -i \ 40.6 -73.8 35.8 140.30000000000001 (Inverse1)
461
+ # RhumbSolve 'Test'@8: '-92.388887981699654 12782581.0676841699 -63760642939072.500' (0, stdout/-err)
462
+ # RhumbSolve 'Test'@8: azi12=-92.388887981699654, s12=12782581.0676841699, S12=-63760642939072.5 (0)
471
463
  # Inverse1: 115.02061966879248
472
- # RhumbSolve 'Test' 9: /opt/local/bin/RhumbSolve -p 10 -i \ 40.600000000000001 -73.799999999999997 35.799999999999997 140.300000000000011 (Inverse3)
473
- # RhumbSolve 'Test' 9: azi12=-92.388887981699654, s12=12782581.0676841699, S12=-63760642939072.5 (0)
464
+ # RhumbSolve 'Test'@9: /opt/local/bin/RhumbSolve -p 10 -i \ 40.6 -73.8 35.8 140.30000000000001 (Inverse3)
465
+ # RhumbSolve 'Test'@9: '-92.388887981699654 12782581.0676841699 -63760642939072.500' (0, stdout/-err)
466
+ # RhumbSolve 'Test'@9: azi12=-92.388887981699654, s12=12782581.0676841699, S12=-63760642939072.5 (0)
474
467
  # Inverse3: Distance3Tuple(distance=12782581.067684, initial=267.611112, final=267.611112)
475
-
476
- # Position: True GDict(azi12=51, lat1=40.6, lat2=71.6889, lon1=-73.8, lon2=0.25552, s12=5500000.0, S12=44095641862956.109375)
468
+ #
469
+ # Line: RhumbLineSolve(invokation=1, rhumb=RhumbSolve(ellipsoid=Ellipsoid(name='WGS84', a=6378137, f=0.00335281, f_=298.25722356, b=6356752.31424518), invokation=9, RhumbSolve='/opt/local/bin/RhumbSolve', status=0), status=0)
470
+ # Position: GDict(azi12=51, lat1=40.6, lat2=71.6889, lon1=-73.8, lon2=0.25552, s12=5500000.0, S12=44095641862956.132812) True
477
471
 
478
472
 
479
473
  # % python3 -m pygeodesy.rhumb.solve 60 0 30 0 45 1e6
@@ -497,9 +491,22 @@ if __name__ == _DMAIN_:
497
491
  # 15 3083112.636 49.63458221, 25.76787606, 4.96052409e-16
498
492
 
499
493
 
494
+ # % python3 -m pygeodesy.rhumb.solve 60 0 30 0 45 1e6
495
+
496
+ # version: /opt/local/bin/RhumbSolve: GeographicLib version 2.7
497
+ # s23 lat3 lon3 cos()
498
+ # 1 1000000.000 36.37559999, 7.58982303, -5.83098638e-01
499
+ # 2 4532573.097 58.84251798, 41.57078946, 4.05349594e-01
500
+ # 3 2233216.895 44.22871762, 17.86660260, -2.91432608e-01
501
+ # 4 3168401.173 50.17678842, 26.60741388, 3.00555188e-02
502
+ # 5 3082690.347 49.63189746, 25.76374255, -1.49446251e-04
503
+ # 6 3083112.629 49.63458216, 25.76787599, -2.59865140e-09
504
+ # 7 3083112.636 49.63458221, 25.76787606, -4.96052409e-16
505
+ # 8 3083112.636 49.63458221, 25.76787606, 0.00000000e+00
506
+
500
507
  # **) MIT License
501
508
  #
502
- # Copyright (C) 2022-2025 -- mrJean1 at Gmail -- All Rights Reserved.
509
+ # Copyright (C) 2022-2026 -- mrJean1 at Gmail -- All Rights Reserved.
503
510
  #
504
511
  # Permission is hereby granted, free of charge, to any person obtaining a
505
512
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/simplify.py CHANGED
@@ -514,7 +514,7 @@ def simplifyVW(points, area=_1mm, radius=R_M, indices=False,
514
514
 
515
515
  # **) MIT License
516
516
  #
517
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
517
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
518
518
  #
519
519
  # Permission is hereby granted, free of charge, to any person obtaining a
520
520
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/solveBase.py CHANGED
@@ -23,7 +23,7 @@ from pygeodesy.units import Precision_
23
23
  from pygeodesy.utily import unroll180
24
24
 
25
25
  __all__ = _ALL_LAZY.solveBase
26
- __version__ = '25.09.02'
26
+ __version__ = '25.12.06'
27
27
 
28
28
  _ERROR_ = 'ERROR'
29
29
 
@@ -54,8 +54,8 @@ class _SolveCapsBase(_CapsBase):
54
54
  _invokat = _AT_
55
55
  _invokation = 0
56
56
  _linelimit = 0
57
- _prec = Precision_(prec=DIG)
58
- _prec2stdin = DIG
57
+ _prec = Precision_(prec=DIG) # -5 stdout
58
+ _prec2stdin = DIG - 1
59
59
  _Xable_name = NN # executable basename
60
60
  _Xable_path = NN # executable path
61
61
  _status = None
@@ -304,6 +304,11 @@ class _SolveCapsBase(_CapsBase):
304
304
  '''
305
305
  return self._status
306
306
 
307
+ def _toStdin(self, floats):
308
+ '''(INTERNAL) Convert C{floats} to strings.
309
+ '''
310
+ return strs(floats, prec=self._prec2stdin, fmt=Fmt.F) # not .G!
311
+
307
312
  @property
308
313
  def verbose(self):
309
314
  '''Get the C{verbose} option (C{bool}).
@@ -347,6 +352,17 @@ class _SolveBase(_SolveCapsBase):
347
352
  _update_all(self)
348
353
  self._reverse2 = reverse2
349
354
 
355
+ def toStr(self, prec=6, sep=_COMMASPACE_, **other): # PYCHOK signature
356
+ '''Return this instance as string.
357
+
358
+ @kwarg prec_sep: Keyword argumens C{B{prec}=6} and C{B{sep}=", "}
359
+ for the C{float} C{prec}ision, number of decimal digits
360
+ (0..9) and the C{sep}arator string to join. Trailing
361
+ zero decimals are stripped for B{C{prec}} values of 1
362
+ and above, but kept for negative B{C{prec}} values.
363
+ '''
364
+ return sep.join(pairs(other, prec=prec))
365
+
350
366
  @Property
351
367
  def unroll(self):
352
368
  '''Get the C{lon2} unroll'ing (C{bool}).
@@ -363,7 +379,51 @@ class _SolveBase(_SolveCapsBase):
363
379
  self._unroll = unroll
364
380
 
365
381
 
366
- class _SolveGDictBase(_SolveBase):
382
+ class _Solve3Base(_SolveBase):
383
+ '''(NTERNAL) Base class for C{_Geodesic[3]SolveBase}.
384
+ '''
385
+
386
+ @Property_RO
387
+ def _cmdDirect(self):
388
+ '''(INTERNAL) Get the C{[3]Solve} I{Direct} cmd (C{tuple}).
389
+ '''
390
+ return self._cmdBasic
391
+
392
+ @Property_RO
393
+ def _cmdInverse(self):
394
+ '''(INTERNAL) Get the C{[3]Solve} I{Inverse} cmd (C{tuple}).
395
+ '''
396
+ return self._cmdBasic + ('-i',)
397
+
398
+ def _GDictDirect(self, lat, lon, azi, arcmode, s12_a12, outmask=_UNUSED_, **floats): # PYCHOK for .geodesicx.gxarea
399
+ '''(INTERNAL) Get C{_GenDirect}-like result as C{GDict}.
400
+ '''
401
+ if arcmode:
402
+ raise self._Error(arcmode=arcmode, txt=str(NotImplemented))
403
+ return self._GDictInvoke(self._cmdDirect, self._Names_Direct,
404
+ lat, lon, azi, s12_a12, **floats)
405
+
406
+ def _GDictInverse(self, lat1, lon1, lat2, lon2, outmask=_UNUSED_, **floats): # PYCHOK for .geodesicx.gxarea
407
+ '''(INTERNAL) Get C{_GenInverse}-like result as C{GDict}, but I{without} C{_SALP_CALPs_}.
408
+ '''
409
+ return self._GDictInvoke(self._cmdInverse, self._Names_Inverse,
410
+ lat1, lon1, lat2, lon2, **floats)
411
+
412
+ def _GDictInvoke(self, cmd, Names, *args, **floats):
413
+ '''(INTERNAL) Invoke C{Solve}, return results as C{Dict}.
414
+ '''
415
+ return self._DictInvoke2(cmd, args, Names, GDict, **floats)[0] # _R
416
+
417
+ def toStr(self, **prec_sep_other): # PYCHOK signature
418
+ '''Return this instance as string.
419
+
420
+ @kwarg prec_sep: See L{toStr<pygeodesy.solveBase._SolveBase.toStr>}.
421
+ '''
422
+ return _SolveBase.toStr(self, invokation=self.invokation,
423
+ status=self.status, **prec_sep_other)
424
+
425
+
426
+ class _SolveGDictBase(_Solve3Base):
367
427
  '''(NTERNAL) Base class for C{_GeodesicSolveBase} and C{_RhumbSolveBase}.
368
428
  '''
369
429
 
@@ -392,42 +452,11 @@ class _SolveGDictBase(_SolveBase):
392
452
  '''
393
453
  return self._GDictDirect(lat1, lon1, azi1, True, a12)
394
454
 
395
- @Property_RO
396
- def _cmdDirect(self):
397
- '''(INTERNAL) Get the C{Solve} I{Direct} cmd (C{tuple}).
398
- '''
399
- return self._cmdBasic
400
-
401
- @Property_RO
402
- def _cmdInverse(self):
403
- '''(INTERNAL) Get the C{Solve} I{Inverse} cmd (C{tuple}).
404
- '''
405
- return self._cmdBasic + ('-i',)
406
-
407
455
  def Direct(self, lat1, lon1, azi1, s12, outmask=_UNUSED_): # PYCHOK unused
408
456
  '''Return the C{Direct} result at distance C{s12}.
409
457
  '''
410
458
  return self._GDictDirect(lat1, lon1, azi1, False, s12)
411
459
 
412
- def _GDictDirect(self, lat, lon, azi, arcmode, s12_a12, outmask=_UNUSED_, **floats): # PYCHOK for .geodesicx.gxarea
413
- '''(INTERNAL) Get C{_GenDirect}-like result as C{GDict}.
414
- '''
415
- if arcmode:
416
- raise self._Error(arcmode=arcmode, txt=str(NotImplemented))
417
- return self._GDictInvoke(self._cmdDirect, self._Names_Direct,
418
- lat, lon, azi, s12_a12, **floats)
419
-
420
- def _GDictInverse(self, lat1, lon1, lat2, lon2, outmask=_UNUSED_, **floats): # PYCHOK for .geodesicx.gxarea
421
- '''(INTERNAL) Get C{_GenInverse}-like result as C{GDict}, but I{without} C{_SALP_CALPs_}.
422
- '''
423
- return self._GDictInvoke(self._cmdInverse, self._Names_Inverse,
424
- lat1, lon1, lat2, lon2, **floats)
425
-
426
- def _GDictInvoke(self, cmd, Names, *args, **floats):
427
- '''(INTERNAL) Invoke C{Solve}, return results as C{Dict}.
428
- '''
429
- return self._DictInvoke2(cmd, args, Names, GDict, **floats)[0] # _R
430
-
431
460
  def Inverse(self, lat1, lon1, lat2, lon2, outmask=_UNUSED_): # PYCHOK unused
432
461
  '''Return the C{Inverse} result.
433
462
  '''
@@ -443,12 +472,10 @@ class _SolveGDictBase(_SolveBase):
443
472
  # XXX self.DISTANCE needed for 'a12'?
444
473
  return abs(float(r.a12))
445
474
 
446
- def _toStr(self, prec=6, sep=_COMMASPACE_, **Solve): # PYCHOK signature
447
- '''(INTERNAL) Return this C{_Solve} as string..
475
+ def toStr(self, **prec_sep_other): # PYCHOK signature
476
+ '''Return this C{_Solve} as string.
448
477
  '''
449
- d = dict(ellipsoid=self.ellipsoid, invokation=self.invokation,
450
- status=self.status, **Solve)
451
- return sep.join(pairs(d, prec=prec))
478
+ return _Solve3Base.toStr(self, ellipsoid=self.ellipsoid, **prec_sep_other)
452
479
 
453
480
 
454
481
  class _SolveGDictLineBase(_SolveGDictBase):
@@ -476,8 +503,7 @@ class _SolveGDictLineBase(_SolveGDictBase):
476
503
  _, azi = _xkwds_item2(azi)
477
504
  return lat1, lon1, azi
478
505
 
479
- t = strs(_lla3(**self._lla1), prec=DIG, fmt=Fmt.F) # self._solve.prec
480
- return self._cmdBasic + ('-L',) + t
506
+ return self._cmdBasic + ('-L',) + self._toStdin(_lla3(**self._lla1))
481
507
 
482
508
  @property_RO
483
509
  def datum(self):
@@ -503,20 +529,17 @@ class _SolveGDictLineBase(_SolveGDictBase):
503
529
  '''
504
530
  return self._lla1.lon1
505
531
 
506
- def _toStr(self, prec=6, sep=_COMMASPACE_, **solve): # PYCHOK signature
507
- '''(INTERNAL) Return this C{_LineSolve} as string..
532
+ def toStr(self, **prec_sep_other): # PYCHOK signature
533
+ '''Return this C{_LineSolve} as string.
508
534
  '''
509
- d = dict(ellipsoid=self.ellipsoid, invokation=self._solve.invokation,
510
- lat1=self.lat1, lon1=self.lon1,
511
- status=self._solve.status, **solve)
512
- return sep.join(pairs(d, prec=prec))
535
+ return _Solve3Base.toStr(self, **prec_sep_other)
513
536
 
514
537
 
515
538
  __all__ += _ALL_DOCS(_SolveBase, _SolveCapsBase, _SolveGDictBase, _SolveGDictLineBase)
516
539
 
517
540
  # **) MIT License
518
541
  #
519
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
542
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
520
543
  #
521
544
  # Permission is hereby granted, free of charge, to any person obtaining a
522
545
  # copy of this software and associated documentation files (the "Software"),
@@ -701,7 +701,7 @@ __all__ += _ALL_DOCS(CartesianSphericalBase, LatLonSphericalBase)
701
701
 
702
702
  # **) MIT License
703
703
  #
704
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
704
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
705
705
  #
706
706
  # Permission is hereby granted, free of charge, to any person obtaining a
707
707
  # copy of this software and associated documentation files (the "Software"),
@@ -1205,7 +1205,7 @@ __all__ += _ALL_OTHER(Cartesian, LatLon, Nvector, # classes
1205
1205
 
1206
1206
  # **) MIT License
1207
1207
  #
1208
- # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1208
+ # Copyright (C) 2016-2026 -- mrJean1 at Gmail -- All Rights Reserved.
1209
1209
  #
1210
1210
  # Permission is hereby granted, free of charge, to any person obtaining a
1211
1211
  # copy of this software and associated documentation files (the "Software"),