pygeodesy 25.10.10__py2.py3-none-any.whl → 25.11.5__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.
pygeodesy/units.py CHANGED
@@ -820,6 +820,11 @@ def _isMeter(obj, iscalar=True):
820
820
  return isinstance(obj, _Meters) or (iscalar and _isScalar(obj))
821
821
 
822
822
 
823
+ def _isRadians(obj, iscalar=True):
824
+ # Check for valid radian types.
825
+ return isinstance(obj, _Radians) or (iscalar and _isScalar(obj))
826
+
827
+
823
828
  def _isRadius(obj, iscalar=True):
824
829
  # Check for valid earth radius types.
825
830
  return isinstance(obj, _Radii) or (iscalar and _isScalar(obj))
pygeodesy/utily.py CHANGED
@@ -28,7 +28,7 @@ from math import acos, asin, asinh, atan2 as _atan2, cos, degrees, fabs, \
28
28
  radians, sin, sinh, tan as _tan # pow
29
29
 
30
30
  __all__ = _ALL_LAZY.utily
31
- __version__ = '25.09.09'
31
+ __version__ = '25.10.29'
32
32
 
33
33
  # sqrt(3) <https://WikiPedia.org/wiki/Square_root_of_3>
34
34
  _COS_30, _SIN_30 = 0.86602540378443864676, _0_5 # sqrt(3) / 2
@@ -807,15 +807,16 @@ def _sin0cos2(q, r, sign):
807
807
  return s, c
808
808
 
809
809
 
810
- def SinCos2(x):
810
+ def SinCos2(x, unit=Radians):
811
811
  '''Get C{sin} and C{cos} of I{typed} angle.
812
812
 
813
813
  @arg x: Angle (L{Degrees}, L{Radians} or scalar C{radians}).
814
+ @kwarg unit: The C{B{x}} unit (L{Degrees}, L{Radians}).
814
815
 
815
816
  @return: 2-Tuple (C{sin(B{x})}, C{cos(B{x})}).
816
817
  '''
817
- return sincos2d(x) if isinstanceof(x, Degrees, Degrees_) else (
818
- # sincos2(x) if isinstanceof(x, Radians, Radians_) else
818
+ return sincos2d(x) if unit is Degrees or isinstanceof(x, Degrees, Degrees_) else (
819
+ # sincos2(x) if unit is Radians or isinstanceof(x, Radians, Radians_) else
819
820
  sincos2(Radians(x))) # assume C{radians}
820
821
 
821
822
 
pygeodesy/vector2d.py CHANGED
@@ -641,7 +641,7 @@ def triaxum5(points, useZ=True):
641
641
  A = []
642
642
  for i, p in enumerate(ps):
643
643
  v = _otherV3d(useZ=useZ, i=i, points=p)
644
- A.append(v.x2y2z2)
644
+ A.append(v.x2y2z23)
645
645
 
646
646
  with _numpy(triaxum5, n=n) as _np:
647
647
  A = _np.array(A)
pygeodesy/vector3dBase.py CHANGED
@@ -10,9 +10,9 @@ A pure Python implementation of vector-based functions by I{(C) Chris Veness
10
10
 
11
11
  from pygeodesy.basics import _copysign, islistuple, isscalar, \
12
12
  map1, map2, _signOf, _zip
13
- from pygeodesy.constants import EPS, EPS0, INT0, PI, PI2, \
14
- _1_0, isnear0, isnear1, isneg0, \
15
- _copysignINF, _float0, _pos_self
13
+ from pygeodesy.constants import EPS, EPS0, INT0, PI, PI2, _1_0, \
14
+ _copysignINF, isnear0, isnear1, \
15
+ _flipsign, _float0, _pos_self
16
16
  from pygeodesy.errors import CrossError, VectorError, _xcallable, _xError
17
17
  from pygeodesy.fmath import euclid_, fdot, fdot_, hypot_, hypot2_ # _MODS.fmath.fma
18
18
  from pygeodesy.interns import _coincident_, _colinear_, _COMMASPACE_, _xyz_
@@ -29,7 +29,7 @@ from pygeodesy.utily import atan2, sincos2, fabs
29
29
  from math import ceil as _ceil, floor as _floor, trunc as _trunc
30
30
 
31
31
  __all__ = _ALL_LAZY.vector3dBase
32
- __version__ = '25.08.31'
32
+ __version__ = '25.10.25'
33
33
 
34
34
 
35
35
  class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
@@ -112,9 +112,20 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
112
112
 
113
113
  cmp = __cmp__
114
114
 
115
- def __divmod__(self, other): # PYCHOK no cover
116
- '''Not implemented.'''
117
- return _NotImplemented(self, other)
115
+ def __divmod__(self, scalar): # PYCHOK no cover
116
+ '''Apply C{scalar} divmod to this vector's components.
117
+
118
+ @arg scalar: Divisor (C{scalar}).
119
+
120
+ @return: 2-Tuple C{(d, m)} each a L{Vector3d}.
121
+ '''
122
+ s = Scalar(divisor=scalar)
123
+ d, m = [], []
124
+ for x in self.xyz3:
125
+ q, r = divmod(x, s)
126
+ d.append(q)
127
+ m.append(r)
128
+ return self.classof(d), self.classof(m)
118
129
 
119
130
  def __eq__(self, other):
120
131
  '''Is this vector equal to an other vector?
@@ -132,15 +143,22 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
132
143
  return _NotImplemented(self) # must return C{float}
133
144
 
134
145
  def __floor__(self): # PYCHOK no cover
135
- '''Return a vector with the C{floor} of these components.
146
+ '''Return a vector with the C{floor} of each components.
136
147
 
137
148
  @return: Floor-ed (L{Vector3d}).
138
149
  '''
139
150
  return self._mapped(_floor)
140
151
 
141
- def __floordiv__(self, other): # PYCHOK no cover
142
- '''Not implemented.'''
143
- return _NotImplemented(self, other)
152
+ def __floordiv__(self, scalar): # PYCHOK no cover
153
+ '''Floor-divide this vector by a scalar, C{this // B{scalar}}.
154
+
155
+ @arg scalar: The divisor (C{scalar}).
156
+
157
+ @return: Floored quotient (L{Vector3d}).
158
+
159
+ @raise TypeError: Non-scalar B{C{scalar}}.
160
+ '''
161
+ return self.floorDividedBy(scalar)
144
162
 
145
163
  def __ge__(self, other):
146
164
  '''Is this vector longer than or equal to an other vector?
@@ -183,9 +201,14 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
183
201
  '''
184
202
  return self._xyz(self.plus(other))
185
203
 
186
- def __ifloordiv__(self, other): # PYCHOK no cover
187
- '''Not implemented.'''
188
- return _NotImplemented(self, other)
204
+ def __ifloordiv__(self, scalar): # PYCHOK no cover
205
+ '''Floor-divide this vector by a scalar I{in-place}, C{this //= B{scalar}}.
206
+
207
+ @arg scalar: The divisor (C{scalar}).
208
+
209
+ @raise TypeError: Non-scalar B{C{scalar}}.
210
+ '''
211
+ return self._xyz(self.floorDividedBy(scalar))
189
212
 
190
213
  def __imatmul__(self, other): # PYCHOK Python 3.5+
191
214
  '''Cross multiply this and an other vector I{in-place}, C{this @= B{other}}.
@@ -215,9 +238,16 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
215
238
  '''Not implemented, see method C{ints}.'''
216
239
  return _NotImplemented(self) # must return C{int}
217
240
 
218
- def __ipow__(self, other, *mod): # PYCHOK no cover
219
- '''Not implemented.'''
220
- return _NotImplemented(self, other, *mod)
241
+ def __ipow__(self, scalar, *mod): # PYCHOK no cover
242
+ '''Raise each component I{in-place} as C{pow(C, B{scalar})}.
243
+
244
+ @arg scalar: Exponent (C{scalar}).
245
+
246
+ @return: Power (L{Vector3d}).
247
+
248
+ @raise TypeError: Non-scalar B{C{scalar}}.
249
+ '''
250
+ return self._xyz(self.pow(scalar, *mod))
221
251
 
222
252
  def __isub__(self, other):
223
253
  '''Subtract an other vector from this one I{in-place}, C{this -= B{other}}.
@@ -280,9 +310,19 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
280
310
  '''
281
311
  return self.cross(other)
282
312
 
283
- def __mod__(self, other): # PYCHOK no cover
284
- '''Not implemented.'''
285
- return _NotImplemented(self, other)
313
+ def __mod__(self, modulus): # PYCHOK no cover
314
+ '''Apply C{scalar} modulo to this vector's components.
315
+
316
+ @arg modulus: Modulus (C{scalar}).
317
+
318
+ @return: Modulo (L{Vector3d}).
319
+ '''
320
+ m = Scalar(modulus=modulus)
321
+
322
+ def _mod(x):
323
+ return x % m
324
+
325
+ return self._mapped(_mod)
286
326
 
287
327
  def __mul__(self, scalar):
288
328
  '''Multiply this vector by a scalar, C{this * B{scalar}}.
@@ -318,13 +358,29 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
318
358
  '''
319
359
  return self if _pos_self else self.copy()
320
360
 
321
- def __pow__(self, other, *mod): # PYCHOK no cover
322
- '''Not implemented.'''
323
- return _NotImplemented(self, other, *mod)
361
+ def __pow__(self, scalar, *mod): # PYCHOK no cover
362
+ '''Return a vector with components as C{pow(C, B{scalar})}.
363
+
364
+ @arg scalar: Exponent (C{scalar}).
365
+
366
+ @return: Power (L{Vector3d}).
367
+
368
+ @raise TypeError: Non-scalar B{C{scalar}}.
369
+ '''
370
+ return self.pow(scalar, *mod)
324
371
 
325
- __radd__ = __add__ # PYCHOK no cover
372
+ def __radd__(self, other): # PYCHOK no cover
373
+ '''Add this vector to an other vector, C{B{other} + this}.
374
+
375
+ @arg other: The other vector (L{Vector3d}).
376
+
377
+ @return: Sum (L{Vector3d}).
378
+
379
+ @raise TypeError: Incompatible B{C{other}} C{type}.
380
+ '''
381
+ return self.others(other).plus(self)
326
382
 
327
- def __rdivmod__ (self, other): # PYCHOK no cover
383
+ def __rdivmod__(self, other):
328
384
  '''Not implemented.'''
329
385
  return _NotImplemented(self, other)
330
386
 
@@ -333,7 +389,7 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
333
389
  # '''
334
390
  # return self.toRepr()
335
391
 
336
- def __rfloordiv__(self, other): # PYCHOK no cover
392
+ def __rfloordiv__(self, other):
337
393
  '''Not implemented.'''
338
394
  return _NotImplemented(self, other)
339
395
 
@@ -348,11 +404,11 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
348
404
  '''
349
405
  return self.others(other).cross(self)
350
406
 
351
- def __rmod__(self, other): # PYCHOK no cover
407
+ def __rmod__(self, other):
352
408
  '''Not implemented.'''
353
409
  return _NotImplemented(self, other)
354
410
 
355
- __rmul__ = __mul__
411
+ __rmul__ = __mul__ # scalar other
356
412
 
357
413
  def __round__(self, *ndigits): # PYCHOK no cover
358
414
  '''Return a vector with these components C{rounded}.
@@ -361,8 +417,11 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
361
417
 
362
418
  @return: Rounded (L{Vector3d}).
363
419
  '''
420
+ def _rnd(x):
421
+ return round(x, *ndigits)
422
+
364
423
  # <https://docs.Python.org/3.12/reference/datamodel.html?#object.__round__>
365
- return self.classof(*(round(_, *ndigits) for _ in self.xyz3))
424
+ return self._mapped(_rnd)
366
425
 
367
426
  def __rpow__(self, other, *mod): # PYCHOK no cover
368
427
  '''Not implemented.'''
@@ -379,9 +438,9 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
379
438
  '''
380
439
  return self.others(other).minus(self)
381
440
 
382
- def __rtruediv__(self, scalar): # PYCHOK no cover
441
+ def __rtruediv__(self, other):
383
442
  '''Not implemented.'''
384
- return _NotImplemented(self, scalar)
443
+ return _NotImplemented(self, other)
385
444
 
386
445
  # def __str__(self):
387
446
  # '''Return the default C{str(self)}.
@@ -527,22 +586,39 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
527
586
  '''
528
587
  self._crosserrors = bool(raiser)
529
588
 
530
- def dividedBy(self, divisor):
589
+ def dividedBy(self, scalar):
531
590
  '''Divide this vector by a scalar.
532
591
 
533
- @arg divisor: The divisor (C{scalar}).
592
+ @arg scalar: The divisor (C{scalar}).
534
593
 
535
594
  @return: New, scaled vector (L{Vector3d}).
536
595
 
537
- @raise TypeError: Non-scalar B{C{divisor}}.
596
+ @raise TypeError: Non-scalar B{C{scalar}}.
538
597
 
539
- @raise VectorError: Invalid or zero B{C{divisor}}.
598
+ @raise VectorError: Invalid or zero B{C{scalar}}.
540
599
  '''
541
- d = Scalar(divisor=divisor)
600
+ d = Scalar(divisor=scalar)
542
601
  try:
543
602
  return self._times(_1_0 / d)
544
603
  except (ValueError, ZeroDivisionError) as x:
545
- raise VectorError(divisor=divisor, cause=x)
604
+ raise VectorError(divisor=scalar, cause=x)
605
+
606
+ def dividedBy_(self, scalar_x, *y_z):
607
+ '''Divide this vector by separate X, Y and Z divisors.
608
+
609
+ @arg scalar_x: X divisor (C{scalar}) or a vector's
610
+ X, Y, and Z components as divisors
611
+ (C{Cartesian}, L{Ecef9Tuple}, C{Nvector},
612
+ L{Vector3d}, L{Vector3Tuple}, L{Vector4Tuple}).
613
+ @arg y_z: Y and Z divisors (C{scalar}, C{scalar}), ignored
614
+ if B{C{scalar_x}} is not C{scalar}.
615
+
616
+ @return: New, scaled vector (L{Vector3d}).
617
+
618
+ @raise VectorError: Invalid B{C{scalar_x}} or B{C{y_z}}.
619
+ '''
620
+ x, y, z = _xyz3(self.dividedBy_, scalar_x, *y_z)
621
+ return self.classof(self.x / x, self.y / y, self.z / z)
546
622
 
547
623
  def dot(self, other):
548
624
  '''Compute the dot (scalar) product of this and an other vector.
@@ -595,6 +671,43 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
595
671
  '''
596
672
  return self._mapped(_float0)
597
673
 
674
+ def floorDividedBy(self, scalar):
675
+ '''Floor-divide this vector by a scalar.
676
+
677
+ @arg scalar: The divisor (C{scalar}).
678
+
679
+ @return: New, scaled vector (L{Vector3d}).
680
+
681
+ @raise TypeError: Non-scalar B{C{scalar}}.
682
+
683
+ @raise VectorError: Invalid or zero B{C{scalar}}.
684
+ '''
685
+ d = Scalar(divisor=scalar)
686
+ try:
687
+ def _floor_d(x):
688
+ return x // d
689
+
690
+ return self._mapped(_floor_d)
691
+ except (ValueError, ZeroDivisionError) as x:
692
+ raise VectorError(divisor=scalar, cause=x)
693
+
694
+ def floorDividedBy_(self, scalar_x, *y_z):
695
+ '''Floor-divide this vector by separate X, Y and Z divisors.
696
+
697
+ @arg scalar_x: X divisor (C{scalar}) or a vector's
698
+ X, Y, and Z components as divisors
699
+ (C{Cartesian}, L{Ecef9Tuple}, C{Nvector},
700
+ L{Vector3d}, L{Vector3Tuple}, L{Vector4Tuple}).
701
+ @arg y_z: Y and Z divisors (C{scalar}, C{scalar}), ignored
702
+ if B{C{scalar_x}} is not C{scalar}.
703
+
704
+ @return: New, scaled vector (L{Vector3d}).
705
+
706
+ @raise VectorError: Invalid B{C{scalar_x}} or B{C{y_z}}.
707
+ '''
708
+ x, y, z = _xyz3(self.floorDividedBy_, scalar_x, *y_z)
709
+ return self.classof(self.x // x, self.y // y, self.z // z)
710
+
598
711
  @Property
599
712
  def _fromll(self):
600
713
  '''(INTERNAL) Get the latlon reference (C{LatLon}) or C{None}.
@@ -617,11 +730,8 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
617
730
  y = y / z
618
731
  # z = _1_0
619
732
  else:
620
- if isneg0(z):
621
- x = -x
622
- y = -y
623
- x = _copysignINF(x)
624
- y = _copysignINF(y)
733
+ x = _copysignINF(_flipsign(x, z))
734
+ y = _copysignINF(_flipsign(y, z))
625
735
  # z = NAN
626
736
  return self.classof(x, y, _1_0)
627
737
 
@@ -705,7 +815,7 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
705
815
 
706
816
  @see: Properties L{length2} and L{euclid}.
707
817
  '''
708
- return Float(length=hypot_(self.x, self.y, self.z))
818
+ return Float(length=hypot_(*self.xyz3))
709
819
 
710
820
  @Property_RO
711
821
  def length2(self): # __dict__ value overwritten by Property_RO C{_united}
@@ -713,7 +823,7 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
713
823
 
714
824
  @see: Property L{length} and method C{equirectangular}.
715
825
  '''
716
- return Float(length2=hypot2_(self.x, self.y, self.z))
826
+ return Float(length2=hypot2_(*self.xyz3))
717
827
 
718
828
  def _mapped(self, func):
719
829
  '''(INTERNAL) Apply C{func} to all components.
@@ -815,12 +925,28 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
815
925
  @arg y_z: Y and Z components (C{scalar}, C{scalar}),
816
926
  ignored if B{C{other_x}} is not C{scalar}.
817
927
 
818
- @return: New, vectiorial vector (L{Vector3d}).
928
+ @return: New, vectorial vector (L{Vector3d}).
819
929
 
820
930
  @raise ValueError: Invalid B{C{other_x}} or B{C{y_z}}.
821
931
  '''
822
932
  return self._plus(*_xyz3(self.plus_, other_x, *y_z))
823
933
 
934
+ def pow(self, scalar, *mod):
935
+ '''Raise each X, Y and Z to C{scalar} power.
936
+
937
+ @arg scalar: Exponent (C{scalar}).
938
+
939
+ @return: Power (L{Vector3d}).
940
+
941
+ @raise TypeError: Non-scalar B{C{scalar}}.
942
+ '''
943
+ p = Scalar(power=scalar)
944
+
945
+ def _pow(x):
946
+ return pow(x, p, *mod)
947
+
948
+ return self._mapped(_pow)
949
+
824
950
  def rotate(self, axis, theta, fma=False):
825
951
  '''Rotate this vector around an axis by a specified angle.
826
952
 
@@ -863,6 +989,16 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
863
989
  '''DEPRECATED, use method C{rotate}.'''
864
990
  return self.rotate(axis, theta) # PYCHOK no cover
865
991
 
992
+ def _roty(self, *pos, **name):
993
+ '''(INTERNAL) Prolate rotation, for C{+1 if pos else -1}.
994
+ '''
995
+ v = self.copy(**name)
996
+ if pos:
997
+ x, _, z = v.xyz3
998
+ _update_all(v, needed=3)
999
+ v._x, v._z = (-z, x) if pos[0] else (z, -x)
1000
+ return v
1001
+
866
1002
  def times(self, factor):
867
1003
  '''Multiply this vector by a scalar.
868
1004
 
@@ -989,8 +1125,10 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
989
1125
  def _xyz(self, x_xyz, *y_z):
990
1126
  '''(INTERNAL) Set the C{_x}, C{_y} and C{_z} attributes.
991
1127
  '''
992
- _update_all(self, needed=3)
993
- self._x, self._y, self._z = _xyz3(_xyz_, x_xyz, *y_z)
1128
+ xyz = _xyz3(_xyz_, x_xyz, *y_z)
1129
+ if self.xyz3 != xyz:
1130
+ _update_all(self, needed=3)
1131
+ self._x, self._y, self._z = xyz
994
1132
  return self
995
1133
 
996
1134
  @property_RO
@@ -999,9 +1137,15 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
999
1137
  '''
1000
1138
  return self.x, self.y, self.z
1001
1139
 
1002
- @property_RO
1140
+ @Property_RO
1003
1141
  def x2y2z2(self):
1004
- '''Get the X, Y and Z components I{squared} (3-tuple C{(x**2, y**2, z**2)}).
1142
+ '''Get the X, Y and Z components, I{squared} (L{Vector3Tuple}).
1143
+ '''
1144
+ return _MODS.namedTuples.Vector3Tuple(*self.x2y2z23, name=self.name)
1145
+
1146
+ @property_RO
1147
+ def x2y2z23(self):
1148
+ '''Get the X, Y and Z components, I{squared} (3-tuple C{(x**2, y**2, z**2)}).
1005
1149
  '''
1006
1150
  return self.x**2, self.y**2, self.z**2
1007
1151
 
@@ -1037,7 +1181,7 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
1037
1181
 
1038
1182
 
1039
1183
  def _xyz3(where, x_xyz, *y_z): # in .cartesianBase._rtp3
1040
- '''(INTERNAL) Get , Y and Z as 3-tuple C{(x, y, z)}.
1184
+ '''(INTERNAL) Get X, Y and Z as 3-tuple C{(x, y, z)}.
1041
1185
  '''
1042
1186
  try:
1043
1187
  xyz3 = map1(_float0, x_xyz, *y_z) if y_z else ( # islistuple for Vector*Tuple
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pygeodesy
3
- Version: 25.10.10
3
+ Version: 25.11.5
4
4
  Summary: Pure Python geodesy tools
5
5
  Home-page: https://GitHub.com/mrJean1/PyGeodesy
6
6
  Author: Jean M. Brouwers
@@ -8,7 +8,7 @@ Author-email: mrJean1@Gmail.com
8
8
  Maintainer: Jean M. Brouwers
9
9
  Maintainer-email: mrJean1@Gmail.com
10
10
  License: MIT
11
- Keywords: AER Albers altitude Andoyer annulus antipode area attitude Authalic auxiliary azimuth azimuthal azimuth-elevation-range bearing bank Barsky Barth beta bi-quadratic boolean cached Cagnoli cartesian Cassini Cassini-Soldner chord circle-intersections circumcenter circumcircle circumradius clip Cohen Cohen-Sutherland Collins composite conformal conic constants contact-triangle Cook Correia cosines-law coverage curvature cylindrical datum deprecation deficit development discrete distance Douglas earth east-north-up eccentricity ECEF elevation ellipsoid ellipsoidal-latitude-beta ellipsoidal-longitude-omega elliptic ENU EPSG equal-area equidistant equirectangular ETM ETRF Euclidean even-odd-rule ExactTM excess Farrell Farrell-Barth Ferrari-solution Field-Of-View flattening fma fmath footpoint footprint Forster Forster-Hormann-Popa Forsythe FOV fractional Frechet Fréchet frustum Fsum fused-multiply-add GARS geocentric GeoConvert GeodesicExact geodesy geodetic GeodSolve GeodTest geographiclib Geohash geoid geoidHeight GeoidHeights georef Girard gnomonic gons grades gradians Greiner Greiner-Hormann Hartzell Hausdorff Haversine heading hectare height Heikkinen Heron Hodgman horizon Hormann Hubeny IDW incenter incirle infix_@_operator inradius intermediate interpolate intersect intersection intersection3d intersections IntersectTool Inverse-Distance-Weighting Isometric ITRF Jacobi Jacobi-Conformal Jarque-Bera Jekel Karney Krueger Krüger kurtosis Lambert latitude law-of-cosines least-squares Lesh L_Huilier LHuilier Liang Liang-Barsky linearize Line-Of-Sight LocalCartesian local-tangent-plane local-x-y-z longitude LOS loxodrome lstsq LTP lune LV03 LV95 mean memoize memoized Mercator Meeus MGRS nearest NED Niemeyer non-finite normalize Norrdine north-east-down numpy n-vector Nvector oblate omega orthographic orthometric-height OSGB OSGR overlap parallel parallel-of-latitude Parametric path-intersection perimeter Peucker Pierlot pitch plumb Point-Of-View polar Popa POV precision-cubic-root precision-hypotenuse precision-powers precision-running-summation precision-square-root precision-summation prolate Pseudo-Mercator pygeodesy PyInstaller PyPy quartic radical radii radius Ramer Ramer-Douglas-Peucker Rectifying Reduced resect resection Rey-Jer Reumann Reumann-Witkam rho-theta-phi rhumb RhumbSolve running-linear-regression running-statistics running-stats running-summation scipy secant semi-perimeter sexagecimal simplify skewness Snellius Snellius-Pothenot Snyder Soddy Soddy-circles Soldner sphere sphere-intersections spherical-deficit spherical-excess spherical-polar spherical-triangle squared-quartic standard-deviation stereographic Sudano surface-area Sutherland Sutherland-Hodgman tangent-circles Terrestrial-Reference-Frame Thomas Tienstra tilt TMcoords TMExact toise transverse TransverseMercatorExact TRF triangle triangulate triaxial triaxial-ellipsoid trigonometry trilaterate trilaterate-2d trilaterate-3d TwoProduct TwoSum umbilic-point unit unroll UPS UTM UTM/UPS variance velocities Veness Vermeille viewing-frustum Vincenty Visvalingam Visvalingam-Whyatt volume volumetric Web-Mercator Welford WGRS WGS Whyatt Wildberger Witkam winding-number XYZ yaw You zenzi-cubic zenzi-quartic
11
+ Keywords: AER Albers altitude Andoyer annulus antipode area attitude Authalic auxiliary azimuth azimuthal azimuth-elevation-range bearing bank Barsky Barth beta bi-quadratic boolean cached Cagnoli cartesian Cassini Cassini-Soldner chord circle-intersections circumcenter circumcircle circumradius clip Cohen Cohen-Sutherland Collins composite conformal conformal-sphere conic constants contact-triangle Cook Correia cosines-law coverage curvature cylindrical datum deprecation deficit development discrete distance Douglas earth east-north-up eccentricity ECEF elevation ellipsoid ellipsoidal-latitude-beta ellipsoidal-longitude-omega elliptic ENU EPSG equal-area equidistant equirectangular ETM ETRF Euclidean even-odd-rule ExactTM excess Farrell Farrell-Barth Ferrari-solution Field-Of-View flattening fma fmath footpoint footprint Forster Forster-Hormann-Popa Forsythe FOV fractional Frechet Fréchet frustum Fsum fused-multiply-add GARS geocentric GeoConvert GeodesicExact geodesy geodetic GeodSolve GeodTest geographiclib Geohash geoid geoidHeight GeoidHeights georef Girard gnomonic gons grades gradians Greiner Greiner-Hormann Hartzell Hausdorff Haversine heading hectare height Heikkinen Heron Hodgman horizon Hormann Hubeny IDW incenter incirle infix_@_operator inradius intermediate interpolate intersect intersection intersection3d intersections IntersectTool Inverse-Distance-Weighting Isometric ITRF Jacobi Jacobi-Conformal Jarque-Bera Jekel Karney Krueger Krüger kurtosis Lambert latitude law-of-cosines least-squares Lesh L_Huilier LHuilier Liang Liang-Barsky linearize Line-Of-Sight LocalCartesian local-tangent-plane local-x-y-z longitude LOS loxodrome lstsq LTP lune LV03 LV95 mean memoize memoized Mercator Meeus MGRS nearest NED Niemeyer non-finite normalize Norrdine north-east-down numpy n-vector Nvector oblate omega orthographic orthometric-height OSGB OSGR overlap parallel parallel-of-latitude Parametric path-intersection perimeter Peucker Pierlot pitch plumb Point-Of-View polar Popa POV precision-cubic-root precision-hypotenuse precision-powers precision-running-summation precision-square-root precision-summation prolate Pseudo-Mercator pygeodesy PyInstaller PyPy quartic radical radii radius Ramer Ramer-Douglas-Peucker Rectifying Reduced resect resection Rey-Jer Reumann Reumann-Witkam rho-theta-phi rhumb RhumbSolve running-linear-regression running-statistics running-stats running-summation scipy secant semi-perimeter sexagecimal simplify skewness Snellius Snellius-Pothenot Snyder Soddy Soddy-circles Soldner sphere sphere-intersections spherical-deficit spherical-excess spherical-polar spherical-triangle squared-quartic standard-deviation stereographic Sudano surface-area Sutherland Sutherland-Hodgman tangent-circles Terrestrial-Reference-Frame Thomas Tienstra tilt TMcoords TMExact toise transverse TransverseMercatorExact TRF triangle triangulate triaxial triaxial-ellipsoid trigonometry trilaterate trilaterate-2d trilaterate-3d TwoProduct TwoSum umbilic-point unit unroll UPS UTM UTM/UPS variance velocities Veness Vermeille viewing-frustum Vincenty Visvalingam Visvalingam-Whyatt volume volumetric Web-Mercator Welford WGRS WGS Whyatt Wildberger Witkam winding-number XYZ yaw You zenzi-cubic zenzi-quartic
12
12
  Classifier: Development Status :: 5 - Production/Stable
13
13
  Classifier: Environment :: Console
14
14
  Classifier: Intended Audience :: Developers
@@ -165,7 +165,7 @@ PyCodeStyle_ (formerly Pep8) and McCabe_ using Python 2.7.18, both in 64-bit on
165
165
 
166
166
  For a summary of all *Karney*-based functionality in ``pygeodesy``, see module karney_.
167
167
 
168
- *Last updated: Oct 10, 2025.*
168
+ *Last updated: Nov 05, 2025.*
169
169
 
170
170
  License
171
171
  =======
@@ -1,13 +1,13 @@
1
1
  pygeodesy/LICENSE,sha256=YfgAiyxOwY6P9Kkb1_5XN81nueTLrpb3Ffkv3EuPgFU,1144
2
- pygeodesy/__init__.py,sha256=-QifNyOMaiddBdni6VVqzLQtjjev0PS_AdfsyVXqz2k,42328
2
+ pygeodesy/__init__.py,sha256=EYklJAQ7lqBC-O6RmgGjNRqP81HDX2w9pnSQ6YiQd0w,42328
3
3
  pygeodesy/__main__.py,sha256=HpOBmuhI7yVP1FIAEugvd9Lb54kzew-nM78be0r4SC4,5597
4
4
  pygeodesy/albers.py,sha256=mb3YbVvoBq8a7AytT0HeVxe8DGEvx1KFN2Usl2ksKwk,30908
5
5
  pygeodesy/azimuthal.py,sha256=GI7nM7RWDwOh5DKYrrZBZDHcP9aSJgCBSdgDm2ovLvY,49849
6
6
  pygeodesy/basics.py,sha256=sKIyFcBNz6UzzY2YRr0bt1WuQLnEFUMfLKW7z4vCOII,32915
7
- pygeodesy/booleans.py,sha256=4ROe0VvrGNW64HUrz8nKG0APs3XA_M3tV8IO631k2M8,73683
7
+ pygeodesy/booleans.py,sha256=sYXV22cKtZlJXhwxcWK5gW5r0qSOP71XnFwC4xAsa0s,72636
8
8
  pygeodesy/cartesianBase.py,sha256=KX74yZE-fM7wHDnrV5OkAEyKwyZJy5o9VuzVjb1caZQ,45355
9
- pygeodesy/clipy.py,sha256=a0azaK7YDmGDU8mVVKe2MvUiPEhqZ9XJ-9u0T1iHKbo,27779
10
- pygeodesy/constants.py,sha256=thlUllMuL_3ZY2hI3xPen1IdW0tAfQnQztMHsv01RBg,20525
9
+ pygeodesy/clipy.py,sha256=a7khVUnc9PjCU7sLN2RP4BsSwDNpKlIMEasfz2wCKoc,27481
10
+ pygeodesy/constants.py,sha256=8b6xQigjfq5FZYX1FCdJV4eqaHcmZr33ylq4Y0XggJc,21049
11
11
  pygeodesy/css.py,sha256=vdQax5m7BMSpr7PUyqedCSvx73ilWuhXQTp39i8FOfA,25793
12
12
  pygeodesy/datums.py,sha256=Vp1fP7sSV1EuRbuO2scnZ3qiTZD1CvL4O12KSRlf1SU,34068
13
13
  pygeodesy/dms.py,sha256=egtF9gjReovgaSKJ_27KHZjvo4vLDdLEZ7yXSf19EZs,42202
@@ -24,7 +24,7 @@ pygeodesy/ellipsoidalVincenty.py,sha256=zeTvid09NGuYJ1WJ__a3ApCBGSzX0A-Rhs8-sQXM
24
24
  pygeodesy/ellipsoids.py,sha256=hdBT-Vl5Ukq51s19brzctT0vZfh8qZYlbUjmrrQPE-Q,108817
25
25
  pygeodesy/elliptic.py,sha256=uWxzmr7woRKqhsBWm6iGTwag5Ga0L184szkPWN3diSg,45515
26
26
  pygeodesy/epsg.py,sha256=VIBidzAEuoBF4LdlJ4r3WtpL0Ymhru8kf4fAgfFr5ok,8220
27
- pygeodesy/errors.py,sha256=qML13IDmvSaVrWp5h9DeHw1L-9J7DTwn86wLsP_sOgw,32498
27
+ pygeodesy/errors.py,sha256=HCFhdUtRzE51CnQseuB2BgJ7MFLysmOhpbnjaEupIhA,32498
28
28
  pygeodesy/etm.py,sha256=swF0QL52uo_DK073hymix8IitMyArOf-n0LL98BGwRU,46796
29
29
  pygeodesy/fmath.py,sha256=5gPHRqD5DbPqrM8BFRFVo1IYumKUVWoTcvEtzc8BFiE,37812
30
30
  pygeodesy/formy.py,sha256=7-CdPiagdVrbDMjWieX_guN4RvFVCYKOM3yDKSFPRWU,69777
@@ -39,13 +39,13 @@ pygeodesy/geohash.py,sha256=bqJMuA0-TH2vgOd7VaW1q4dw8KL43oCmV3eSjP90Bak,40124
39
39
  pygeodesy/geoids.py,sha256=m0EqTAKCuOVxrRpoPdmgymu0i0ufV2xpdt_laJLFqqE,86129
40
40
  pygeodesy/hausdorff.py,sha256=KGB0CIeNkBqR0sXIbRJvcgXPrM-4Mpi2aBOqDeZjqZ0,32269
41
41
  pygeodesy/heights.py,sha256=q7ej8RO-iZ5hfNi3OxwO3w_Opk4xHAZIzHbcbFTO3CA,41011
42
- pygeodesy/internals.py,sha256=8fddKdxThLLo17u3koRo4jW8g1yao1igEJMEnm-NamU,24711
42
+ pygeodesy/internals.py,sha256=RS_8XXDMoZqgDizztPtvyn8kl3rozS4n5vg8CjOp_WQ,24712
43
43
  pygeodesy/interns.py,sha256=QTP_6rStQ283DE-rL7rCAcfEffuiAXustBGkCY_DHJ0,23508
44
44
  pygeodesy/iters.py,sha256=nKVp_LUQyTqOz_OLzY25g6-_xlKG7lmAnjKKMXESmiM,20345
45
45
  pygeodesy/karney.py,sha256=GJuruLHO7IjhwXYNh507EbHO5VFNXwhRpzIkaGCec7c,41652
46
46
  pygeodesy/ktm.py,sha256=9eZ5Wk2HHhRl0IyypJ4guhhxGJLriWZm0Wfb3Z9Gf7Y,27270
47
47
  pygeodesy/latlonBase.py,sha256=eF8tr0fP9nc8JMGbJ0JyeFfECZyjlBJbtIchKRdU4B4,75317
48
- pygeodesy/lazily.py,sha256=bLCBDH13GY1LqVzoO6xmaeGsRDrBLHr-EqxUiSvOESo,47678
48
+ pygeodesy/lazily.py,sha256=_8ZqQgupvH2cKVl84Q6yM8o6ySyef6Ioyvr77mXDFcU,47802
49
49
  pygeodesy/lcc.py,sha256=nU_aWXgsxwB53c3CKM-dBQoDRoypkrY-tVmKmU9yQQ8,25785
50
50
  pygeodesy/ltp.py,sha256=N3TMipTWKUOeZYzn3UeJJqe5J4Yk788390ohQM1ykAE,50893
51
51
  pygeodesy/ltpTuples.py,sha256=t-n7p9A3JCVasv8LKCV4PkOTmXJZi91BkBFm8pBZM5o,59101
@@ -64,17 +64,17 @@ pygeodesy/sphericalNvector.py,sha256=bu0yB4PEq1cs6BS8QFqtljWpVEw7ESwq2yILOzGDuAc
64
64
  pygeodesy/sphericalTrigonometry.py,sha256=PqxNMSK8DI7TJuOtkQ5afzJtLfDzOkVe_tRdLTq9x14,64398
65
65
  pygeodesy/streprs.py,sha256=UYlk5v-GEJHMDiHZsqLssY3h6J5LbFw9dsCsKJbiERs,23684
66
66
  pygeodesy/trf.py,sha256=M0kzyclDJ5q4wCr-2HDIj6_J42FsrffnFGiyPkgHEmE,119216
67
- pygeodesy/triaxials.py,sha256=V0MSYJxRgYDhZcF7HXnu7oFzRyWJkhwc6scuNjc6VVg,64046
68
- pygeodesy/units.py,sha256=nH6uNqtaILtGRXqCcHVYBTfhGrv-WFt3w1aso6PA0kM,35419
67
+ pygeodesy/triaxials.py,sha256=tj2IjG6BLmtp6PjcX-xsEv9ONv2eAp49amwon9L6v4Y,66992
68
+ pygeodesy/units.py,sha256=DOSFqTdX1ryabNaQ0kmUvC1RpYzOw1i0T1205ovYeno,35561
69
69
  pygeodesy/unitsBase.py,sha256=cVNKG24Fov73gLFPGwGdjvXmM-8fd3MDufVubABAMeE,14141
70
70
  pygeodesy/ups.py,sha256=k7MDyq_aKO70m8sEeOCvpFb3nyrBmBdbdPST-UgxgeA,23349
71
- pygeodesy/utily.py,sha256=0MbACLAypq--uT4XeLX83C6KAWeJQiYhSqx592LCPTE,40983
71
+ pygeodesy/utily.py,sha256=1f5tMdkmfLaYNg0ALHLpcIixuLimjLCiAVqpf_FbRng,41098
72
72
  pygeodesy/utm.py,sha256=kcXliftP9q0nTxviIOixVyvResK2Jydj-G52CXJiSuQ,31123
73
73
  pygeodesy/utmups.py,sha256=31RD8l7M-vcRXU9_wnkb_PNUcKjOr1HAmwjOndjkgXE,13176
74
74
  pygeodesy/utmupsBase.py,sha256=PptZ4Mm8BaDUCA8v1sK54o8idw_24kq6loAuYv0bejE,22730
75
- pygeodesy/vector2d.py,sha256=7R5ciPxXEX98LmMWNqwbds8Y6vpsHKEeCzcBVDRiq6g,40305
75
+ pygeodesy/vector2d.py,sha256=3Pqadaafd0vn4DWCHq5gaE3utL0PDZxp9hI_G5j3O1I,40306
76
76
  pygeodesy/vector3d.py,sha256=sC7u9tgFFWoWHFxqtO-dvKVuiEzraw50TDU_QpdDbYw,43045
77
- pygeodesy/vector3dBase.py,sha256=FnaRhLJnJ1WCkV9oia2Cb47Fo0f-_5kBvpT7otzkOIk,36371
77
+ pygeodesy/vector3dBase.py,sha256=YMX3veS3EEjVkFszCgztbX_NtHQXd1BgaKZ898_wgJI,40884
78
78
  pygeodesy/webmercator.py,sha256=z3Ft5TeHc9FoLA8zQhzTrSuShHSz0aHjanbvj53ohmo,15016
79
79
  pygeodesy/wgrs.py,sha256=1MK72g3HsfdsvChM6rBy_auxzSvWHSoer8fEuT4LinI,15503
80
80
  pygeodesy/auxilats/_CX_4.py,sha256=DX67nZ1E4nOis8d_wQ8tn5T-SAVNDBJH3kp9IuQc8lM,6830
@@ -88,9 +88,9 @@ pygeodesy/auxilats/auxDLat.py,sha256=lvffZo8DdVWWEHusPNXRYQeoCFfZcG5rNhgEooL5Xu0
88
88
  pygeodesy/auxilats/auxDST.py,sha256=ab8ByHMmX1dWBmGgOGxYUlmkZqTKKpawg5maLYYrG7M,10464
89
89
  pygeodesy/auxilats/auxLat.py,sha256=2d6uliIVfxOHp8qibom-8l5T7bLONSyTr6LRTt4OwRs,31972
90
90
  pygeodesy/auxilats/auxily.py,sha256=eA5-QSr3pZgY_5dJQsIiCWwlXofZsYJTGQVpMhfybSs,8085
91
- pygeodesy/deprecated/__init__.py,sha256=QkeQNBFL8OukeYlea0F0PGVUffqs8ZMAN8jDOuHVNvI,2823
91
+ pygeodesy/deprecated/__init__.py,sha256=avPno_C9H8QYbAsNRkxPIyfYX_tDHeakKqSsJMwJU9U,2823
92
92
  pygeodesy/deprecated/bases.py,sha256=pL4fEW7PTrDc_coggRCcnrs3izp-MWUEyvr6yBNzgMw,1649
93
- pygeodesy/deprecated/classes.py,sha256=_H9-QnSVA4iLRKwN16FO8WOE51Qin0zNMNb_kSWgnjU,16388
93
+ pygeodesy/deprecated/classes.py,sha256=8va_ePoOq_TWkzOMJTeaIwyEuDGP9sYsbChnuH7FdqU,17266
94
94
  pygeodesy/deprecated/consterns.py,sha256=RC-YvqQXAEVoIaLnaLrIrA1Mr3oXLk3HT9n1HLvGCSs,1917
95
95
  pygeodesy/deprecated/datum.py,sha256=aeY-POZBZrKKiTnrhqOImV5AfiXu2-9Vz8xu_d4ze2g,1910
96
96
  pygeodesy/deprecated/functions.py,sha256=TK3T1zGAmTLowLeKZik7qknRBthCqjIGhdOjebnCdhE,15844
@@ -113,7 +113,7 @@ pygeodesy/rhumb/aux_.py,sha256=2FbR_0Y0ofOROay2Z16oiLILhd7G50LUiatkQhBwEMA,16117
113
113
  pygeodesy/rhumb/bases.py,sha256=R-QLV8a0KZUvaI1wEkyAG4yO-IQNNK4I2O7WRIMBJuo,54218
114
114
  pygeodesy/rhumb/ekx.py,sha256=LlMjVJqb-Q5rJnexJi-0TPRkUZkJaPQ7fVRypxkxNjo,24058
115
115
  pygeodesy/rhumb/solve.py,sha256=z8z_XYObTgz7w1skNLNcLBpe-EO_r0H4sVcZGlBcWnc,24005
116
- pygeodesy-25.10.10.dist-info/METADATA,sha256=F_luIoHZU0UkQQxINpuceZKW7FOMvNxy3MOgTxdyocc,20126
117
- pygeodesy-25.10.10.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
118
- pygeodesy-25.10.10.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
119
- pygeodesy-25.10.10.dist-info/RECORD,,
116
+ pygeodesy-25.11.5.dist-info/METADATA,sha256=tohssI5czjmAyKZhTBWpSr9Qu8FBC0_4_xyXLYbhaKc,20142
117
+ pygeodesy-25.11.5.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
118
+ pygeodesy-25.11.5.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
119
+ pygeodesy-25.11.5.dist-info/RECORD,,