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/__init__.py +19 -19
- pygeodesy/azimuthal.py +10 -12
- pygeodesy/booleans.py +7 -32
- pygeodesy/clipy.py +16 -22
- pygeodesy/constants.py +82 -66
- pygeodesy/deprecated/__init__.py +1 -1
- pygeodesy/deprecated/classes.py +24 -1
- pygeodesy/elliptic.py +2 -2
- pygeodesy/errors.py +1 -1
- pygeodesy/etm.py +3 -3
- pygeodesy/fmath.py +5 -3
- pygeodesy/geodesicx/gx.py +11 -10
- pygeodesy/geodesicx/gxarea.py +4 -4
- pygeodesy/geohash.py +6 -6
- pygeodesy/geoids.py +2 -2
- pygeodesy/heights.py +2 -2
- pygeodesy/internals.py +7 -8
- pygeodesy/karney.py +14 -14
- pygeodesy/lazily.py +6 -5
- pygeodesy/named.py +1 -1
- pygeodesy/streprs.py +9 -9
- pygeodesy/trf.py +4 -4
- pygeodesy/triaxials.py +233 -151
- pygeodesy/units.py +5 -0
- pygeodesy/utily.py +5 -4
- pygeodesy/vector2d.py +1 -1
- pygeodesy/vector3dBase.py +194 -50
- {pygeodesy-25.9.9.dist-info → pygeodesy-25.11.5.dist-info}/METADATA +20 -20
- {pygeodesy-25.9.9.dist-info → pygeodesy-25.11.5.dist-info}/RECORD +31 -31
- {pygeodesy-25.9.9.dist-info → pygeodesy-25.11.5.dist-info}/WHEEL +0 -0
- {pygeodesy-25.9.9.dist-info → pygeodesy-25.11.5.dist-info}/top_level.txt +0 -0
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.
|
|
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) #
|
|
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.
|
|
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.
|
|
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 *
|
|
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,
|
|
14
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
pygeodesy/geodesicx/gxarea.py
CHANGED
|
@@ -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.
|
|
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 =
|
|
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.
|
|
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
|
-
|
|
153
|
+
d, _mid = True, _2mid
|
|
154
154
|
for _ in range(prec):
|
|
155
155
|
i = 0
|
|
156
|
-
for _ in
|
|
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
|
|
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
|
-
|
|
236
|
+
d, _mid = True, _2mid
|
|
237
237
|
try:
|
|
238
238
|
for j, c in enumerate(geohash.lower()):
|
|
239
|
-
i =
|
|
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
|
|
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.
|
|
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...
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
663
|
-
m =
|
|
664
|
-
|
|
665
|
-
b =
|
|
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.
|
|
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,
|
|
149
|
-
|
|
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.
|
|
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
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
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
|
|
777
|
-
d, t = _sum2(_r(-deg0,
|
|
778
|
-
_r( deg,
|
|
779
|
-
d, t = _sum2(_r( d,
|
|
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',
|
|
350
|
-
'
|
|
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.
|
|
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.
|
|
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}
|
|
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
|
|
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,
|
|
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],
|
|
557
|
+
t = reprs(args[:e], **fmt_prec)
|
|
558
558
|
t += _ELLIPSIS_,
|
|
559
|
-
t += reprs(args[-1:],
|
|
559
|
+
t += reprs(args[-1:], **fmt_prec)
|
|
560
560
|
else:
|
|
561
|
-
t = reprs(args,
|
|
561
|
+
t = reprs(args, **fmt_prec) if args else ()
|
|
562
562
|
if kwds:
|
|
563
|
-
t += pairs(itemsorted(kwds),
|
|
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.
|
|
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,
|
|
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,
|
|
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),
|