pygeodesy 25.9.9__py2.py3-none-any.whl → 25.11.5__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
pygeodesy/elliptic.py CHANGED
@@ -100,7 +100,7 @@ from math import asin, asinh, atan, ceil, cosh, fabs, floor, radians, \
100
100
  sin, sinh, sqrt, tan, tanh # tan as _tan
101
101
 
102
102
  __all__ = _ALL_LAZY.elliptic
103
- __version__ = '25.09.04'
103
+ __version__ = '25.10.10'
104
104
 
105
105
  _TolRD = zqrt(EPS * 0.002)
106
106
  _TolRF = zqrt(EPS * 0.030)
@@ -932,7 +932,7 @@ class Elliptic(_Named):
932
932
  raise _ellipticError(Elliptic._RFRD, x, y, z, m, cause=X)
933
933
  return float(R)
934
934
 
935
- _allPropertiesOf_n(16, Elliptic) # # PYCHOK assert, see Elliptic.reset
935
+ _allPropertiesOf_n(16, Elliptic) # PYCHOK assert, see Elliptic.reset
936
936
 
937
937
 
938
938
  class EllipticError(_ValueError):
pygeodesy/errors.py CHANGED
@@ -28,7 +28,7 @@ from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS, _PYTHON_X_DEV
28
28
  from copy import copy as _copy
29
29
 
30
30
  __all__ = _ALL_LAZY.errors # _ALL_DOCS('_InvalidError', '_IsnotError') _under
31
- __version__ = '25.09.04'
31
+ __version__ = '25.10.30'
32
32
 
33
33
  _argument_ = 'argument'
34
34
  _basics = _MODS.into(basics=__name__)
pygeodesy/etm.py CHANGED
@@ -67,7 +67,7 @@ from pygeodesy.basics import _isin, map1, neg, neg_, _xinstanceof
67
67
  from pygeodesy.constants import EPS, EPS02, PI_2, PI_4, _K0_UTM, \
68
68
  _1_EPS, _0_0, _0_1, _0_5, _1_0, _2_0, \
69
69
  _3_0, _90_0, isnear0, isnear90
70
- from pygeodesy.constants import _4_0 # PYCHOK used!
70
+ from pygeodesy.constants import _0_75, _4_0 # PYCHOK used!
71
71
  from pygeodesy.datums import _ellipsoidal_datum, _WGS84, _EWGS84
72
72
  # from pygeodesy.ellipsoids import _EWGS84 # from .datums
73
73
  # from pygeodesy.elliptic import Elliptic # _MODS
@@ -93,7 +93,7 @@ from pygeodesy.utm import _cmlon, _LLEB, _parseUTM5, _toBand, _toXtm8, \
93
93
  from math import asinh, degrees, radians, sinh, sqrt
94
94
 
95
95
  __all__ = _ALL_LAZY.etm
96
- __version__ = '25.08.31'
96
+ __version__ = '25.09.15'
97
97
 
98
98
  _OVERFLOW = _1_EPS**2 # ~2e+31
99
99
  _TAYTOL = pow(EPS, 0.6)
@@ -410,7 +410,7 @@ class ExactTransverseMercator(_NamedBase):
410
410
  def _Ev_3cKE_4(self):
411
411
  '''(INTERNAL) Get and cache C{_Ev.cKE * 3 / 4}.
412
412
  '''
413
- return self._Ev_cKE * 0.75 # _0_75
413
+ return self._Ev_cKE * _0_75
414
414
 
415
415
  @Property_RO
416
416
  def _Ev_5cKE_4(self):
pygeodesy/fmath.py CHANGED
@@ -10,8 +10,8 @@ from __future__ import division as _; del _ # noqa: E702 ;
10
10
  from pygeodesy.basics import _copysign, copysign0, isbool, isint, isodd, \
11
11
  isscalar, len2, map1, _xiterable, typename
12
12
  from pygeodesy.constants import EPS0, EPS02, EPS1, NAN, PI, PI_2, PI_4, \
13
- _0_0, _0_125, _1_6th, _0_25, _1_3rd, _0_5, _1_0, \
14
- _1_5, _copysign_0_0, isfinite, remainder
13
+ _0_0, _0_125, _0_25, _0_5, _1_0, _1_5, \
14
+ _copysign_0_0, isfinite, remainder
15
15
  from pygeodesy.errors import _IsnotError, LenError, _TypeError, _ValueError, \
16
16
  _xError, _xkwds, _xkwds_pop2, _xsError
17
17
  from pygeodesy.fsums import _2float, Fsum, fsum, _isFsum_2Tuple, Fmt, unstr
@@ -25,10 +25,12 @@ from math import fabs, sqrt # pow
25
25
  import operator as _operator # in .datums, .trf, .utm
26
26
 
27
27
  __all__ = _ALL_LAZY.fmath
28
- __version__ = '25.08.31'
28
+ __version__ = '25.09.15'
29
29
 
30
30
  # sqrt(2) - 1 <https://WikiPedia.org/wiki/Square_root_of_2>
31
31
  _0_4142 = 0.41421356237309504880 # ~ 3_730_904_090_310_553 / 9_007_199_254_740_992
32
+ _1_3rd = _1_0 / 3
33
+ _1_6th = _1_0 / 6
32
34
  _2_3rd = _1_3rd * 2
33
35
  _h_lt_b_ = 'abs(h) < abs(b)'
34
36
 
pygeodesy/geodesicx/gx.py CHANGED
@@ -65,7 +65,7 @@ from pygeodesy.utily import atan2, atan2d as _atan2d_reverse, _unrollon, \
65
65
  from math import copysign, cos, degrees, fabs, radians, sqrt
66
66
 
67
67
  __all__ = ()
68
- __version__ = '25.09.02'
68
+ __version__ = '25.09.16'
69
69
 
70
70
  _MAXIT1 = 20
71
71
  _MAXIT2 = 10 + _MAXIT1 + MANT_DIG # MANT_DIG == C++ digits
@@ -188,7 +188,7 @@ class GeodesicExact(_GeodesicBase):
188
188
  <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1GeodesicExact.html>}
189
189
  and Python U{Geodesic.ArcDirect<https://GeographicLib.SourceForge.io/Python/doc/code.html>}.
190
190
  '''
191
- return self._GDictDirect(lat1, lon1, azi1, True, a12, outmask)
191
+ return self._GDictDirect(lat1, lon1, azi1, True, a12, outmask=outmask)
192
192
 
193
193
  def ArcDirectLine(self, lat1, lon1, azi1, a12, caps=Caps.ALL, **name):
194
194
  '''Define a L{GeodesicLineExact} in terms of the I{direct} geodesic problem and as arc length.
@@ -348,7 +348,7 @@ class GeodesicExact(_GeodesicBase):
348
348
  <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1GeodesicExact.html>}
349
349
  and Python U{Geodesic.Direct<https://GeographicLib.SourceForge.io/Python/doc/code.html>}.
350
350
  '''
351
- return self._GDictDirect(lat1, lon1, azi1, False, s12, outmask)
351
+ return self._GDictDirect(lat1, lon1, azi1, False, s12, outmask=outmask)
352
352
 
353
353
  def Direct3(self, lat1, lon1, azi1, s12): # PYCHOK outmask
354
354
  '''Return the destination lat, lon and reverse azimuth
@@ -356,7 +356,7 @@ class GeodesicExact(_GeodesicBase):
356
356
 
357
357
  @return: L{Destination3Tuple}C{(lat, lon, final)}.
358
358
  '''
359
- r = self._GDictDirect(lat1, lon1, azi1, False, s12, Caps._AZIMUTH_LATITUDE_LONGITUDE)
359
+ r = self._GDictDirect(lat1, lon1, azi1, False, s12, outmask=Caps._AZIMUTH_LATITUDE_LONGITUDE)
360
360
  return Destination3Tuple(r.lat2, r.lon2, r.azi2) # no iteration
361
361
 
362
362
  def _DirectLine(self, ll1, azi12, s12=0, **caps_name):
@@ -710,7 +710,7 @@ class GeodesicExact(_GeodesicBase):
710
710
  @return: L{Direct9Tuple}C{(a12, lat2, lon2, azi2,
711
711
  s12, m12, M12, M21, S12)}.
712
712
  '''
713
- r = self._GDictDirect(lat1, lon1, azi1, arcmode, s12_a12, outmask)
713
+ r = self._GDictDirect(lat1, lon1, azi1, arcmode, s12_a12, outmask=outmask)
714
714
  return r.toDirect9Tuple()
715
715
 
716
716
  def _GenInverse(self, lat1, lon1, lat2, lon2, outmask=Caps.STANDARD):
@@ -719,7 +719,7 @@ class GeodesicExact(_GeodesicBase):
719
719
  @return: L{Inverse10Tuple}C{(a12, s12, salp1, calp1, salp2, calp2,
720
720
  m12, M12, M21, S12)}.
721
721
  '''
722
- r = self._GDictInverse(lat1, lon1, lat2, lon2, outmask | Caps._SALP_CALPs_)
722
+ r = self._GDictInverse(lat1, lon1, lat2, lon2, outmask=outmask | Caps._SALP_CALPs_)
723
723
  return r.toInverse10Tuple()
724
724
 
725
725
  def _Inverse(self, ll1, ll2, wrap, **outmask):
@@ -752,7 +752,7 @@ class GeodesicExact(_GeodesicBase):
752
752
  <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1GeodesicExact.html>} and
753
753
  Python U{Geodesic.InverseLine<https://GeographicLib.SourceForge.io/Python/doc/code.html>}.
754
754
  '''
755
- return self._GDictInverse(lat1, lon1, lat2, lon2, outmask)
755
+ return self._GDictInverse(lat1, lon1, lat2, lon2, outmask=outmask)
756
756
 
757
757
  def Inverse1(self, lat1, lon1, lat2, lon2, wrap=False):
758
758
  '''Return the non-negative, I{angular} distance in C{degrees}.
@@ -764,7 +764,8 @@ class GeodesicExact(_GeodesicBase):
764
764
  # and .HeightIDWkarney._distances
765
765
  if wrap:
766
766
  _, lat2, lon2 = _Wrap.latlon3(lat1, lat2, lon2, True) # _Geodesic.LONG_UNROLL
767
- return fabs(self._GDictInverse(lat1, lon1, lat2, lon2, Caps.EMPTY).a12) # a12 always
767
+ r = self._GDictInverse(lat1, lon1, lat2, lon2, outmask=Caps.EMPTY)
768
+ return fabs(r.a12) # a12 always
768
769
 
769
770
  def Inverse3(self, lat1, lon1, lat2, lon2): # PYCHOK outmask
770
771
  '''Return the distance in C{meter} and the forward and
@@ -772,7 +773,7 @@ class GeodesicExact(_GeodesicBase):
772
773
 
773
774
  @return: L{Distance3Tuple}C{(distance, initial, final)}.
774
775
  '''
775
- r = self._GDictInverse(lat1, lon1, lat2, lon2, Caps.AZIMUTH_DISTANCE)
776
+ r = self._GDictInverse(lat1, lon1, lat2, lon2, outmask=Caps.AZIMUTH_DISTANCE)
776
777
  return Distance3Tuple(r.s12, wrap360(r.azi1), wrap360(r.azi2),
777
778
  iteration=r.iteration)
778
779
 
@@ -804,7 +805,7 @@ class GeodesicExact(_GeodesicBase):
804
805
  <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1GeodesicExact.html>} and
805
806
  Python U{Geodesic.InverseLine<https://GeographicLib.SourceForge.io/Python/doc/code.html>}.
806
807
  '''
807
- r = self._GDictInverse(lat1, lon1, lat2, lon2, caps | Caps._SALP_CALPs_)
808
+ r = self._GDictInverse(lat1, lon1, lat2, lon2, outmask=caps | Caps._SALP_CALPs_)
808
809
  return GeodesicLineExact(self, lat1, lon1, None, caps=caps, _s_calp1=(r.salp1, r.calp1),
809
810
  **name)._GenSet(self._debug, **r)
810
811
 
@@ -31,7 +31,7 @@ from pygeodesy.props import Property, Property_RO, property_RO
31
31
  from math import fmod as _fmod
32
32
 
33
33
  __all__ = ()
34
- __version__ = '25.06.04'
34
+ __version__ = '25.09.16'
35
35
 
36
36
 
37
37
  class GeodesicAreaExact(_NamedBase):
@@ -74,7 +74,7 @@ class GeodesicAreaExact(_NamedBase):
74
74
  self._g_gX = g = geodesic
75
75
  # use the class-level Caps since the values
76
76
  # differ between GeodesicExact and Geodesic
77
- self._mask = g.DISTANCE | g.LATITUDE | g.LONGITUDE
77
+ self._mask = g.DISTANCE | g.LATITUDE | g.LONGITUDE
78
78
  self._Peri = _Accumulator(name='_Peri')
79
79
  if not polyline: # perimeter and area
80
80
  self._mask |= g.AREA | g.LONG_UNROLL
@@ -188,7 +188,7 @@ class GeodesicAreaExact(_NamedBase):
188
188
  '''(INTERNAL) Edge helper.
189
189
  '''
190
190
  lon1 = self.lon1
191
- r = self._g_gX._GDictDirect(self.lat1, lon1, azi, False, s, self._mask)
191
+ r = self._g_gX._GDictDirect(self.lat1, lon1, azi, False, s, outmask=self._mask)
192
192
  if self._Area: # aka transitDirect
193
193
  # Count crossings of prime meridian exactly as
194
194
  # int(ceil(lon2 / 360)) - int(ceil(lon1 / 360))
@@ -219,7 +219,7 @@ class GeodesicAreaExact(_NamedBase):
219
219
  def _Inverse(self, lat1, lon1, lat2, lon2):
220
220
  '''(INTERNAL) Point helper.
221
221
  '''
222
- r = self._g_gX._GDictInverse(lat1, lon1, lat2, lon2, self._mask)
222
+ r = self._g_gX._GDictInverse(lat1, lon1, lat2, lon2, outmask=self._mask)
223
223
  if self._Area: # aka transit
224
224
  # count crossings of prime meridian as +1 or -1
225
225
  # if in east or west direction, otherwise 0
pygeodesy/geohash.py CHANGED
@@ -37,7 +37,7 @@ from pygeodesy.units import Degrees_, Int, Lat_, Lon_, Meter, Precision_, Str
37
37
  from math import fabs, ldexp, log10, radians
38
38
 
39
39
  __all__ = _ALL_LAZY.geohash
40
- __version__ = '25.04.21'
40
+ __version__ = '25.09.16'
41
41
 
42
42
  _formy = _MODS.into(formy=__name__)
43
43
  _MASK5 = 16, 8, 4, 2, 1 # PYCHOK used!
@@ -150,10 +150,10 @@ class _GH(object):
150
150
  '''
151
151
  def _encodes(lat, lon, prec, eps=0):
152
152
  s, w, n, e = self.SWNE4
153
- E, d, _mid = self.EncodeB32, True, _2mid
153
+ d, _mid = True, _2mid
154
154
  for _ in range(prec):
155
155
  i = 0
156
- for _ in range(5): # len(_MASK5)
156
+ for _ in _MASK5:
157
157
  i += i
158
158
  if d: # bisect longitude
159
159
  a = _mid(e, w)
@@ -170,7 +170,7 @@ class _GH(object):
170
170
  s = a
171
171
  i += 1
172
172
  d = not d
173
- yield E[i]
173
+ yield self.EncodeB32[i]
174
174
  if eps > 0: # infer prec
175
175
  if _2dab(lon, e, w) < eps and \
176
176
  _2dab(lat, n, s) < eps:
@@ -233,10 +233,10 @@ class _GH(object):
233
233
  if not (0 < nc <= _MaxPrec): # or geohash.startswith(_INV_)
234
234
  raise GeohashError(geohash=geohash, len=nc)
235
235
  s, w, n, e = self.SWNE4
236
- D, d, _mid = self.DecodeB32, True, _2mid
236
+ d, _mid = True, _2mid
237
237
  try:
238
238
  for j, c in enumerate(geohash.lower()):
239
- i = D[c]
239
+ i = self.DecodeB32[c]
240
240
  for m in mask5:
241
241
  if d: # longitude
242
242
  a = _mid(e, w)
pygeodesy/geoids.py CHANGED
@@ -28,7 +28,7 @@ or L{GeoidPGM} and download a C{geoid} model file, containing locations with
28
28
  known heights also referred to as the C{grid knots}. See the documentation of
29
29
  the interpolator class for references to available C{grid} models.
30
30
 
31
- C{>>> from pygeodesy import GeoidEGM96 # or -G2012B, -Karney or -PGM as GeoidXyz}
31
+ C{>>> from pygeodesy import GeoidEGM96 as GeoidXyz # or GeoidG2012B, -Karney or -PGM}
32
32
 
33
33
  2. Instantiate an interpolator with the C{geoid} model file and use keyword
34
34
  arguments to select different interpolation options
@@ -126,7 +126,7 @@ except ImportError: # Python 3+
126
126
  from io import BytesIO as _BytesIO # PYCHOK expected
127
127
 
128
128
  __all__ = _ALL_LAZY.geoids
129
- __version__ = '25.05.21'
129
+ __version__ = '25.09.26'
130
130
 
131
131
  _assert_ = 'assert'
132
132
  _bHASH_ = b'#'
pygeodesy/heights.py CHANGED
@@ -21,7 +21,7 @@ C{>>> ...}
21
21
 
22
22
  2. Select one of the C{Height} classes for height interpolation
23
23
 
24
- C{>>> from pygeodesy import HeightCubic # or other Height... as HeightXyz}
24
+ C{>>> from pygeodesy import HeightCubic as HeightXyz # or an other Height... class}
25
25
 
26
26
  3. Instantiate a height interpolator with the C{knots} and use keyword
27
27
  arguments to select different interpolation options
@@ -92,7 +92,7 @@ from pygeodesy.units import _isDegrees, Float_, Int_
92
92
  # from math import radians # from .points
93
93
 
94
94
  __all__ = _ALL_LAZY.heights
95
- __version__ = '25.05.26'
95
+ __version__ = '25.09.29'
96
96
 
97
97
  _error_ = 'error'
98
98
  _formy = _MODS.into(formy=__name__)
pygeodesy/internals.py CHANGED
@@ -202,7 +202,7 @@ class _MODS_Base(object):
202
202
  (_macOS_, p.mac_ver),
203
203
  (_Windows_, p.win32_ver),
204
204
  (_Nix, _MODS.nix_ver),
205
- ('Java', p.java_ver),
205
+ # removed Py 3.15 ('Java', p.java_ver),
206
206
  ('uname', p.uname)):
207
207
  v = v()[0]
208
208
  if v and n:
@@ -498,7 +498,7 @@ def printf(fmt, *args, **nl_nt_prec_prefix__end_file_flush_sep__kwds):
498
498
  t = fmt
499
499
  except Exception as x:
500
500
  _Error, s = _MODS.errors._xError2(x)
501
- _unstr = _MODS.strepr.unstr
501
+ _unstr = _MODS.streprs.unstr
502
502
  t = _unstr(printf, fmt, *args, **nl_nt_prec_prefix__end_file_flush_sep__kwds)
503
503
  raise _Error(s, txt=t, cause=x)
504
504
  try:
@@ -659,11 +659,10 @@ def _usage_argv(argv0, *args):
659
659
  '''(INTERNAL) Return 3-tuple C{(python, '-m', module, *args)}.
660
660
  '''
661
661
  o = _MODS.os
662
- m = o.path.dirname(argv0)
663
- m = m.replace(o.getcwd(), _ELLIPSIS_) \
664
- .replace(o.sep, _DOT_).strip()
665
- b = o.path.basename(argv0)
666
- b, x = o.path.splitext(b)
662
+ p = o.path
663
+ m = p.dirname(argv0).replace(o.getcwd(), _ELLIPSIS_) \
664
+ .replace(o.sep, _DOT_).strip()
665
+ b, x = p.splitext(p.basename(argv0))
667
666
  if x == '.py' and b != _DMAIN_:
668
667
  m = _DOT_(m or _pygeodesy_, b)
669
668
  p = NN(_python_, _MODS.sys_version_info2[0])
@@ -710,7 +709,7 @@ def _versions(sep=_SPACE_):
710
709
 
711
710
 
712
711
  __all__ = tuple(map(typename, (machine, print_, printf, typename)))
713
- __version__ = '25.09.05'
712
+ __version__ = '25.10.26'
714
713
 
715
714
  if __name__ == _DMAIN_:
716
715
 
pygeodesy/karney.py CHANGED
@@ -145,8 +145,8 @@ from __future__ import division as _; del _ # noqa: E702 ;
145
145
 
146
146
  from pygeodesy.basics import _copysign, _isin, isint, neg, unsigned0, \
147
147
  _xgeographiclib, _zip
148
- from pygeodesy.constants import NAN, _isfinite as _math_isfinite, _0_0, \
149
- _1_16th, _1_0, _2_0, _180_0, _N_180_0, _360_0
148
+ from pygeodesy.constants import NAN, _isfinite as _math_isfinite, \
149
+ _0_0, _1_0, _2_0, _180_0, _N_180_0, _360_0
150
150
  from pygeodesy.errors import GeodesicError, _ValueError, _xkwds
151
151
  from pygeodesy.fmath import cbrt, fremainder, norm2 # Fhorner, Fsum
152
152
  from pygeodesy.internals import _getenv, _popen2, _PYGEODESY_ENV, typename, \
@@ -165,8 +165,9 @@ from pygeodesy.utily import atan2d, sincos2d, tand, _unrollon, fabs
165
165
  # from math import fabs # from .utily
166
166
 
167
167
  __all__ = _ALL_LAZY.karney
168
- __version__ = '25.08.31'
168
+ __version__ = '25.09.13'
169
169
 
170
+ _1_16th = _1_0 / 16
170
171
  _2_4_ = '2.4'
171
172
  _K_2_0 = _getenv(_PYGEODESY_ENV(typename(_xgeographiclib)[2:]), _2_)
172
173
  _K_2_4 = _K_2_0 == _2_4_
@@ -723,11 +724,10 @@ def _around(x): # in .utily.sincos2d
723
724
  try:
724
725
  return _wrapped.Math.AngRound(x)
725
726
  except AttributeError:
726
- b, a = _1_16th, fabs(x)
727
- if a < b:
728
- a -= b
729
- a += b
730
- x = _copysign(a, x)
727
+ z = _1_16th
728
+ w = z - fabs(x)
729
+ if w > 0: # don't "simplify" z - (z - x) to x
730
+ x = _copysign(z - w, x)
731
731
  return x
732
732
 
733
733
 
@@ -772,13 +772,13 @@ def _diff182(deg0, deg, K_2_0=False):
772
772
  try:
773
773
  return _wrapped.Math.AngDiff(deg0, deg)
774
774
  except AttributeError:
775
- if K_2_0 or _K_2_0: # geographiclib 2.0
776
- _r, _360 = fremainder, _360_0
777
- d, t = _sum2(_r(-deg0, _360),
778
- _r( deg, _360))
779
- d, t = _sum2(_r( d, _360), t)
775
+ if K_2_0 or _K_2_0: # geographiclib 2.0+
776
+ _r = fremainder
777
+ d, t = _sum2(_r(-deg0, _360_0),
778
+ _r( deg, _360_0))
779
+ d, t = _sum2(_r( d, _360_0), t)
780
780
  if _isin(d, _0_0, _180_0, _N_180_0):
781
- d = _copysign(d, -t if t else (deg - deg0))
781
+ d = _copysign(d, (-t) if t else (deg - deg0))
782
782
  else:
783
783
  _n = _norm180
784
784
  d, t = _sum2(_n(-deg0), _n(deg))
pygeodesy/lazily.py CHANGED
@@ -203,7 +203,7 @@ _ALL_LAZY = _NamedEnum_RO(_name='_ALL_LAZY',
203
203
  'INF', 'INT0', 'MANT_DIG', 'MAX', 'MAX_EXP', 'MIN', 'MIN_EXP', 'NAN', 'NEG0', 'NINF',
204
204
  'PI', 'PI2', 'PI_2', 'PI3', 'PI_3', 'PI3_2', 'PI4', 'PI_4', 'PI_6',
205
205
  'R_FM', 'R_GM', 'R_KM', 'R_M', 'R_MA', 'R_MB', 'R_NM', 'R_QM', 'R_SM', 'R_VM',
206
- 'float_', 'float0_', 'isclose', 'isfinite', 'isinf', 'isint0',
206
+ 'float_', 'float0_', 'floats_', 'isclose', 'isfinite', 'isinf', 'isint0',
207
207
  'isnan', 'isnear0', 'isnear1', 'isnear90', 'isneg', 'isneg0', 'isninf', 'isnon0',
208
208
  'remainder'),
209
209
  datums=_a('Datum', 'Datums', 'Transform', 'Transforms'),
@@ -346,9 +346,9 @@ _ALL_LAZY = _NamedEnum_RO(_name='_ALL_LAZY',
346
346
  'lrstrip', 'pairs', 'reprs', 'strs', 'unstr'),
347
347
  trf=_a('RefFrame', 'RefFrames', 'TransformXform', 'TRFXform', 'TRFXform7Tuple',
348
348
  'date2epoch', 'epoch2date', 'trfTransform0', 'trfTransforms', 'trfXform'),
349
- triaxials=_a('BetaOmega2Tuple', 'BetaOmega3Tuple', 'Jacobi2Tuple',
350
- 'JacobiConformal', 'JacobiConformalSpherical',
351
- 'Triaxial', 'Triaxial_', 'TriaxialError', 'Triaxials', 'hartzell4'),
349
+ triaxials=_a('BetaOmega2Tuple', 'BetaOmega3Tuple',
350
+ 'ConformalSphere', 'ConformalTriaxial', 'Conformal2Tuple',
351
+ 'Triaxial', 'Triaxial_', 'TriaxialError', 'Triaxials', 'hartzell4'), # 'height4'
352
352
  units=_a('Azimuth', 'Band', 'Bearing', 'Bearing_', 'Bool',
353
353
  'Degrees', 'Degrees_', 'Degrees2', 'Distance', 'Distance_', 'Easting', 'Epoch',
354
354
  'Feet', 'FIx', 'Float_', 'Height', 'Height_', 'HeightX', 'Int_',
@@ -394,6 +394,7 @@ _ALL_DEPRECATED = _NamedEnum_RO(_name='_ALL_DEPRECATED',
394
394
  'HausdorffCosineAndoyerLambert', 'HausdorffCosineForsytheAndoyerLambert',
395
395
  'HeightIDW', 'HeightIDW2', 'HeightIDW3', 'HeightIDWcosineAndoyerLambert',
396
396
  'HeightIDWcosineForsytheAndoyerLambert', 'Helmert7Tuple',
397
+ 'JacobiConformal', 'JacobiConformalSpherical', 'Jacobi2Tuple',
397
398
  'Lam_', 'LatLonExact4Tuple', 'NearestOn4Tuple', 'Ned3Tuple',
398
399
  'Phi_', 'RefFrameError', 'Rhumb7Tuple', 'RhumbOrder2Tuple',
399
400
  'Transform7Tuple', 'TriAngle4Tuple', 'UtmUps4Tuple', 'XDist'),
@@ -511,7 +512,7 @@ class _ALL_MODS(_internals._MODS_Base):
511
512
  _internals._MODS = _ALL_MODS = _ALL_MODS() # PYCHOK singleton
512
513
 
513
514
  __all__ = _ALL_LAZY.lazily
514
- __version__ = '25.09.09'
515
+ __version__ = '25.10.30'
515
516
 
516
517
 
517
518
  def _ALL_OTHER(*objs):
pygeodesy/named.py CHANGED
@@ -1247,7 +1247,7 @@ def modulename(clas, prefixed=None): # in .basics._xversion
1247
1247
  '''Return the class name optionally prefixed with the
1248
1248
  module name.
1249
1249
 
1250
- @arg clas: The class (any C{class}).
1250
+ @arg clas: The class (any C{class} or C{str}).
1251
1251
  @kwarg prefixed: Include the module name (C{bool}), see
1252
1252
  function C{classnaming}.
1253
1253
 
pygeodesy/streprs.py CHANGED
@@ -22,7 +22,7 @@ from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS
22
22
  from math import fabs, log10 as _log10
23
23
 
24
24
  __all__ = _ALL_LAZY.streprs
25
- __version__ = '25.04.14'
25
+ __version__ = '25.10.10'
26
26
 
27
27
  _at_ = 'at' # PYCHOK used!
28
28
  _EN_PREC = 6 # max MGRS/OSGR precision, 1 micrometer
@@ -545,22 +545,22 @@ def unstr(where, *args, **kwds_):
545
545
  @arg where: Class, function, method (C{type}) or name (C{str}).
546
546
  @arg args: Optional positional arguments.
547
547
  @kwarg kwds_: Optional keyword arguments, except C{B{_Cdot}=None},
548
- C{B{_ELLIPSIS}=False} and C{B{_fmt}=Fmt.g}.
548
+ C{B{_ELLIPSIS}=False}, C{B{_fmt}=Fmt.g} and C{B{_prec}=6}.
549
549
 
550
550
  @return: Representation (C{str}).
551
551
  '''
552
- def _C_e_g_kwds3(_Cdot=None, _ELLIPSIS=0, _fmt=Fmt.g, **kwds):
553
- return _Cdot, _ELLIPSIS, _fmt, kwds
552
+ def _C_e_fmt_prec_kwds(_Cdot=None, _ELLIPSIS=0, _fmt=Fmt.g, _prec=6, **kwds):
553
+ return _Cdot, _ELLIPSIS, dict(fmt=_fmt, prec=_prec), kwds
554
554
 
555
- C, e, g, kwds = _C_e_g_kwds3(**kwds_)
555
+ C, e, fmt_prec, kwds = _C_e_fmt_prec_kwds(**kwds_)
556
556
  if e and len(args) > (e + 1):
557
- t = reprs(args[:e], fmt=g)
557
+ t = reprs(args[:e], **fmt_prec)
558
558
  t += _ELLIPSIS_,
559
- t += reprs(args[-1:], fmt=g)
559
+ t += reprs(args[-1:], **fmt_prec)
560
560
  else:
561
- t = reprs(args, fmt=g) if args else ()
561
+ t = reprs(args, **fmt_prec) if args else ()
562
562
  if kwds:
563
- t += pairs(itemsorted(kwds), fmt=g)
563
+ t += pairs(itemsorted(kwds), **fmt_prec)
564
564
  n = where if isstr(where) else typename(where) # _NN_
565
565
  if C and hasattr(C, n):
566
566
  try: # bound method of class C?
pygeodesy/trf.py CHANGED
@@ -71,7 +71,7 @@ en/how-to-deal-with-etrs89-datum-and-time-dependent-transformation-parameters-45
71
71
 
72
72
  from pygeodesy.basics import _isin, map1, neg, isidentifier, isstr, _xinstanceof, \
73
73
  _xscalar, typename
74
- from pygeodesy.constants import _float as _F, _0_0s, _0_0, _0_001, _0_5, _1_0
74
+ from pygeodesy.constants import _float as _F, _0_0s, _0_0, _0_001, _0_5, _0_75, _1_0
75
75
  from pygeodesy.datums import Datums, _earth_datum, _equall, _GDA2020_, _Names7, \
76
76
  _negastr, Transform, _WGS84, _EWGS84, _operator
77
77
  # from pygeodesy.ellipsoids import _EWGS84 # from .datums
@@ -93,7 +93,7 @@ from math import ceil as _ceil, fabs
93
93
  # import operator as _operator # from .datums
94
94
 
95
95
  __all__ = _ALL_LAZY.trf
96
- __version__ = '25.05.12'
96
+ __version__ = '25.09.11'
97
97
 
98
98
  _EP0CH = Epoch(0, low=0)
99
99
  _Es = {_EP0CH: _EP0CH} # L{Epoch}s, deleted below
@@ -1336,7 +1336,7 @@ _trfX(_ITRF2020_, _ITRF94_, epoch=_E(2015),
1336
1336
  xform=_X( 6.5, -3.9, -77.9, 3.98, _0_0, _0_0, 0.36),
1337
1337
  rates=_R( 0.1, -0.6, -3.1, 0.12, _0_0, _0_0, 0.02))
1338
1338
  _trfX(_ITRF2020_, _ITRF93_, epoch=_E(2015),
1339
- xform=_X( -65.8, 1.9, -71.3, 4.47, -3.36, -4.33, 0.75),
1339
+ xform=_X( -65.8, 1.9, -71.3, 4.47, -3.36, -4.33, _0_75),
1340
1340
  rates=_R( -2.8, -0.2, -2.3, 0.12, -0.11, -0.19, 0.07))
1341
1341
  _trfX(_ITRF2020_, _ITRF92_, epoch=_E(2015),
1342
1342
  xform=_X( 14.5, -1.9, -85.9, 3.27, _0_0, _0_0, 0.36),
@@ -1459,7 +1459,7 @@ _trfX(_ITRF2000_, _ITRF93_, epoch=_E(1988),
1459
1459
  xform=_X( 12.7, 6.5, -20.9, 1.95, -0.39, 0.8, -1.14),
1460
1460
  rates=_R( -2.9, -0.2, -0.6, 0.01, -0.11, -0.19, 0.07))
1461
1461
  _trfX(_ITRF2000_, _ITRF92_, epoch=_E(1988),
1462
- xform=_X( 1.47, 1.35, -1.39, 0.75, _0_0, _0_0, -0.18),
1462
+ xform=_X( 1.47, 1.35, -1.39, _0_75, _0_0, _0_0, -0.18),
1463
1463
  rates=_R( _0_0, -0.06, -0.14, 0.01, _0_0, _0_0, 0.02))
1464
1464
  _trfX(_ITRF2000_, _ITRF91_, epoch=_E(1988),
1465
1465
  xform=_X( 26.7, 27.5, -19.9, 2.15, _0_0, _0_0, -0.18),