pygeodesy 24.10.10__py2.py3-none-any.whl → 24.11.11__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 (76) hide show
  1. {PyGeodesy-24.10.10.dist-info → PyGeodesy-24.11.11.dist-info}/METADATA +12 -12
  2. PyGeodesy-24.11.11.dist-info/RECORD +118 -0
  3. {PyGeodesy-24.10.10.dist-info → PyGeodesy-24.11.11.dist-info}/WHEEL +1 -1
  4. pygeodesy/__init__.py +14 -14
  5. pygeodesy/__main__.py +5 -5
  6. pygeodesy/albers.py +12 -17
  7. pygeodesy/azimuthal.py +51 -61
  8. pygeodesy/basics.py +60 -62
  9. pygeodesy/booleans.py +87 -79
  10. pygeodesy/cartesianBase.py +6 -6
  11. pygeodesy/constants.py +23 -19
  12. pygeodesy/css.py +7 -8
  13. pygeodesy/datums.py +3 -3
  14. pygeodesy/deprecated/__init__.py +1 -1
  15. pygeodesy/deprecated/classes.py +9 -9
  16. pygeodesy/deprecated/functions.py +6 -6
  17. pygeodesy/dms.py +250 -270
  18. pygeodesy/ecef.py +11 -14
  19. pygeodesy/ellipsoidalBase.py +106 -121
  20. pygeodesy/ellipsoidalBaseDI.py +114 -118
  21. pygeodesy/ellipsoidalExact.py +35 -37
  22. pygeodesy/ellipsoidalNvector.py +4 -4
  23. pygeodesy/ellipsoidalVincenty.py +2 -2
  24. pygeodesy/ellipsoids.py +10 -51
  25. pygeodesy/elliptic.py +14 -14
  26. pygeodesy/errors.py +28 -28
  27. pygeodesy/etm.py +92 -68
  28. pygeodesy/fmath.py +42 -40
  29. pygeodesy/formy.py +7 -6
  30. pygeodesy/fsums.py +72 -51
  31. pygeodesy/geodesici.py +43 -40
  32. pygeodesy/geodesicw.py +17 -16
  33. pygeodesy/geodesicx/__init__.py +2 -2
  34. pygeodesy/geodesicx/gxarea.py +3 -2
  35. pygeodesy/geodsolve.py +79 -39
  36. pygeodesy/geohash.py +2 -2
  37. pygeodesy/geoids.py +32 -31
  38. pygeodesy/heights.py +2 -2
  39. pygeodesy/internals.py +201 -147
  40. pygeodesy/interns.py +23 -20
  41. pygeodesy/karney.py +62 -13
  42. pygeodesy/ktm.py +11 -13
  43. pygeodesy/latlonBase.py +18 -20
  44. pygeodesy/lazily.py +210 -218
  45. pygeodesy/lcc.py +4 -4
  46. pygeodesy/ltp.py +10 -10
  47. pygeodesy/ltpTuples.py +74 -75
  48. pygeodesy/mgrs.py +20 -21
  49. pygeodesy/named.py +15 -10
  50. pygeodesy/nvectorBase.py +1 -1
  51. pygeodesy/osgr.py +9 -12
  52. pygeodesy/points.py +2 -2
  53. pygeodesy/props.py +35 -14
  54. pygeodesy/resections.py +9 -10
  55. pygeodesy/rhumb/__init__.py +1 -1
  56. pygeodesy/rhumb/bases.py +5 -5
  57. pygeodesy/rhumb/solve.py +9 -10
  58. pygeodesy/simplify.py +5 -5
  59. pygeodesy/solveBase.py +7 -25
  60. pygeodesy/sphericalBase.py +20 -23
  61. pygeodesy/sphericalNvector.py +103 -145
  62. pygeodesy/sphericalTrigonometry.py +68 -73
  63. pygeodesy/streprs.py +5 -5
  64. pygeodesy/trf.py +6 -4
  65. pygeodesy/triaxials.py +46 -9
  66. pygeodesy/units.py +5 -4
  67. pygeodesy/ups.py +6 -6
  68. pygeodesy/utily.py +2 -2
  69. pygeodesy/utm.py +7 -7
  70. pygeodesy/vector2d.py +13 -13
  71. pygeodesy/vector3d.py +19 -21
  72. pygeodesy/vector3dBase.py +21 -19
  73. pygeodesy/webmercator.py +4 -4
  74. pygeodesy/wgrs.py +4 -4
  75. PyGeodesy-24.10.10.dist-info/RECORD +0 -118
  76. {PyGeodesy-24.10.10.dist-info → PyGeodesy-24.11.11.dist-info}/top_level.txt +0 -0
pygeodesy/interns.py CHANGED
@@ -3,7 +3,7 @@
3
3
  u'''Single C{str}ing constants, C{intern}'ed across C{pygeodesy}
4
4
  modules and function L{pygeodesy.machine}.
5
5
  '''
6
- import sys as _sys
6
+ import sys as _sys # in .internals, .lazily
7
7
  try:
8
8
  _intern = intern # PYCHOK in .lazily, .trf
9
9
  except NameError: # Python 3+
@@ -11,7 +11,7 @@ except NameError: # Python 3+
11
11
 
12
12
  _COMMASPACE_ = ', ' # overriden below
13
13
  _SUB_PACKAGES = 'auxilats', 'deprecated', 'geodesicx', 'rhumb' # PYCHOK in ...
14
- # ... .lazily, make._dist, MANIFEST, setup.setup, test.bases, .testModules
14
+ # ... .lazily, make._dist, MANIFEST, setup.setup, test/bases, test/testModules
15
15
 
16
16
 
17
17
  class _Dash(str):
@@ -199,7 +199,8 @@ _distance_ = 'distance' # PYCHOK OK
199
199
  _distant_ = _Prefix('distant') # PYCHOK OK
200
200
  _doesn_t_exist_ = "doesn't exist" # PYCHOK OK
201
201
  _DOT_ = Str_('.') # PYCHOK OK
202
- _dunder_name_ = '__name__' # PYCHOK _DUNDER_(NN, _name_, NN)
202
+ _DUNDER_all_ = '__all__' # PYCHOK OK
203
+ _DUNDER_name_ = '__name__' # PYCHOK _DUNDER_(NN, _name_, NN)
203
204
  _duplicate_ = 'duplicate' # PYCHOK OK
204
205
  _e_ = 'e' # PYCHOK OK
205
206
  _E_ = 'E' # PYCHOK OK
@@ -309,7 +310,6 @@ _negative_ = 'negative' # PYCHOK OK
309
310
  _NL_ = Str_('\n') # PYCHOK OK
310
311
  _NLATvar_ = Str_(_NL_ + '@var ') # PYCHOK OK
311
312
  _NLHASH_ = Str_(_NL_ + '# ') # PYCHOK OK
312
- # _NLNL_ = _DNL_ # PYCHOK OK
313
313
  _NN_ = 'NN' # PYCHOK OK
314
314
  _no_ = _Prefix('no') # PYCHOK OK
315
315
  _northing_ = 'northing' # PYCHOK OK
@@ -341,7 +341,7 @@ _points_ = 'points' # PYCHOK OK
341
341
  _pole_ = 'pole' # PYCHOK OK
342
342
  _precision_ = 'precision' # PYCHOK OK
343
343
  _prime_vertical_ = 'prime_vertical' # PYCHOK OK
344
- _pygeodesy_ = 'pygeodesy' # PYCHOK OK
344
+ _pygeodesy_ = 'pygeodesy' # PYCHOK OK # in test/bases
345
345
  _pygeodesy_abspath_ = 'pygeodesy_abspath' # PYCHOK OK
346
346
  _PyPy__ = _PyPy__('PyPy ') # PYCHOK + _SPACE_
347
347
  _Python_ = _Python_('Python') # PYCHOK singleton
@@ -429,7 +429,7 @@ _SW_ = _S_ + _W_ # PYCHOK negative ones
429
429
 
430
430
  _DDOT_ = Str_(_DOT_ * 2) # PYCHOK OK
431
431
  # _DEQUAL_ = Str_(_EQUAL_ * 2) # PYCHOK OK
432
- _DNL_ = Str_(_NL_ * 2) # PYCHOK OK
432
+ # _DNL_ = Str_(_NL_ * 2) # PYCHOK OK
433
433
  # _DSLASH_ = Str_(_SLASH_ * 2) # PYCHOK OK
434
434
  # _DSTAR_ = Str_(_STAR_ * 2) # PYCHOK OK
435
435
  _DUNDER_ = Str_(_UNDER_ * 2) # PYCHOK OK
@@ -441,23 +441,26 @@ _LR_PAIRS = {_LANGLE_: _RANGLE_,
441
441
 
442
442
  __all__ = (_NN_, # NOT MISSING!
443
443
  Str_.__name__) # classes
444
- __version__ = '24.08.30'
444
+ __version__ = '24.10.19'
445
445
 
446
446
  if __name__ == '__main__':
447
447
 
448
- from pygeodesy import itemsorted, printf
449
-
450
- t = b = 0
451
- for n, v in itemsorted(locals(), asorted=False, reverse=True):
452
- if n.endswith(_UNDER_) and n.startswith(_UNDER_) and \
453
- not n.startswith(_DUNDER_):
454
- t += 1
455
- b += len(v)
456
- m = n[1:-1]
457
- if m != v and m.replace(_UNDER_, _SPACE_) != v:
458
- printf('%4d: %s = %r', t, n, v)
459
- n = len(locals())
460
- printf('%4d (%d) names, %s chars total, %.2f chars avg', t, n, b, float(b) / t, nl=1)
448
+ def _main():
449
+ from pygeodesy import itemsorted, printf
450
+
451
+ t = b = 0
452
+ for n, v in itemsorted(locals(), asorted=False, reverse=True):
453
+ if n.endswith(_UNDER_) and n.startswith(_UNDER_) and \
454
+ not n.startswith(_DUNDER_):
455
+ t += 1
456
+ b += len(v)
457
+ m = n[1:-1]
458
+ if m != v and m.replace(_UNDER_, _SPACE_) != v:
459
+ printf('%4d: %s = %r', t, n, v)
460
+ n = len(locals())
461
+ printf('%4d (%d) names, %s chars total, %.2f chars avg', t, n, b, float(b) / t, nl=1)
462
+
463
+ _main()
461
464
 
462
465
  # **) MIT License
463
466
  #
pygeodesy/karney.py CHANGED
@@ -64,7 +64,7 @@ Karney-based functionality
64
64
  <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1Intersect.html>} from I{GeographicLib 2.3+}
65
65
 
66
66
  - L{JacobiConformal} -- U{JacobiConformal
67
- <https://geographiclib.sourceforge.io/C++/doc/classGeographicLib_1_1experimental_1_1JacobiConformal.html>}
67
+ <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1experimental_1_1JacobiConformal.html>}
68
68
 
69
69
  - L{KTransverseMercator} - U{TransverseMercator
70
70
  <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1TransverseMercator.html>}
@@ -143,18 +143,18 @@ in C{pygeodesy} are based on I{Karney}'s post U{Area of a spherical polygon
143
143
  # make sure int/int division yields float quotient, see .basics
144
144
  from __future__ import division as _; del _ # PYCHOK semicolon
145
145
 
146
- from pygeodesy.basics import _copysign, isint, neg, unsigned0, _xgeographiclib, \
147
- _zip, _version_info
146
+ from pygeodesy.basics import _copysign, isint, neg, unsigned0, \
147
+ _xgeographiclib, _zip
148
148
  from pygeodesy.constants import NAN, _isfinite as _math_isfinite, _0_0, \
149
149
  _1_16th, _1_0, _2_0, _180_0, _N_180_0, _360_0
150
150
  from pygeodesy.errors import GeodesicError, _ValueError, _xkwds
151
151
  from pygeodesy.fmath import cbrt, fremainder, norm2 # Fhorner, Fsum
152
- # from pygeodesy.internals import _version_info # from .basics
153
- from pygeodesy.interns import NN, _2_, _a12_, _area_, _azi1_, _azi2_, _azi12_, \
152
+ from pygeodesy.internals import _getenv, _popen2, _PYGEODESY, _version_info
153
+ from pygeodesy.interns import NN, _a12_, _area_, _azi1_, _azi2_, _azi12_, \
154
154
  _composite_, _lat1_, _lat2_, _lon1_, _lon2_, \
155
155
  _m12_, _M12_, _M21_, _number_, _s12_, _S12_, \
156
- _UNDER_, _X_, _BAR_ # PYCHOK used!
157
- from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS, _getenv
156
+ _SPACE_, _UNDER_, _X_, _1_, _2_, _BAR_ # PYCHOK used!
157
+ from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS
158
158
  from pygeodesy.named import ADict, _NamedBase, _NamedTuple, notImplemented, _Pass
159
159
  from pygeodesy.props import deprecated_method, Property_RO, property_RO, \
160
160
  property_ROnce
@@ -165,11 +165,12 @@ 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.09.13'
168
+ __version__ = '24.11.09'
169
169
 
170
- _K_2_0 = _getenv('PYGEODESY_GEOGRAPHICLIB', _2_)
171
- _K_2_4 = _K_2_0 == '2.4'
172
- _K_2_0 = _K_2_0 == _2_ or _K_2_4
170
+ _2_4_ = '2.4'
171
+ _K_2_0 = _getenv(_PYGEODESY(_xgeographiclib, 1), _2_)
172
+ _K_2_4 = _K_2_0 == _2_4_
173
+ _K_2_0 = _K_2_4 or (_K_2_0 == _2_)
173
174
  _perimeter_ = 'perimeter'
174
175
 
175
176
 
@@ -576,8 +577,8 @@ class _kWrapped(object): # in .geodesicw
576
577
 
577
578
  @property_RO
578
579
  def Math_K_2(self):
579
- return ('_K_2_4' if _K_2_4 else
580
- ('_K_2_0' if _K_2_0 else '_K_1_0')) if self.Math else NN
580
+ return (_2_4_ if _K_2_4 else
581
+ (_2_ if _K_2_0 else _1_)) if self.Math else NN
581
582
 
582
583
  _wrapped = _kWrapped() # PYCHOK singleton, .datum, .test/base.py
583
584
 
@@ -639,6 +640,54 @@ class Rhumb8Tuple(_GTuple):
639
640
  return _MODS.deprecated.classes.Rhumb7Tuple(self[:-1])
640
641
 
641
642
 
643
+ class _Xables(object):
644
+ '''(INTERNAL) Get I{Karney}'s executable paths from/and env vars.
645
+ '''
646
+ bin_ = '/opt/local/bin/' # '/opt/local/Cellar/geographiclib/2.3/bin/' # HomeBrew on macOS
647
+ ENV = NN
648
+
649
+ def GeoConvert(self, *dir_):
650
+ return self._path(self.GeoConvert, *dir_)
651
+
652
+ def GeodSolve(self, *dir_):
653
+ return self._path(self.GeodSolve, *dir_)
654
+
655
+ def IntersectTool(self, *dir_):
656
+ return self._path(self.IntersectTool, *dir_)
657
+
658
+ def RhumbSolve(self, *dir_):
659
+ return self._path(self.RhumbSolve, *dir_)
660
+
661
+ def name_version(self, path, base=True):
662
+ # return C{(path + ' ' + version)} of an executable
663
+ if path:
664
+ try:
665
+ r, s = _popen2((path, '--version'))
666
+ if base:
667
+ path = _MODS.os.path.basename(path)
668
+ r = _SPACE_(path, r.split()[-1])
669
+ else:
670
+ r = _MODS.streprs.Fmt.PARENSPACED(r, s)
671
+ return r
672
+ except (IndexError, IOError, OSError):
673
+ pass
674
+ return NN
675
+
676
+ def _path(self, which, *dir_):
677
+ self.ENV = E = _PYGEODESY(which)
678
+ return _getenv(E, NN) or \
679
+ (NN(dir_[0], which.__name__) if dir_ else E)
680
+
681
+ def X_not(self, path):
682
+ return 'env %s=%r not executable' % (self.ENV, path)
683
+
684
+ def X_OK(self, path): # is C{path} an executable?
685
+ os = _MODS.os # import os
686
+ return os.access(path, os.X_OK) if path else False
687
+
688
+ _Xables = _Xables() # PYCHOK singleton
689
+
690
+
642
691
  def _around(x): # in .utily.sincos2d
643
692
  '''I{Coarsen} a scalar by rounding small values to underflow to C{0.0}.
644
693
 
pygeodesy/ktm.py CHANGED
@@ -49,8 +49,7 @@ from pygeodesy.constants import INF, _K0_UTM, PI, PI_2, _0_0s, _0_0, \
49
49
  from pygeodesy.datums import Datum, _spherical_datum, _WGS84, _EWGS84
50
50
  # from pygeodesy.ellipsoids import _EWGS84 # from .datums
51
51
  from pygeodesy.errors import _ValueError, _xkwds_pop2, _Xorder
52
- from pygeodesy.fmath import hypot, hypot1
53
- from pygeodesy.fsums import fsum1f_
52
+ from pygeodesy.fmath import fdot_, hypot, hypot1
54
53
  from pygeodesy.interns import _COMMASPACE_, _singular_
55
54
  from pygeodesy.karney import _atan2d, _diff182, _fix90, _norm180, \
56
55
  _polynomial, _unsigned2
@@ -67,7 +66,7 @@ from cmath import polar
67
66
  from math import atan2, asinh, cos, cosh, degrees, fabs, sin, sinh, sqrt, tanh
68
67
 
69
68
  __all__ = _ALL_LAZY.ktm
70
- __version__ = '24.08.31'
69
+ __version__ = '24.11.11'
71
70
 
72
71
 
73
72
  class KTMError(_ValueError):
@@ -433,10 +432,10 @@ def _cma(a, b0, b1, Cn):
433
432
  @see: CPython function U{_Py_c_prod<https://GitHub.com/python/
434
433
  cpython/blob/main/Objects/complexobject.c>}.
435
434
 
436
- @note: Python function C{cmath.fsum} is no longer available.
435
+ @note: Python function C{cmath.fsum} no longer exists.
437
436
  '''
438
- r = fsum1f_(a.real * b0.real, -a.imag * b0.imag, -b1.real, Cn)
439
- j = fsum1f_(a.real * b0.imag, a.imag * b0.real, -b1.imag)
437
+ r = fdot_(a.real, b0.real, -a.imag, b0.imag, -b1.real, _1_0, start=Cn)
438
+ j = fdot_(a.real, b0.imag, a.imag, b0.real, -b1.imag, _1_0)
440
439
  return complex(r, j)
441
440
 
442
441
 
@@ -461,19 +460,18 @@ def _Cyxgk4(E, xi_, eta_, C):
461
460
  y0 = complex(Cn) # +0j
462
461
  z0 = complex(Cn * (n * 2))
463
462
  n -= 1
464
- _c = _cma
465
463
  while n > 0:
466
464
  Cn = C[n]
467
- y1 = _c(a, y0, y1, Cn)
468
- z1 = _c(a, z0, z1, Cn * (n * 2))
465
+ y1 = _cma(a, y0, y1, Cn)
466
+ z1 = _cma(a, z0, z1, Cn * (n * 2))
469
467
  n -= 1
470
468
  Cn = C[n]
471
- y0 = _c(a, y1, y0, Cn)
472
- z0 = _c(a, z1, z0, Cn * (n * 2))
469
+ y0 = _cma(a, y1, y0, Cn)
470
+ z0 = _cma(a, z1, z0, Cn * (n * 2))
473
471
  n -= 1
474
472
  # assert n == 0
475
- x = _c(s, y0, -x, _0_0)
476
- c = _c(c, z0, z1, _1_0)
473
+ x = _cma(s, y0, -x, _0_0)
474
+ c = _cma(c, z0, z1, _1_0)
477
475
 
478
476
  # Gauss-Schreiber to Gauss-Krueger TM
479
477
  # C{cmath.polar} handles INF, NAN, etc.
pygeodesy/latlonBase.py CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  u'''(INTERNAL) Base class L{LatLonBase} for all elliposiodal, spherical and N-vectorial C{LatLon} classes.
5
5
 
6
- @see: I{(C) Chris Veness}' U{latlong<https://www.Movable-Type.co.UK/scripts/latlong.html>},
6
+ @see: I{(C) Chris Veness 2005-2024}' U{latlong<https://www.Movable-Type.co.UK/scripts/latlong.html>},
7
7
  U{-ellipsoidal<https://www.Movable-Type.co.UK/scripts/geodesy/docs/latlon-ellipsoidal.js.html>} and
8
8
  U{-vectors<https://www.Movable-Type.co.UK/scripts/latlong-vectors.html>} and I{Charles Karney}'s
9
9
  U{Rhumb<https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1Rhumb.html>} and
@@ -47,14 +47,14 @@ from pygeodesy.units import _isDegrees, _isRadius, Distance_, Lat, Lon, \
47
47
  Height, Radius, Radius_, Scalar, Scalar_
48
48
  from pygeodesy.utily import _unrollon, _unrollon3, _Wrap
49
49
  # from pygeodesy.vector2d import _circin6, Circin6Tuple, _circum3, circum4_, \
50
- # Circum3Tuple, _radii11ABC # _MODS
50
+ # Circum3Tuple, _radii11ABC4 # _MODS
51
51
  # from pygeodesy.vector3d import nearestOn6, Vector3d # _MODS
52
52
 
53
53
  from contextlib import contextmanager
54
54
  from math import asin, cos, degrees, fabs, radians
55
55
 
56
56
  __all__ = _ALL_LAZY.latlonBase
57
- __version__ = '24.08.18'
57
+ __version__ = '24.11.10'
58
58
 
59
59
  _formy = _MODS.into(formy=__name__)
60
60
 
@@ -1142,7 +1142,7 @@ class LatLonBase(_NamedBase):
1142
1142
  Circles<https://MathWorld.Wolfram.com/TangentCircles.html>}.
1143
1143
  '''
1144
1144
  with _toCartesian3(self, point2, point3, wrap) as cs:
1145
- return _MODS.vector2d._radii11ABC(*cs, useZ=True)[0]
1145
+ return _MODS.vector2d._radii11ABC4(*cs, useZ=True)[0]
1146
1146
 
1147
1147
  def _rhumb3(self, exact, radius): # != .sphericalBase._rhumbs3
1148
1148
  '''(INTERNAL) Get the C{rhumb} for this point's datum or for
@@ -1250,10 +1250,10 @@ class LatLonBase(_NamedBase):
1250
1250
  points or as a point and azimuth.
1251
1251
 
1252
1252
  @arg circle: Radius of the circle centered at this location (C{meter}),
1253
- or a point on the circle (this C{LatLon}).
1254
- @arg point: The start point of the rhumb line (this C{LatLon}).
1255
- @arg other: An other point I{on} (this C{LatLon}) or the azimuth I{of}
1256
- (compass C{degrees}) the rhumb line.
1253
+ or a point on the circle (same C{LatLon} class).
1254
+ @arg point: The start point of the rhumb line (same C{LatLon} class).
1255
+ @arg other: An other point I{on} (same C{LatLon} class) or the azimuth
1256
+ I{of} (compass C{degrees}) the rhumb line.
1257
1257
  @kwarg height: Optional height for the intersection points (C{meter},
1258
1258
  conventionally) or C{None} for interpolated heights.
1259
1259
  @kwarg exact_radius_wrap_eps_tol: Optional keyword arguments, see
@@ -1266,8 +1266,7 @@ class LatLonBase(_NamedBase):
1266
1266
 
1267
1267
  @raise IntersectionError: The circle and rhumb line do not intersect.
1268
1268
 
1269
- @raise TypeError: If B{C{point}} is not this C{LatLon} or B{C{circle}}
1270
- or B{C{other}} invalid.
1269
+ @raise TypeError: Invalid B{C{point}}, B{C{circle}} or B{C{other}}.
1271
1270
 
1272
1271
  @raise ValueError: Invalid B{C{circle}}, B{C{other}}, B{C{height}}
1273
1272
  or B{C{exact_radius_wrap}}.
@@ -1297,7 +1296,7 @@ class LatLonBase(_NamedBase):
1297
1296
  this and an other point.
1298
1297
 
1299
1298
  @arg other: The azimuth I{of} (compass C{degrees}) or an other point
1300
- I{on} (this C{LatLon}) the rhumb line.
1299
+ I{on} (same C{LatLon} class) the rhumb line.
1301
1300
  @kwarg exact: Exact C{Rhumb...} to use (C{bool} or C{Rhumb...}), see
1302
1301
  method L{Ellipsoid.rhumb_}.
1303
1302
  @kwarg radius: Optional earth radius (C{meter}) or earth model
@@ -1311,7 +1310,7 @@ class LatLonBase(_NamedBase):
1311
1310
  @return: A C{RhumbLine} instance.
1312
1311
 
1313
1312
  @raise TypeError: Invalid B{C{radius}} or B{C{other}} not C{scalar} nor
1314
- this C{LatLon}.
1313
+ same C{LatLon} class.
1315
1314
 
1316
1315
  @see: Modules L{rhumb.aux_} and L{rhumb.ekx}.
1317
1316
  '''
@@ -1326,7 +1325,7 @@ class LatLonBase(_NamedBase):
1326
1325
  '''Return the (loxodromic) midpoint on the rhumb line between this and
1327
1326
  an other point.
1328
1327
 
1329
- @arg other: The other point (this C{LatLon}).
1328
+ @arg other: The other point (same C{LatLon} class).
1330
1329
  @kwarg exact: Exact C{Rhumb...} to use (C{bool} or C{Rhumb...}), see
1331
1330
  method L{Ellipsoid.rhumb_}.
1332
1331
  @kwarg radius: Optional earth radius (C{meter}) or earth model (L{Datum},
@@ -1341,7 +1340,7 @@ class LatLonBase(_NamedBase):
1341
1340
  and unroll the B{C{other}} point (C{bool}).
1342
1341
 
1343
1342
  @return: The midpoint at the given B{C{fraction}} along the rhumb line
1344
- (this C{LatLon}).
1343
+ (same C{LatLon} class).
1345
1344
 
1346
1345
  @raise TypeError: The B{C{other}} point is incompatible or B{C{radius}}
1347
1346
  is invalid.
@@ -1506,9 +1505,9 @@ class LatLonBase(_NamedBase):
1506
1505
  @kwarg h: Optional height, overriding this point's height (C{meter}).
1507
1506
  @kwarg Nvector: Optional class to return the C{n-vector} components
1508
1507
  (C{Nvector}) or C{None}.
1509
- @kwarg name_Nvector_kwds: Optional C{B{name}=NN} (C{str}) and optional,
1510
- additional B{C{Nvector}} keyword arguments, ignored if
1511
- C{B{Nvector} is None}.
1508
+ @kwarg name_Nvector_kwds: Optional C{B{name}=NN} (C{str}) and optionally,
1509
+ additional B{C{Nvector}} keyword arguments, ignored if C{B{Nvector}
1510
+ is None}.
1512
1511
 
1513
1512
  @return: An named B{C{Nvector}} or if C{B{Nvector} is None} a named
1514
1513
  L{Vector4Tuple}C{(x, y, z, h)}.
@@ -1539,9 +1538,8 @@ class LatLonBase(_NamedBase):
1539
1538
  @kwarg m: Optional unit of the height (C{str}), use C{None} to
1540
1539
  exclude height from the returned string.
1541
1540
  @kwarg prec_sep_s_D_M_S: Optional C{B{prec}ision}, C{B{sep}arator},
1542
- B{C{s_D}}, B{C{s_M}}, B{C{s_S}} and B{C{s_DMS}} keyword
1543
- arguments, see function L{pygeodesy.latDMS} or
1544
- L{pygeodesy.lonDMS}.
1541
+ B{C{s_D}}, B{C{s_M}}, B{C{s_S}} and B{C{s_DMS}} keyword
1542
+ arguments, see function L{pygeodesy.toDMS} for details.
1545
1543
 
1546
1544
  @return: This point in the specified C{B{form}at}, etc. (C{str} or
1547
1545
  a 2- or 3-tuple C{(lat_str, lon_str[, height_str])} if