pygeodesy 25.12.12__py2.py3-none-any.whl → 26.1.16__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.
@@ -12,41 +12,56 @@ GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1Triaxial_1_1Ellipsoid
12
12
  Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2024-2025) and licensed under the MIT/X11
13
13
  License. For more information, see the U{GeographicLib 2.7 <https://GeographicLib.SourceForge.io/>}
14
14
  documentation.
15
+
16
+ @var Triaxial3s.Amalthea: Triaxial3(name='Amalthea', a=125000, b=73000, c=64000, k2=0.106947697, kp2=0.893052303, volume=2446253479595252, area=93239507787.490371704, area_p=93212299402.670425415)
17
+ @var Triaxial3s.Ariel: Triaxial3(name='Ariel', a=581100, b=577900, c=577700, k2=0.05866109, kp2=0.94133891, volume=812633172614203904, area=4211301462766.580078125, area_p=4211301574065.829589844)
18
+ @var Triaxial3s.Earth: Triaxial3(name='Earth', a=6378173.435, b=6378103.9, c=6356754.399999999, k2=0.996748146, kp2=0.003251854, volume=1083208241574987694080, area=510065911057441.0625, area_p=510065915922713.6875)
19
+ @var Triaxial3s.Enceladus: Triaxial3(name='Enceladus', a=256600, b=251400, c=248300, k2=0.369647336, kp2=0.630352664, volume=67094551514082248, area=798618496278.596679688, area_p=798619018175.109985352)
20
+ @var Triaxial3s.Europa: Triaxial3(name='Europa', a=1564130, b=1561230, c=1560930, k2=0.093663002, kp2=0.906336998, volume=15966575194402123776, area=30663773697323.515625, area_p=30663773794562.45703125)
21
+ @var Triaxial3s.Io: Triaxial3(name='Io', a=1829400, b=1819300, c=1815700, k2=0.262045618, kp2=0.737954382, volume=25313121117889765376, area=41691875849096.734375, area_p=41691877397441.2109375)
22
+ @var Triaxial3s.Mars: Triaxial3(name='Mars', a=3394600, b=3393300, c=3376300, k2=0.92878339, kp2=0.07121661, volume=162907283585817247744, area=144249140795107.4375, area_p=144249144150662.15625)
23
+ @var Triaxial3s.Mimas: Triaxial3(name='Mimas', a=207400, b=196800, c=190600, k2=0.359218713, kp2=0.640781287, volume=32587072869017956, area=493855762247.691833496, area_p=493857714107.9375)
24
+ @var Triaxial3s.Miranda: Triaxial3(name='Miranda', a=240400, b=234200, c=232900, k2=0.171062751, kp2=0.828937249, volume=54926187094835456, area=698880863325.757202148, area_p=698881306767.950317383)
25
+ @var Triaxial3s.Moon: Triaxial3(name='Moon', a=1735550, b=1735324, c=1734898, k2=0.653331685, kp2=0.346668315, volume=21886698675223740416, area=37838824729886.09375, area_p=37838824733332.21875)
26
+ @var Triaxial3s.Tethys: Triaxial3(name='Tethys', a=535600, b=528200, c=525800, k2=0.243190549, kp2=0.756809451, volume=623086233855821440, area=3528073490771.394042969, area_p=3528074261832.738769531)
27
+ @var Triaxial3s.WGS84_3: Triaxial3(name='WGS84_3', a=6378171.36, b=6378101.609999999, c=6356751.84, k2=0.996738165, kp2=0.003261835, volume=1083207064030173855744, area=510065541435967.375, area_p=510065546301413.5625)
28
+ @var Triaxial3s.WGS84_35: Triaxial3(name='WGS84_35', a=6378172, b=6378102, c=6356752.314245179, k2=0.996726499, kp2=0.003273501, volume=1083207319768789942272, area=510065621722018.25, area_p=510065626587483.3125)
29
+ @var Triaxial3s.WGS84_3r: Triaxial3(name='WGS84_3r', a=6378172, b=6378102, c=6356752, k2=0.996726547, kp2=0.003273453, volume=1083207266220584468480, area=510065604942135.8125, area_p=510065609807745.0)
15
30
  '''
16
31
  # make sure int/int division yields float quotient, see .basics
17
32
  from __future__ import division as _; del _ # noqa: E702 ;
18
33
 
19
34
  from pygeodesy.angles import Ang, Ang_, _Ang3Tuple, atan2, sincos2, _SinCos2
20
35
  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
36
+ from pygeodesy.constants import EPS, EPS_2, EPS02, EPS8, INT0, NAN, \
37
+ _EPSqrt, _SQRT3, _copysign_0_0, _copysign_1_0, \
38
+ _flipsign, _isfinite, _over, _1_over, _0_0, \
39
+ _0_5, _N_1_0, _1_0, _2_0, _3_0, _4_0, _9_0
25
40
  from pygeodesy.errors import _xattr, _xkwds, _xkwds_get, _xkwds_pop2
26
41
  from pygeodesy.fmath import cbrt2, fdot, hypot, hypot2, norm2, fabs, sqrt
27
42
  from pygeodesy.fsums import Fsum, fsumf_, Fmt
28
- from pygeodesy.interns import NN, _h_, _lam_, _name_, _phi_
29
- from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS
30
- from pygeodesy.named import _NamedDict, _Pass # _Named
31
- from pygeodesy.namedTuples import Vector4Tuple
32
- from pygeodesy.props import Property_RO, property_ROver
43
+ from pygeodesy.interns import NN, _DMAIN_, _h_, _lam_, _phi_
44
+ # from pygeodesy.lazily import _ALL_LAZY # from .vector3d
45
+ # from pygeodesy.named import _Pass # from .namedTuples
46
+ from pygeodesy.namedTuples import Vector4Tuple, _Pass
47
+ # from pygeodesy.props import Property_RO # from .units
33
48
  # from pygeodesy.streprs import Fmt # from .fsums
34
49
  from pygeodesy.triaxials.bases import _bet_, _HeightINT0, LLK, _llk_, \
35
50
  _MAXIT, _omg_, _otherV3d_, _sqrt0, \
36
- _Triaxial3Base, TriaxialError
37
- from pygeodesy.units import Degrees, Radians, Radius_
51
+ _Triaxial3Base, TriaxialError, \
52
+ _TriaxialsBase
53
+ from pygeodesy.units import Degrees, Radians, Radius_, Property_RO
38
54
  # from pygeodesy.utily import atan2, sincos2 # from .triaxials.angles
39
- from pygeodesy.vector3d import Vector3d
55
+ from pygeodesy.vector3d import Vector3d, _ALL_LAZY
40
56
 
41
57
  # from math import fabs, sqrt # from .fmath
42
58
  from random import random
43
59
 
44
60
  __all__ = _ALL_LAZY.triaxials_triaxial3
45
- __version__ = '25.12.12'
61
+ __version__ = '26.01.14'
46
62
 
47
63
  _alp_ = 'alp'
48
64
  _NAN3d = Vector3d(NAN, NAN, NAN)
49
- _SQRT3 = sqrt(_3_0)
50
65
  _TOL = cbrt2(EPS)
51
66
  _TOL2 = _TOL**2 # cbrt(EPS)**4
52
67
  _zet_ = 'zet'
@@ -80,8 +95,6 @@ class Cartesian5Tuple(Vector4Tuple):
80
95
  class _Fp2(object):
81
96
  '''(INTERNAL) Function and derivate evaluation.
82
97
  '''
83
- _D = EPS * _0_5
84
-
85
98
  def __init__(self, rs, ls, n=1):
86
99
  # assert 0 < n <= 2
87
100
  self._2 = n == 2
@@ -92,7 +105,7 @@ class _Fp2(object):
92
105
  # k=0..2) - 1} and its derivative C{fp}.
93
106
  f = _N_1_0
94
107
  fc = fp = _0_0
95
- _D = self._D
108
+ _D = EPS_2
96
109
  _2 = self._2
97
110
  for g, q in self._rls:
98
111
  q = _1_over(p + q)
@@ -647,8 +660,6 @@ class Triaxial3(_Triaxial3Base):
647
660
  v = v._roty(True) # +1
648
661
  phi = Ang_(v.z, hypot(v.x, v.y), **name)
649
662
  lam = Ang_(v.y, v.x, **name) # Ang(0, 0) -> 0
650
- if llk is LLK.GEODETIC_LON0:
651
- lam += self.Lon0
652
663
 
653
664
  if dir3d is None:
654
665
  zet = None
@@ -658,6 +669,8 @@ class Triaxial3(_Triaxial3Base):
658
669
  dir3d.dot(n), **name)
659
670
  else:
660
671
  raise TriaxialError(dir3d=dir3d)
672
+ if llk is LLK.GEODETIC_LON0:
673
+ lam += self.Lon0
661
674
  return PhiLamZet5Tuple(phi, lam, zet, h, llk, **name)
662
675
 
663
676
  def random2(self, llk=LLK.ELLIPSOIDAL, both=False, _rand=random):
@@ -769,7 +782,7 @@ class Triaxial3(_Triaxial3Base):
769
782
  s = r.times_(*T._abc3)
770
783
  p = max(fabs(s.z), hypot(s.x, s.y) - l1, s.length - l0)
771
784
  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)))
785
+ v = r.times_(*(_over(n, h + l_) for n, l_ in zip(T._a2b2c23, ls)))
773
786
  if not h: # handle h == 0, v.y indeterminate
774
787
  x = v.x if l0 else r.x # sphere
775
788
  y = v.y if l1 else r.y # sphere or prolate
@@ -803,38 +816,6 @@ class Triaxial3B(Triaxial3):
803
816
  self._init_abc3_e2_k2_kp2(Radius_(b=b), e2, k2, kp2, **name)
804
817
 
805
818
 
806
- class Triaxial3s(_NamedDict):
807
- '''(INTERNAL) L{Triaxial3} registry, I{must} be a sub-class
808
- to accommodate the L{_LazyNamedEnumItem} properties.
809
- '''
810
- def __getattr__(self, name):
811
- '''Get the value of an item by B{C{name}}.
812
- '''
813
- try:
814
- return self[name]
815
- except KeyError:
816
- if name == _name_:
817
- return _MODS.named._Named.name.fget(self)
818
- raise _NamedDict._AttributeError(self, self._DOT_(name))
819
-
820
- def __getitem__(self, key):
821
- '''Get the value of an item by B{C{key}}.
822
- '''
823
- T = self._Triaxials(key, None)
824
- if T is None or key == _name_:
825
- raise KeyError(key)
826
- return Triaxial3(T, name=key)
827
-
828
- @property_ROver
829
- def _Triaxials(self):
830
- '''(INTERNAL) Get the C{Triaxials.get}, I{once}.
831
- '''
832
- return _MODS.triaxials.triaxial5.Triaxials.get
833
-
834
- Triaxial3s = Triaxial3s() # PYCHOK singleton
835
- '''Some pre-defined L{Triaxial3}s, like L{Triaxials<triaxials.Triaxials>}.'''
836
-
837
-
838
819
  def _cubic(rs, rt, l0, l1): # Cartesian3.cubic
839
820
  '''(INTERNaL) Solve sum(R2[i]/(z + lq2[i]), i=0,1,2) - 1 = 0
840
821
  with lq2[2] = 0. This has three real roots with just one
@@ -843,7 +824,7 @@ def _cubic(rs, rt, l0, l1): # Cartesian3.cubic
843
824
  a = l0 + l1
844
825
  b = l0 * l1
845
826
  c = -b * rs[2] # z2
846
- # cubic equation z^3 + a*z^2 + b*z + c = 0
827
+ # cubic equation z**3 + a*z**2 + b*z + c = 0
847
828
  b -= fdot(rs, l1, l0, a)
848
829
  a -= rt
849
830
  _r = b > 0
@@ -905,7 +886,8 @@ def _solve(_fp2, p, pscale, **n):
905
886
  if not (fv > _TOL2):
906
887
  break
907
888
  p, d = _P2(-fv / fp) # d is positive
908
- if i and d <= dt and (fv <= EPS8 or d <= (max(pt, p) * _TOL)):
889
+ if i and d <= dt and (fv <= EPS8 or
890
+ d <= (max(pt, p) * _TOL)):
909
891
  break
910
892
  dt = d
911
893
  else:
@@ -946,6 +928,20 @@ def _v_h_llk_name_NOIDAL(x_ct, y, z, **h_llk_name):
946
928
  raise TriaxialError(h=h, llk=llk, **kwds)
947
929
  return v, h, (LLK.ELLIPSOIDAL if llk is None else llk), name
948
930
 
931
+
932
+ class Triaxial3s(_TriaxialsBase):
933
+ _Triaxial = Triaxial3
934
+
935
+ Triaxial3s = Triaxial3s(Triaxial3, Triaxial3B) # PYCHOK singleton
936
+ '''Some pre-defined L{Triaxial3}s, like L{Triaxials<triaxials.triaxial5.Triaxials>}.'''
937
+ Triaxial3s._assert()
938
+
939
+ if __name__ == _DMAIN_:
940
+ # __doc__ of this file, force all into registry
941
+ from pygeodesy.internals import _pregistry
942
+ _pregistry(Triaxial3s)
943
+
944
+
949
945
  # **) MIT License
950
946
  #
951
947
  # Copyright (C) 2025-2026 -- mrJean1 at Gmail -- All Rights Reserved.
@@ -37,9 +37,8 @@ from pygeodesy.angles import _SinCos2, Property_RO
37
37
  from pygeodesy.basics import _isin, isLatLon
38
38
  from pygeodesy.constants import EPS, EPS0, EPS02, _EPS2e4, INT0, \
39
39
  _isfinite, isnear1, _over, _SQRT2_2, \
40
- _0_0, _0_5, _1_0, _N_1_0, _64_0
41
- from pygeodesy.datums import Datum, _spherical_datum, _WGS84, _EWGS84, Fmt
42
- # from pygeodesy.ellipsoids import Ellipsoid, _EWGS84 # from .datums
40
+ _0_0, _0_5, _1_0, _N_1_0
41
+ from pygeodesy.datums import Datum, _spherical_datum, _WGS84, Fmt
43
42
  # from pygeodesy.elliptic import Elliptic # _MODS
44
43
  from pygeodesy.errors import _AssertionError, _ValueError, _xkwds_pop2
45
44
  from pygeodesy.fmath import Fdot, fdot, hypot, hypot_, fabs, sqrt
@@ -48,7 +47,7 @@ from pygeodesy.interns import NN, _beta_, _distant_, _DMAIN_, _finite_, _height_
48
47
  _inside_, _near_, _negative_, _not_, _null_, _opposite_, \
49
48
  _outside_, _too_, _x_, _y_
50
49
  from pygeodesy.lazily import _ALL_LAZY, _FOR_DOCS
51
- from pygeodesy.named import _lazyNamedEnumItem as _lazy, _name__, _NamedEnum, _Pass
50
+ from pygeodesy.named import _name__, _Pass
52
51
  from pygeodesy.namedTuples import LatLon3Tuple, _NamedTupleTo, Vector2Tuple, \
53
52
  Vector3Tuple, Vector4Tuple
54
53
  # from pygeodesy.props import Property_RO # from .triaxials.angles
@@ -56,15 +55,15 @@ from pygeodesy.namedTuples import LatLon3Tuple, _NamedTupleTo, Vector2Tuple, \
56
55
  from pygeodesy.triaxials.bases import Conformal5Tuple, _HeightINT0, _hypot2_1, \
57
56
  _not_ordered_, _OrderedTriaxialBase, _over0, \
58
57
  _otherV3d_, _over02, _sqrt0, TriaxialError, \
59
- _Triaxial3Base, _UnOrderedTriaxialBase
58
+ _Triaxial3Base, _TriaxialsBase, _UnOrderedTriaxialBase
60
59
  from pygeodesy.units import Degrees, Height_, Lat, Lon, Meter, Radians, Radius_, Scalar_
61
- from pygeodesy.utily import atan2, atan2d, km2m, m2km
60
+ from pygeodesy.utily import atan2, atan2d
62
61
  from pygeodesy.vector3d import _otherV3d, Vector3d
63
62
 
64
63
  # from math import fabs, sqrt # from .fmath
65
64
 
66
65
  __all__ = _ALL_LAZY.triaxials_triaxial5
67
- __version__ = '25.11.29'
66
+ __version__ = '26.01.14'
68
67
 
69
68
  _omega_ = 'omega'
70
69
  _TRIPS = 359 # Eberly 1074?
@@ -757,41 +756,6 @@ class ConformalSphere(Conformal):
757
756
  return self.a
758
757
 
759
758
 
760
- class Triaxials(_NamedEnum):
761
- '''(INTERNAL) L{Triaxial} registry, I{must} be a sub-class
762
- to accommodate the L{_LazyNamedEnumItem} properties.
763
- '''
764
- def _Lazy(self, *abc, **name):
765
- '''(INTERNAL) Instantiate the C{Triaxial}.
766
- '''
767
- a, b, c = map(km2m, abc)
768
- return Triaxial(a, b, c, **name)
769
-
770
- Triaxials = Triaxials(Triaxial, Triaxial_) # PYCHOK singleton
771
- '''Some pre-defined L{Triaxial}s, all I{lazily} instantiated.'''
772
- # <https://ArxIV.org/pdf/1909.06452.pdf> Table 1 Semi-axes in Km
773
- # <https://www.JPS.NASA.gov/education/images/pdf/ss-moons.pdf>
774
- # <https://link.Springer.com/article/10.1007/s00190-022-01650-9>
775
- # <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1Constants.html>
776
- _abc84_35 = (_EWGS84.a + 35), (_EWGS84.a - 35), _EWGS84.b
777
- Triaxials._assert( # a (Km) b (Km) c (Km) planet
778
- Amalthea = _lazy('Amalthea', 125.0, 73.0, _64_0), # Jupiter
779
- Ariel = _lazy('Ariel', 581.1, 577.9, 577.7), # Uranus
780
- Earth = _lazy('Earth', 6378.173435, 6378.1039, 6356.7544),
781
- Enceladus = _lazy('Enceladus', 256.6, 251.4, 248.3), # Saturn
782
- Europa = _lazy('Europa', 1564.13, 1561.23, 1560.93), # Jupiter
783
- Io = _lazy('Io', 1829.4, 1819.3, 1815.7), # Jupiter
784
- Mars = _lazy('Mars', 3394.6, 3393.3, 3376.3),
785
- Mimas = _lazy('Mimas', 207.4, 196.8, 190.6), # Saturn
786
- Miranda = _lazy('Miranda', 240.4, 234.2, 232.9), # Uranus
787
- Moon = _lazy('Moon', 1735.55, 1735.324, 1734.898), # Earth
788
- Tethys = _lazy('Tethys', 535.6, 528.2, 525.8), # Saturn
789
- WGS84_3 = _lazy('WGS84_3', 6378.17136, 6378.10161, 6356.75184), # C++
790
- WGS84_3r = _lazy('WGS84_3r', 6378.172, 6378.102, 6356.752), # C++, rounded
791
- WGS84_35 = _lazy('WGS84_35', *map(m2km, _abc84_35)))
792
- del _abc84_35, _EWGS84
793
-
794
-
795
759
  def _hartzell3(pov, los, Tun): # in .Ellipsoid.hartzell4, .formy.hartzell
796
760
  '''(INTERNAL) Hartzell's "Satellite Line-of-Sight Intersection ...",
797
761
  formula from a Point-Of-View to an I{un-/ordered} Triaxial.
@@ -1180,20 +1144,24 @@ def _validate(a, b, c, d, T, x, y, z, val):
1180
1144
  dot=e, eps=val)
1181
1145
 
1182
1146
 
1147
+ class Triaxials(_TriaxialsBase):
1148
+ _Triaxial = Triaxial
1149
+
1150
+ Triaxials = Triaxials(Triaxial, Triaxial_) # PYCHOK singleton
1151
+ '''Some pre-defined L{Triaxial}s, all I{lazily} instantiated.'''
1152
+ Triaxials._assert()
1153
+
1183
1154
  if __name__ == _DMAIN_:
1184
1155
 
1185
- from pygeodesy import printf
1186
- from pygeodesy.interns import _COMMA_, _NL_, _NLATvar_
1156
+ from pygeodesy.internals import _pregistry, printf
1187
1157
 
1188
1158
  T = Triaxial_(6378388.0, 6378318.0, 6356911.9461)
1189
1159
  t = T.height4(3909863.9271, 3909778.123, 3170932.5016)
1190
1160
  printf('# Bektas: %r', t)
1161
+ # __doc__ of this file, force all into registry
1162
+ _pregistry(Triaxials)
1191
1163
 
1192
- # __doc__ of this file, force all into registery
1193
- t = [NN] + Triaxials.toRepr(all=True, asorted=True).split(_NL_)
1194
- printf(_NLATvar_.join(i.strip(_COMMA_) for i in t))
1195
-
1196
- # % python3 -m pygeodesy.triaxials
1164
+ # % python3 -m pygeodesy.triaxials.triaxial5
1197
1165
  #
1198
1166
  # Bektas: height4(x=3909251.554667, y=3909165.750567, z=3170432.501602, h=999.999996)
1199
1167
 
pygeodesy/utily.py CHANGED
@@ -13,7 +13,8 @@ from __future__ import division as _; del _ # noqa: E702 ;
13
13
 
14
14
  from pygeodesy.basics import _copysign, isinstanceof, isint, isstr
15
15
  from pygeodesy.constants import EPS, EPS0, NAN, PI, PI2, PI_2, PI_4, PI_6, R_M, \
16
- _M_KM, _M_NM, _M_SM, _0_0, _0_5, _1_0, _N_1_0, \
16
+ _M_KM, _M_NM, _M_SM, _SQRT2_2 as _COS_45, \
17
+ _SQRT3_2 as _COS_30, _0_0, _0_5, _1_0, _N_1_0, \
17
18
  _10_0, _90_0, _180_0, _360_0, _copysign_0_0, \
18
19
  _copysignINF, _float, _isfinite, isnan, isnear0, \
19
20
  _over_1, _umod_360, _umod_PI2, OVERFLOW
@@ -28,11 +29,10 @@ from math import acos, asin, asinh, atan2 as _atan2, cos, degrees, fabs, \
28
29
  radians, sin, sinh, tan as _tan # pow
29
30
 
30
31
  __all__ = _ALL_LAZY.utily
31
- __version__ = '25.11.09'
32
+ __version__ = '26.01.14'
32
33
 
33
- # sqrt(3) <https://WikiPedia.org/wiki/Square_root_of_3>
34
- _COS_30, _SIN_30 = 0.86602540378443864676, _0_5 # sqrt(3) / 2
35
- _COS_45 = _SIN_45 = 0.70710678118654752440 # sqrt(2) / 2
34
+ _SIN_30 = _0_5
35
+ _SIN_45 = _COS_45
36
36
 
37
37
  _G = _Enum( # grades per ...
38
38
  DEG = _float( 400.0 / _360_0), # degree
@@ -42,7 +42,7 @@ _M = _Enum( # meter per ...
42
42
  ACRE = _float( 4046.8564224), # acre, chain2m(1) * furlong2m(1), squared
43
43
  CHAIN = _float( 20.1168), # yard2m(1) * 22
44
44
  FATHOM = _float( 1.8288), # yard2m(1) * 2 or _M.NM * 1e-3
45
- FOOT = _float( 0.3048), # Int'l foot, 1 / 3.280_839_895_0131 = 10_000 / (254 * 12)
45
+ FOOT = _float( 0.3048), # Int'l foot, 1 / 3.280_839_895_0131 == (254 * 12) / 10_000
46
46
  FOOT_GE = _float( 0.31608), # German Fuss, 1 / 3.163_756_011_1364
47
47
  FOOT_FR = _float( 0.3248406), # French Pied-du-Roi or pied, 1 / 3.078_432_929_8739
48
48
  FOOT_US = _float( 0.3048006096012192), # US Survey foot, 1_200 / 3_937
@@ -56,7 +56,7 @@ _M = _Enum( # meter per ...
56
56
 
57
57
 
58
58
  def _abs1nan(x):
59
- '''(INTERNAL) Bracket C{x}.
59
+ '''(INTERNAL) Bracket C{-1 < x < 1 or isnan(x)}.
60
60
  '''
61
61
  return _N_1_0 < x < _1_0 or isnan(x)
62
62
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pygeodesy
3
- Version: 25.12.12
3
+ Version: 26.1.16
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``.
@@ -120,31 +126,31 @@ test results (on macOS only) and the complete documentation_ generated by Epydoc
120
126
  Tests
121
127
  =====
122
128
 
123
- 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.
129
+ The tests ran with Python 3.14.2 (with geographiclib_ 2.1), Python 3.13.11 (with geographiclib_ 2.1,
130
+ numpy_ 2.3.3, scipy_ 1.16.2, GeoConvert_ 2.7, GeodSolve_ 2.7 and Geod3Solve_ 2.7), Python 3.12.10 (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.9 (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.11, 3.12.10 and 3.11.9 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
- Test coverage has been measured with coverage_ 7.10.7 using Python 3.14.2, 3.13.9 and 3.12.7. The
143
+ Test coverage has been measured with coverage_ 7.10.7 using Python 3.14.2, 3.13.11 and 3.12.10. 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
145
151
  and 64-bit Python 3.7.4 and 3.7.3 on macOS 10.13.6 High Sierra.
146
152
 
147
- Previously, the tests were run with Python 3.13.0-7, 3.12.0-6, 3.11.2-4, 3.10.1-7, 3.9.1, 3.8.7, 3.7.1, 2.7.15,
153
+ Previously, the tests were run with Python 3.13.0-9, 3.12.0-7, 3.11.2-5, 3.10.1-7, 3.9.1, 3.8.7, 3.7.1, 2.7.15,
148
154
  PyPy_ 7.3.12 (Python 3.10.12), 7.3.1 (Python 3.6.9) and PyPy_ 7.1.1 (Python 2.7.13) (and geographiclib_ 1.52,
149
155
  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, 1.4.1, 1.5.2 or 1.8.1) on
150
156
  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
@@ -160,12 +166,12 @@ Server 2012R2, Windows 10 Pro and 32-bit Python 2.6.6 on Windows XP SP3.
160
166
  Notes
161
167
  =====
162
168
 
163
- 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.
169
+ All Python source code has been statically checked_ with Ruff_ using Python 3.13.11 and with PyChecker_, PyFlakes_,
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: Jan 16, 2026.*
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,16 +1,16 @@
1
1
  pygeodesy/LICENSE,sha256=YfgAiyxOwY6P9Kkb1_5XN81nueTLrpb3Ffkv3EuPgFU,1144
2
- pygeodesy/__init__.py,sha256=mlFdhvirSlon80mpgvgMqzKo43dV9_bSTRrfKCoNR-c,43176
2
+ pygeodesy/__init__.py,sha256=DmJmEyYy4jSMO4rkA65hK5ZTWBan1UwlXKGAehPbWoc,43790
3
3
  pygeodesy/__main__.py,sha256=06sdpwiuTP1hPvKOdzjqhuuDqqpicErwnAYwioeiTNw,5597
4
- pygeodesy/albers.py,sha256=1Jt-WWcawNw6Dj7wl6hPSLbYiGGZqFMCnRU8gyGvV7o,30908
4
+ pygeodesy/albers.py,sha256=6S0hHJA6MspeKLsQHW0cFUpJcWRL1yGshJxtEgJ9PMQ,30908
5
5
  pygeodesy/angles.py,sha256=68sNVXU3QKGZnIYyjWFcKhWlBKSmaduO--rjtoM2sqU,29996
6
6
  pygeodesy/azimuthal.py,sha256=7JwLHx-mTkwxuSkWmxNPPnPFAu4a0F5X_T_JyL6aEHE,49867
7
7
  pygeodesy/basics.py,sha256=bbQs7M1epOl7t8IF2xs5uA46rrdYdobSuiJJ6v5st0s,32988
8
8
  pygeodesy/booleans.py,sha256=kEF7rFvQzUaGFdrDzOXo_GFauXmaDTnhd2LNDh69B28,72636
9
- pygeodesy/cartesianBase.py,sha256=L6y0Mn3x25eLF0Wd6ntOLlyfvGqmIl15Akvs373lXhg,45382
9
+ pygeodesy/cartesianBase.py,sha256=fCFcb6ubmMRBc19Ny-OBvbdrmdaOtqin8bf1PVhH4tg,45372
10
10
  pygeodesy/clipy.py,sha256=uLTbX6byZa6fi2Kir1WanfW47JSxAkmfngH3vD7TDfw,27481
11
- pygeodesy/constants.py,sha256=8UPc_dVrlKMMieFB20nbWMdLK_3hep282IuxSwIAg-M,21345
11
+ pygeodesy/constants.py,sha256=HP5ZO34CqwaVU19NThXj2OMvlqFcDhiUrYYAiWvJz1Q,21810
12
12
  pygeodesy/css.py,sha256=Fb_z5nvu5j4To1WgXGPOaEaME71IZW747FdpL4YBczc,25793
13
- pygeodesy/datums.py,sha256=3uB7cuFdhNNMxKq96J3FjdklwaKOcdshBrGMf1Osbms,34068
13
+ pygeodesy/datums.py,sha256=jG2KZozQqV559PXVrD08N977GxwnLRGH_JDOn9yRjDw,33912
14
14
  pygeodesy/dms.py,sha256=2jesqmjWy-Pze5VWtgbiyC8CbjeIFbPP1qt2nYriubw,42202
15
15
  pygeodesy/ecef.py,sha256=0MSfLlMedBokrrn2YcOyfa2MrJhhKzVemXTHn8Qi4KI,62577
16
16
  pygeodesy/ecefLocals.py,sha256=hlx0DUW5n6v2H8SLJvaSEQQj_Sq61bLXpT8PY7SWqe4,7794
@@ -22,42 +22,42 @@ 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
26
- pygeodesy/elliptic.py,sha256=914gDJmHVu_zlyQJy4tfqTJmq2Buqq5w3Jt-7wrXpEo,45515
25
+ pygeodesy/ellipsoids.py,sha256=5UwnIOpDCFrxqQIF9mkQUEEPW2H1YRog_MpYkvcYx7c,109248
26
+ pygeodesy/elliptic.py,sha256=xCllssJSm2O4W2Mo2hb1f65pT-GcaVwQuIpzR84eD7Y,59483
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=OUitWAuSM7OzlbJJ_JahfUjsVrIv5Bnt4U_0pUgXTQ4,37995
31
+ pygeodesy/formy.py,sha256=TSDEyzOInkhmeZYVRjoOl4oO7wCFrE2YLWGTs9Ewa_4,69842
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=VmxnlFld-3z-_xuksKsQinWmzZyeo6CEMM9c9ZabMCU,105500
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=ATQmfkg2KU1YwAgQU32t78Fq5mLvpYykLpqH6TH6mXw,22052
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
43
43
  pygeodesy/heights.py,sha256=T_5ZhtFAskQf-1BHL2Nm5bTYQIMJj-d1UKhW11YPWvs,41011
44
- pygeodesy/internals.py,sha256=_KTAnSPlLWYBEXaUxiDpE-nN-JbexcN5h_szyJwzgWE,24712
44
+ pygeodesy/internals.py,sha256=WPrXmN1GMnVB3JYJbXpC1cZlIYMyU9v1I1rDeHI8yGQ,24934
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
51
- pygeodesy/lcc.py,sha256=BXWEHDRgNOzAOM5dVBfpETWVdJ7Me378Wv93n2oR_UI,25785
50
+ pygeodesy/lazily.py,sha256=Bsjd8yeZDWu-crKUPHf1--41_XxeMLhJVkmXXg-EkEI,48865
51
+ pygeodesy/lcc.py,sha256=iqIeQpJu0e0CtyJeD8ha_YWaFVHIHVsfMw5CtwAbBIQ,25667
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=ZW9ckz5spaDhAZ6UfgRTU1h8hicv5O1FUtYij729TYE,53116
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,11 +65,11 @@ 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=nKiCqHxAIWdI4Bq5VuJbn32CvcdutLMpSJT1aCvB97s,119214
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
72
- pygeodesy/utily.py,sha256=lucez138JJVLAafMciduGMcDyvPrsSjwr-6ApToHPIM,41330
72
+ pygeodesy/utily.py,sha256=31ArxOIv4kkKcAOudBng13WOBEpn664-A9BeAUbYi6c,41282
73
73
  pygeodesy/utm.py,sha256=Cu0CTqXVSNIIdzp8cejd0ONvo8Y26WtB3spt2o10ZV8,31123
74
74
  pygeodesy/utmups.py,sha256=MsgnWVw0u_4nAO_kol4GjUTg7dMGwURR2hv3TV8eVik,13176
75
75
  pygeodesy/utmupsBase.py,sha256=v9ZCOBaaMaAF-rUdzL-kbj0pov-E-8aBq9nuOMSnxYw,22730
@@ -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=WfF3Up7JFAWrLnvsRpWsncXICjxqbjVZZUbB6EvGFHU,36535
119
119
  pygeodesy/triaxials/conformal3.py,sha256=FrJLQ0m58YvP_heh9jFH5TkhR46kSTzCIgtmtRPMErQ,23883
120
- pygeodesy/triaxials/triaxial3.py,sha256=uj3XFLbh6bGOHHiqeulJiQjmnKNOB5-e1OYjAcsD5sk,40578
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,,
120
+ pygeodesy/triaxials/triaxial3.py,sha256=mTG8Atw7VbGyXWPoD78M-6XM6rarXCwKlatqWl41Hoo,42865
121
+ pygeodesy/triaxials/triaxial5.py,sha256=nJhVDbNfXSbldL7QCrGAXNsFlIWY-rUAaVLMPcX7x-g,50977
122
+ pygeodesy-26.1.16.dist-info/METADATA,sha256=U4um_8MNCzFuw0CYVx46wj3uI-aK9MCcIjYbykv5M1s,20716
123
+ pygeodesy-26.1.16.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
124
+ pygeodesy-26.1.16.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
125
+ pygeodesy-26.1.16.dist-info/RECORD,,