pygeodesy 25.12.31__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.
- pygeodesy/__init__.py +9 -9
- pygeodesy/albers.py +5 -5
- pygeodesy/cartesianBase.py +2 -2
- pygeodesy/constants.py +6 -1
- pygeodesy/datums.py +5 -8
- pygeodesy/ellipsoids.py +9 -8
- pygeodesy/elliptic.py +532 -139
- pygeodesy/fmath.py +2 -2
- pygeodesy/formy.py +10 -249
- pygeodesy/fsums.py +9 -3
- pygeodesy/geod3solve.py +18 -3
- pygeodesy/internals.py +10 -3
- pygeodesy/lazily.py +13 -6
- pygeodesy/lcc.py +3 -7
- pygeodesy/named.py +13 -9
- pygeodesy/trf.py +1 -1
- pygeodesy/triaxials/bases.py +64 -42
- pygeodesy/triaxials/triaxial3.py +40 -43
- pygeodesy/triaxials/triaxial5.py +17 -49
- pygeodesy/utily.py +7 -7
- {pygeodesy-25.12.31.dist-info → pygeodesy-26.1.16.dist-info}/METADATA +9 -9
- {pygeodesy-25.12.31.dist-info → pygeodesy-26.1.16.dist-info}/RECORD +24 -24
- {pygeodesy-25.12.31.dist-info → pygeodesy-26.1.16.dist-info}/WHEEL +0 -0
- {pygeodesy-25.12.31.dist-info → pygeodesy-26.1.16.dist-info}/top_level.txt +0 -0
pygeodesy/__init__.py
CHANGED
|
@@ -132,17 +132,17 @@ Tests
|
|
|
132
132
|
=====
|
|
133
133
|
|
|
134
134
|
The tests ran with Python 3.14.2 (with U{geographiclib<https://PyPI.org/project/geographiclib>} 2.1),
|
|
135
|
-
Python 3.13.
|
|
135
|
+
Python 3.13.11 (with U{geographiclib<https://PyPI.org/project/geographiclib>} 2.1),
|
|
136
136
|
U{numpy<https://PyPI.org/project/numpy>} 2.3.3, U{scipy<https://PyPI.org/project/scipy>} 1.16.2,
|
|
137
137
|
U{GeoConvert<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.7 and
|
|
138
138
|
U{GeodSolve<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.7),
|
|
139
|
-
Python 3.12.
|
|
139
|
+
Python 3.12.10 (with U{geographiclib<https://PyPI.org/project/geographiclib>} 2.0,
|
|
140
140
|
U{numpy<https://PyPI.org/project/numpy>} 2.1.0, U{scipy<https://PyPI.org/project/scipy>} 1.14.1,
|
|
141
141
|
U{GeodSolve<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.7,
|
|
142
142
|
U{GeodS3olve<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.7,
|
|
143
143
|
U{IntersectTool<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.7 and
|
|
144
144
|
U{RhumbSolve<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.7),
|
|
145
|
-
Python 3.11.
|
|
145
|
+
Python 3.11.9 (with U{geographiclib<https://PyPI.org/project/geographiclib>} 2.0,
|
|
146
146
|
U{numpy<https://PyPI.org/project/numpy>} 1.24.2 and U{scipy<https://PyPI.org/project/scipy>} 1.10.1),
|
|
147
147
|
and with Python 2.7.18 (with U{geographiclib<https://PyPI.org/project/geographiclib>} 1.50,
|
|
148
148
|
U{numpy<https://PyPI.org/project/numpy>} 1.16.6, U{scipy<https://PyPI.org/project/scipy>} 1.2.2,
|
|
@@ -158,14 +158,14 @@ env variable C{PYGEODESY_WARNINGS=on} for all Python versions. The results of t
|
|
|
158
158
|
the distribution files.
|
|
159
159
|
|
|
160
160
|
Test coverage has been measured with U{coverage<https://PyPI.org/project/coverage>} 7.10.7 using Python
|
|
161
|
-
3.14.2, 3.13.
|
|
161
|
+
3.14.2, 3.13.11 and 3.12.10. The complete coverage report in HTML and a PDF summary are included in the
|
|
162
162
|
distribution files.
|
|
163
163
|
|
|
164
|
-
Python 3.14.2, 3.13.
|
|
164
|
+
Python 3.14.2, 3.13.11, 3.12.10 and 3.11.9 run on Apple Si M4 (C{arm64}), I{natively}. Python 2.7.18 runs
|
|
165
165
|
on Intel (C{x86_64}) or Intel I{emulation} ("C{arm64_x86_64}", see function L{machine<pygeodesy.machine>}).
|
|
166
166
|
|
|
167
167
|
The tests also ran with Python 3.14.2 (and U{geographiclib<https://PyPI.org/project/geographiclib>} 2.1) on
|
|
168
|
-
U{Debian 12<https://Cirrus-CI.com/github/mrJean1/PyGeodesy/master>} in 64-bit only, with Python 3.13.
|
|
168
|
+
U{Debian 12<https://Cirrus-CI.com/github/mrJean1/PyGeodesy/master>} in 64-bit only, with Python 3.13.11 (and
|
|
169
169
|
U{geographiclib<https://PyPI.org/project/geographiclib>} 2.0) on U{Windows 2019Server
|
|
170
170
|
<https://CI.AppVeyor.com/project/mrJean1/pygeodesy>} in 64-bit only and with Python 2.7.18 (and U{geographiclib
|
|
171
171
|
<https://PyPI.org/project/geographiclib>} 1.52) on U{Windows 10<https://CI.AppVeyor.com/project/mrJean1/pygeodesy>}
|
|
@@ -174,7 +174,7 @@ in 64- and 32-bit.
|
|
|
174
174
|
A single-File and single-Directory application with C{pygeodesy} has been bundled using U{PyInstaller
|
|
175
175
|
<https://PyPI.org/project/pyinstaller>} 3.4 and 64-bit Python 3.7.3 on macOS 10.13.6 High Sierra.
|
|
176
176
|
|
|
177
|
-
Previously, the tests were run with Python 3.13.0-
|
|
177
|
+
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.6, 3.9.1, 3.8.7, 3.7.1, 2.7.15,
|
|
178
178
|
U{PyPy<https://PyPy.org>} 7.3.12 (Python 3.10.12), 7.3.1 (Python 3.6.9) and U{PyPy<https://PyPy.org>} 7.1.1 (Python
|
|
179
179
|
2.7.13) (and U{geographiclib <https://PyPI.org/project/geographiclib>} 1.52, U{numpy<https://PyPI.org/project/numpy>}
|
|
180
180
|
1.16.3, 1.16.4, 1.16.6, 1.19.0, 1.19.4, 1.19.5 or 1.22.4 and U{scipy<https://PyPI.org/project/scipy>} 1.2.1, 1.4.1,
|
|
@@ -195,7 +195,7 @@ Notes
|
|
|
195
195
|
=====
|
|
196
196
|
|
|
197
197
|
All Python source code has been statically U{checked<https://GitHub.com/ActiveState/code/tree/master/recipes/Python/
|
|
198
|
-
546532_PyChecker_postprocessor>} with U{Ruff<https://GitHub.com/astral-sh/ruff>} using Python 3.13.
|
|
198
|
+
546532_PyChecker_postprocessor>} with U{Ruff<https://GitHub.com/astral-sh/ruff>} using Python 3.13.11 and with
|
|
199
199
|
U{PyChecker<https://PyPI.org/project/pychecker>}, U{PyFlakes<https://PyPI.org/project/pyflakes>}, U{PyCodeStyle
|
|
200
200
|
<https://PyPI.org/project/pycodestyle>} (formerly Pep8) and U{McCabe<https://PyPI.org/project/mccabe>} using Python
|
|
201
201
|
2.7.18, both in 64-bit on macOS 26.2 Tahoe.
|
|
@@ -626,7 +626,7 @@ else:
|
|
|
626
626
|
|
|
627
627
|
from pygeodesy.internals import _version2, _DOT_ # noqa: E402
|
|
628
628
|
# from pygeodesy.interns import _DOT_ # from .internals
|
|
629
|
-
__version__ = '
|
|
629
|
+
__version__ = '26.01.16'
|
|
630
630
|
# see setup.py for similar logic
|
|
631
631
|
version = _DOT_(*_version2(__version__, n=3))
|
|
632
632
|
|
pygeodesy/albers.py
CHANGED
|
@@ -38,11 +38,11 @@ from pygeodesy.utily import atan1, atan1d, atan2, degrees360, sincos2, \
|
|
|
38
38
|
from math import atanh, degrees, fabs, radians, sqrt
|
|
39
39
|
|
|
40
40
|
__all__ = _ALL_LAZY.albers
|
|
41
|
-
__version__ = '
|
|
41
|
+
__version__ = '26.01.06'
|
|
42
42
|
|
|
43
43
|
_k1_ = 'k1'
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
_MAXIT = 9 # XXX 4?
|
|
45
|
+
_MAXIT0 = 41 # XXX 21?
|
|
46
46
|
_TERMS = 31 # XXX 16?
|
|
47
47
|
_TOL0 = sqrt3(_TOL)
|
|
48
48
|
|
|
@@ -425,7 +425,7 @@ class _AlbersBase(_NamedBase):
|
|
|
425
425
|
_Ta02 = Fsum(ta0).fsum2f_
|
|
426
426
|
_1, _2 = _1_0, _2_0
|
|
427
427
|
_4, _6 = _4_0, _6_0
|
|
428
|
-
for self._iteration in range(1,
|
|
428
|
+
for self._iteration in range(1, _MAXIT0): # 4 trips
|
|
429
429
|
ta02 = ta0**2
|
|
430
430
|
sca02 = ta02 + _1
|
|
431
431
|
sca0 = sqrt(sca02)
|
|
@@ -492,7 +492,7 @@ class _AlbersBase(_NamedBase):
|
|
|
492
492
|
ta = txi
|
|
493
493
|
tol = _tol(_TOL, ta)
|
|
494
494
|
_Ta2 = Fsum(ta).fsum2f_
|
|
495
|
-
for self._iteration in range(1,
|
|
495
|
+
for self._iteration in range(1, _MAXIT): # max 2, mean 1.99
|
|
496
496
|
# dtxi / dta = (scxi / sca)^3 * 2 * (1 - e^2)
|
|
497
497
|
# / (qZ * (1 - e^2 * sa^2)^2)
|
|
498
498
|
ta2 = ta**2
|
pygeodesy/cartesianBase.py
CHANGED
|
@@ -43,7 +43,7 @@ from pygeodesy.vector3d import Vector3d, _xyzhdlln4
|
|
|
43
43
|
# from math import degrees, fabs, radians, sqrt # from .fmath, .utily
|
|
44
44
|
|
|
45
45
|
__all__ = _ALL_LAZY.cartesianBase
|
|
46
|
-
__version__ = '
|
|
46
|
+
__version__ = '26.01.06'
|
|
47
47
|
|
|
48
48
|
_r_ = 'r'
|
|
49
49
|
_resections = _MODS.into(resections=__name__)
|
|
@@ -361,7 +361,7 @@ class CartesianBase(Vector3d, _EcefLocal):
|
|
|
361
361
|
d = self.datum if earth is None else earth
|
|
362
362
|
if normal and d is self.datum:
|
|
363
363
|
r = self._height4
|
|
364
|
-
elif isinstance(d, _MODS.triaxials.
|
|
364
|
+
elif isinstance(d, _MODS.triaxials.Triaxial_):
|
|
365
365
|
r = d.height4(self, normal=normal)
|
|
366
366
|
try:
|
|
367
367
|
d = d.toEllipsoid(name=n)
|
pygeodesy/constants.py
CHANGED
|
@@ -26,7 +26,7 @@ except ImportError: # Python 2-
|
|
|
26
26
|
_inf, _nan = float(_INF_), float(_NAN_)
|
|
27
27
|
|
|
28
28
|
__all__ = _ALL_LAZY.constants
|
|
29
|
-
__version__ = '
|
|
29
|
+
__version__ = '26.01.14'
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
def _copysign_0_0(y):
|
|
@@ -295,6 +295,11 @@ OVERFLOW = _Float(OVERFLOW=_1_0 / EPS0) # PYCHOK = 2.028240960365e+31
|
|
|
295
295
|
# _1SQRT2= _Float(_1SQRT2 =sqrt(_2_0) + 1)
|
|
296
296
|
# 0.707106781186547_524_400_844_362_104_849_039_284_835_937_688_474_036_588_339_868_99
|
|
297
297
|
_SQRT2_2 = _Float(_SQRT2_2=sqrt(_0_5)) # PYCHOK = 0.707106781186547_5 == sqrt(2) / 2
|
|
298
|
+
# sqrt(3) <https://WikiPedia.org/wiki/Square_root_of_3>
|
|
299
|
+
# 1.732050807568877_293_527_446_341_505_872_366_942_805_253_810_380_628_055_806
|
|
300
|
+
_SQRT3 = _Float(_SQRT3 =sqrt(_3_0)) # PYCHOK = 1.732050807568877_2 == sqrt(3)
|
|
301
|
+
# 0.866025403784438_646_763_723_170_752_936_183_471_402_626_905_190_314_027_903
|
|
302
|
+
_SQRT3_2 = _Float(_SQRT3_2=sqrt(_0_75)) # PYCHOK = 0.866025403784438_6 == sqrt(3) / 2
|
|
298
303
|
|
|
299
304
|
INF = Float(INF =_inf) # PYCHOK INFinity, see function L{isinf}, L{isfinite}, NOT _Float!
|
|
300
305
|
INT0 = Int( INT0= 0) # PYCHOK unique int(0) instance, see .fsums, useZ=False
|
pygeodesy/datums.py
CHANGED
|
@@ -94,7 +94,7 @@ from pygeodesy.units import _isRadius, Radius_, radians
|
|
|
94
94
|
# import operator as _operator # from .fmath
|
|
95
95
|
|
|
96
96
|
__all__ = _ALL_LAZY.datums
|
|
97
|
-
__version__ = '
|
|
97
|
+
__version__ = '26.01.13'
|
|
98
98
|
|
|
99
99
|
_a_ellipsoid_ = _UNDER_(_a_, _ellipsoid_)
|
|
100
100
|
_BD72_ = 'BD72'
|
|
@@ -723,13 +723,10 @@ assert _WGS84.ellipsoid is _EWGS84
|
|
|
723
723
|
|
|
724
724
|
if __name__ == _DMAIN_:
|
|
725
725
|
|
|
726
|
-
from pygeodesy.
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
for r in (Datums, Transforms):
|
|
731
|
-
t = [NN] + r.toRepr(all=True, asorted=True).split(_NL_)
|
|
732
|
-
printf(_NLATvar_.join(i.strip(_COMMA_) for i in t))
|
|
726
|
+
from pygeodesy.internals import _pregistry
|
|
727
|
+
# __doc__ of this file, force all into registry
|
|
728
|
+
_pregistry(Datums)
|
|
729
|
+
_pregistry(Transforms)
|
|
733
730
|
|
|
734
731
|
# **) MIT License
|
|
735
732
|
#
|
pygeodesy/ellipsoids.py
CHANGED
|
@@ -96,7 +96,7 @@ from pygeodesy.utily import atan1, atan1d, atan2b, degrees90, m2radians, radians
|
|
|
96
96
|
from math import asinh, atan, atanh, cos, degrees, exp, fabs, radians, sin, sinh, sqrt, tan # as _tan
|
|
97
97
|
|
|
98
98
|
__all__ = _ALL_LAZY.ellipsoids
|
|
99
|
-
__version__ = '
|
|
99
|
+
__version__ = '26.01.13'
|
|
100
100
|
|
|
101
101
|
_f_0_0 = Float(f =_0_0) # zero flattening
|
|
102
102
|
_f__0_0 = Float(f_=_0_0) # zero inverse flattening
|
|
@@ -1140,7 +1140,8 @@ class Ellipsoid(_NamedEnumItem):
|
|
|
1140
1140
|
methods L{Ellipsoid.height4} and L{Triaxial.hartzell4}.
|
|
1141
1141
|
'''
|
|
1142
1142
|
try:
|
|
1143
|
-
|
|
1143
|
+
m = _MODS._triaxials_triaxial5
|
|
1144
|
+
v, d, i = m._hartzell3(pov, los, self._triaxial)
|
|
1144
1145
|
except Exception as x:
|
|
1145
1146
|
raise IntersectionError(pov=pov, los=los, cause=x)
|
|
1146
1147
|
return Vector4Tuple(v.x, v.y, v.z, d, iteration=i, name__=self.hartzell4)
|
|
@@ -1194,7 +1195,8 @@ class Ellipsoid(_NamedEnumItem):
|
|
|
1194
1195
|
v = v.times_(t, t, 0) # force z=0.0
|
|
1195
1196
|
h = x - a # equatorial
|
|
1196
1197
|
else: # normal in 1st quadrant
|
|
1197
|
-
|
|
1198
|
+
m = _MODS._triaxials_triaxial5
|
|
1199
|
+
x, y, i = m._plumbTo3(x, y, self)
|
|
1198
1200
|
t, v = v, v.times_(x, x, y)
|
|
1199
1201
|
h = t.minus(v).length
|
|
1200
1202
|
|
|
@@ -1910,8 +1912,8 @@ class Ellipsoid(_NamedEnumItem):
|
|
|
1910
1912
|
def _triaxial(self):
|
|
1911
1913
|
'''(INTERNAL) Get this ellipsoid's un-/ordered C{Triaxial/_}.
|
|
1912
1914
|
'''
|
|
1913
|
-
a, b,
|
|
1914
|
-
T =
|
|
1915
|
+
a, b, t = self.a, self.b, _MODS.triaxials
|
|
1916
|
+
T = t.Triaxial if a > b else t.Triaxial_
|
|
1915
1917
|
return T(a, a, b, name=self.name)
|
|
1916
1918
|
|
|
1917
1919
|
@Property_RO
|
|
@@ -2433,7 +2435,6 @@ _EWGS84 = Ellipsoids.WGS84 # (INTERNAL) shared
|
|
|
2433
2435
|
|
|
2434
2436
|
if __name__ == _DMAIN_:
|
|
2435
2437
|
|
|
2436
|
-
from pygeodesy.interns import _COMMA_, _NL_, _NLATvar_
|
|
2437
2438
|
from pygeodesy import nameof, printf
|
|
2438
2439
|
|
|
2439
2440
|
for E in (_EWGS84, Ellipsoids.GRS80, # NAD83,
|
|
@@ -2450,9 +2451,9 @@ if __name__ == _DMAIN_:
|
|
|
2450
2451
|
printf('# %s %s', Ellipsoid.BetaKs.name, fstr(E.BetaKs, prec=20))
|
|
2451
2452
|
printf('# %s %s', nameof(Ellipsoid.KsOrder), E.KsOrder) # property
|
|
2452
2453
|
|
|
2454
|
+
from pygeodesy.internals import _pregistry
|
|
2453
2455
|
# __doc__ of this file, force all into registry
|
|
2454
|
-
|
|
2455
|
-
printf(_NLATvar_.join(i.strip(_COMMA_) for i in t))
|
|
2456
|
+
_pregistry(Ellipsoids)
|
|
2456
2457
|
|
|
2457
2458
|
# % python3.13 -m pygeodesy.ellipsoids
|
|
2458
2459
|
|