pygeodesy 24.10.24__py2.py3-none-any.whl → 24.12.12__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. {PyGeodesy-24.10.24.dist-info → PyGeodesy-24.12.12.dist-info}/METADATA +6 -6
  2. PyGeodesy-24.12.12.dist-info/RECORD +118 -0
  3. {PyGeodesy-24.10.24.dist-info → PyGeodesy-24.12.12.dist-info}/WHEEL +1 -1
  4. pygeodesy/__init__.py +5 -5
  5. pygeodesy/__main__.py +1 -1
  6. pygeodesy/albers.py +5 -5
  7. pygeodesy/auxilats/_CX_4.py +1 -1
  8. pygeodesy/auxilats/_CX_6.py +1 -1
  9. pygeodesy/auxilats/_CX_8.py +1 -1
  10. pygeodesy/auxilats/_CX_Rs.py +1 -1
  11. pygeodesy/auxilats/__init__.py +1 -1
  12. pygeodesy/auxilats/__main__.py +1 -1
  13. pygeodesy/auxilats/auxAngle.py +5 -5
  14. pygeodesy/auxilats/auxDLat.py +6 -6
  15. pygeodesy/auxilats/auxDST.py +2 -2
  16. pygeodesy/auxilats/auxLat.py +5 -5
  17. pygeodesy/auxilats/auxily.py +2 -2
  18. pygeodesy/azimuthal.py +55 -65
  19. pygeodesy/basics.py +35 -34
  20. pygeodesy/booleans.py +37 -37
  21. pygeodesy/cartesianBase.py +26 -65
  22. pygeodesy/clipy.py +1 -1
  23. pygeodesy/constants.py +7 -7
  24. pygeodesy/css.py +8 -9
  25. pygeodesy/datums.py +1 -1
  26. pygeodesy/deprecated/__init__.py +2 -2
  27. pygeodesy/deprecated/bases.py +1 -1
  28. pygeodesy/deprecated/classes.py +10 -10
  29. pygeodesy/deprecated/consterns.py +1 -1
  30. pygeodesy/deprecated/datum.py +1 -1
  31. pygeodesy/deprecated/functions.py +23 -13
  32. pygeodesy/deprecated/nvector.py +1 -1
  33. pygeodesy/deprecated/rhumbBase.py +1 -1
  34. pygeodesy/deprecated/rhumbaux.py +1 -1
  35. pygeodesy/deprecated/rhumbsolve.py +1 -1
  36. pygeodesy/deprecated/rhumbx.py +1 -1
  37. pygeodesy/dms.py +1 -1
  38. pygeodesy/ecef.py +63 -69
  39. pygeodesy/elevations.py +1 -1
  40. pygeodesy/ellipsoidalBase.py +106 -121
  41. pygeodesy/ellipsoidalBaseDI.py +115 -119
  42. pygeodesy/ellipsoidalExact.py +36 -38
  43. pygeodesy/ellipsoidalGeodSolve.py +1 -1
  44. pygeodesy/ellipsoidalKarney.py +1 -1
  45. pygeodesy/ellipsoidalNvector.py +1 -1
  46. pygeodesy/ellipsoidalVincenty.py +6 -5
  47. pygeodesy/ellipsoids.py +7 -8
  48. pygeodesy/elliptic.py +6 -6
  49. pygeodesy/epsg.py +1 -1
  50. pygeodesy/errors.py +25 -25
  51. pygeodesy/etm.py +84 -76
  52. pygeodesy/fmath.py +54 -51
  53. pygeodesy/formy.py +74 -106
  54. pygeodesy/frechet.py +1 -1
  55. pygeodesy/fstats.py +1 -1
  56. pygeodesy/fsums.py +82 -72
  57. pygeodesy/gars.py +1 -1
  58. pygeodesy/geodesici.py +4 -4
  59. pygeodesy/geodesicw.py +16 -15
  60. pygeodesy/geodesicx/_C4_24.py +2 -2
  61. pygeodesy/geodesicx/_C4_27.py +2 -2
  62. pygeodesy/geodesicx/_C4_30.py +2 -2
  63. pygeodesy/geodesicx/__init__.py +3 -3
  64. pygeodesy/geodesicx/__main__.py +1 -1
  65. pygeodesy/geodesicx/gx.py +6 -5
  66. pygeodesy/geodesicx/gxarea.py +2 -2
  67. pygeodesy/geodesicx/gxbases.py +2 -2
  68. pygeodesy/geodesicx/gxline.py +16 -12
  69. pygeodesy/geodsolve.py +8 -17
  70. pygeodesy/geohash.py +1 -1
  71. pygeodesy/geoids.py +6 -6
  72. pygeodesy/hausdorff.py +1 -1
  73. pygeodesy/heights.py +3 -3
  74. pygeodesy/internals.py +64 -80
  75. pygeodesy/interns.py +2 -3
  76. pygeodesy/iters.py +1 -1
  77. pygeodesy/karney.py +4 -4
  78. pygeodesy/ktm.py +20 -21
  79. pygeodesy/latlonBase.py +296 -346
  80. pygeodesy/lazily.py +15 -15
  81. pygeodesy/lcc.py +5 -5
  82. pygeodesy/ltp.py +55 -59
  83. pygeodesy/ltpTuples.py +208 -192
  84. pygeodesy/mgrs.py +9 -10
  85. pygeodesy/named.py +153 -3
  86. pygeodesy/namedTuples.py +58 -7
  87. pygeodesy/nvectorBase.py +122 -105
  88. pygeodesy/osgr.py +10 -13
  89. pygeodesy/points.py +1 -1
  90. pygeodesy/props.py +3 -3
  91. pygeodesy/resections.py +26 -26
  92. pygeodesy/rhumb/__init__.py +2 -2
  93. pygeodesy/rhumb/aux_.py +2 -2
  94. pygeodesy/rhumb/bases.py +2 -2
  95. pygeodesy/rhumb/ekx.py +4 -4
  96. pygeodesy/rhumb/solve.py +4 -4
  97. pygeodesy/simplify.py +291 -403
  98. pygeodesy/solveBase.py +1 -1
  99. pygeodesy/sphericalBase.py +1 -1
  100. pygeodesy/sphericalNvector.py +84 -127
  101. pygeodesy/sphericalTrigonometry.py +66 -71
  102. pygeodesy/streprs.py +10 -5
  103. pygeodesy/trf.py +1 -1
  104. pygeodesy/triaxials.py +23 -16
  105. pygeodesy/units.py +17 -17
  106. pygeodesy/unitsBase.py +1 -1
  107. pygeodesy/ups.py +4 -4
  108. pygeodesy/utily.py +202 -145
  109. pygeodesy/utm.py +10 -10
  110. pygeodesy/utmups.py +1 -1
  111. pygeodesy/utmupsBase.py +1 -1
  112. pygeodesy/vector2d.py +17 -17
  113. pygeodesy/vector3d.py +32 -23
  114. pygeodesy/vector3dBase.py +22 -19
  115. pygeodesy/webmercator.py +5 -5
  116. pygeodesy/wgrs.py +5 -5
  117. PyGeodesy-24.10.24.dist-info/RECORD +0 -118
  118. {PyGeodesy-24.10.24.dist-info → PyGeodesy-24.12.12.dist-info}/top_level.txt +0 -0
pygeodesy/utm.py CHANGED
@@ -39,7 +39,7 @@ from pygeodesy.datums import _ellipsoidal_datum, _WGS84, _under
39
39
  from pygeodesy.dms import degDMS, parseDMS2
40
40
  from pygeodesy.errors import MGRSError, RangeError, _ValueError, \
41
41
  _xkwds_get, _xkwds_pop2
42
- from pygeodesy.fmath import fdot3, hypot, hypot1, _operator
42
+ from pygeodesy.fmath import fdot_, fdot3, hypot, hypot1, _operator
43
43
  # from pygeodesy.internals import _under # from .datums
44
44
  from pygeodesy.interns import MISSING, NN, _by_, _COMMASPACE_, _N_, \
45
45
  _NS_, _outside_, _range_, _S_, _scale0_, \
@@ -51,19 +51,19 @@ from pygeodesy.props import deprecated_method, property_doc_, \
51
51
  Property_RO
52
52
  from pygeodesy.streprs import Fmt, unstr
53
53
  from pygeodesy.units import Band, Int, Lat, Lon, Meter, Zone
54
- from pygeodesy.utily import atan1, degrees90, degrees180, sincos2
54
+ from pygeodesy.utily import atan1, atan2, degrees90, degrees180, sincos2
55
55
  from pygeodesy.utmupsBase import _hemi, _LLEB, _parseUTMUPS5, _to4lldn, \
56
56
  _to3zBhp, _to3zll, _UPS_LATS, _UPS_ZONE, \
57
57
  _UTM_LAT_MAX, _UTM_ZONE_MAX, \
58
58
  _UTM_LAT_MIN, _UTM_ZONE_MIN, \
59
59
  _UTM_ZONE_OFF_MAX, UtmUpsBase
60
60
 
61
- from math import asinh, atanh, atan2, cos, cosh, degrees, fabs, \
62
- radians, sin, sinh, tan, tanh
61
+ from math import asinh, atanh, cos, cosh, degrees, fabs, radians, \
62
+ sin, sinh, tan, tanh # tan as _tan
63
63
  # import operator as _operator # from .fmath
64
64
 
65
65
  __all__ = _ALL_LAZY.utm
66
- __version__ = '24.10.12'
66
+ __version__ = '24.11.26'
67
67
 
68
68
  _Bands = 'CDEFGHJKLMNPQRSTUVWXX' # UTM latitude bands C..X (no
69
69
  # I|O) 8° each, covering 80°S to 84°N and X repeated for 80-84°N
@@ -566,12 +566,12 @@ def toUtm8(latlon, lon=None, datum=None, Utm=Utm, falsed=True,
566
566
  # easting, northing: Karney 2011 Eq 7-14, 29, 35
567
567
  sb, cb = sincos2(b)
568
568
 
569
- T = tan(a)
569
+ T = tan(a)
570
570
  T12 = hypot1(T)
571
- S = sinh(E.e * atanh(E.e * T / T12))
571
+ S = sinh(E.e * atanh(E.e * T / T12))
572
572
 
573
- T_ = T * hypot1(S) - S * T12
574
- H = hypot(T_, cb)
573
+ T_ = fdot_(T, hypot1(S), -S, T12)
574
+ H = hypot(T_, cb)
575
575
 
576
576
  y = atan2(T_, cb) # ξ' ksi
577
577
  x = asinh(sb / H) # η' eta
@@ -733,7 +733,7 @@ def utmZoneBand5(lat, lon, cmoff=False, **name):
733
733
 
734
734
  # **) MIT License
735
735
  #
736
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
736
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
737
737
  #
738
738
  # Permission is hereby granted, free of charge, to any person obtaining a
739
739
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/utmups.py CHANGED
@@ -294,7 +294,7 @@ def utmupsZoneBand5(lat, lon, cmoff=False, **name):
294
294
 
295
295
  # **) MIT License
296
296
  #
297
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
297
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
298
298
  #
299
299
  # Permission is hereby granted, free of charge, to any person obtaining a
300
300
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/utmupsBase.py CHANGED
@@ -494,7 +494,7 @@ __all__ += _ALL_DOCS(UtmUpsBase)
494
494
 
495
495
  # **) MIT License
496
496
  #
497
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
497
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
498
498
  #
499
499
  # Permission is hereby granted, free of charge, to any person obtaining a
500
500
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/vector2d.py CHANGED
@@ -12,7 +12,7 @@ from pygeodesy.constants import EPS, EPS0, EPS02, EPS4, INF, INT0, \
12
12
  _1_0, _1_0_1T, _N_1_0, _2_0, _N_2_0, _4_0
13
13
  from pygeodesy.errors import _and, _AssertionError, IntersectionError, NumPyError, \
14
14
  PointsError, TriangleError, _xError, _xkwds
15
- from pygeodesy.fmath import fabs, fdot, hypot, hypot2_, sqrt
15
+ from pygeodesy.fmath import fabs, fdot, fdot_, hypot, hypot2_, sqrt
16
16
  from pygeodesy.fsums import _Fsumf_, fsumf_, fsum1f_
17
17
  from pygeodesy.interns import NN, _a_, _and_, _b_, _c_, _center_, _coincident_, \
18
18
  _colinear_, _COMMASPACE_, _concentric_, _few_, \
@@ -31,7 +31,7 @@ from contextlib import contextmanager
31
31
  # from math import fabs, sqrt # from .fmath
32
32
 
33
33
  __all__ = _ALL_LAZY.vector2d
34
- __version__ = '24.08.19'
34
+ __version__ = '24.11.21'
35
35
 
36
36
  _cA_ = 'cA'
37
37
  _cB_ = 'cB'
@@ -175,7 +175,7 @@ def _circin6(point1, point2, point3, eps=EPS4, useZ=True, dLL3=False, **Vector_k
175
175
  C = V(c.x, c.y, c.z, **V_kwds)
176
176
  return c, C
177
177
 
178
- t, p1, p2, p3 = _radii11ABC(point1, point2, point3, useZ=useZ)
178
+ t, p1, p2, p3 = _radii11ABC4(point1, point2, point3, useZ=useZ)
179
179
  V, r1, r2, r3 = point1.classof, t.rA, t.rB, t.rC
180
180
 
181
181
  c1, cA = _contact2(t.a, p2, r2, p3, r3, V, _xkwds(Vector_kwds, name=_cA_))
@@ -251,8 +251,8 @@ def circum4(points, useZ=True, **Vector_and_kwds):
251
251
  @kwarg useZ: If C{True}, use the points' Z component, otherwise force C{z=INT0}
252
252
  (C{bool}).
253
253
  @kwarg Vector_and_kwds: Optional class C{B{Vector}=None} to return the center point
254
- and optional, additional B{C{Vector}} keyword arguments, otherwise
255
- the first B{C{points}}' (sub-)class is used.
254
+ and optionally, additional B{C{Vector}} keyword arguments, otherwise
255
+ the B{C{points}}' (sub-)class.
256
256
 
257
257
  @return: L{Circum4Tuple}C{(radius, center, rank, residuals)} with C{center} an
258
258
  instance of C{B{points}[0]}' (sub-)class or B{C{Vector}} if specified.
@@ -509,12 +509,12 @@ def radii11(point1, point2, point3, useZ=True):
509
509
  U{Tangent Circles<https://MathWorld.Wolfram.com/TangentCircles.html>}.
510
510
  '''
511
511
  try:
512
- return _radii11ABC(point1, point2, point3, useZ=useZ)[0]
512
+ return _radii11ABC4(point1, point2, point3, useZ=useZ)[0]
513
513
  except (TypeError, ValueError) as x:
514
514
  raise _xError(x, point1=point1, point2=point2, point3=point3)
515
515
 
516
516
 
517
- def _radii11ABC(point1, point2, point3, useZ=True):
517
+ def _radii11ABC4(point1, point2, point3, useZ=True):
518
518
  # (INTERNAL) Tangent, Circum, Incircle, Soddy radii, sides and semi-perimeter
519
519
  A = _otherV3d(useZ=useZ, point1=point1, NN_OK=False)
520
520
  B = _otherV3d(useZ=useZ, point2=point2, NN_OK=False)
@@ -589,7 +589,7 @@ def soddy4(point1, point2, point3, eps=EPS4, useZ=True):
589
589
  @see: Functions L{radii11} and L{circum3} and U{Soddy Circles
590
590
  <https://MathWorld.Wolfram.com/SoddyCircles.html>}.
591
591
  '''
592
- t, p1, p2, p3 = _radii11ABC(point1, point2, point3, useZ=useZ)
592
+ t, p1, p2, p3 = _radii11ABC4(point1, point2, point3, useZ=useZ)
593
593
 
594
594
  r = t.riS
595
595
  c, d = _tricenter3d2(p1, t.rA + r,
@@ -635,10 +635,10 @@ def triaxum5(points, useZ=True):
635
635
  b = _1_0_1T * n
636
636
  T, R, rk = _np.least_squares3(A, b)
637
637
 
638
- def _sqrt(x):
639
- return sqrt(_1_0 / x) if x else _0_0
638
+ def _1_sqrt(x):
639
+ return sqrt(_1_0 / x) if x else _0_0 # INF
640
640
 
641
- a, b, c = map(_sqrt, T)
641
+ a, b, c = map(_1_sqrt, T)
642
642
  return Triaxum5Tuple(a, b, c, rk, R)
643
643
 
644
644
 
@@ -685,8 +685,8 @@ def trilaterate2d2(x1, y1, radius1, x2, y2, radius2, x3, y3, radius3,
685
685
  @kwarg eps: Tolerance to check the trilaterated point I{delta} on
686
686
  all 3 circles (C{scalar}) or C{None} for no checking.
687
687
  @kwarg Vector_and_kwds: Optional class C{B{Vector}=None} to return
688
- the trilateration and optional, additional
689
- B{C{Vector}} keyword arguments).
688
+ the trilateration and optionally, additional B{C{Vector}}
689
+ keyword arguments).
690
690
 
691
691
  @return: Trilaterated point as C{B{Vector}(x, y, **B{Vector_kwds})}
692
692
  or L{Vector2Tuple}C{(x, y)} if C{B{Vector} is None}.
@@ -742,14 +742,14 @@ def _trilaterate2d2(x1, y1, radius1, x2, y2, radius2, x3, y3, radius3,
742
742
  raise IntersectionError(_and(_astr(x3=x3, y3=y3, radius3=r3),
743
743
  _astr(x1=x1, y1=y1, radius1=r1)), txt=t)
744
744
 
745
- q = (a * e - b * d) * _2_0
745
+ q = fdot_(a, e, -b, d) * _2_0
746
746
  if isnear0(q):
747
747
  t = _no_(_intersection_)
748
748
  raise IntersectionError(_and(_astr(x1=x1, y1=y1, radius1=r1),
749
749
  _astr(x2=x2, y2=y2, radius2=r2),
750
750
  _astr(x3=x3, y3=y3, radius3=r3)), txt=t)
751
- t = Vector2Tuple((c * e - b * f) / q,
752
- (a * f - c * d) / q, name=trilaterate2d2.__name__)
751
+ t = Vector2Tuple(fdot_(c, e, -b, f) / q,
752
+ fdot_(a, f, -c, d) / q, name=trilaterate2d2.__name__)
753
753
 
754
754
  if eps and eps > 0: # check distances to center vs radius
755
755
  for x, y, r in ((x1, y1, r1), (x2, y2, r2), (x3, y3, r3)):
@@ -871,7 +871,7 @@ def _tri5perturbs(eps, r):
871
871
 
872
872
  # **) MIT License
873
873
  #
874
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
874
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
875
875
  #
876
876
  # Permission is hereby granted, free of charge, to any person obtaining a
877
877
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/vector3d.py CHANGED
@@ -20,7 +20,7 @@ from pygeodesy.iters import PointsIter, Fmt
20
20
  from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS
21
21
  from pygeodesy.named import _name__, _name2__, _xnamed, _xotherError
22
22
  from pygeodesy.namedTuples import Intersection3Tuple, NearestOn2Tuple, \
23
- NearestOn6Tuple, Vector3Tuple # Vector4Tuple
23
+ NearestOn6Tuple, _v2Cls, Vector3Tuple # Vector4Tuple
24
24
  # from pygeodesy.nvectorBase import _nsumOf # _MODS
25
25
  # from pygeodesy.streprs import Fmt # from .iters
26
26
  from pygeodesy.units import _fi_j2, _isDegrees, Radius, Radius_
@@ -31,7 +31,7 @@ from pygeodesy.vector3dBase import Vector3dBase
31
31
  # from math import fabs, sqrt # from .fmath
32
32
 
33
33
  __all__ = _ALL_LAZY.vector3d
34
- __version__ = '24.10.01'
34
+ __version__ = '24.11.22'
35
35
 
36
36
  _vector2d = _MODS.into(vector2d=__name__)
37
37
 
@@ -272,7 +272,7 @@ class Vector3d(Vector3dBase):
272
272
  Circles<https://MathWorld.Wolfram.com/TangentCircles.html>}.
273
273
  '''
274
274
  try:
275
- return _vector2d._radii11ABC(self, point2, point3, useZ=True)[0]
275
+ return _vector2d._radii11ABC4(self, point2, point3, useZ=True)[0]
276
276
  except (TypeError, ValueError) as x:
277
277
  raise _xError(x, point=self, point2=point2, point3=point3)
278
278
 
@@ -303,6 +303,17 @@ class Vector3d(Vector3dBase):
303
303
  '''
304
304
  return _vector2d.soddy4(self, point2, point3, eps=eps, useZ=True)
305
305
 
306
+ def toCartesian(self, Cartesian, **Cartesian_kwds):
307
+ '''Return this C{Vector3d} as a C{Cartesian}.
308
+
309
+ @arg Cartesian: The C{Cartesian} class to use.
310
+ @kwarg Cartesian_kwds: Optional, additional C{Cartesian}
311
+ keyword arguments.
312
+
313
+ @return: The C{B{Cartesian}} instance.
314
+ '''
315
+ return _v2Cls(self, Cartesian, Cartesian_kwds)
316
+
306
317
  def trilaterate2d2(self, radius, center2, radius2, center3, radius3, eps=EPS4, z=INT0):
307
318
  '''Trilaterate this and two other circles, each given as a (2-D) center
308
319
  and a radius.
@@ -497,17 +508,16 @@ def intersection3d3(start1, end1, start2, end2, eps=EPS, useZ=True,
497
508
  B{C{start2}} (Ccompass C{degrees}).
498
509
  @kwarg eps: Tolerance for skew line distance and length (C{EPS}).
499
510
  @kwarg useZ: If C{True}, use the Z components, otherwise force C{z=INT0} (C{bool}).
500
- @kwarg Vector_and_kwds: Optional class C{B{Vector}=None} to return the
501
- intersection points and optional, additional B{C{Vector}}
502
- keyword arguments, otherwise B{C{start1}}'s (sub-)class.
511
+ @kwarg Vector_and_kwds: Optional class C{B{Vector}=None} to return the intersection
512
+ points and optional, additional B{C{Vector}} keyword arguments,
513
+ otherwise B{C{start1}}'s (sub-)class.
503
514
 
504
- @return: An L{Intersection3Tuple}C{(point, outside1, outside2)} with
505
- C{point} an instance of B{C{Vector}} or B{C{start1}}'s (sub-)class.
515
+ @return: An L{Intersection3Tuple}C{(point, outside1, outside2)} with C{point}
516
+ an instance of B{C{Vector}} or B{C{start1}}'s (sub-)class.
506
517
 
507
518
  @note: The C{outside} values is C{0} for lines specified by point and bearing.
508
519
 
509
- @raise IntersectionError: Invalid, skew, non-co-planar or otherwise
510
- non-intersecting lines.
520
+ @raise IntersectionError: Invalid, skew, non-co-planar or otherwise non-intersecting lines.
511
521
 
512
522
  @see: U{Line-line intersection<https://MathWorld.Wolfram.com/Line-LineIntersection.html>}
513
523
  and U{line-line distance<https://MathWorld.Wolfram.com/Line-LineDistance.html>},
@@ -538,9 +548,9 @@ def intersections2(center1, radius1, center2, radius2, sphere=True, **Vector_and
538
548
  @kwarg sphere: If C{True}, compute the center and radius of the intersection of
539
549
  two spheres. If C{False}, ignore the C{z}-component and compute
540
550
  the intersection of two circles (C{bool}).
541
- @kwarg Vector_and_kwds: Optional class C{B{Vector}=None} to return the
542
- intersection points and optional, additional B{C{Vector}}
543
- keyword arguments, otherwise B{C{center1}}'s (sub-)class.
551
+ @kwarg Vector_and_kwds: Optional class C{B{Vector}=None} to return the intersection
552
+ points and optionally, additional B{C{Vector}} keyword arguments,
553
+ otherwise B{C{center1}}'s (sub-)class.
544
554
 
545
555
  @return: If C{B{sphere} is True}, a 2-tuple of the C{center} and C{radius} of the
546
556
  intersection of the I{spheres}. For abutting circles, C{radius} is C{0.0}
@@ -725,12 +735,12 @@ def nearestOn6(point, points, closed=False, useZ=True, **Vector_and_kwds): # ep
725
735
  @kwarg closed: Optionally, close the path or polygon (C{bool}).
726
736
  @kwarg useZ: If C{True}, use the Z components, otherwise force C{z=INT0} (C{bool}).
727
737
  @kwarg Vector_and_kwds: Optional class C{B{Vector}=None} to return the closest
728
- point and optional, additional B{C{Vector}} keyword
729
- arguments, otherwise B{C{point}}'s (sub-)class.
738
+ point and optionally, additional B{C{Vector}} keyword arguments,
739
+ otherwise B{C{point}}'s (sub-)class.
730
740
 
731
741
  @return: A L{NearestOn6Tuple}C{(closest, distance, fi, j, start, end)} with the
732
742
  C{closest}, the C{start} and the C{end} point each an instance of the
733
- B{C{Vector}} keyword argument of if {B{Vector}=None} or not specified,
743
+ B{C{Vector}} keyword argument or if {B{Vector}=None} or not specified,
734
744
  an instance of the reference B{C{point}}'s (sub-)class.
735
745
 
736
746
  @raise PointsError: Insufficient number of B{C{points}}
@@ -854,17 +864,16 @@ def trilaterate3d2(center1, radius1, center2, radius2, center3, radius3,
854
864
  and C{z}).
855
865
  @kwarg eps: Pertubation tolerance (C{scalar}), same units as C{x},
856
866
  C{y} and C{z} or C{None} for no pertubations.
857
- @kwarg Vector_and_kwds: Optional class C{B{Vector}=None} to return
858
- the trilateration and optional, additional
859
- B{C{Vector}} keyword arguments, otherwise
860
- the B{C{center1}}'s (sub-)class.
867
+ @kwarg Vector_and_kwds: Optional class C{B{Vector}=None} to return the
868
+ trilateration and optionally, additional B{C{Vector}}
869
+ keyword arguments, otherwise B{C{center1}}'s (sub-)class.
861
870
 
862
871
  @return: 2-Tuple with two trilaterated points, each a B{C{Vector}}
863
872
  instance. Both points are the same instance if all three
864
873
  spheres abut/intersect in a single point.
865
874
 
866
- @raise ImportError: Package C{numpy} not found, not installed or
867
- older than version 1.10.
875
+ @raise ImportError: Package C{numpy} not found, not installed or older
876
+ than version 1.10.
868
877
 
869
878
  @raise IntersectionError: Near-concentric, -colinear, too distant or
870
879
  non-intersecting spheres.
@@ -904,7 +913,7 @@ __all__ += _ALL_DOCS(intersections2, sumOf, Vector3dBase)
904
913
 
905
914
  # **) MIT License
906
915
  #
907
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
916
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
908
917
  #
909
918
  # Permission is hereby granted, free of charge, to any person obtaining a
910
919
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/vector3dBase.py CHANGED
@@ -14,7 +14,7 @@ from pygeodesy.constants import EPS, EPS0, INT0, PI, PI2, _copysignINF, \
14
14
  _float0, isnear0, isnear1, isneg0, \
15
15
  _pos_self, _1_0
16
16
  from pygeodesy.errors import CrossError, VectorError, _xcallable, _xError
17
- from pygeodesy.fmath import euclid_, fdot, hypot_, hypot2_
17
+ from pygeodesy.fmath import euclid_, fdot, fdot_, hypot_, hypot2_ # _MODS.fmath.fma
18
18
  from pygeodesy.interns import _coincident_, _colinear_, _COMMASPACE_, _xyz_
19
19
  from pygeodesy.lazily import _ALL_LAZY, _ALL_DOCS, _ALL_MODS as _MODS
20
20
  from pygeodesy.named import _NamedBase, _NotImplemented, _xother3
@@ -23,12 +23,12 @@ from pygeodesy.props import deprecated_method, Property, Property_RO, \
23
23
  property_doc_, property_RO, _update_all
24
24
  from pygeodesy.streprs import Fmt, strs, unstr
25
25
  from pygeodesy.units import Float, Scalar
26
- from pygeodesy.utily import sincos2, atan2, fabs
26
+ from pygeodesy.utily import atan2, sincos2, fabs
27
27
 
28
28
  from math import ceil as _ceil, floor as _floor, trunc as _trunc
29
29
 
30
30
  __all__ = _ALL_LAZY.vector3dBase
31
- __version__ = '24.10.12'
31
+ __version__ = '24.11.24'
32
32
 
33
33
 
34
34
  class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
@@ -141,10 +141,6 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
141
141
  '''Not implemented.'''
142
142
  return _NotImplemented(self, other)
143
143
 
144
- def __format__(self, *other): # PYCHOK no cover
145
- '''Not implemented.'''
146
- return _NotImplemented(self, *other)
147
-
148
144
  def __ge__(self, other):
149
145
  '''Is this vector longer than or equal to an other vector?
150
146
 
@@ -504,9 +500,9 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
504
500
  '''
505
501
  X, Y, Z = self.others(other).xyz3
506
502
  x, y, z = self.xyz3
507
- xyz = ((y * Z - z * Y),
508
- (z * X - x * Z),
509
- (x * Y - y * X))
503
+ xyz = (fdot_(y, Z, -z, Y),
504
+ fdot_(z, X, -x, Z),
505
+ fdot_(x, Y, -y, X))
510
506
 
511
507
  if raiser and self.crosserrors and eps0 > 0 \
512
508
  and max(map(fabs, xyz)) < eps0:
@@ -823,11 +819,12 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
823
819
  '''
824
820
  return self._plus(*_xyz3(self.plus_, other_x, *y_z))
825
821
 
826
- def rotate(self, axis, theta):
822
+ def rotate(self, axis, theta, fma=False):
827
823
  '''Rotate this vector around an axis by a specified angle.
828
824
 
829
825
  @arg axis: The axis being rotated around (L{Vector3d}).
830
826
  @arg theta: The angle of rotation (C{radians}).
827
+ @kwarg fma: If C{True}, use fused-multiply-add (C{bool}).
831
828
 
832
829
  @return: New, rotated vector (L{Vector3d}).
833
830
 
@@ -846,17 +843,23 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
846
843
  bx, by, bz = r.times(d).xyz3
847
844
  sx, sy, sz = r.times(s).xyz3
848
845
 
849
- x = fdot(p, ax * bx + c, ax * by - sz, ax * bz + sy)
850
- y = fdot(p, ay * bx + sz, ay * by + c, ay * bz - sx)
851
- z = fdot(p, az * bx - sy, az * by + sx, az * bz + c)
846
+ if fma:
847
+ _fma = _MODS.fmath.fma
848
+ else:
849
+ def _fma(a, b, c):
850
+ return a * b + c
851
+
852
+ x = fdot(p, _fma(ax, bx, c), _fma(ax, by, -sz), _fma(ax, bz, sy))
853
+ y = fdot(p, _fma(ay, bx, sz), _fma(ay, by, c), _fma(ay, bz, -sx))
854
+ z = fdot(p, _fma(az, bx, -sy), _fma(az, by, sx), _fma(az, bz, c))
852
855
  else: # unrotated
853
856
  x, y, z = self.xyz3
854
857
  return self.classof(x, y, z)
855
858
 
856
859
  @deprecated_method
857
- def rotateAround(self, axis, theta): # PYCHOK no cover
860
+ def rotateAround(self, axis, theta):
858
861
  '''DEPRECATED, use method C{rotate}.'''
859
- return self.rotate(axis, theta)
862
+ return self.rotate(axis, theta) # PYCHOK no cover
860
863
 
861
864
  def times(self, factor):
862
865
  '''Multiply this vector by a scalar.
@@ -897,7 +900,7 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
897
900
  #
898
901
  # @return: A L{PhiLam2Tuple}C{(phi, lam)}.
899
902
  # '''
900
- # return _MODS.formy.n_xyz2philam(self.x, self.y, self.z)
903
+ # return _MODS.nvectorBase.n_xyz2philam(self.x, self.y, self.z)
901
904
 
902
905
  # @deprecated_method
903
906
  # def to2ll(self): # PYCHOK no cover
@@ -905,7 +908,7 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
905
908
  #
906
909
  # @return: A L{LatLon2Tuple}C{(lat, lon)}.
907
910
  # '''
908
- # return _MODS.formy.n_xyz2latlon(self.x, self.y, self.z)
911
+ # return _MODS.nvectorBase.n_xyz2latlon(self.x, self.y, self.z)
909
912
 
910
913
  @deprecated_method
911
914
  def to3xyz(self): # PYCHOK no cover
@@ -1047,7 +1050,7 @@ __all__ += _ALL_DOCS(Vector3dBase)
1047
1050
 
1048
1051
  # **) MIT License
1049
1052
  #
1050
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
1053
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1051
1054
  #
1052
1055
  # Permission is hereby granted, free of charge, to any person obtaining a
1053
1056
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/webmercator.py CHANGED
@@ -36,7 +36,7 @@ from pygeodesy.utily import degrees90, degrees180
36
36
  from math import atan, atanh, exp, radians, sin, tanh
37
37
 
38
38
  __all__ = _ALL_LAZY.webmercator
39
- __version__ = '24.08.13'
39
+ __version__ = '24.11.06'
40
40
 
41
41
  # _FalseEasting = 0 # false Easting (C{meter})
42
42
  # _FalseNorthing = 0 # false Northing (C{meter})
@@ -314,10 +314,10 @@ def toWm(latlon, lon=None, earth=R_MA, Wm=Wm, **name_Wm_kwds_radius):
314
314
  L{a_f2Tuple}, L{Ellipsoid} or L{Ellipsoid2}), overridden
315
315
  by B{C{latlon}}'s datum if present.
316
316
  @kwarg Wm: Optional class to return the WM coordinate (L{Wm}) or C{None}.
317
- @kwarg name_Wm_kwds_radius: Optional C{B{name}=NN} (C{str}), optional,
317
+ @kwarg name_Wm_kwds_radius: Optional C{B{name}=NN} (C{str}), optionally,
318
318
  additional B{C{Wm}} keyword arguments, ignored if C{B{Wm} is
319
- None} and DEPRECATED keyword argument C{B{radius}=earth},
320
- use B{C{earth}}.
319
+ None} and DEPRECATED keyword argument C{B{radius}=earth}, use
320
+ B{C{earth}}.
321
321
 
322
322
  @return: The WM coordinate (B{C{Wm}}) or if C{B{Wm} is None}, an
323
323
  L{EasNorRadius3Tuple}C{(easting, northing, radius)}.
@@ -352,7 +352,7 @@ def toWm(latlon, lon=None, earth=R_MA, Wm=Wm, **name_Wm_kwds_radius):
352
352
 
353
353
  # **) MIT License
354
354
  #
355
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
355
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
356
356
  #
357
357
  # Permission is hereby granted, free of charge, to any person obtaining a
358
358
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/wgrs.py CHANGED
@@ -32,7 +32,7 @@ from pygeodesy.utily import ft2m, m2ft, m2NM
32
32
  from math import floor
33
33
 
34
34
  __all__ = _ALL_LAZY.wgrs
35
- __version__ = '24.08.15'
35
+ __version__ = '24.11.06'
36
36
 
37
37
  _Base = 10
38
38
  _BaseLen = 4
@@ -212,9 +212,9 @@ class Georef(Str):
212
212
 
213
213
  @kwarg LatLon: Class to use (C{LatLon}) or C{None}.
214
214
  @kwarg height: Optional height (C{meter}), overriding this height.
215
- @kwarg name_LatLon_kwds: Optional C{B{name}=NN} (C{str}) and optional,
216
- additional B{C{LatLon}} keyword arguments, ignored if
217
- C{B{LatLon} is None}.
215
+ @kwarg name_LatLon_kwds: Optional C{B{name}=NN} (C{str}) and optionally,
216
+ additional B{C{LatLon}} keyword arguments, ignored if C{B{LatLon}
217
+ is None}.
218
218
 
219
219
  @return: This georef location (B{C{LatLon}}) or if C{B{LatLon} is None},
220
220
  a L{LatLon3Tuple}C{(lat, lon, height)}.
@@ -424,7 +424,7 @@ __all__ += _ALL_DOCS(decode3, decode5, # functions
424
424
 
425
425
  # **) MIT License
426
426
  #
427
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
427
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
428
428
  #
429
429
  # Permission is hereby granted, free of charge, to any person obtaining a
430
430
  # copy of this software and associated documentation files (the "Software"),
@@ -1,118 +0,0 @@
1
- pygeodesy/LICENSE,sha256=YfgAiyxOwY6P9Kkb1_5XN81nueTLrpb3Ffkv3EuPgFU,1144
2
- pygeodesy/__init__.py,sha256=r0yjEW8YI02U-NFs0qZF3tqSGbEqYLors4l-upxXJEg,42631
3
- pygeodesy/__main__.py,sha256=1lE1jMp57iXpvu3TEh2unyT2qvtSa5nJPQn_K7Wmj3E,5442
4
- pygeodesy/albers.py,sha256=BTeUqKPgygExYBLhRJh8b8FYdwuCIpCuo8ggCw6-Auw,30955
5
- pygeodesy/azimuthal.py,sha256=erI5DTM0-Nr5YC2LnBTVNbUKlrnnXJUwKe0SCQ7-Soc,50223
6
- pygeodesy/basics.py,sha256=I1za68bt64DDU7uDobR6EO8DZoNHtfTZHnKdGdH9O8w,30020
7
- pygeodesy/booleans.py,sha256=0sNGKydX2ALi-VaIdaGhoPoRxmfBvA-Ny66lAH_LVis,73463
8
- pygeodesy/cartesianBase.py,sha256=82h4wO5OxRRuvwMhGpjdZzeJjYVDWObP_3bhPB1T7TY,46935
9
- pygeodesy/clipy.py,sha256=hzI6IutTRkbssjPPgAjXv9OcgCIIZchjnMWaHin4YAU,27728
10
- pygeodesy/constants.py,sha256=X2qvwiHSbCKv-PalJ6u22EJpwCcvSksvFrJdLaxgnZk,19842
11
- pygeodesy/css.py,sha256=rPr5EcGm_blVt72h-851ytpVxdPhx1MEqqGs3Ppx3eI,25651
12
- pygeodesy/datums.py,sha256=trFx6KgEjlYY_VC6WViZhH1D-U3tDDDdbZXG6MD2H_U,34057
13
- pygeodesy/dms.py,sha256=FiI-h3nXngSp624i0KlzHkBqYp5X5ucmvN6fLGi_Xgk,42174
14
- pygeodesy/ecef.py,sha256=_yy_TIUGsXmEZ7aRcmchbJwTp7x__edx6EPiS3Xznes,59587
15
- pygeodesy/elevations.py,sha256=4FuVcVNb_D09gmcvUlck344N4f7Jms76SIRrdutvKjk,10801
16
- pygeodesy/ellipsoidalBase.py,sha256=D5OlvepTLoguqDdMmR50OqiMX44e1kaMM-z7k1NtFvI,55385
17
- pygeodesy/ellipsoidalBaseDI.py,sha256=-y6JhV_8ZA0uNaIV05MkhCASVmUaXJthM4azJrM5Lbk,38445
18
- pygeodesy/ellipsoidalExact.py,sha256=wmIGgZyd0cvjswP4KOeDuEcuagjwQQRRq1cmseRoD-Q,16946
19
- pygeodesy/ellipsoidalGeodSolve.py,sha256=fAT4b3HXkM6i1W_C0rb4vbSxZqr4c6rS7PIvGF2ad7s,16666
20
- pygeodesy/ellipsoidalKarney.py,sha256=qvJa8kZ4SgaRR2UbjtkcRxw_CRbwhXoUT4Dn_6DJ6Ag,18721
21
- pygeodesy/ellipsoidalNvector.py,sha256=Ye6O6SIRiiwY6PJG4KD9kZ6GBpKkWWxZWsZC4k3eH-s,30039
22
- pygeodesy/ellipsoidalVincenty.py,sha256=Eeh-lFB9y65kyYCZ5bc7uRIF9o6UT4lqdkk4EVRi0Pg,25946
23
- pygeodesy/ellipsoids.py,sha256=PQ4fZtEHN-24ROvEbKzARWquisy__WKvKkaT4SOXVB0,106894
24
- pygeodesy/elliptic.py,sha256=g_IuxDoVf0npEicUCT3x39GJqo1cfpkalC7aV1Z1hFY,45004
25
- pygeodesy/epsg.py,sha256=Vq_M1g7Z0x5Noqsmt6OCQkPdYJj4jpWObtixL5pAjDA,8220
26
- pygeodesy/errors.py,sha256=KtLGXxBeNMagCio5qeNX86NmR4g1GHmoYsSQ093RgfA,32040
27
- pygeodesy/etm.py,sha256=QMQstkJGAvGS5zrLz_TJ75IRzDOljNXuuwGs8peJkMg,46188
28
- pygeodesy/fmath.py,sha256=3y_qlxzq4vlOwqJ0vhDaGscAi3XbOyPbU6IISovvOzE,36494
29
- pygeodesy/formy.py,sha256=8xrs_fSGng-TVKSgDzjR41SBwtbEO4_kS3Lq4kLtX-4,75082
30
- pygeodesy/frechet.py,sha256=F6TYbOEYSOFcll6nvp4GhqafUWXh1umAKb1QaMYQtuM,34372
31
- pygeodesy/fstats.py,sha256=8Vn1cwlgCQD444WX8FfAEC-AXQcJDeI9_i14Mizp59U,28288
32
- pygeodesy/fsums.py,sha256=QEPeyM7wkgqeeWEynUNhJhiqynapRTCh8WzpU1fCREw,103404
33
- pygeodesy/gars.py,sha256=KRlyZUv1euEl7ZkDYSZG913GAfFMRG2m2hp37ObYY_Y,11829
34
- pygeodesy/geodesici.py,sha256=4Elhe9Z8tcVFD46K0HKd_TSS24CQmgQGGlDk6DnBnmo,74775
35
- pygeodesy/geodesicw.py,sha256=y6XVpgSG_s-sqF0Dh2HZwJWjBfKiUTCJoCP9Hc8LIww,28710
36
- pygeodesy/geodsolve.py,sha256=iimnxLJBwygqy7Lxxl-ZjkJ7HVPD6sUrPW8hUZBxaKo,29356
37
- pygeodesy/geohash.py,sha256=gDmDI91GOJAdNiAcf9bHq8I581UfPnMmwjWyJlPHRlM,40201
38
- pygeodesy/geoids.py,sha256=uOvDFPYigoEOPnl7yrzbEN1_pEjo4YP-Nan4zsHI_Vs,82479
39
- pygeodesy/hausdorff.py,sha256=-aKtRbMefDSoIk4V3wCvNrXPZ7Bqk1P6-XuGuI7o8Zc,34770
40
- pygeodesy/heights.py,sha256=Gv3b1xC7I0tBvTO-DdmWVW8A3ZV3RKxY3jveUUZso38,42909
41
- pygeodesy/internals.py,sha256=QPLqHnyTMQirTyjyRqlenCxP3vOq-PPxKnxFlKie0WM,24594
42
- pygeodesy/interns.py,sha256=t8hQ3Y1QHzVkoQxq8Z9f0YjkpRC0oB0G7hpV894aYjw,23403
43
- pygeodesy/iters.py,sha256=xPH0ytomvJeKHu717Fjzi3QbRrEikO6n7vqkY_IDz1k,20311
44
- pygeodesy/karney.py,sha256=UUZqUWlRn7S2YdF2A9bxuBNa-Qkpib9QkpRyGZXQOt8,40466
45
- pygeodesy/ktm.py,sha256=eUWYKhoPou1AiWiNz-xI8eDr-q-RvKDY6newAmYP26Q,27239
46
- pygeodesy/latlonBase.py,sha256=9R9O9SeIRXTmHfpR9WOL8-1m0yyG8Ymfth2eGq0mDEo,79070
47
- pygeodesy/lazily.py,sha256=MSQhTpG8jPYBGsi75yNx9yXEvefQFwzDFnYpW_-Kkc0,46648
48
- pygeodesy/lcc.py,sha256=oDooTzFHnqsMtSKmmmfEbypHpdlPltfo7Mt0pAO4-_A,25669
49
- pygeodesy/ltp.py,sha256=ZMdfJHLKeDHSoymmjWfoAZTtrdoADf0O6WccRf53L2w,50745
50
- pygeodesy/ltpTuples.py,sha256=oNTxtjxmHveMDQvPdQCHl-JzSJJGb1jFRrF8SEG_Ojw,58480
51
- pygeodesy/mgrs.py,sha256=3grmlAIeJFMDTLwCqlt86n4_kmIGocQ-3I6bIXd9nPo,29833
52
- pygeodesy/named.py,sha256=D71yA_a3mwELI-rUYSKKKiXGuJQNuUnVXPTDhW5zZyc,52386
53
- pygeodesy/namedTuples.py,sha256=e0rV1Zb2tbx8fztXcSkUFsRTmZtye8B5i_Hi4vBUndU,28758
54
- pygeodesy/nvectorBase.py,sha256=Xy1TDcH5UuUelVZ7aSKX85hx3fLlpDkYDhuoZijQ1vI,28644
55
- pygeodesy/osgr.py,sha256=3Qon_oWuVrIb1vYnd3ae3L5MDkjp_tngyVdiYHuL4to,30821
56
- pygeodesy/points.py,sha256=Vs9vShhBxebgo7UdHlt7Ov4D4Chfa723BZxV0_kpgGk,64389
57
- pygeodesy/props.py,sha256=IFykUIfSybnymwxQbMjCJax7uAZl6SVJ-uMjatQPsLc,24564
58
- pygeodesy/resections.py,sha256=IrPHAHbF9JdBgAVd9LMgXoPgPFRkY8j1G7p0P8y8pdc,43543
59
- pygeodesy/simplify.py,sha256=vkOtO478sOjZHZBuSFvCaRh72qSDQuzXLQpMK1LKyYI,25232
60
- pygeodesy/solveBase.py,sha256=DpgFNHmWs1GUwCViAU-9iBsmKLVFNc8kW1zrDNi31FY,18485
61
- pygeodesy/sphericalBase.py,sha256=lsjzDWm3VUxKTpKASqZJDYw7M_CJ4eCgzp3LiCJvMt8,32110
62
- pygeodesy/sphericalNvector.py,sha256=lUXLX0fSZ0TcResvJ59N25GKR-qQBZEuXlhK-T6ijY4,56984
63
- pygeodesy/sphericalTrigonometry.py,sha256=uOSNMlsdp5jEK36bL6750IlMuLdy-cKqOsd4tMhFr1M,64135
64
- pygeodesy/streprs.py,sha256=ItNnTqkE_TMZtqgsRhDonrRDpi5gXtD44sQ_D3Qfsd0,23418
65
- pygeodesy/trf.py,sha256=hxh6WA7IibL09dHoGMBKQeSXrRFPsYQV0F-LPAD40v4,119073
66
- pygeodesy/triaxials.py,sha256=priBlyuraA1VhNbN0gv_UAXuulAwV14XjOBvu_oJA4U,63559
67
- pygeodesy/units.py,sha256=XUbABlp93Pt9VL_Z_chhYRd-dMvwAMWNNWe54V6gmmM,35314
68
- pygeodesy/unitsBase.py,sha256=ZZ-VDntCOTjSerQJf9aaLE_J0lozrpmUhynRBaCtg24,14060
69
- pygeodesy/ups.py,sha256=qRyk3tnQNRD7KgWGPANWOrg6Hxqd9eS7vN8or_tKk4E,23338
70
- pygeodesy/utily.py,sha256=qLxVVE57PHEu1stJaULIYHZ6G-uNe7Fy_uoQfmNbXUg,36189
71
- pygeodesy/utm.py,sha256=Ubd6-kZtBEoOzCj-pbHb3gRzuGrWBX6nY9_h1YweV2Q,31091
72
- pygeodesy/utmups.py,sha256=g2Z_aEOt6fhV9f4fASlW4_K_O_P4zBsBbWfQV11mIKo,13196
73
- pygeodesy/utmupsBase.py,sha256=S4s1Sehj9jSMy-XRxwtwVstG3QhyVt924V0FHu0cPIk,18730
74
- pygeodesy/vector2d.py,sha256=O9a3uRIREL2k7G-pnpuacjBcAlKg75MnokjtfJB-nBs,39659
75
- pygeodesy/vector3d.py,sha256=PaiuJgHCf0bO8nhOai42ut2zk0_DskSNCrOtCuHxw6U,42673
76
- pygeodesy/vector3dBase.py,sha256=IJdJ-fLApA88HbPZb41vAJzbLlGywpfKn5yT7ia26A0,36108
77
- pygeodesy/webmercator.py,sha256=fFQtTxIsjOE35_nX_mAgFv1Eov7AdcsCBjT2ONm3qmI,14934
78
- pygeodesy/wgrs.py,sha256=6dO31uMKF-t-uQz58hdutilE2A5msOs5Bybq5Uq3qgk,15453
79
- pygeodesy/auxilats/_CX_4.py,sha256=WsxGrwqEhdWBx-K5ocwwDuatIkDTZB-FwrqQITbcNU0,6829
80
- pygeodesy/auxilats/_CX_6.py,sha256=PsaVhzOdCDyRuZ-SH6ZwbWrf_rAkidtwLuAQTlvv5XQ,11277
81
- pygeodesy/auxilats/_CX_8.py,sha256=mxk12xvzOMNimyHM74fn9sFB0aUSBLojYqtenYhAekQ,18899
82
- pygeodesy/auxilats/_CX_Rs.py,sha256=z7UXI7KUyURE44wGuLJE2on6SlgAZzfbay4jkbpON1U,7967
83
- pygeodesy/auxilats/__init__.py,sha256=ywIs1e5wes3qq3dvCvX0VdxoGtFNQwBmY8Ar-07f9Kg,2881
84
- pygeodesy/auxilats/__main__.py,sha256=pb0GWDrrg440xNvHvPAz-UTGrLu2uXp4g-RlbkW7P6c,3171
85
- pygeodesy/auxilats/auxAngle.py,sha256=nr-su1loEbv1uVxg7_cEjH0M1DLyodsulPfq4NVT5kY,16745
86
- pygeodesy/auxilats/auxDLat.py,sha256=3sq7Wc-ykpVbldNh10IZ3tIlJ7DcQFDlmZ4nOhJEgo0,10969
87
- pygeodesy/auxilats/auxDST.py,sha256=BSHR0M3hQBR1KjF_BUJHrNzGXr2PblYXUQsMD5L1Kcc,10468
88
- pygeodesy/auxilats/auxLat.py,sha256=7uxe7mtkY-9uSI3z2wmUNBqzCKyFujIpJU1v-8yDgds,31934
89
- pygeodesy/auxilats/auxily.py,sha256=X1y4_qC40Th7CgmZILqoQCLAUQoyORcR5W-bN4X0W4I,7882
90
- pygeodesy/deprecated/__init__.py,sha256=jSwmipBzyIOYIQhiZxZwsIQlqMXPfNaPfVpppBu7zkw,2815
91
- pygeodesy/deprecated/bases.py,sha256=nxUtxscAg5cb7HEzTSmPJFafLc9Ad2SL5ovwkYaU5z8,1655
92
- pygeodesy/deprecated/classes.py,sha256=gktUr5qYXCm8ztH6lfzFgaHKqMiw1tHc1Vw6i6DEvNA,12377
93
- pygeodesy/deprecated/consterns.py,sha256=W-rQiw443_zCFEUzjCGykGND-i5P_ghEIyJUSGg7-Nc,1908
94
- pygeodesy/deprecated/datum.py,sha256=s8Hke053RucP5ACvg3gdX8weQfGM0x59pQyHpY11eOs,1875
95
- pygeodesy/deprecated/functions.py,sha256=-spa_5k7yRWGd7s4UBObzf9QpAM0o-tgP4S0wX876JY,14122
96
- pygeodesy/deprecated/nvector.py,sha256=_dZf84RdmPr7e7i8Yi683R-8Mqn0ipTqIsDhNl29hGo,2117
97
- pygeodesy/deprecated/rhumbBase.py,sha256=d7YKW--dnRpobB2CSvhFsntWF0B5-HYJqID2pv5lD5k,1375
98
- pygeodesy/deprecated/rhumbaux.py,sha256=n29xazYMbVG4MJkLjAGu8B88bbcFF5xnvuj9xSxjfIk,1428
99
- pygeodesy/deprecated/rhumbsolve.py,sha256=QprjRfo5T1_C4ovaa1cffAcmNczzkhGIfmybAup9a9w,1431
100
- pygeodesy/deprecated/rhumbx.py,sha256=OS0p_meaoVrpZe5UhK6qZljjlrGpL0pCHWw8gofw7ks,1425
101
- pygeodesy/geodesicx/_C4_24.py,sha256=r5-So2i4z-OFY6NFYERUvhtxYHaYphPRgUUC3PWC5K4,90707
102
- pygeodesy/geodesicx/_C4_27.py,sha256=Pkpns4kBAHxBcvi0f9l_3GQeE6qcrl123DccEQ593To,134215
103
- pygeodesy/geodesicx/_C4_30.py,sha256=cseNhROi7DHi77kgdrXXDXO6yiiq00DNcX0HOVf2Rpg,201921
104
- pygeodesy/geodesicx/__init__.py,sha256=Z-Pq7wWevRZeMdG2qqL7OE1b8hRUubyZE2w1GqF1OzI,2478
105
- pygeodesy/geodesicx/__main__.py,sha256=wsJPK6lW_PsgVCR1ZJksgGhwxwrsMGSXhYkhpjbknTc,4188
106
- pygeodesy/geodesicx/gx.py,sha256=yeNpMQbw_uWfs4KOQX8RMAQt6WNsG3zsGgmZRVgbQIk,60612
107
- pygeodesy/geodesicx/gxarea.py,sha256=cJaXwMMxjQ21RiCGU7c2YLXNmrqkRawHxQxsg7o5gas,19454
108
- pygeodesy/geodesicx/gxbases.py,sha256=AyvsjiSENqikJK6qpm55rDkUlBSmTDk_-FoqzzMFX1M,6130
109
- pygeodesy/geodesicx/gxline.py,sha256=zNQF8lz9caHZlsUcL8NfjG02KIza39Q6Qd6XizDp_UI,27537
110
- pygeodesy/rhumb/__init__.py,sha256=G8qo1yrLhKfd0yWiVUdJbIPj3udcmsgqKZqFD0PYfeA,2207
111
- pygeodesy/rhumb/aux_.py,sha256=XN0zlNwhU525NdcHko-G_Igvc7-mzXbT7ypcVIt5ADw,16048
112
- pygeodesy/rhumb/bases.py,sha256=e_ASUIK9ABtORVZaTMiFMGRc3w2wKGNDPdJEfVCp5CU,54162
113
- pygeodesy/rhumb/ekx.py,sha256=JsmdCatWKqsffF8jCh4HDu5IKt_kHq1qUdmP1LMuofY,24044
114
- pygeodesy/rhumb/solve.py,sha256=Ko1uHcicoqw7x467IzncjMtppjRs1JC1yqVh_DtTV6k,23905
115
- PyGeodesy-24.10.24.dist-info/METADATA,sha256=tKtj7Pcqe2Kbx6YfgDvEdUNdDHw0-L4X0xpMStYFGlg,19919
116
- PyGeodesy-24.10.24.dist-info/WHEEL,sha256=fS9sRbCBHs7VFcwJLnLXN1MZRR0_TVTxvXKzOnaSFs8,110
117
- PyGeodesy-24.10.24.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
118
- PyGeodesy-24.10.24.dist-info/RECORD,,