pygeodesy 25.12.12__py2.py3-none-any.whl → 25.12.31__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.
@@ -44,12 +44,14 @@ from pygeodesy.constants import EPS, EPS0, EPS02, EPS4, _EPS2e4, INT0, NAN, PI2,
44
44
  from pygeodesy.fmath import fmean_, hypot, norm2, sqrt0, fabs, sqrt
45
45
  from pygeodesy.formy import elliperim, _ValueError, _xkwds
46
46
  from pygeodesy.fsums import _Fsumf_, fsumf_, fsum1f_
47
+ # from pygeodesy.internals import typename # _MODS
47
48
  from pygeodesy.interns import _a_, _b_, _c_, _inside_, _not_, _NOTEQUAL_, _null_, \
48
49
  _outside_, _scale_, _SPACE_, _spherical_, _x_, _y_, _z_
49
- from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS
50
+ from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS, _FOR_DOCS
50
51
  from pygeodesy.named import _NamedEnumItem, _NamedTuple, _Pass
51
52
  from pygeodesy.namedTuples import Vector4Tuple
52
53
  from pygeodesy.props import Property_RO, property_doc_, property_RO, property_ROver
54
+ # from pygeodesy.streprs import Fmt # _MODS
53
55
  from pygeodesy.units import Degrees, Easting, Float, Height, Height_, Meter2, Meter3, \
54
56
  Northing, Radius_, Scalar
55
57
  from pygeodesy.utily import asin1
@@ -58,7 +60,7 @@ from pygeodesy.vector3d import _otherV3d, Vector3d
58
60
  # from math import fabs, sqrt # from .fmath
59
61
 
60
62
  __all__ = _ALL_LAZY.triaxials_bases
61
- __version__ = '25.12.12'
63
+ __version__ = '25.12.31'
62
64
 
63
65
  _bet_ = 'bet' # PYCHOK shared
64
66
  _llk_ = 'llk' # PYCHOK shared
@@ -112,21 +114,42 @@ class LLK(object):
112
114
  _NOIDAL = (None, ELLIPSOIDAL)
113
115
  # _XCLUDE = (CONFORMAL, GEOGRAPHIC, PLANETOCENTRIC, PLANETODETIC)
114
116
 
117
+ def __getitem__(self, name):
118
+ llk = self.get(name, None)
119
+ if llk is None:
120
+ t = _MODS.internals.typename(self)
121
+ t = _MODS.streprs.Fmt.SQUARE(t, name)
122
+ raise _ValueError(t, name)
123
+ return llk
124
+
125
+ def get(self, name, dflt=None):
126
+ '''Get an C{LLK} by C{name}.
127
+ '''
128
+ llk = getattr(self, name, None)
129
+ return llk if isinstance(llk, _LLK) else dflt
130
+
115
131
  def items(self):
132
+ '''Yield all C{LLK (name, value)} pairs.
133
+ '''
116
134
  for n, llk in LLK.__class__.__dict__.items():
117
135
  if isinstance(llk, _LLK):
118
136
  yield n, llk
119
137
 
120
138
  def keys(self):
139
+ '''Yield all C{LLK} names.
140
+ '''
121
141
  for n, _ in self.items():
122
142
  yield n
123
143
 
124
144
  def values(self):
145
+ '''Yield all C{LLK} values.
146
+ '''
125
147
  for _, llk in self.items():
126
148
  yield llk
127
149
 
128
- LLK = LLK() # PYCHOK singleton
129
- # del _LLK
150
+ if not _FOR_DOCS: # PYCHOK force epydoc
151
+ LLK = LLK() # singleton
152
+ del _FOR_DOCS
130
153
 
131
154
 
132
155
  def _HeightINT0(h):
@@ -212,13 +235,6 @@ class _UnOrderedTriaxialBase(_NamedEnumItem):
212
235
  a, b, c = self._abc3
213
236
  return self.a2, self.b2, self.c2
214
237
 
215
- @Property_RO
216
- def _ab_elliperim(self):
217
- '''(INTERNAL) Get C{ab} ellipse' perimeter.
218
- '''
219
- a, b, _ = self._abc3
220
- return elliperim(a, b)
221
-
222
238
  @Property_RO
223
239
  def _a2c2(self):
224
240
  '''(INTERNAL) Get C{a**2 - c**2} == E_sub_x**2.
@@ -279,13 +295,6 @@ class _UnOrderedTriaxialBase(_NamedEnumItem):
279
295
  d = b - c
280
296
  return (d * (b + c)) if d else _0_0
281
297
 
282
- @Property_RO
283
- def _bc_elliperim(self):
284
- '''(INTERNAL) Get C{bc} ellipse' perimeter.
285
- '''
286
- _, b, c = self._abc3
287
- return elliperim(b, c)
288
-
289
298
  @Property_RO
290
299
  def c(self):
291
300
  '''Get the C{smallest, z} semi-axis (C{meter}, same units as B{C{a}}).
@@ -513,6 +522,27 @@ class _UnOrderedTriaxialBase(_NamedEnumItem):
513
522
  '''
514
523
  return self._kji if reverse else self._ijk
515
524
 
525
+ @Property_RO
526
+ def perimeter4ab(self):
527
+ '''Get the C{ab} ellipse' perimeter (C{scalar}).
528
+ '''
529
+ a, b, _ = self._abc3
530
+ return Float(perimeter4ab=elliperim(a, b))
531
+
532
+ @Property_RO
533
+ def perimeter4ac(self):
534
+ '''Get the C{ac} ellipse' perimeter (C{scalar}).
535
+ '''
536
+ a, _, c = self._abc3
537
+ return Float(perimeter4ac=elliperim(a, c))
538
+
539
+ @Property_RO
540
+ def perimeter4bc(self):
541
+ '''Get the C{bc} ellipse' perimeter (C{scalar}).
542
+ '''
543
+ _, b, c = self._abc3
544
+ return Float(perimeter4bc=elliperim(b, c))
545
+
516
546
  def _radialTo3(self, sbeta, cbeta, somega, comega):
517
547
  '''(INTERNAL) I{Unordered} helper for C{.height4}.
518
548
  '''
@@ -827,7 +857,8 @@ class _Triaxial3Base(_OrderedTriaxialBase):
827
857
  @property_doc_(" longitude of the I{earth}'s major semi-axis C{a}, (L{Ang}), Karney's C{Triaxial_Earth_lon0}.")
828
858
  def Lon0(self):
829
859
  if self._Lon0 is None:
830
- self.Lon0 = -(1493 / 100) if self.name.startswith('WGS84_3') else 0
860
+ WGS84_3 = self.name.startswith('WGS84_3')
861
+ self.Lon0 = -(1493 / 100) if WGS84_3 else 0
831
862
  return self._Lon0
832
863
 
833
864
  @Lon0.setter # PYCHOK setter!
@@ -863,7 +894,7 @@ class _Triaxial3Base(_OrderedTriaxialBase):
863
894
 
864
895
 
865
896
  class TriaxialError(_ValueError):
866
- '''Raised for any cartesian or conformal triaxial issues.
897
+ '''Raised for any triaxial issue.
867
898
  '''
868
899
  pass # ...
869
900
 
@@ -18,10 +18,10 @@ from __future__ import division as _; del _ # noqa: E702 ;
18
18
 
19
19
  from pygeodesy.angles import Ang, Ang_, _Ang3Tuple, atan2, sincos2, _SinCos2
20
20
  from pygeodesy.basics import _copysign, map1
21
- from pygeodesy.constants import EPS, EPS02, EPS8, _EPSqrt, INT0, NAN, \
22
- _copysign_0_0, _copysign_1_0, _flipsign, \
23
- _isfinite, _over, _1_over, _0_0, _0_5, \
24
- _1_0, _N_1_0, _2_0, _3_0, _4_0, _9_0
21
+ from pygeodesy.constants import EPS, EPS_2, EPS02, EPS8, INT0, NAN, \
22
+ _EPSqrt, _copysign_0_0, _copysign_1_0, \
23
+ _flipsign, _isfinite, _over, _1_over, _0_0, \
24
+ _0_5, _N_1_0, _1_0, _2_0, _3_0, _4_0, _9_0
25
25
  from pygeodesy.errors import _xattr, _xkwds, _xkwds_get, _xkwds_pop2
26
26
  from pygeodesy.fmath import cbrt2, fdot, hypot, hypot2, norm2, fabs, sqrt
27
27
  from pygeodesy.fsums import Fsum, fsumf_, Fmt
@@ -42,7 +42,7 @@ from pygeodesy.vector3d import Vector3d
42
42
  from random import random
43
43
 
44
44
  __all__ = _ALL_LAZY.triaxials_triaxial3
45
- __version__ = '25.12.12'
45
+ __version__ = '25.12.14'
46
46
 
47
47
  _alp_ = 'alp'
48
48
  _NAN3d = Vector3d(NAN, NAN, NAN)
@@ -80,8 +80,6 @@ class Cartesian5Tuple(Vector4Tuple):
80
80
  class _Fp2(object):
81
81
  '''(INTERNAL) Function and derivate evaluation.
82
82
  '''
83
- _D = EPS * _0_5
84
-
85
83
  def __init__(self, rs, ls, n=1):
86
84
  # assert 0 < n <= 2
87
85
  self._2 = n == 2
@@ -92,7 +90,7 @@ class _Fp2(object):
92
90
  # k=0..2) - 1} and its derivative C{fp}.
93
91
  f = _N_1_0
94
92
  fc = fp = _0_0
95
- _D = self._D
93
+ _D = EPS_2
96
94
  _2 = self._2
97
95
  for g, q in self._rls:
98
96
  q = _1_over(p + q)
@@ -647,8 +645,6 @@ class Triaxial3(_Triaxial3Base):
647
645
  v = v._roty(True) # +1
648
646
  phi = Ang_(v.z, hypot(v.x, v.y), **name)
649
647
  lam = Ang_(v.y, v.x, **name) # Ang(0, 0) -> 0
650
- if llk is LLK.GEODETIC_LON0:
651
- lam += self.Lon0
652
648
 
653
649
  if dir3d is None:
654
650
  zet = None
@@ -658,6 +654,8 @@ class Triaxial3(_Triaxial3Base):
658
654
  dir3d.dot(n), **name)
659
655
  else:
660
656
  raise TriaxialError(dir3d=dir3d)
657
+ if llk is LLK.GEODETIC_LON0:
658
+ lam += self.Lon0
661
659
  return PhiLamZet5Tuple(phi, lam, zet, h, llk, **name)
662
660
 
663
661
  def random2(self, llk=LLK.ELLIPSOIDAL, both=False, _rand=random):
@@ -769,7 +767,7 @@ class Triaxial3(_Triaxial3Base):
769
767
  s = r.times_(*T._abc3)
770
768
  p = max(fabs(s.z), hypot(s.x, s.y) - l1, s.length - l0)
771
769
  h = _solve(_Fp2(s.xyz3, ls, n=2), p, T.b2)
772
- v = r.times_(*(_over(_, h + l_) for _, l_ in zip(T._a2b2c23, ls)))
770
+ v = r.times_(*(_over(n, h + l_) for n, l_ in zip(T._a2b2c23, ls)))
773
771
  if not h: # handle h == 0, v.y indeterminate
774
772
  x = v.x if l0 else r.x # sphere
775
773
  y = v.y if l1 else r.y # sphere or prolate
@@ -843,7 +841,7 @@ def _cubic(rs, rt, l0, l1): # Cartesian3.cubic
843
841
  a = l0 + l1
844
842
  b = l0 * l1
845
843
  c = -b * rs[2] # z2
846
- # cubic equation z^3 + a*z^2 + b*z + c = 0
844
+ # cubic equation z**3 + a*z**2 + b*z + c = 0
847
845
  b -= fdot(rs, l1, l0, a)
848
846
  a -= rt
849
847
  _r = b > 0
@@ -905,7 +903,8 @@ def _solve(_fp2, p, pscale, **n):
905
903
  if not (fv > _TOL2):
906
904
  break
907
905
  p, d = _P2(-fv / fp) # d is positive
908
- if i and d <= dt and (fv <= EPS8 or d <= (max(pt, p) * _TOL)):
906
+ if i and d <= dt and (fv <= EPS8 or
907
+ d <= (max(pt, p) * _TOL)):
909
908
  break
910
909
  dt = d
911
910
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pygeodesy
3
- Version: 25.12.12
3
+ Version: 25.12.31
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 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
11
+ Keywords: AER AGM Albers altitude Andoyer annulus antipode area Arithmetic-Geometric-Mean 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 Gauss-Kummer geocentric GeoConvert GeodesicExact geodesy geodetic GeodSolve Geod3Solve 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 Linderholm-Segal 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 Ramanujan 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
@@ -20,6 +20,7 @@ Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
22
  Classifier: Programming Language :: Python :: 3.14
23
+ Classifier: Programming Language :: Python :: 3.15
23
24
  Classifier: Topic :: Software Development
24
25
  Classifier: Topic :: Scientific/Engineering :: GIS
25
26
 
@@ -33,8 +34,8 @@ models using precision exact, elliptic, trigonometric, vector-based, iterative a
33
34
  methods for geodetic (lat-/longitude), geocentric (ECEF_ cartesian), local (LTP_) and certain
34
35
  `triaxial ellipsoidal`_ coordinates.
35
36
 
36
- Transcoded in part from `JavaScript originals`_ by *Chris Veness (C) 2005-2024* and from several
37
- `C++ classes`_ by *Charles F.F. Karney (C) 2008-2024* and published under the same `MIT License`_.
37
+ Transcoded in part from `JavaScript originals`_ by *Chris Veness (C) 2005-2025* and from several
38
+ `C++ classes`_ by *Charles F.F. Karney (C) 2008-2025* and published under the same `MIT License`_.
38
39
 
39
40
  There are four modules for ellipsoidal earth models, *ellipsoidalExact*, *-Karney*, *-Vincenty*
40
41
  and *-Nvector* and two for spherical ones, *sphericalTrigonometry* and *-Nvector*. Each module
@@ -101,8 +102,13 @@ Modules ``ellipsoidalGeodSolve`` and ``geodsolve`` and ``azimuthal`` classes ``E
101
102
  and ``GnomonicGeodSolve`` depend on *Karney*\'s C++ utility GeodSolve_ to be executable and set with
102
103
  env variable ``PYGEODESY_GEODSOLVE`` or with property ``Ellipsoid.geodsolve``.
103
104
 
105
+ Triaxial geodesic classes ``Geodesic3Solve`` and ``GeodesicLine3Solve`` in module ``geod3solve`` need
106
+ *Karney*\'s C++ utility Geod3Solve_ to be executable and set with env variable ``PYGEODESY_GEOD3SOLVE``
107
+ or with property ``Geodesic3Solve.Geod3Solve``.
108
+
104
109
  Class ``Intersectool`` in module ``geodesici`` needs *Karney*\'s C++ utility IntersectTool_ to be
105
- executable and set with env variable ``PYGEODESY_INTERSECTTOOL``.
110
+ executable and set with env variable ``PYGEODESY_INTERSECTTOOL`` or with property
111
+ ``Intersectool.IntersectTool``.
106
112
 
107
113
  To compare ``MGRS`` results from modules ``mgrs`` and ``testMgrs`` with *Karney*\'s C++ utility
108
114
  GeoConvert_, the latter must be executable and set with env variable ``PYGEODESY_GEOCONVERT``.
@@ -121,24 +127,24 @@ Tests
121
127
  =====
122
128
 
123
129
  The tests ran with Python 3.14.2 (with geographiclib_ 2.1), Python 3.13.9 (with geographiclib_ 2.1,
124
- numpy_ 2.3.3, scipy_ 1.16.2, GeoConvert_ 2.5 and GeodSolve_ 2.5), Python 3.12.7 (with geographiclib_ 2.0,
125
- numpy_ 2.1.0, scipy_ 1.14.1, GeodSolve_ 2.5, IntersectTool_ 2.5 and RhumbSolve_ 2.5), Python 3.11.5 (with
126
- geographiclib_ 2.0, numpy_ 1.24.2 and scipy_ 1.10.1) and with Python 2.7.18 (with geographiclib_ 1.50,
127
- numpy_ 1.16.6, scipy_ 1.2.2, GeoConvert_ 2.5, GeodSolve_ 2.5, IntersectTool_ 2.5 and RhumbSolve_ 2.5),
128
- all on macOS 26.1 Tahoe in 64-bit.
130
+ numpy_ 2.3.3, scipy_ 1.16.2, GeoConvert_ 2.7, GeodSolve_ 2.7 and Geod3Solve_ 2.7), Python 3.12.7 (with
131
+ geographiclib_ 2.0, numpy_ 2.1.0, scipy_ 1.14.1, GeodSolve_ 2.7, Geod3Solve_ 2.7, IntersectTool_ 2.7
132
+ and RhumbSolve_ 2.7), Python 3.11.5 (with geographiclib_ 2.0, numpy_ 1.24.2 and scipy_ 1.10.1) and with
133
+ Python 2.7.18 (with geographiclib_ 1.50, numpy_ 1.16.6, scipy_ 1.2.2, GeoConvert_ 2.7, GeodSolve_ 2.7,
134
+ Geod3Solve_ 2.7, IntersectTool_ 2.7 and RhumbSolve_ 2.7), all on macOS 26.2 Tahoe in 64-bit.
129
135
 
130
136
  All tests ran with and without ``lazy import`` for Python 3 and with command line option ``-W default``
131
137
  and env variable ``PYGEODESY_WARNINGS=on`` for all Python versions. The results of those tests are
132
138
  included in the distribution files.
133
139
 
134
- Python 3.14.2, 3.13.9, 3.12.7 and 3.11.5 run on Apple Si M4 (``arm64``), *natively*. Python 2.7.18 runs
140
+ Python 3.14.2, 3.13.9, 3.12.7 and 3.11.5 run on Apple M4 Si (``arm64``), *natively*. Python 2.7.18 runs
135
141
  on Intel (``x86_64``) or Intel *emulation* (\"``arm64_x86_64``\", see function `pygeodesy.machine`_).
136
142
 
137
143
  Test coverage has been measured with coverage_ 7.10.7 using Python 3.14.2, 3.13.9 and 3.12.7. The
138
144
  complete coverage report in HTML and a PDF summary are included in the distribution files.
139
145
 
140
- The tests also ran with Python 3.13.9 (and geographiclib_ 2.1) on `Debian 12`_ in 64-bit only and with
141
- Python 3.12.8 (and geographiclib_ 2.0) on `Windows 2019Server`_ in 64-bit only and with Python 2.7.18
146
+ The tests also ran with Python 3.14.2 (and geographiclib_ 2.1) on `Debian 12`_ in 64-bit only and with
147
+ Python 3.13.8 (and geographiclib_ 2.0) on `Windows 2019Server`_ in 64-bit only and with Python 2.7.18
142
148
  (and with geographiclib_ 1.52) on `Windows 10`_ in 64- and 32-bit.
143
149
 
144
150
  A single-File and single-Directory application with ``pygeodesy`` has been bundled using PyInstaller_ 3.4
@@ -161,11 +167,11 @@ Notes
161
167
  =====
162
168
 
163
169
  All Python source code has been statically checked_ with Ruff_ using Python 3.13.9 and with PyChecker_, PyFlakes_,
164
- PyCodeStyle_ (formerly Pep8) and McCabe_ using Python 2.7.18, both in 64-bit on macOS 26.1 Tahoe only.
170
+ PyCodeStyle_ (formerly Pep8) and McCabe_ using Python 2.7.18, both in 64-bit on macOS 26.2 Tahoe only.
165
171
 
166
172
  For a summary of all *Karney*-based functionality in ``pygeodesy``, see module karney_.
167
173
 
168
- *Last updated: Dec 12, 2025.*
174
+ *Last updated: Dec 31, 2025.*
169
175
 
170
176
  License
171
177
  =======
@@ -224,6 +230,7 @@ DEALINGS IN THE SOFTWARE.
224
230
  .. _Garefs (GARS): https://WikiPedia.org/wiki/Global_Area_Reference_System
225
231
  .. _GeoConvert: https://GeographicLib.SourceForge.io/C++/doc/utilities.html
226
232
  .. _GeodSolve: https://GeographicLib.SourceForge.io/C++/doc/utilities.html
233
+ .. _Geod3Solve: https://GeographicLib.SourceForge.io/C++/doc/Geod3Solve.1.html
227
234
  .. _geographiclib: https://PyPI.org/project/geographiclib
228
235
  .. _GeographicLib.: https://GeographicLib.SourceForge.io/C++/doc/index.html
229
236
  .. _Geohashes: https://www.Movable-Type.co.UK/scripts/geohash.html
@@ -1,5 +1,5 @@
1
1
  pygeodesy/LICENSE,sha256=YfgAiyxOwY6P9Kkb1_5XN81nueTLrpb3Ffkv3EuPgFU,1144
2
- pygeodesy/__init__.py,sha256=mlFdhvirSlon80mpgvgMqzKo43dV9_bSTRrfKCoNR-c,43176
2
+ pygeodesy/__init__.py,sha256=LJWArNEBwQusGv0qhNBOLJJjlAy-5oQqJ6wgce3p0wE,43782
3
3
  pygeodesy/__main__.py,sha256=06sdpwiuTP1hPvKOdzjqhuuDqqpicErwnAYwioeiTNw,5597
4
4
  pygeodesy/albers.py,sha256=1Jt-WWcawNw6Dj7wl6hPSLbYiGGZqFMCnRU8gyGvV7o,30908
5
5
  pygeodesy/angles.py,sha256=68sNVXU3QKGZnIYyjWFcKhWlBKSmaduO--rjtoM2sqU,29996
@@ -8,7 +8,7 @@ pygeodesy/basics.py,sha256=bbQs7M1epOl7t8IF2xs5uA46rrdYdobSuiJJ6v5st0s,32988
8
8
  pygeodesy/booleans.py,sha256=kEF7rFvQzUaGFdrDzOXo_GFauXmaDTnhd2LNDh69B28,72636
9
9
  pygeodesy/cartesianBase.py,sha256=L6y0Mn3x25eLF0Wd6ntOLlyfvGqmIl15Akvs373lXhg,45382
10
10
  pygeodesy/clipy.py,sha256=uLTbX6byZa6fi2Kir1WanfW47JSxAkmfngH3vD7TDfw,27481
11
- pygeodesy/constants.py,sha256=8UPc_dVrlKMMieFB20nbWMdLK_3hep282IuxSwIAg-M,21345
11
+ pygeodesy/constants.py,sha256=UsVlgLUwfvP-DPP5Fa51T-aJIe5cjLpwt0LVyQwMS70,21425
12
12
  pygeodesy/css.py,sha256=Fb_z5nvu5j4To1WgXGPOaEaME71IZW747FdpL4YBczc,25793
13
13
  pygeodesy/datums.py,sha256=3uB7cuFdhNNMxKq96J3FjdklwaKOcdshBrGMf1Osbms,34068
14
14
  pygeodesy/dms.py,sha256=2jesqmjWy-Pze5VWtgbiyC8CbjeIFbPP1qt2nYriubw,42202
@@ -22,21 +22,21 @@ pygeodesy/ellipsoidalGeodSolve.py,sha256=wuA-veOYC95vcEnbr4zT0ZzDN7s6kSuMRHpd4V1
22
22
  pygeodesy/ellipsoidalKarney.py,sha256=CxPB91CKA0q5E97TOcErTTQdufdB2dT4KF84QZtfnGM,18839
23
23
  pygeodesy/ellipsoidalNvector.py,sha256=48N-KtVUn0wi9kXZe12hg0jABWNeaiNXyY__oS-x5I4,30146
24
24
  pygeodesy/ellipsoidalVincenty.py,sha256=X4OpMPtoretveNjHlEXKL4ifmAARTRY0yxbIOlR26J8,26273
25
- pygeodesy/ellipsoids.py,sha256=4U8yK0CnZ-dqLQfInL_5BNGfj_SJG7KrTRhW5KnC4KU,108945
25
+ pygeodesy/ellipsoids.py,sha256=u4jeDSP9smTzK5Y2PWTa4eGI5dxUdcHxSBL9sVVvzQs,109316
26
26
  pygeodesy/elliptic.py,sha256=914gDJmHVu_zlyQJy4tfqTJmq2Buqq5w3Jt-7wrXpEo,45515
27
27
  pygeodesy/epsg.py,sha256=wS8Mzzk70Fzry6c0fBA16VVez3ghKG2Dhgpo2eN_Ik8,8220
28
28
  pygeodesy/errors.py,sha256=76wVrhxev-n-kBOHv3MicHell3ifA2whUp4SRCrqUx4,32633
29
29
  pygeodesy/etm.py,sha256=3pQmpjsrnI0mgLwhkLOCOFq_44bkhHwXExf-Keyky2w,46796
30
- pygeodesy/fmath.py,sha256=-MjjZ5U-IjK8PjowT4Fv_dhFOxSg2LmLAdU5RnMWtWI,38008
31
- pygeodesy/formy.py,sha256=ha8i6sqmePlOdA7ee_azhNCfmES1gjrciNhnapMzugQ,73081
30
+ pygeodesy/fmath.py,sha256=buLhJkanh06PU-CIzdT8V8nLeQdn7D4olI6E124NA6s,37984
31
+ pygeodesy/formy.py,sha256=0PLwO2coxgCIyGDMHM9T4EBqLUAlEYOFhdxYszmUzPU,78285
32
32
  pygeodesy/frechet.py,sha256=FySLdZgLb_NXd81AILx4G2C9J6dxwI5uYW1MEHuEocg,35588
33
33
  pygeodesy/fstats.py,sha256=EuyC9UrJ5K0IlZqM7h3C8C7tYDrTujqoBp9-V1ICPx0,28348
34
- pygeodesy/fsums.py,sha256=jj1gRWr5dutqavpXZacky0m2va87sq0y5JBCVbCFtgg,104978
34
+ pygeodesy/fsums.py,sha256=EmjY74uPwCMxXVC3pOu2F5rqc42rsvXGWPGtvbDaG3c,105304
35
35
  pygeodesy/gars.py,sha256=z7yvE6dRAjtXUAB9yakH8duwF2gBKbcjXUIznNnr8_w,11761
36
- pygeodesy/geod3solve.py,sha256=v17vxrDBnkf_Nl3x7fNm7bxj58NW8ky3G94eiYbm4EQ,21488
37
- pygeodesy/geodesici.py,sha256=7OSn4VyAoAzPBlRpAnvnhp1PQozD7FhCcQgueYNX14o,74889
36
+ pygeodesy/geod3solve.py,sha256=nWYPBilw5j1T-uWk_cDV7TdBpIVNP5SM2jjUsXn7y8s,21595
37
+ pygeodesy/geodesici.py,sha256=eHkXKDQzeFfJ6lVkGANqnEk5hQR-MkYXQlgXCLzbG3Y,74933
38
38
  pygeodesy/geodesicw.py,sha256=bhwSBtHAaNAl487uAgifS42cKvcYTe-8O8M5S44u9_k,30029
39
- pygeodesy/geodsolve.py,sha256=bfXeqCnOeWOXv2xcoJqt2mqBZ7onOCEaCpM7GnkfIZg,24948
39
+ pygeodesy/geodsolve.py,sha256=GqMn4PjXAT7jK0VjxeMv7FgNx-_T_LeAfeMda7wUSqM,25032
40
40
  pygeodesy/geohash.py,sha256=LmjvzgrzD0Cj-xPCZNJp3LbVOQ7llaE2sAO0V0SxNOo,40124
41
41
  pygeodesy/geoids.py,sha256=Fn3pOCokzQJuEY2UE11Ah5XuiT24WRmmoc3FeNhfpsg,86129
42
42
  pygeodesy/hausdorff.py,sha256=_zfkZ4pzUE_6LwFD77RU9NC58aN8imglI7TfapM82Wc,32269
@@ -44,20 +44,20 @@ pygeodesy/heights.py,sha256=T_5ZhtFAskQf-1BHL2Nm5bTYQIMJj-d1UKhW11YPWvs,41011
44
44
  pygeodesy/internals.py,sha256=_KTAnSPlLWYBEXaUxiDpE-nN-JbexcN5h_szyJwzgWE,24712
45
45
  pygeodesy/interns.py,sha256=h7LupB9eEhwgW8mq3R4VMFI3i-49ObgXAEvV2JJmmpM,23521
46
46
  pygeodesy/iters.py,sha256=xH719oFB-0z4jCAHeC6uLqyfWPtpQoSBF6Pgnoz5weQ,20345
47
- pygeodesy/karney.py,sha256=0hVfPFNisGu4Qmp4LHKnxeRyikdRmvfsm1b6ijT6cHI,42408
47
+ pygeodesy/karney.py,sha256=_HLXxYtoh8eIMfsvsH7f4irb0L1xHljnvgLf7_e3ixc,42115
48
48
  pygeodesy/ktm.py,sha256=262-FbXSHpQnlpHKyqzMO4Uuf7DflDINSSSOEmRXyRc,27270
49
49
  pygeodesy/latlonBase.py,sha256=as2BBvogFBANmyixQNgVWVfXuBSvcDtb200XzSMKzE4,75317
50
- pygeodesy/lazily.py,sha256=67MpN-WnfW7E7cR7SANBJ_HxPyXzbBhX577-VTZZlA8,48627
50
+ pygeodesy/lazily.py,sha256=yfdUlY0H2t-h627-oKijSRNJtilu9J9m4PcLguoL9F8,48640
51
51
  pygeodesy/lcc.py,sha256=BXWEHDRgNOzAOM5dVBfpETWVdJ7Me378Wv93n2oR_UI,25785
52
52
  pygeodesy/ltp.py,sha256=-dokXawH_nvyjYaQzPQ0pguB0yAlvybnFnokEwLE488,50893
53
53
  pygeodesy/ltpTuples.py,sha256=6BcsN1rjshV1w80EtXR14TzDmZLl-YReFJ4UFL-DBt0,59101
54
54
  pygeodesy/mgrs.py,sha256=ZUsW0ixGlS0YOuzXFoGj3N0XrI1PbuSVYldZuqKS3g8,29842
55
- pygeodesy/named.py,sha256=Nt3MJa3fQBKlkwaaCjQiy80_shCM92r-4rHSjZcubh8,52985
55
+ pygeodesy/named.py,sha256=CfOdOZrMTCPWtHju158dJl8Yc8OimWW7i6uZ0LMVFjs,52988
56
56
  pygeodesy/namedTuples.py,sha256=mIwqxjSRqmJ7D4_BMYhQkSoAaaP3-rwnToNenu1k3yU,30598
57
57
  pygeodesy/nvectorBase.py,sha256=hDLrOOBuxz0n5zNH3nyg5FlElUD2Yusd91PRL7QLooA,29927
58
58
  pygeodesy/osgr.py,sha256=afrHMVQ6wrdCaKDXMuhXcDy0MTI-8HKQccSlKGUNwps,30852
59
59
  pygeodesy/points.py,sha256=Fcz220qrQqLCI9b442sOb1wR0w12EsE1LDbLFwwXWhA,64497
60
- pygeodesy/props.py,sha256=8B-gajKbNpYpk6Uc3-FoDL1eomjzjKzkhwM-JobDqE8,24600
60
+ pygeodesy/props.py,sha256=90WNv8voJGF_X4zEL_luSmZi3XNzA6gvLDAX9Sv6tCk,24658
61
61
  pygeodesy/resections.py,sha256=47twtGa_PQ71QUwReECkRpVFyuRSuYhsCecS3cThEiA,43796
62
62
  pygeodesy/simplify.py,sha256=8OJj7jkxJFVE5jQRvbpm14_Oxrv4Oju7atIGFRg3zUE,22068
63
63
  pygeodesy/solveBase.py,sha256=4lKwoWCiDjQjaS_iMUZ7m8nkLL92yNHBcNsmNsulOdc,19631
@@ -65,7 +65,7 @@ pygeodesy/sphericalBase.py,sha256=54na1mQCuyZ1dYzpt801AC2B7PStLNmt3CRwAC2A03A,32
65
65
  pygeodesy/sphericalNvector.py,sha256=N_qB3ziZMf0spE0fqd-GVW9omAy5YT3HdsE2DB2Td9Y,54948
66
66
  pygeodesy/sphericalTrigonometry.py,sha256=YN-Gv2m1rWg2rzAXpuAFPu2WL-ARt3u1zKNWJLZ8JAk,64398
67
67
  pygeodesy/streprs.py,sha256=tS21sthUtj06Jmh9rdyAbiczwjNjvZTMWvUmJwD9ODs,23728
68
- pygeodesy/trf.py,sha256=Uuuai2FMZFJsKXTHZtT4c2gQ4YRlYdw9K_0PSHmP-Fo,119216
68
+ pygeodesy/trf.py,sha256=DPfcjdSEOz7xlhdRgfQVCnX5j9jUTkfK4sYGP4EbolI,119215
69
69
  pygeodesy/units.py,sha256=9zAnu28f0c7pELZviZDukxz6hjeAwhBvH5wq8F2-cww,35561
70
70
  pygeodesy/unitsBase.py,sha256=9AHGuUuGWmKUYHNZt6tVxUkLDvSAyr2gitikME75eZg,14141
71
71
  pygeodesy/ups.py,sha256=_Qyp1cBhAGOGPya09zZQYO468H2Nc8jxKYw-HgOMa8o,23288
@@ -103,10 +103,10 @@ pygeodesy/deprecated/rhumbx.py,sha256=SdCzJgaSMBxZUQpT3vu52eE1neZTMkddz1Vuu4KsGx
103
103
  pygeodesy/geodesicx/_C4_24.py,sha256=qkKFpXNPBo2RRfCjNV_AjNO4nZm_wsUux4IZuyfZJt8,90707
104
104
  pygeodesy/geodesicx/_C4_27.py,sha256=rrcq4FeTQThu4vmYqLK0cmjpCLkPTCQbS728AbDjPRw,134215
105
105
  pygeodesy/geodesicx/_C4_30.py,sha256=A6Keryy3a4iF6chjf1RMFG-Fb9M49_QQaI-4T-2NXx0,201921
106
- pygeodesy/geodesicx/__init__.py,sha256=rQOcuynoXLIuaS7viIXB0wih4d-obon5BtFmZWWbzsc,2468
106
+ pygeodesy/geodesicx/__init__.py,sha256=9zxci6ekoDGhyq7wAED3xPCD3-bJ_-Vx8vteCHvUOeI,2468
107
107
  pygeodesy/geodesicx/__main__.py,sha256=834PZqoetW0V3xeIvCSbh6TPMCv8wq2-mUIm8cLkv-w,4330
108
108
  pygeodesy/geodesicx/gx.py,sha256=qXz-YWiIjJhg2ytyFKFvjXAkVqTqQ26TzzGU3bncbfE,60438
109
- pygeodesy/geodesicx/gxarea.py,sha256=0wML9AmCgb9mJj7q7OPP0QHgIDcCQVp_4UuNWHfhpDA,19588
109
+ pygeodesy/geodesicx/gxarea.py,sha256=dyoAZsCeytAUBCHG4Nxjll8AWcXmBHKzkxzIztj9X-g,20520
110
110
  pygeodesy/geodesicx/gxbases.py,sha256=FC9oZLaKy-uf8o5Bmmr7MK4jBBvhzgaETzb5Qdixa04,6319
111
111
  pygeodesy/geodesicx/gxline.py,sha256=PoPa_Qz9KSmP6Pb3LZgQg-9FcLpvMuVBRwxAkAtrYOw,28284
112
112
  pygeodesy/rhumb/__init__.py,sha256=wetV7OwO6z-_D0FVTphwu6u0bA7h-sG3pfZa3WGAvfk,2296
@@ -115,11 +115,11 @@ pygeodesy/rhumb/bases.py,sha256=RBWGVBogfZAT7azFe-46mF_hUoI-bIvWCxwoiE8-Pvo,5421
115
115
  pygeodesy/rhumb/ekx.py,sha256=L__f41hdrU8cVcqbWolEvdLAXtQdULlYhxsbccoYwok,24058
116
116
  pygeodesy/rhumb/solve.py,sha256=85GonvF3qsp8I--XA2DUuwR0J7BU4S3O9BjnLEStcMw,24910
117
117
  pygeodesy/triaxials/__init__.py,sha256=dZ3zXLWIIGhjMBYE6-8gJSfokNw4x5wg7eaTGSZH2Hw,3894
118
- pygeodesy/triaxials/bases.py,sha256=qbD-YLERQqe4jcz4UxEjNI1ZEnTOBQ695__HUf0jbLA,33963
118
+ pygeodesy/triaxials/bases.py,sha256=Fv_sPyC5Mp_LouFbuOywK7BRcR0I2XmLeKCIOtlvX5w,34945
119
119
  pygeodesy/triaxials/conformal3.py,sha256=FrJLQ0m58YvP_heh9jFH5TkhR46kSTzCIgtmtRPMErQ,23883
120
- pygeodesy/triaxials/triaxial3.py,sha256=uj3XFLbh6bGOHHiqeulJiQjmnKNOB5-e1OYjAcsD5sk,40578
120
+ pygeodesy/triaxials/triaxial3.py,sha256=jCPAHwofXTZKpAN8xNtNlT2f5R0COzn46E1y_5mKnyU,40581
121
121
  pygeodesy/triaxials/triaxial5.py,sha256=C38E8Atkxfiu8J6HOfkUUVU5lRn2kIjdSh5opkMep-s,53028
122
- pygeodesy-25.12.12.dist-info/METADATA,sha256=lNnk-d-YFxVq-Cx-_fBBdcJLdY-KfoH5IS9E0nk6nw0,20145
123
- pygeodesy-25.12.12.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
124
- pygeodesy-25.12.12.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
125
- pygeodesy-25.12.12.dist-info/RECORD,,
122
+ pygeodesy-25.12.31.dist-info/METADATA,sha256=cCh8F1b6GYHz1DBtBYPlSOdW5tM0JAMq7ATtdgU0yYg,20710
123
+ pygeodesy-25.12.31.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
124
+ pygeodesy-25.12.31.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
125
+ pygeodesy-25.12.31.dist-info/RECORD,,