pygeodesy 25.7.25__py2.py3-none-any.whl → 25.8.25__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/ellipsoids.py CHANGED
@@ -66,8 +66,9 @@ from __future__ import division as _; del _ # noqa: E702 ;
66
66
 
67
67
  # from pygeodesy.albers import AlbersEqualAreaCylindrical # _MODS
68
68
  from pygeodesy.basics import copysign0, isbool, _isin, isint, typename
69
- from pygeodesy.constants import EPS, EPS0, EPS02, EPS1, INF, NINF, PI4, PI_2, PI_3, R_M, R_MA, R_FM, \
70
- _EPSqrt, _EPStol as _TOL, _floatuple as _T, _isfinite, _over, \
69
+ from pygeodesy.constants import EPS, EPS_2, EPS0, EPS02, EPS1, INF, NINF, \
70
+ _over, PI_2, PI_3, PI4, R_M, R_MA, R_FM, \
71
+ _EPSqrt, _EPStol as _TOL, _floatuple as _T, _isfinite, \
71
72
  _0_0s, _0_0, _0_5, _1_0, _1_EPS, _2_0, _4_0, _90_0, \
72
73
  _0_25, _3_0 # PYCHOK used!
73
74
  from pygeodesy.errors import _AssertionError, IntersectionError, _ValueError, _xattr, _xkwds_not
@@ -95,7 +96,7 @@ from pygeodesy.utily import atan1, atan1d, atan2b, degrees90, m2radians, radians
95
96
  from math import asinh, atan, atanh, cos, degrees, exp, fabs, radians, sin, sinh, sqrt, tan # as _tan
96
97
 
97
98
  __all__ = _ALL_LAZY.ellipsoids
98
- __version__ = '25.05.12'
99
+ __version__ = '25.08.25'
99
100
 
100
101
  _f_0_0 = Float(f =_0_0) # zero flattening
101
102
  _f__0_0 = Float(f_=_0_0) # zero inverse flattening
@@ -1186,6 +1187,22 @@ class Ellipsoid(_NamedEnumItem):
1186
1187
 
1187
1188
  return Vector4Tuple(v.x, v.y, v.z, h, iteration=i, name__=self.height4)
1188
1189
 
1190
+ def _heightB(self, sa, ca, z, p): # in ecef.EcefSudano, ecec.EcefVeness
1191
+ '''(INTERNAL) Height above ellipsoid (Bowring eqn 7) at C{lat}.
1192
+ '''
1193
+ # sa, ca = sincos2d(lat)
1194
+ # p = hypot(x, y) # distance to polar axis
1195
+
1196
+ # r = a / self.e2s(sa) # length of normal terminated by polar axis
1197
+ # h = p * ca + z * sa - (a * a / r)
1198
+ return (p * ca + fabs(z * sa) - self.a * self.e2s(sa)) if sa else (p - self.a)
1199
+
1200
+ @Property_RO
1201
+ def _heightMax(self):
1202
+ '''(INTERNAL) Get the height limit (C{meter}, conventionally).
1203
+ '''
1204
+ return self.a / EPS_2 # self.a * _2_EPS, about 12M lightyears
1205
+
1189
1206
  def _hubeny_2(self, phi2, phi1, lam21, scaled=True, squared=True):
1190
1207
  '''(INTERNAL) like function C{pygeodesy.flatLocal_}/C{pygeodesy.hubeny_},
1191
1208
  returning the I{angular} distance in C{radians squared} or C{radians}
@@ -1542,7 +1559,7 @@ class Ellipsoid(_NamedEnumItem):
1542
1559
 
1543
1560
  @deprecated_property_RO
1544
1561
  def rhumbx(self):
1545
- '''DEPRECATED on 2023.11.28, use property C{rhumbekx}. '''
1562
+ '''DEPRECATED on 2023.11.28, use property C{rhumbekx}.'''
1546
1563
  return self.rhumbekx
1547
1564
 
1548
1565
  def Rlat(self, lat):
@@ -1587,16 +1604,15 @@ class Ellipsoid(_NamedEnumItem):
1587
1604
 
1588
1605
  @see: Method L{roc2_} and class L{EcefYou}.
1589
1606
  '''
1590
- if not self.f: # .isSpherical
1591
- n = self.a
1592
- elif ca is None:
1593
- r = self.e2s2(sa) # see .roc2_ and _EcefBase._forward
1594
- n = sqrt(self.a2 / r) if r > EPS02 else _0_0
1595
- elif ca: # derived from EcefYou.forward
1596
- h = hypot(ca, self.b_a * sa) if sa else fabs(ca)
1597
- n = self.a / h
1598
- elif sa:
1599
- n = self.a2_b / fabs(sa)
1607
+ if sa and self.f: # .isEllipsoidal
1608
+ if ca is None:
1609
+ r = self.e2s2(sa) # see .roc2_ and _EcefBase._forward
1610
+ n = sqrt(self.a2 / r) if r > EPS02 else _0_0
1611
+ elif ca: # derived from EcefYou.forward
1612
+ h = hypot(ca, self.b_a * sa)
1613
+ n = self.a / h
1614
+ else:
1615
+ n = self.a2_b / fabs(sa)
1600
1616
  else:
1601
1617
  n = self.a
1602
1618
  return n
pygeodesy/internals.py CHANGED
@@ -76,7 +76,7 @@ class _MODS_Base(object):
76
76
  return b
77
77
 
78
78
  @_Property_RO
79
- def bits_machine2(self):
79
+ def bits_machine2(self): # in test/bases.py
80
80
  '''Get platform 2-list C{[bits, machine]}, I{once}.
81
81
  '''
82
82
  import platform as p
@@ -686,7 +686,7 @@ def _versions(sep=_SPACE_):
686
686
 
687
687
 
688
688
  __all__ = tuple(map(typename, (machine, print_, printf, typename)))
689
- __version__ = '25.05.26'
689
+ __version__ = '25.08.18'
690
690
 
691
691
  if __name__ == _DMAIN_:
692
692
 
@@ -699,7 +699,7 @@ if __name__ == _DMAIN_:
699
699
  _main()
700
700
 
701
701
  # % python3 -m pygeodesy.internals
702
- # pygeodesy 25.4.14 Python 3.13.2 64bit arm64 macOS 15.4 _isfrozen False isLazy 1
702
+ # pygeodesy 25.8.18 Python 3.13.5 64bit arm64 macOS 15.6 _isfrozen False isLazy 1
703
703
 
704
704
  # **) MIT License
705
705
  #
pygeodesy/ktm.py CHANGED
@@ -62,11 +62,11 @@ from pygeodesy.props import property_doc_, Property, Property_RO, \
62
62
  from pygeodesy.units import Degrees, Scalar_, _1mm as _TOL_10 # PYCHOK used!
63
63
  from pygeodesy.utily import atan1d, atan2, _loneg, sincos2, sincos2d_
64
64
 
65
- from cmath import polar
65
+ from cmath import polar as _polar
66
66
  from math import asinh, cos, cosh, degrees, fabs, sin, sinh, sqrt, tanh
67
67
 
68
68
  __all__ = _ALL_LAZY.ktm
69
- __version__ = '25.05.12'
69
+ __version__ = '25.08.18'
70
70
 
71
71
 
72
72
  class KTMError(_ValueError):
@@ -476,7 +476,7 @@ def _Cyxgk4(E, xi_, eta_, C):
476
476
 
477
477
  # Gauss-Schreiber to Gauss-Krueger TM
478
478
  # C{cmath.polar} handles INF, NAN, etc.
479
- k, g = polar(c)
479
+ k, g = _polar(c)
480
480
  g = degrees(g)
481
481
  else: # E.isSpherical
482
482
  g, k = _0_0, _1_0
pygeodesy/latlonBase.py CHANGED
@@ -33,7 +33,7 @@ from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS
33
33
  from pygeodesy.named import _name2__, _NamedBase, Fmt
34
34
  from pygeodesy.namedTuples import Bounds2Tuple, LatLon2Tuple, PhiLam2Tuple, \
35
35
  Trilaterate5Tuple, Vector3Tuple
36
- # from pygeodesy.nvectorBase import _N_vector_ # _MODS
36
+ # from pygeodesy.nvectorBase import _N_Vector # _MODS
37
37
  from pygeodesy.props import deprecated_method, Property, Property_RO, \
38
38
  property_RO, _update_all
39
39
  # from pygeodesy.streprs import Fmt, hstr # from .named, _MODS
@@ -48,7 +48,7 @@ from contextlib import contextmanager
48
48
  from math import asin, cos, degrees, fabs, radians
49
49
 
50
50
  __all__ = _ALL_LAZY.latlonBase
51
- __version__ = '25.05.07'
51
+ __version__ = '25.08.18'
52
52
 
53
53
  _formy = _MODS.into(formy=__name__)
54
54
 
@@ -971,9 +971,9 @@ class LatLonBase(_NamedBase, _EcefLocal):
971
971
 
972
972
  @property_RO
973
973
  def _N_vector(self):
974
- '''(INTERNAL) Get the C{Nvector} (C{nvectorBase._N_vector_})
974
+ '''(INTERNAL) Get the C{Nvector} (C{nvectorBase._N_Vector})
975
975
  '''
976
- _N = _MODS.nvectorBase._N_vector_
976
+ _N = _MODS.nvectorBase._N_Vector
977
977
  return _N(*self._n_xyz3, h=self.height, name=self.name)
978
978
 
979
979
  @Property_RO
pygeodesy/lazily.py CHANGED
@@ -214,8 +214,8 @@ _ALL_LAZY = _NamedEnum_RO(_name='_ALL_LAZY',
214
214
  'bearingDMS', 'clipDegrees', 'clipRadians', 'compassDMS', 'compassPoint',
215
215
  'degDMS', 'latDMS', 'latlonDMS', 'latlonDMS_', 'lonDMS', 'normDMS',
216
216
  'parseDDDMMSS', 'parseDMS', 'parseDMS2', 'parse3llh', 'parseRad', 'precision', 'toDMS'),
217
- ecef=_a('EcefError', 'EcefFarrell21', 'EcefFarrell22', 'EcefKarney', 'EcefMatrix',
218
- 'EcefSudano', 'Ecef9Tuple', 'EcefVeness', 'EcefYou'),
217
+ ecef=_a('EcefFarrell21', 'EcefFarrell22', 'EcefKarney', 'EcefSudano', 'EcefUPC', 'EcefVeness', 'EcefYou',
218
+ 'EcefError', 'EcefMatrix', 'Ecef9Tuple'),
219
219
  ecefLocals=_a(), # module only
220
220
  elevations=_a('Elevation2Tuple', 'GeoidHeight2Tuple',
221
221
  'elevation2', 'geoidHeight2'),
@@ -510,7 +510,7 @@ class _ALL_MODS(_internals._MODS_Base):
510
510
  _internals._MODS = _ALL_MODS = _ALL_MODS() # PYCHOK singleton
511
511
 
512
512
  __all__ = _ALL_LAZY.lazily
513
- __version__ = '25.05.19'
513
+ __version__ = '25.08.22'
514
514
 
515
515
 
516
516
  def _ALL_OTHER(*objs):
pygeodesy/nvectorBase.py CHANGED
@@ -38,7 +38,7 @@ from pygeodesy.vector3d import Vector3d, _xyzhdlln4
38
38
  from math import degrees, fabs, sqrt
39
39
 
40
40
  __all__ = _ALL_LAZY.nvectorBase
41
- __version__ = '25.05.12'
41
+ __version__ = '25.08.18'
42
42
 
43
43
 
44
44
  class NvectorBase(Vector3d): # XXX kept private
@@ -355,7 +355,7 @@ class NvectorBase(Vector3d): # XXX kept private
355
355
  return self.xyz.to4Tuple(self.h)
356
356
 
357
357
 
358
- class _N_vector_(NvectorBase):
358
+ class _N_Vector(NvectorBase):
359
359
  '''(INTERNAL) Minimal, low-overhead C{n-vector}.
360
360
  '''
361
361
  def __init__(self, x, y, z, h=0, **name):
@@ -366,8 +366,8 @@ class _N_vector_(NvectorBase):
366
366
  self.name = name
367
367
 
368
368
 
369
- NorthPole = _N_vector_(0, 0, +1, name='NorthPole') # North pole
370
- SouthPole = _N_vector_(0, 0, -1, name='SouthPole') # South pole
369
+ NorthPole = _N_Vector(0, 0, +1, name='NorthPole') # North pole
370
+ SouthPole = _N_Vector(0, 0, -1, name='SouthPole') # South pole
371
371
 
372
372
 
373
373
  class LatLonNvectorBase(LatLonBase):
@@ -36,7 +36,7 @@ from pygeodesy.interns import _1_, _2_, _coincident_, _composite_, _colinear_, \
36
36
  _point_, _SPACE_, _too_
37
37
  from pygeodesy.latlonBase import _trilaterate5
38
38
  from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS, _ALL_OTHER
39
- # from pygeodesy.nvectorBase import NvectorBase, sumOf # _MODS
39
+ # from pygeodesy.nvectorBase import _N_Vector, NvectorBase, sumOf # _MODS
40
40
  from pygeodesy.namedTuples import LatLon2Tuple, LatLon3Tuple, NearestOn3Tuple, \
41
41
  Triangle7Tuple, Triangle8Tuple
42
42
  from pygeodesy.points import ispolar, nearestOn5 as _nearestOn5, \
@@ -57,7 +57,7 @@ from pygeodesy.vector3d import sumOf, Vector3d
57
57
  from math import asin, cos, degrees, fabs, radians, sin
58
58
 
59
59
  __all__ = _ALL_LAZY.sphericalTrigonometry
60
- __version__ = '25.05.28'
60
+ __version__ = '25.08.18'
61
61
 
62
62
  _PI_EPS4 = PI - EPS4
63
63
  if _PI_EPS4 >= PI:
@@ -968,10 +968,10 @@ def _intersect(start1, end1, start2, end2, height=None, wrap=False, # in.ellips
968
968
  a, b = antipode_(a, b) # PYCHOK PhiLam2Tuple
969
969
 
970
970
  else: # end point(s) or bearing(s)
971
- _N_vector_ = _MODS.nvectorBase._N_vector_
971
+ _N = _MODS.nvectorBase._N_Vector
972
972
 
973
- x1, d1 = _int3d2(s1, end1, wrap, _1_, _N_vector_, hs)
974
- x2, d2 = _int3d2(s2, end2, wrap, _2_, _N_vector_, hs)
973
+ x1, d1 = _int3d2(s1, end1, wrap, _1_, _N, hs)
974
+ x2, d2 = _int3d2(s2, end2, wrap, _2_, _N, hs)
975
975
  x = x1.cross(x2)
976
976
  if x.length < EPS: # [nearly] colinear or parallel lines
977
977
  raise IntersectionError(_colinear_)
pygeodesy/vector3dBase.py CHANGED
@@ -19,6 +19,7 @@ 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
21
21
  # from pygeodesy.namedTuples import Vector3Tuple # _MODS
22
+ # from pygeodesy.nvectorBase import _N_Vector # _MODS
22
23
  from pygeodesy.props import deprecated_method, Property, Property_RO, \
23
24
  property_doc_, property_RO, _update_all
24
25
  from pygeodesy.streprs import Fmt, strs, unstr
@@ -28,7 +29,7 @@ from pygeodesy.utily import atan2, sincos2, fabs
28
29
  from math import ceil as _ceil, floor as _floor, trunc as _trunc
29
30
 
30
31
  __all__ = _ALL_LAZY.vector3dBase
31
- __version__ = '24.11.24'
32
+ __version__ = '25.08.18'
32
33
 
33
34
 
34
35
  class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
@@ -760,9 +761,10 @@ class Vector3dBase(_NamedBase): # sync __methods__ with .fsums.Fsum
760
761
 
761
762
  @Property_RO
762
763
  def _N_vector(self):
763
- '''(INTERNAL) Get the (C{nvectorBase._N_vector_})
764
+ '''(INTERNAL) Get the (C{nvectorBase._N_Vector})
764
765
  '''
765
- return _MODS.nvectorBase._N_vector_(*self.xyz3, name=self.name)
766
+ _N = _MODS.nvectorBase._N_Vector
767
+ return _N(*self.xyz3, name=self.name)
766
768
 
767
769
  def _other_cmp(self, other):
768
770
  '''(INTERNAL) Return the value for comparison.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pygeodesy
3
- Version: 25.7.25
3
+ Version: 25.8.25
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 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-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 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
@@ -123,7 +123,7 @@ The tests ran with Python 3.13.5 (with geographiclib_ 2.0), 3.12.7 (with geograp
123
123
  scipy_ 1.14.1, GeodSolve_ 2.5, IntersectTool_ 2.5 and RhumbSolve_ 2.5), 3.11.5 (with geographiclib_ 2.0,
124
124
  numpy_ 1.24.2 and scipy_ 1.10.1), Python 3.10.8 (with geographiclib_ 2.0, numpy_ 1.23.3, scipy_ 1.9.1,
125
125
  GeoConvert_ 2.5, GeodSolve_ 2.5), Python 3.9.6 and Python 2.7.18 (with geographiclib_ 1.50, numpy_ 1.16.6,
126
- scipy_ 1.2.2, GeoConvert_ 2.5, GeodSolve_ 2.5, IntersectTool_ 2.5 and RhumbSolve_ 2.5), all on macOS 15.5
126
+ scipy_ 1.2.2, GeoConvert_ 2.5, GeodSolve_ 2.5, IntersectTool_ 2.5 and RhumbSolve_ 2.5), all on macOS 15.6.1
127
127
  Sequoia in 64-bit.
128
128
 
129
129
  All tests ran with and without ``lazy import`` for Python 3 and with command line option ``-W default``
@@ -133,7 +133,7 @@ included in the distribution files.
133
133
  Python 3.13.5, 3.12.7, 3.11.5 and 3.10.8 run on Apple M4 Si (``arm64``), *natively*. Python 2.7.18 runs
134
134
  on Intel (``x86_64``) or Intel *emulation* (\"``arm64_x86_64``\", see function `pygeodesy.machine`_).
135
135
 
136
- Test coverage has been measured with coverage_ 7.6.1 using Python 3.13.4, 3.12.7, 3.11.5 and 3.10.8. The
136
+ Test coverage has been measured with coverage_ 7.6.1 using Python 3.13.5, 3.12.7, 3.11.5 and 3.10.8. The
137
137
  complete coverage report in HTML and a PDF summary are included in the distribution files.
138
138
 
139
139
  The tests also ran with Python 3.13.5 (and geographiclib_ 2.0) on `Debian 12`_ in 64-bit only and with
@@ -149,7 +149,7 @@ numpy_ 1.16.3, 1.16.4, 1.16.6, 1.19.0, 1.19.4, 1.19.5 or 1.22.4 and scipy_ 1.2.1
149
149
  Ubuntu 16.04, with Python 3.10.0-1, 3.9.0-5, 3.8.0-6, 3.7.2-6, 3.7.0, 3.6.2-5, 3.5.3, 2.7.13-17, 2.7.10
150
150
  and 2.6.9 (and numpy_ 1.19.0, 1.16.5, 1.16.2, 1.15.2, 1.14.0, 1.13.1, 1.8.0rc1 or 1.6.2 and scipy_ 1.5.0),
151
151
  PyPy_ 7.3.0 (Python 2.7.13 and 3.6.9), PyPy_ 6.0.0 (Python 2.7.13 and 3.5.3) and `Intel-Python`_ 3.5.3 (and
152
- numpy_ 1.11.3) on macOS 15.0-4 Sequoia, 14.0-6.1 Sonoma, 13.0-5.2 Ventura, 12.1-6 Monterey, 11.0-5.2-6.1 Big
152
+ numpy_ 1.11.3) on macOS 15.0-5 Sequoia, 14.0-6.1 Sonoma, 13.0-5.2 Ventura, 12.1-6 Monterey, 11.0-5.2-6.1 Big
153
153
  Sur (aka 10.16), 10.15.3, 10.15.5-7 Catalina, 10.14 Mojave, 10.13.6 High Sierra and 10.12 Sierra, MacOS X
154
154
  10.11 El Capitan and/or MacOS X 10.10 Yosemite, with Pythonista_ 3.2 (with geographiclib 1.50 or 1.49 and
155
155
  numpy 1.8.0) on iOS 14.4.2, 11.4.1, 12.0-3 on iPad4, iPhone6, iPhone10 and/or iPhone12, with Pythonista_ 3.1
@@ -160,11 +160,11 @@ Notes
160
160
  =====
161
161
 
162
162
  All Python source code has been statically checked_ with Ruff_ using Python 3.13.5 and with PyChecker_, PyFlakes_,
163
- PyCodeStyle_ (formerly Pep8) and McCabe_ using Python 2.7.18, both in 64-bit on macOS 15.5 Sequoia only.
163
+ PyCodeStyle_ (formerly Pep8) and McCabe_ using Python 2.7.18, both in 64-bit on macOS 15.6.1 Sequoia only.
164
164
 
165
165
  For a summary of all *Karney*-based functionality in ``pygeodesy``, see module karney_.
166
166
 
167
- *Last updated: July 25, 2025.*
167
+ *Last updated: Aug 25, 2025.*
168
168
 
169
169
  License
170
170
  =======
@@ -1,17 +1,17 @@
1
1
  pygeodesy/LICENSE,sha256=YfgAiyxOwY6P9Kkb1_5XN81nueTLrpb3Ffkv3EuPgFU,1144
2
- pygeodesy/__init__.py,sha256=eQka0vi00N446lUD8M76mPfU8TsRK4VgBqY0tdqocuk,42285
2
+ pygeodesy/__init__.py,sha256=SVNWIkycgnT1Zg3btfHYDEGCrQwHaGIs9o748NoxFIY,42289
3
3
  pygeodesy/__main__.py,sha256=HpOBmuhI7yVP1FIAEugvd9Lb54kzew-nM78be0r4SC4,5597
4
4
  pygeodesy/albers.py,sha256=mb3YbVvoBq8a7AytT0HeVxe8DGEvx1KFN2Usl2ksKwk,30908
5
5
  pygeodesy/azimuthal.py,sha256=acwIA1B7jmg1oDpJBuFitnOVHUWRUk7Y73yI8zqIGrc,49854
6
6
  pygeodesy/basics.py,sha256=ErpbLgHNerGPKiOIlWKdKzq6lO0dhoZjaywTnCn8PyE,32905
7
7
  pygeodesy/booleans.py,sha256=njAJlAoVZEcQ5jp8wwyuVo8-jFPE3PFpAF3k3dQihBM,73683
8
- pygeodesy/cartesianBase.py,sha256=tvb1pGUTvSkIAInNhrnHXjBCwnQrVn6a-H2fipoapKE,45365
8
+ pygeodesy/cartesianBase.py,sha256=KX74yZE-fM7wHDnrV5OkAEyKwyZJy5o9VuzVjb1caZQ,45355
9
9
  pygeodesy/clipy.py,sha256=a0azaK7YDmGDU8mVVKe2MvUiPEhqZ9XJ-9u0T1iHKbo,27779
10
10
  pygeodesy/constants.py,sha256=usdHWtYiy8iaPXxXau2vsViL9zC8I4Jp2fziiEmp2g4,19947
11
11
  pygeodesy/css.py,sha256=vdQax5m7BMSpr7PUyqedCSvx73ilWuhXQTp39i8FOfA,25793
12
12
  pygeodesy/datums.py,sha256=Vp1fP7sSV1EuRbuO2scnZ3qiTZD1CvL4O12KSRlf1SU,34068
13
13
  pygeodesy/dms.py,sha256=CKXt2EOYFBluQV5q6cFYppJl3dCvvEB_0E84J0ki6ws,42202
14
- pygeodesy/ecef.py,sha256=DcWNhnOZC7-Olns9c1XI9p4MmuC00KN5rZ5W1UQVUxw,59009
14
+ pygeodesy/ecef.py,sha256=dOnyvDCoJ1u55WzxHFe0BQsYG1dbql9HwWVOz4LMats,62577
15
15
  pygeodesy/ecefLocals.py,sha256=zoxGUJeYX2UXzR9r0jaByrvfrrpmrvAhjyQsz433RjA,7794
16
16
  pygeodesy/elevations.py,sha256=WrWPZNgkZX9Ys_1ij_gyE4jzdIv85JYAaR2cK3vc4gQ,10879
17
17
  pygeodesy/ellipsoidalBase.py,sha256=UpmJfjAuC7pvN9VIxLXveAmotPVW7oL2APAJUTi34Uc,55711
@@ -21,7 +21,7 @@ pygeodesy/ellipsoidalGeodSolve.py,sha256=w5TubUdqYwvrtxfIwP2Scr1FzISq2szx1HX88TU
21
21
  pygeodesy/ellipsoidalKarney.py,sha256=W_Liw5MxTqJJGsxMi50ui8grRSPKwkG2HH-Mv_mXQYk,18839
22
22
  pygeodesy/ellipsoidalNvector.py,sha256=HLFjX6o26q2fzVCjLSL0PdEh96xhGtjfzo2V_k54j4A,30146
23
23
  pygeodesy/ellipsoidalVincenty.py,sha256=zeTvid09NGuYJ1WJ__a3ApCBGSzX0A-Rhs8-sQXMNQQ,26273
24
- pygeodesy/ellipsoids.py,sha256=v964yZIL2nCc8MJgt3nzV6pczaQsQubXmX_sAh_nrBw,107765
24
+ pygeodesy/ellipsoids.py,sha256=C6DXM7OmuxDyh6kYiRvwEW91srd7cOIpxxlO_-08EdA,108446
25
25
  pygeodesy/elliptic.py,sha256=4MdiatI5RZuP9t2nMdmzeoqk37R2U8Ll5SeW5w2wymY,45670
26
26
  pygeodesy/epsg.py,sha256=VIBidzAEuoBF4LdlJ4r3WtpL0Ymhru8kf4fAgfFr5ok,8220
27
27
  pygeodesy/errors.py,sha256=OUEJ51M3c-JH1n0BBbRtPTCDX0I00rH_BQPYSRoKrqo,32043
@@ -39,20 +39,20 @@ pygeodesy/geohash.py,sha256=1P9-k9sMN-ZVFr2iWbQpFi1lg3uNmChHFCIfETkgFJU,40153
39
39
  pygeodesy/geoids.py,sha256=OQvOVutr8R1CalStgxmNu2Mk3oMl4zpCY_OKh0KHpI8,86125
40
40
  pygeodesy/hausdorff.py,sha256=KGB0CIeNkBqR0sXIbRJvcgXPrM-4Mpi2aBOqDeZjqZ0,32269
41
41
  pygeodesy/heights.py,sha256=_Pn-6w4gGzdXCoA6m72rJm4hb-Fe2vxc8RiRRjq5iTI,41002
42
- pygeodesy/internals.py,sha256=y3qT-ZbNDc-7md_T87qtVk1x2rDVtJbP5G0P-HgBlVA,24024
42
+ pygeodesy/internals.py,sha256=2iZ2XbHjxXZnGDhHDcBu8Syi-iHCmzasOv7NbJ66fwQ,24044
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=IzWyGwX0kRpwrVFBpCzogd2Q8PLvCdCwHheE-zbCQZE,41629
46
- pygeodesy/ktm.py,sha256=3CLwbRvk-sr4qs8R9fdJ_ejokgZEjKHULV7wzzuonHU,27259
47
- pygeodesy/latlonBase.py,sha256=B7wNE-IJf-Sm3NKhCXdrgwRbH_4dBGluZlQdxTJqp8s,75320
48
- pygeodesy/lazily.py,sha256=2FzJkIQK7LftAXXYxMbqTQUAWth7T3syIhqm8Z9bhuo,47609
46
+ pygeodesy/ktm.py,sha256=h8F_NfkgJzQ4zt24IqJeXe-E1MFdIJ3ti51IjQ8iuCs,27270
47
+ pygeodesy/latlonBase.py,sha256=eF8tr0fP9nc8JMGbJ0JyeFfECZyjlBJbtIchKRdU4B4,75317
48
+ pygeodesy/lazily.py,sha256=kFWqUcOEYzCDKk2zDMmZPTXnZIxMt4ditF9cJGmwGgQ,47620
49
49
  pygeodesy/lcc.py,sha256=7Di2Y5VIDL5drdSce4ABWGT3MtZSosaLKd68US6788s,25786
50
50
  pygeodesy/ltp.py,sha256=N3TMipTWKUOeZYzn3UeJJqe5J4Yk788390ohQM1ykAE,50893
51
51
  pygeodesy/ltpTuples.py,sha256=t-n7p9A3JCVasv8LKCV4PkOTmXJZi91BkBFm8pBZM5o,59101
52
52
  pygeodesy/mgrs.py,sha256=ZgCBH_M_YFxuFu5ukVOVetk-uftv-4GJP-QJrtoqtcU,29842
53
53
  pygeodesy/named.py,sha256=NjRLzk0bNSJbPBaqFPjG0UagZj6MarF9O4ZQVQsyV7o,52898
54
54
  pygeodesy/namedTuples.py,sha256=JlO8uWmR65RkT7Rdgc9knfI0-bqJeA-tm2ZKsesztVU,30598
55
- pygeodesy/nvectorBase.py,sha256=XnA_DlqbgYPpF7y_BQHQVmntpI3M5fe0q8h3zX-PKbs,29930
55
+ pygeodesy/nvectorBase.py,sha256=r-O-ErwTXqDfLg4zYqhB4IqTJc8P8rbJlMm0XfQN2Gs,29927
56
56
  pygeodesy/osgr.py,sha256=4mFUcn1vMOju3PK1rKohPtIlJZrBGPJrcRjFl-CoxqE,30852
57
57
  pygeodesy/points.py,sha256=2vQpgqxJiC7Cgn03pqiezTM4I-CTquv9tQZi4uYWjpw,64497
58
58
  pygeodesy/props.py,sha256=GCBqrkMfpbHuca2Sh68WSGDplIeZLvCDDXUewyvEiqI,24600
@@ -61,7 +61,7 @@ pygeodesy/simplify.py,sha256=O04NSb0ezXM8z3lCcajXbetZuum6PURAOPYTsJ27gxI,22068
61
61
  pygeodesy/solveBase.py,sha256=I2oW7zaPoVUkD7IB9Ro0paU-T1vie1lomg83f71twDY,18468
62
62
  pygeodesy/sphericalBase.py,sha256=hq6dyeeIHBy_T0Q6PIwSvmo1U70Ir5KBeMTwQplzqHQ,32071
63
63
  pygeodesy/sphericalNvector.py,sha256=bu0yB4PEq1cs6BS8QFqtljWpVEw7ESwq2yILOzGDuAc,54948
64
- pygeodesy/sphericalTrigonometry.py,sha256=8q3sevqdeJ-mOukkXLsXKAg06hDxaBhiPHhrdQn3UHY,64411
64
+ pygeodesy/sphericalTrigonometry.py,sha256=hybTuf3IlNU3ETbV8Zd-XxPSE6xrYgX3dxJSrDGeY58,64398
65
65
  pygeodesy/streprs.py,sha256=-4LErmfPLtGt1tLDBHhJam-zYq8p2Z2C5wDCMELEml4,23599
66
66
  pygeodesy/trf.py,sha256=gpsOJVER1KhITOtyiENQ4EnRONinLkzbujsfzzxHVv8,119209
67
67
  pygeodesy/triaxials.py,sha256=V0MSYJxRgYDhZcF7HXnu7oFzRyWJkhwc6scuNjc6VVg,64046
@@ -74,7 +74,7 @@ pygeodesy/utmups.py,sha256=31RD8l7M-vcRXU9_wnkb_PNUcKjOr1HAmwjOndjkgXE,13176
74
74
  pygeodesy/utmupsBase.py,sha256=PptZ4Mm8BaDUCA8v1sK54o8idw_24kq6loAuYv0bejE,22730
75
75
  pygeodesy/vector2d.py,sha256=7R5ciPxXEX98LmMWNqwbds8Y6vpsHKEeCzcBVDRiq6g,40305
76
76
  pygeodesy/vector3d.py,sha256=sC7u9tgFFWoWHFxqtO-dvKVuiEzraw50TDU_QpdDbYw,43045
77
- pygeodesy/vector3dBase.py,sha256=BHenp3NGpfhVbJ6JMgdNLx6vAcwDWDJIxl9hAdp-AVw,36301
77
+ pygeodesy/vector3dBase.py,sha256=KHb9JwyOWdPSfhQAlo6jImvOsAPTm-A9bud5J8EUqso,36370
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
@@ -113,7 +113,7 @@ pygeodesy/rhumb/aux_.py,sha256=NeHkNLS2ULh3sTb3eBTtmRih9SZNyVJKMtJj7imKkuI,16117
113
113
  pygeodesy/rhumb/bases.py,sha256=P5AQyL-MTbJaO4oKH_Y7qcusQxaHoAii0hJVQ9mT7hU,54250
114
114
  pygeodesy/rhumb/ekx.py,sha256=GMY6ik4fgiRrjek-42cpZxU3U2bdoAcY6ZcbZRckpII,24026
115
115
  pygeodesy/rhumb/solve.py,sha256=z8z_XYObTgz7w1skNLNcLBpe-EO_r0H4sVcZGlBcWnc,24005
116
- pygeodesy-25.7.25.dist-info/METADATA,sha256=l3Vhf9Rra1Q1RsaUfPbDVHlRIpEyUpfzZseoSLAeIYA,20103
117
- pygeodesy-25.7.25.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
118
- pygeodesy-25.7.25.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
119
- pygeodesy-25.7.25.dist-info/RECORD,,
116
+ pygeodesy-25.8.25.dist-info/METADATA,sha256=S0lNNdiQn_nIwc6xpMLFuPx_g4XWcOS-Z6079gQz-Ys,20136
117
+ pygeodesy-25.8.25.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
118
+ pygeodesy-25.8.25.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
119
+ pygeodesy-25.8.25.dist-info/RECORD,,