pygeodesy 25.5.5__py2.py3-none-any.whl → 25.5.28__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 (88) hide show
  1. pygeodesy/__init__.py +186 -186
  2. pygeodesy/__main__.py +4 -3
  3. pygeodesy/albers.py +4 -4
  4. pygeodesy/auxilats/_CX_Rs.py +3 -3
  5. pygeodesy/auxilats/auxAngle.py +2 -2
  6. pygeodesy/auxilats/auxDLat.py +2 -2
  7. pygeodesy/auxilats/auxDST.py +2 -2
  8. pygeodesy/auxilats/auxLat.py +2 -2
  9. pygeodesy/auxilats/auxily.py +2 -2
  10. pygeodesy/azimuthal.py +2 -2
  11. pygeodesy/booleans.py +11 -11
  12. pygeodesy/cartesianBase.py +2 -2
  13. pygeodesy/clipy.py +2 -2
  14. pygeodesy/constants.py +7 -7
  15. pygeodesy/css.py +1 -1
  16. pygeodesy/datums.py +2 -2
  17. pygeodesy/deprecated/__init__.py +8 -8
  18. pygeodesy/deprecated/bases.py +2 -2
  19. pygeodesy/deprecated/rhumbBase.py +2 -2
  20. pygeodesy/deprecated/rhumbaux.py +2 -2
  21. pygeodesy/deprecated/rhumbsolve.py +2 -2
  22. pygeodesy/deprecated/rhumbx.py +2 -2
  23. pygeodesy/ecef.py +3 -4
  24. pygeodesy/ellipsoidalBase.py +2 -2
  25. pygeodesy/ellipsoidalBaseDI.py +7 -6
  26. pygeodesy/ellipsoidalExact.py +24 -29
  27. pygeodesy/ellipsoidalGeodSolve.py +19 -19
  28. pygeodesy/ellipsoidalKarney.py +22 -27
  29. pygeodesy/ellipsoidalNvector.py +4 -4
  30. pygeodesy/ellipsoidalVincenty.py +17 -15
  31. pygeodesy/ellipsoids.py +4 -4
  32. pygeodesy/elliptic.py +16 -11
  33. pygeodesy/errors.py +1 -1
  34. pygeodesy/etm.py +2 -2
  35. pygeodesy/fmath.py +9 -9
  36. pygeodesy/formy.py +2 -2
  37. pygeodesy/frechet.py +6 -6
  38. pygeodesy/fstats.py +2 -2
  39. pygeodesy/fsums.py +37 -28
  40. pygeodesy/gars.py +2 -3
  41. pygeodesy/geodesici.py +4 -4
  42. pygeodesy/geodesicw.py +27 -8
  43. pygeodesy/geodesicx/__init__.py +3 -3
  44. pygeodesy/geodesicx/gx.py +52 -48
  45. pygeodesy/geodesicx/gxarea.py +54 -65
  46. pygeodesy/geodesicx/gxbases.py +12 -2
  47. pygeodesy/geodesicx/gxline.py +10 -7
  48. pygeodesy/geoids.py +6 -6
  49. pygeodesy/hausdorff.py +5 -5
  50. pygeodesy/heights.py +5 -5
  51. pygeodesy/internals.py +2 -2
  52. pygeodesy/interns.py +5 -5
  53. pygeodesy/iters.py +1 -1
  54. pygeodesy/karney.py +28 -12
  55. pygeodesy/ktm.py +2 -2
  56. pygeodesy/latlonBase.py +3 -4
  57. pygeodesy/lazily.py +1 -1
  58. pygeodesy/lcc.py +3 -3
  59. pygeodesy/ltp.py +5 -5
  60. pygeodesy/mgrs.py +3 -3
  61. pygeodesy/namedTuples.py +3 -3
  62. pygeodesy/nvectorBase.py +2 -2
  63. pygeodesy/osgr.py +2 -2
  64. pygeodesy/points.py +2 -3
  65. pygeodesy/props.py +18 -18
  66. pygeodesy/resections.py +30 -24
  67. pygeodesy/rhumb/aux_.py +2 -2
  68. pygeodesy/rhumb/bases.py +3 -3
  69. pygeodesy/rhumb/ekx.py +3 -4
  70. pygeodesy/rhumb/solve.py +2 -2
  71. pygeodesy/simplify.py +2 -2
  72. pygeodesy/solveBase.py +2 -2
  73. pygeodesy/sphericalBase.py +8 -8
  74. pygeodesy/sphericalNvector.py +19 -16
  75. pygeodesy/sphericalTrigonometry.py +24 -24
  76. pygeodesy/trf.py +4 -4
  77. pygeodesy/triaxials.py +2 -2
  78. pygeodesy/units.py +7 -8
  79. pygeodesy/utily.py +2 -2
  80. pygeodesy/utmupsBase.py +2 -2
  81. pygeodesy/vector2d.py +14 -8
  82. pygeodesy/vector3d.py +3 -3
  83. pygeodesy/webmercator.py +2 -2
  84. {pygeodesy-25.5.5.dist-info → pygeodesy-25.5.28.dist-info}/METADATA +16 -16
  85. pygeodesy-25.5.28.dist-info/RECORD +119 -0
  86. pygeodesy-25.5.5.dist-info/RECORD +0 -119
  87. {pygeodesy-25.5.5.dist-info → pygeodesy-25.5.28.dist-info}/WHEEL +0 -0
  88. {pygeodesy-25.5.5.dist-info → pygeodesy-25.5.28.dist-info}/top_level.txt +0 -0
@@ -12,7 +12,7 @@ under the MIT/X11 License. For more information, see the U{GeographicLib
12
12
  <https://GeographicLib.SourceForge.io>} documentation.
13
13
  '''
14
14
  # make sure int/int division yields float quotient, see .basics
15
- from __future__ import division as _; del _ # PYCHOK semicolon
15
+ from __future__ import division as _; del _ # noqa: E702 ;
16
16
 
17
17
  # from pygeodesy import auxilats # _MODS
18
18
  from pygeodesy.auxilats._CX_Rs import _Rkey
@@ -29,7 +29,7 @@ from pygeodesy.utily import atan1
29
29
  from math import asinh, copysign
30
30
 
31
31
  __all__ = ()
32
- __version__ = '25.04.14'
32
+ __version__ = '25.05.12'
33
33
 
34
34
 
35
35
  class Aux(object):
pygeodesy/azimuthal.py CHANGED
@@ -40,7 +40,7 @@ altitude in Earth radii<https://WikiPedia.org/wiki/Azimuthal_equidistant_project
40
40
  #/media/File:Comparison_azimuthal_projections.svg>}.
41
41
  '''
42
42
  # make sure int/int division yields float quotient, see .basics
43
- from __future__ import division as _; del _ # PYCHOK semicolon
43
+ from __future__ import division as _; del _ # noqa: E702 ;
44
44
 
45
45
  # from pygeodesy.basics import _isin, _xinstanceof # from .ellipsoidalBase
46
46
  from pygeodesy.constants import EPS, EPS0, EPS1, NAN, isnon0, _umod_360, \
@@ -71,7 +71,7 @@ from pygeodesy.utily import asin1, atan1, atan2, atan2b, atan2d, \
71
71
  from math import acos, degrees, fabs, sin, sqrt
72
72
 
73
73
  __all__ = _ALL_LAZY.azimuthal
74
- __version__ = '25.04.14'
74
+ __version__ = '25.05.12'
75
75
 
76
76
  _EPS_K = _EPStol * _0_1 # Karney's eps_ or _EPSmin * _0_1?
77
77
  _over_horizon_ = 'over horizon'
pygeodesy/booleans.py CHANGED
@@ -15,7 +15,7 @@ C{reverse-difference}, C{sum} and C{union}.
15
15
  <http://www.Inf.USI.CH/hormann/papers/Greiner.1998.ECO.pdf>}.
16
16
  '''
17
17
  # make sure int/int division yields float quotient, see .basics
18
- from __future__ import division as _; del _ # PYCHOK semicolon
18
+ from __future__ import division as _; del _ # noqa: E702 ;
19
19
 
20
20
  from pygeodesy.basics import _isin, isodd, issubclassof, map2, \
21
21
  _xscalar, typename
@@ -45,7 +45,7 @@ from pygeodesy.utily import fabs, _unrollon, _Wrap
45
45
  # from math import fabs # from .utily
46
46
 
47
47
  __all__ = _ALL_LAZY.booleans
48
- __version__ = '25.04.30'
48
+ __version__ = '25.05.26'
49
49
 
50
50
  _0EPS = EPS # near-zero, positive
51
51
  _EPS0 = -EPS # near-zero, negative
@@ -199,8 +199,8 @@ class _LatLonBool(_Named):
199
199
 
200
200
  def __sub__(self, other):
201
201
  _other(self, other)
202
- return self.__class__(self.y - other.y, # classof
203
- self.x - other.x)
202
+ return type(self)(self.y - other.y, # classof
203
+ self.x - other.x)
204
204
 
205
205
  def _2A(self, p2, p3):
206
206
  # I{Signed} area of a triangle, I{doubled}.
@@ -314,7 +314,7 @@ class LatLonFHP(_LatLonBool):
314
314
 
315
315
  def __add__(self, other):
316
316
  _other(self, other)
317
- return self.__class__(self.y + other.y, self.x + other.x)
317
+ return type(self)(self.y + other.y, self.x + other.x)
318
318
 
319
319
  def __mod__(self, other): # cross product
320
320
  _other(self, other)
@@ -326,7 +326,7 @@ class LatLonFHP(_LatLonBool):
326
326
 
327
327
  def __rmul__(self, other): # scalar product
328
328
  _xscalar(other=other)
329
- return self.__class__(self.y * other, self.x * other)
329
+ return type(self)(self.y * other, self.x * other)
330
330
 
331
331
  # def _edge2(self):
332
332
  # # Return the start and end point of the
@@ -959,7 +959,7 @@ class _CompositeBase(_Named):
959
959
  # Return a new instance
960
960
  _g = kwds.get
961
961
  kwds = dict((n, _g(n, v)) for n, v in dflts.items())
962
- return self.__class__(corners or (), **kwds)
962
+ return type(self)(corners or (), **kwds)
963
963
 
964
964
  @property_RO
965
965
  def _clipids(self): # PYCHOK no cover
@@ -1549,7 +1549,7 @@ class _EdgeFHP(object):
1549
1549
  dq = q2 - q1
1550
1550
  dq2 = dq * dq # dot product, hypot2
1551
1551
  if dq2 > EPS2: # like ._clip
1552
- T, _E = None, _EdgeFHP # self.__class__
1552
+ T, _E = None, _EdgeFHP # type(self)
1553
1553
  p1, p2 = self._p1_p2
1554
1554
  ap1 = p1._2A(q1, q2)
1555
1555
  ap2_1 = p2._2A(q1, q2) - ap1
@@ -1750,8 +1750,8 @@ class _BooleanBase(object):
1750
1750
 
1751
1751
  def _boolean4(self, other, op):
1752
1752
  # Set up a new C{Boolean[FHP|GH]}.
1753
- C = self.__class__
1754
- kwds = C._kwds(self, op)
1753
+ C = type(self)
1754
+ kwds = C._kwds(self, op) # PYCHOK in _Composite[FHP|GH]
1755
1755
  a = C(self, **kwds)
1756
1756
  b = _other(self, other)
1757
1757
  return a, b, C, kwds
@@ -1964,7 +1964,7 @@ def _min_max_eps2(*xs):
1964
1964
  def _other(this, other):
1965
1965
  '''(INTERNAL) Check for compatible C{type}s.
1966
1966
  '''
1967
- C = this.__class__
1967
+ C = type(this)
1968
1968
  if isinstance(other, C):
1969
1969
  return other
1970
1970
  raise _IsnotError(C, other=other)
@@ -28,7 +28,7 @@ from pygeodesy.interns import _ellipsoidal_, _spherical_ # PYCHOK used!
28
28
  from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS
29
29
  from pygeodesy.named import _name2__, _Pass
30
30
  from pygeodesy.namedTuples import LatLon4Tuple, _NamedTupleTo , Vector3Tuple, \
31
- Vector4Tuple, Bearing2Tuple # PYCHOK .sphericalBase
31
+ Vector4Tuple
32
32
  # from pygeodesy.nvectorBase import _N_vector # _MODS
33
33
  from pygeodesy.props import deprecated_method, Property, Property_RO, property_doc_, \
34
34
  property_RO, _update_all
@@ -44,7 +44,7 @@ from pygeodesy.vector3d import Vector3d, _xyzhdlln4
44
44
  # from math import degrees, fabs, radians, sqrt # from .fmath, .utily
45
45
 
46
46
  __all__ = _ALL_LAZY.cartesianBase
47
- __version__ = '25.04.28'
47
+ __version__ = '25.05.07'
48
48
 
49
49
  _r_ = 'r'
50
50
  _resections = _MODS.into(resections=__name__)
pygeodesy/clipy.py CHANGED
@@ -10,7 +10,7 @@ I{Greiner-Hormann} and L{clipSH} and L{clipSH3} I{Sutherland-Hodgeman}.
10
10
  .
11
11
  '''
12
12
  # make sure int/int division yields float quotient, see .basics
13
- from __future__ import division as _; del _ # PYCHOK semicolon
13
+ from __future__ import division as _; del _ # noqa: E702 ;
14
14
 
15
15
  from pygeodesy.basics import len2, typename
16
16
  from pygeodesy.constants import EPS, _0_0, _1_0
@@ -31,7 +31,7 @@ from pygeodesy.units import Bool, FIx, HeightX, Lat, Lon, Number_
31
31
  # from math import fabs # from .fmath
32
32
 
33
33
  __all__ = _ALL_LAZY.clipy
34
- __version__ = '25.04.14'
34
+ __version__ = '25.05.12'
35
35
 
36
36
  _fj_ = 'fj'
37
37
  _original_ = 'original'
pygeodesy/constants.py CHANGED
@@ -1,14 +1,14 @@
1
1
 
2
2
  # -*- coding: utf-8 -*-
3
3
 
4
- u'''Single-instance C{float} and C{int} constants across C{pygeodesy} modules and
5
- related functions L{pygeodesy.float_}, L{pygeodesy.isclose}, L{pygeodesy.isfinite},
4
+ u'''Single-instance C{float} and C{int} constants across C{pygeodesy} modules and related
5
+ functions L{pygeodesy.float_}, L{pygeodesy.float0_}, L{pygeodesy.isclose}, L{pygeodesy.isfinite},
6
6
  L{pygeodesy.isinf}, L{pygeodesy.isint0}, L{pygeodesy.isnan}, L{pygeodesy.isnear0},
7
7
  L{pygeodesy.isnear1}, L{pygeodesy.isnear90}, L{pygeodesy.isneg0}, L{pygeodesy.isninf},
8
8
  L{pygeodesy.isnon0} and L{pygeodesy.remainder}.
9
9
  '''
10
10
  # make sure int/int division yields float quotient, see .basics
11
- from __future__ import division as _; del _ # PYCHOK semicolon
11
+ from __future__ import division as _; del _ # noqa: E702 ;
12
12
 
13
13
  from pygeodesy.basics import _copysign, isbool, iscomplex, isint
14
14
  from pygeodesy.errors import _xError, _xError2, _xkwds_get1, _xkwds_item2
@@ -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.04.14'
29
+ __version__ = '25.05.26'
30
30
 
31
31
 
32
32
  def _copysign_0_0(y):
@@ -495,12 +495,12 @@ def _umod_PI2(rad):
495
495
 
496
496
  if __name__ == _DMAIN_:
497
497
 
498
- def _main(locals):
498
+ def _main(globalocals):
499
499
  from pygeodesy import itemsorted, printf
500
500
  from pygeodesy.interns import _DALL_, _UNDER_
501
501
 
502
502
  t = n = v = []
503
- for n, v in itemsorted(locals):
503
+ for n, v in itemsorted(globalocals):
504
504
  if isinstance(v, (Float, Int, Radius)):
505
505
  printf('%9s: %r', n, v.toRepr(std=False))
506
506
  if v.name != n:
@@ -512,7 +512,7 @@ if __name__ == _DMAIN_:
512
512
  t.append(typename(float_))
513
513
  printf('%s = %r', _DALL_, tuple(t))
514
514
 
515
- _main(locals())
515
+ _main(globals()) # or locals()
516
516
 
517
517
  # **) MIT License
518
518
  #
pygeodesy/css.py CHANGED
@@ -470,7 +470,7 @@ class Css(_NamedBase):
470
470
  # h=self.height, cs0=self.cs0,
471
471
  # name=_name__(name, _or_nameof(self)))
472
472
  # args, kwds = _args_kwds(**kwds)
473
- # return self.__class__(*args, **kwds) # .classof
473
+ # return type(self)(*args, **kwds) # .classof
474
474
 
475
475
  @Property_RO
476
476
  def easting(self):
pygeodesy/datums.py CHANGED
@@ -65,7 +65,7 @@ datum, q.v. U{"A Guide to Coordinate Systems in Great Britain", Section 6
65
65
  @var Transforms.WGS84: Transform(name='WGS84', tx=0.0, ty=0.0, tz=0.0, s1=1.0, rx=0.0, ry=0.0, rz=0.0, s=0.0, sx=0.0, sy=0.0, sz=0.0)
66
66
  '''
67
67
  # make sure int/int division yields float quotient, see .basics
68
- from __future__ import division as _; del _ # PYCHOK semicolon
68
+ from __future__ import division as _; del _ # noqa: E702 ;
69
69
 
70
70
  from pygeodesy.basics import _isin, islistuple, map2, neg, _xinstanceof, _zip
71
71
  from pygeodesy.constants import R_M, _float as _F, _0_0, _1_0, _2_0, _8_0, _3600_0
@@ -94,7 +94,7 @@ from pygeodesy.units import _isRadius, Radius_, radians
94
94
  # import operator as _operator # from .fmath
95
95
 
96
96
  __all__ = _ALL_LAZY.datums
97
- __version__ = '25.04.14'
97
+ __version__ = '25.05.12'
98
98
 
99
99
  _a_ellipsoid_ = _UNDER_(_a_, _ellipsoid_)
100
100
  _BD72_ = 'BD72'
@@ -10,13 +10,13 @@ bases} or C{from pygeodesy.deprecated import bases}. Likewise for C{datum} and
10
10
  C{nvector}.
11
11
  '''
12
12
 
13
- from pygeodesy.deprecated.bases import * # PYCHOK not pygeodesy.__init__
14
- from pygeodesy.deprecated.datum import * # PYCHOK not pygeodesy.__init__
15
- from pygeodesy.deprecated.nvector import * # PYCHOK not pygeodesy.__init__
13
+ from pygeodesy.deprecated.bases import * # noqa: F403 not pygeodesy.__init__
14
+ from pygeodesy.deprecated.datum import * # noqa: F403 not pygeodesy.__init__
15
+ from pygeodesy.deprecated.nvector import * # noqa: F403 not pygeodesy.__init__
16
16
 
17
- from pygeodesy.deprecated.classes import * # PYCHOK expected
18
- from pygeodesy.deprecated.consterns import * # PYCHOK expected
19
- from pygeodesy.deprecated.functions import * # PYCHOK expected
17
+ from pygeodesy.deprecated.classes import * # noqa: F403
18
+ from pygeodesy.deprecated.consterns import * # noqa: F403
19
+ from pygeodesy.deprecated.functions import * # noqa: F403
20
20
 
21
21
  from pygeodesy.lazily import _ALL_ATTRS, _ALL_DEPRECATED, _lazy_import_as, _unLazy0 # _lazy_import_star
22
22
 
@@ -27,11 +27,11 @@ __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__ = '24.12.31'
30
+ __version__ = '25.05.12'
31
31
 
32
32
  if _unLazy0:
33
33
  from pygeodesy.deprecated import bases, datum, nvector, rhumbBase, \
34
- rhumbaux, rhumbsolve, rhumbx # PYCHOK expected
34
+ rhumbaux, rhumbsolve, rhumbx # noqa: F401 PYCHOK expected
35
35
  __all__ += _ALL_ATTRS(_ALL_DEPRECATED.deprecated) # DEPRECATED modules
36
36
 
37
37
  else: # lazily import modules and exported attrs
@@ -4,12 +4,12 @@
4
4
  u'''DEPRECATED on 2021.02.10, use (INTERNAL) module L{pygeodesy.latlonBase} instead.
5
5
  '''
6
6
 
7
- from pygeodesy.iters import points2 # PYCHOK exported
7
+ from pygeodesy.iters import points2 # noqa: F401
8
8
  from pygeodesy.latlonBase import LatLonBase as _LatLonBase
9
9
  from pygeodesy.lazily import _ALL_DEPRECATED
10
10
 
11
11
  __all__ = _ALL_DEPRECATED.deprecated_bases
12
- __version__ = '25.04.09'
12
+ __version__ = '25.05.12'
13
13
 
14
14
 
15
15
  class LatLonHeightBase(_LatLonBase): # PYCHOK no cover
@@ -4,10 +4,10 @@
4
4
  u'''DEPRECATED on 2023.11.26, use module L{pygeodesy.rhumb.bases} instead.
5
5
  '''
6
6
 
7
- from pygeodesy.rhumb.bases import * # PYCHOK expected
7
+ from pygeodesy.rhumb.bases import * # noqa: F403
8
8
 
9
9
  __all__ = () # _ALL_LAZY.rhumb._bases
10
- __version__ = '23.11.26'
10
+ __version__ = '25.05.12'
11
11
 
12
12
  # **) MIT License
13
13
  #
@@ -4,11 +4,11 @@
4
4
  u'''DEPRECATED on 2023.11.26, use module L{pygeodesy.rhumb.aux_} instead.
5
5
  '''
6
6
 
7
- from pygeodesy.rhumb.aux_ import * # PYCHOK expected
7
+ from pygeodesy.rhumb.aux_ import * # noqa: F403
8
8
  from pygeodesy.lazily import _ALL_LAZY
9
9
 
10
10
  __all__ = _ALL_LAZY.rhumb_aux_ # attrs NOT DEPRECATED
11
- __version__ = '23.12.02'
11
+ __version__ = '25.05.12'
12
12
 
13
13
  # **) MIT License
14
14
  #
@@ -4,11 +4,11 @@
4
4
  u'''DEPRECATED on 2023.11.26, use module L{pygeodesy.rhumb.solve} instead.
5
5
  '''
6
6
 
7
- from pygeodesy.rhumb.solve import * # PYCHOK expected
7
+ from pygeodesy.rhumb.solve import * # noqa: F403
8
8
  from pygeodesy.lazily import _ALL_LAZY
9
9
 
10
10
  __all__ = _ALL_LAZY.rhumb_solve # attrs NOT DEPRECATED
11
- __version__ = '23.11.26'
11
+ __version__ = '25.05.12'
12
12
 
13
13
  # **) MIT License
14
14
  #
@@ -4,11 +4,11 @@
4
4
  u'''DEPRECATED on 2023.11.26, use module L{pygeodesy.rhumb.ekx} instead.
5
5
  '''
6
6
 
7
- from pygeodesy.rhumb.ekx import * # PYCHOK expected
7
+ from pygeodesy.rhumb.ekx import * # noqa: F403
8
8
  from pygeodesy.lazily import _ALL_LAZY
9
9
 
10
10
  __all__ = _ALL_LAZY.rhumb_ekx # attrs NOT DEPRECATED
11
- __version__ = '23.11.30'
11
+ __version__ = '25.05.12'
12
12
 
13
13
  # **) MIT License
14
14
  #
pygeodesy/ecef.py CHANGED
@@ -60,9 +60,8 @@ plane} as opposed to I{geocentric} (ECEF) ones.
60
60
  from pygeodesy.basics import copysign0, _isin, isscalar, issubclassof, neg, map1, \
61
61
  _xinstanceof, _xsubclassof, typename # _args_kwds_names
62
62
  from pygeodesy.constants import EPS, EPS0, EPS02, EPS1, EPS2, EPS_2, INT0, PI, PI_2, \
63
- _0_0, _0_0001, _0_01, _0_5, _1_0, _1_0_1T, _N_1_0, \
64
- _2_0, _N_2_0, _3_0, _4_0, _6_0, _60_0, _90_0, _N_90_0, \
65
- _100_0, _copysign_1_0, isnon0 # PYCHOK used!
63
+ _0_0, _0_5, _1_0, _1_0_1T, _2_0, _N_2_0, _3_0, _4_0, \
64
+ _6_0, _90_0, _N_90_0, _copysign_1_0, isnon0 # PYCHOK used!
66
65
  from pygeodesy.datums import _ellipsoidal_datum, _WGS84, a_f2Tuple, _EWGS84
67
66
  from pygeodesy.ecefLocals import _EcefLocal
68
67
  # from pygeodesy.ellipsoids import a_f2Tuple, _EWGS84 # from .datums
@@ -90,7 +89,7 @@ from pygeodesy.utily import atan1, atan1d, atan2, atan2d, degrees90, degrees180,
90
89
  from math import cos, degrees, fabs, radians, sqrt
91
90
 
92
91
  __all__ = _ALL_LAZY.ecef
93
- __version__ = '25.04.28'
92
+ __version__ = '25.05.07'
94
93
 
95
94
  _Ecef_ = 'Ecef'
96
95
  _prolate_ = 'prolate'
@@ -10,7 +10,7 @@ and published under the same MIT Licence**, see for example U{latlon-ellipsoidal
10
10
  <https://www.Movable-Type.co.UK/scripts/geodesy/docs/latlon-ellipsoidal.js.html>}.
11
11
  '''
12
12
  # make sure int/int division yields float quotient, see .basics
13
- from __future__ import division as _; del _ # PYCHOK semicolon
13
+ from __future__ import division as _; del _ # noqa: E702 ;
14
14
 
15
15
  # from pygeodesy.azimuthal import EquidistantExact, EquidistantKarney # _MODS
16
16
  from pygeodesy.basics import _isin, _xinstanceof
@@ -46,7 +46,7 @@ from pygeodesy.units import Epoch, _isDegrees, Radius_, _1mm as _TOL_M
46
46
  # from math import fabs # from .latlonBase
47
47
 
48
48
  __all__ = _ALL_LAZY.ellipsoidalBase
49
- __version__ = '25.04.14'
49
+ __version__ = '25.05.12'
50
50
 
51
51
 
52
52
  class CartesianEllipsoidalBase(CartesianBase):
@@ -5,7 +5,7 @@ u'''(INTERNAL) Private, ellipsoidal Direct/Inverse geodesy base
5
5
  class C{LatLonEllipsoidalBaseDI} and functions.
6
6
  '''
7
7
  # make sure int/int division yields float quotient, see .basics
8
- from __future__ import division as _; del _ # PYCHOK semicolon
8
+ from __future__ import division as _; del _ # noqa: E702 ;
9
9
 
10
10
  # from pygeodesy.azimuthal import _Equidistants # _MODS
11
11
  from pygeodesy.basics import isLatLon, _xsubclassof, typename
@@ -36,7 +36,7 @@ from pygeodesy.utily import m2km, unroll180, _unrollon, _unrollon3, _Wrap, wrap3
36
36
  from math import degrees, radians
37
37
 
38
38
  __all__ = _ALL_LAZY.ellipsoidalBaseDI
39
- __version__ = '25.04.21'
39
+ __version__ = '25.05.23'
40
40
 
41
41
  _polar__ = 'polar?'
42
42
  _TRIPS = 33 # _intersect3, _intersects2, _nearestOn interations, 6..9 sufficient?
@@ -115,14 +115,15 @@ class LatLonEllipsoidalBaseDI(LatLonEllipsoidalBase):
115
115
  r = self._Direct2Tuple(LL, height, r)
116
116
  return r
117
117
 
118
- def _Direct2Tuple(self, LL, height, r):
118
+ def _Direct2Tuple(self, LL, height, r): # in .ellipsoidalVincenty.py
119
119
  '''(INTERNAL) Helper for C{._Direct} result L{Destination2Tuple}.
120
120
  '''
121
121
  h = self._heigHt(height)
122
- d = _xkwds_not(None, datum=self.datum, name=self.name,
122
+ n = self.name
123
+ d = _xkwds_not(None, datum=self.datum, height=h, name=n,
123
124
  epoch=self.epoch, reframe=self.reframe)
124
- d = LL(*_Wrap.latlon(r.lat, r.lon), height=h, **d)
125
- return Destination2Tuple(d, wrap360(r.final), name=self.name)
125
+ d = LL(*_Wrap.latlon(r.lat, r.lon), **d)
126
+ return Destination2Tuple(d, wrap360(r.final), name=n)
126
127
 
127
128
  def distanceTo(self, other, wrap=False, **unused): # radius=R_M
128
129
  '''Compute the distance between this and an other point along
@@ -11,12 +11,12 @@ L{GeodesicExact}, L{GeodesicAreaExact} and L{GeodesicLineExact}.
11
11
 
12
12
  # from pygeodesy.datums import _WGS84 # from .ellipsoidalBase
13
13
  from pygeodesy.ellipsoidalBase import CartesianEllipsoidalBase, \
14
- _nearestOn, _WGS84
14
+ _nearestOn, _WGS84
15
15
  from pygeodesy.ellipsoidalBaseDI import LatLonEllipsoidalBaseDI, \
16
16
  _intersection3, _intersections2, \
17
17
  _TOL_M, intersecant2
18
18
  # from pygeodesy.errors import _xkwds # from .karney
19
- from pygeodesy.karney import fabs, _polygon, Property_RO, _xkwds
19
+ from pygeodesy.karney import _polygon, fabs, Property_RO, _xkwds
20
20
  from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS, _ALL_OTHER
21
21
  from pygeodesy.points import _areaError, ispolar # PYCHOK exported
22
22
  # from pygeodesy.props import Property_RO # from .karney
@@ -24,7 +24,7 @@ from pygeodesy.points import _areaError, ispolar # PYCHOK exported
24
24
  # from math import fabs # from .karney
25
25
 
26
26
  __all__ = _ALL_LAZY.ellipsoidalExact
27
- __version__ = '24.11.06'
27
+ __version__ = '25.05.28'
28
28
 
29
29
 
30
30
  class Cartesian(CartesianEllipsoidalBase):
@@ -88,17 +88,19 @@ class LatLon(LatLonEllipsoidalBaseDI):
88
88
  return LatLonEllipsoidalBaseDI.toCartesian(self, **kwds)
89
89
 
90
90
 
91
- def areaOf(points, datum=_WGS84, wrap=True):
91
+ def areaOf(points, datum=_WGS84, wrap=True, polar=False):
92
92
  '''Compute the area of an (ellipsoidal) polygon or composite.
93
93
 
94
- @arg points: The polygon points (L{LatLon}[], L{BooleanFHP} or
95
- L{BooleanGH}).
94
+ @arg points: The polygon points (L{LatLon}[], L{BooleanFHP} or L{BooleanGH}).
96
95
  @kwarg datum: Optional datum (L{Datum}).
97
- @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the
98
- B{C{points}} (C{bool}).
96
+ @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the B{C{points}}
97
+ (C{bool}).
98
+ @kwarg polar: Use C{B{polar}=True} if the polygon encloses a pole (C{bool}), see
99
+ function L{ispolar<pygeodesy.points.ispolar>} and U{area of a polygon
100
+ enclosing a pole<https://GeographicLib.SourceForge.io/C++/doc/
101
+ classGeographicLib_1_1GeodesicExact.html#a3d7a9155e838a09a48dc14d0c3fac525>}.
99
102
 
100
- @return: Area (C{meter} I{squared}, same units as the B{C{datum}}'s
101
- ellipsoid axes).
103
+ @return: Area (C{meter} I{squared}, same units as the B{C{datum}}'s ellipsoid axes).
102
104
 
103
105
  @raise PointsError: Insufficient number of B{C{points}}.
104
106
 
@@ -110,12 +112,8 @@ def areaOf(points, datum=_WGS84, wrap=True):
110
112
  @see: Functions L{pygeodesy.areaOf}, L{ellipsoidalGeodSolve.areaOf},
111
113
  L{ellipsoidalKarney.areaOf}, L{sphericalNvector.areaOf} and
112
114
  L{sphericalTrigonometry.areaOf}.
113
-
114
- @note: The U{area of a polygon enclosing a pole<https://GeographicLib.SourceForge.io/
115
- C++/doc/classGeographicLib_1_1GeodesicExact.html#a3d7a9155e838a09a48dc14d0c3fac525>}
116
- can be found by adding half the datum's ellipsoid surface area to the polygon's area.
117
115
  '''
118
- return fabs(_polygon(datum.ellipsoid.geodesicx, points, True, False, wrap))
116
+ return fabs(_polygon(datum.ellipsoid.geodesicx, points, True, False, wrap, polar))
119
117
 
120
118
 
121
119
  def intersection3(start1, end1, start2, end2, height=None, wrap=False, # was=True
@@ -216,13 +214,14 @@ def intersections2(center1, radius1, center2, radius2, height=None, wrap=False,
216
214
  equidistant=equidistant, tol=tol, **kwds)
217
215
 
218
216
 
219
- def isclockwise(points, datum=_WGS84, wrap=True):
217
+ def isclockwise(points, datum=_WGS84, wrap=True, polar=False):
220
218
  '''Determine the direction of a path or polygon.
221
219
 
222
220
  @arg points: The path or polygon points (C{LatLon}[]).
223
221
  @kwarg datum: Optional datum (L{Datum}).
224
- @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the
225
- B{C{points}} (C{bool}).
222
+ @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the B{C{points}} (C{bool}).
223
+ @kwarg polar: Use C{B{polar}=True} if the C{B{points}} enclose a pole (C{bool}),
224
+ see function U{ispolar<pygeodeys.points.ispolar>}.
226
225
 
227
226
  @return: C{True} if B{C{points}} are clockwise, C{False} otherwise.
228
227
 
@@ -234,7 +233,7 @@ def isclockwise(points, datum=_WGS84, wrap=True):
234
233
 
235
234
  @see: L{pygeodesy.isclockwise}.
236
235
  '''
237
- a = _polygon(datum.ellipsoid.geodesicx, points, True, False, wrap)
236
+ a = _polygon(datum.ellipsoid.geodesicx, points, True, False, wrap, polar)
238
237
  if a < 0:
239
238
  return True
240
239
  elif a > 0:
@@ -288,29 +287,25 @@ def nearestOn(point, point1, point2, within=True, height=None, wrap=False,
288
287
  def perimeterOf(points, closed=False, datum=_WGS84, wrap=True):
289
288
  '''Compute the perimeter of an (ellipsoidal) polygon or composite.
290
289
 
291
- @arg points: The polygon points (L{LatLon}[], L{BooleanFHP} or
292
- L{BooleanGH}).
290
+ @arg points: The polygon points (L{LatLon}[], L{BooleanFHP} or L{BooleanGH}).
293
291
  @kwarg closed: Optionally, close the polygon (C{bool}).
294
292
  @kwarg datum: Optional datum (L{Datum}).
295
- @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the
296
- B{C{points}} (C{bool}).
293
+ @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the B{C{points}} (C{bool}).
297
294
 
298
- @return: Perimeter (C{meter}, same units as the B{C{datum}}'s
299
- ellipsoid axes).
295
+ @return: Perimeter (C{meter}, same units as the B{C{datum}}'s ellipsoid axes).
300
296
 
301
297
  @raise PointsError: Insufficient number of B{C{points}}.
302
298
 
303
299
  @raise TypeError: Some B{C{points}} are not L{LatLon}.
304
300
 
305
- @raise ValueError: Invalid C{B{wrap}=False}, unwrapped, unrolled
306
- longitudes not supported or C{B{closed}=False}
307
- with C{B{points}} a composite.
301
+ @raise ValueError: Invalid C{B{wrap}=False}, unwrapped, unrolled longitudes not
302
+ supported or C{B{closed}=False} with C{B{points}} a composite.
308
303
 
309
304
  @see: Functions L{pygeodesy.perimeterOf}, L{ellipsoidalGeodSolve.perimeterOf},
310
305
  L{ellipsoidalKarney.perimeterOf}, L{sphericalNvector.perimeterOf} and
311
306
  L{sphericalTrigonometry.perimeterOf}.
312
307
  '''
313
- return _polygon(datum.ellipsoid.geodesicx, points, closed, True, wrap)
308
+ return _polygon(datum.ellipsoid.geodesicx, points, closed, True, wrap, False)
314
309
 
315
310
 
316
311
  __all__ += _ALL_OTHER(Cartesian, LatLon, # classes
@@ -24,7 +24,7 @@ from pygeodesy.points import _areaError, ispolar # PYCHOK exported
24
24
  # from math import fabs # from .karney
25
25
 
26
26
  __all__ = _ALL_LAZY.ellipsoidalGeodSolve
27
- __version__ = '24.08.13'
27
+ __version__ = '25.05.28'
28
28
 
29
29
 
30
30
  class Cartesian(CartesianEllipsoidalBase):
@@ -87,12 +87,16 @@ class LatLon(LatLonEllipsoidalBaseDI):
87
87
  return LatLonEllipsoidalBaseDI.toCartesian(self, **kwds)
88
88
 
89
89
 
90
- def areaOf(points, datum=_WGS84, wrap=True):
90
+ def areaOf(points, datum=_WGS84, wrap=True, polar=False):
91
91
  '''Compute the area of an (ellipsoidal) polygon or composite.
92
92
 
93
93
  @arg points: The polygon points (L{LatLon}[], L{BooleanFHP} or L{BooleanGH}).
94
94
  @kwarg datum: Optional datum (L{Datum}).
95
95
  @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the B{C{points}} (C{bool}).
96
+ @kwarg polar: Use C{B{polar}=True} if the polygon encloses a pole (C{bool}), see
97
+ function L{ispolar<pygeodesy.points.ispolar>} and U{area of a polygon
98
+ enclosing a pole<https://GeographicLib.SourceForge.io/C++/doc/
99
+ classGeographicLib_1_1GeodesicExact.html#a3d7a9155e838a09a48dc14d0c3fac525>}.
96
100
 
97
101
  @return: Area (C{meter}, same as units of the B{C{datum}}'s ellipsoid axes, I{squared}).
98
102
 
@@ -105,7 +109,7 @@ def areaOf(points, datum=_WGS84, wrap=True):
105
109
  @see: Functions L{pygeodesy.areaOf}, L{ellipsoidalExact.areaOf}, L{ellipsoidalKarney.areaOf},
106
110
  L{sphericalNvector.areaOf} and L{sphericalTrigonometry.areaOf}.
107
111
  '''
108
- return fabs(_polygon(datum.ellipsoid.geodsolve, points, True, False, wrap))
112
+ return fabs(_polygon(datum.ellipsoid.geodsolve, points, True, False, wrap, polar))
109
113
 
110
114
 
111
115
  def intersection3(start1, end1, start2, end2, height=None, wrap=False, # was=True
@@ -209,13 +213,14 @@ def intersections2(center1, radius1, center2, radius2, height=None, wrap=False,
209
213
  equidistant=equidistant, tol=tol, LatLon=LatLon, **LatLon_kwds)
210
214
 
211
215
 
212
- def isclockwise(points, datum=_WGS84, wrap=True):
216
+ def isclockwise(points, datum=_WGS84, wrap=True, polar=False):
213
217
  '''Determine the direction of a path or polygon.
214
218
 
215
219
  @arg points: The path or polygon points (C{LatLon}[]).
216
220
  @kwarg datum: Optional datum (L{Datum}).
217
- @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the
218
- B{C{points}} (C{bool}).
221
+ @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the B{C{points}} (C{bool}).
222
+ @kwarg polar: Use C{B{polar}=True} if the C{B{points}} enclose a pole (C{bool}),
223
+ see function U{ispolar<pygeodeys.points.ispolar>}.
219
224
 
220
225
  @return: C{True} if B{C{points}} are clockwise, C{False} otherwise.
221
226
 
@@ -223,12 +228,11 @@ def isclockwise(points, datum=_WGS84, wrap=True):
223
228
 
224
229
  @raise TypeError: Some B{C{points}} are not C{LatLon}.
225
230
 
226
- @raise ValueError: The B{C{points}} enclose a pole or zero
227
- area.
231
+ @raise ValueError: The B{C{points}} enclose a pole or zero area.
228
232
 
229
233
  @see: L{pygeodesy.isclockwise}.
230
234
  '''
231
- a = _polygon(datum.ellipsoid.geodsolve, points, True, False, wrap)
235
+ a = _polygon(datum.ellipsoid.geodsolve, points, True, False, wrap, polar)
232
236
  if a < 0:
233
237
  return True
234
238
  elif a > 0:
@@ -282,29 +286,25 @@ def nearestOn(point, point1, point2, within=True, height=None, wrap=False,
282
286
  def perimeterOf(points, closed=False, datum=_WGS84, wrap=True):
283
287
  '''Compute the perimeter of an (ellipsoidal) polygon or composite.
284
288
 
285
- @arg points: The polygon points (L{LatLon}[], L{BooleanFHP} or
286
- L{BooleanGH}).
289
+ @arg points: The polygon points (L{LatLon}[], L{BooleanFHP} or L{BooleanGH}).
287
290
  @kwarg closed: Optionally, close the polygon (C{bool}).
288
291
  @kwarg datum: Optional datum (L{Datum}).
289
- @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the
290
- B{C{points}} (C{bool}).
292
+ @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the B{C{points}} (C{bool}).
291
293
 
292
- @return: Perimeter (C{meter}, same as units of the B{C{datum}}'s
293
- ellipsoid axes).
294
+ @return: Perimeter (C{meter}, same as units of the B{C{datum}}'s ellipsoid axes).
294
295
 
295
296
  @raise PointsError: Insufficient number of B{C{points}}.
296
297
 
297
298
  @raise TypeError: Some B{C{points}} are not L{LatLon}.
298
299
 
299
- @raise ValueError: Invalid C{B{wrap}=False}, unwrapped, unrolled
300
- longitudes not supported or C{B{closed}=False}
301
- with C{B{points}} a composite.
300
+ @raise ValueError: Invalid C{B{wrap}=False}, unwrapped, unrolled longitudes not
301
+ supported or C{B{closed}=False} with C{B{points}} a composite.
302
302
 
303
303
  @see: Functions L{pygeodesy.perimeterOf}, L{ellipsoidalExact.perimeterOf},
304
304
  L{ellipsoidalKarney.perimeterOf}, L{sphericalNvector.perimeterOf}
305
305
  and L{sphericalTrigonometry.perimeterOf}.
306
306
  '''
307
- return _polygon(datum.ellipsoid.geodsolve, points, closed, True, wrap)
307
+ return _polygon(datum.ellipsoid.geodsolve, points, closed, True, wrap, False)
308
308
 
309
309
 
310
310
  __all__ += _ALL_OTHER(Cartesian, LatLon, # classes