pygeodesy 25.9.9__py2.py3-none-any.whl → 25.10.10__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/constants.py +23 -27
- pygeodesy/elliptic.py +2 -2
- 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 +6 -7
- pygeodesy/karney.py +14 -14
- pygeodesy/named.py +1 -1
- pygeodesy/streprs.py +9 -9
- pygeodesy/trf.py +4 -4
- {pygeodesy-25.9.9.dist-info → pygeodesy-25.10.10.dist-info}/METADATA +19 -19
- {pygeodesy-25.9.9.dist-info → pygeodesy-25.10.10.dist-info}/RECORD +20 -20
- {pygeodesy-25.9.9.dist-info → pygeodesy-25.10.10.dist-info}/WHEEL +0 -0
- {pygeodesy-25.9.9.dist-info → pygeodesy-25.10.10.dist-info}/top_level.txt +0 -0
pygeodesy/__init__.py
CHANGED
|
@@ -17,7 +17,7 @@ and a geocentric B{C{Cartesian}} class with methods and functions to compute dis
|
|
|
17
17
|
forward and reverse azimuth, initial and final bearing, intermediate and nearest points, intersections of geodesic,
|
|
18
18
|
great circle and rhumb lines, circle intersections and secants, U{3-point resections
|
|
19
19
|
<https://WikiPedia.org/wiki/Position_resection_and_intersection>}, triangulation, trilateration (by intersection,
|
|
20
|
-
by overlap and in 3-D),
|
|
20
|
+
by overlap and in 3-D), among other things.
|
|
21
21
|
|
|
22
22
|
Also included are modules for conversions to and from U{Cassini-Soldner
|
|
23
23
|
<https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1CassiniSoldner.html>},
|
|
@@ -51,9 +51,9 @@ resources/hull:8338>} and the U{Reumann-Witkam<https://psimpl.SourceForge.net/re
|
|
|
51
51
|
algorithms and modified versions of the former.
|
|
52
52
|
|
|
53
53
|
Plus modules and classes to U{interpolate<https://docs.SciPy.org/doc/scipy/reference/interpolate.html>} the
|
|
54
|
-
L{height<pygeodesy.heights>} of C{LatLon} points and L{Geoid<pygeodesy.geoids>} models, compute various U{Fréchet
|
|
54
|
+
L{height<pygeodesy.heights>} of C{LatLon} points and L{Geoid<pygeodesy.geoids>} models, to compute various U{Fréchet
|
|
55
55
|
<https://WikiPedia.org/wiki/Frechet_distance>} or U{Hausdorff<https://WikiPedia.org/wiki/Hausdorff_distance>}
|
|
56
|
-
distances or perform I{boolean} operations between (composite) polygons.
|
|
56
|
+
distances or to perform I{boolean} operations between (composite) polygons of C{LatLon} points.
|
|
57
57
|
|
|
58
58
|
For further details see the U{documentation<https://mrJean1.GitHub.io/PyGeodesy>}, the descriptions of
|
|
59
59
|
U{Latitude/Longitude<https://www.Movable-Type.co.UK/scripts/latlong.html>}, U{Vincenty
|
|
@@ -125,7 +125,11 @@ C{epydoc --html --no-private --no-source --name=pygeodesy --url=... -v pygeodesy
|
|
|
125
125
|
Tests
|
|
126
126
|
=====
|
|
127
127
|
|
|
128
|
-
The tests ran with Python 3.
|
|
128
|
+
The tests ran with Python 3.14 (with U{geographiclib<https://PyPI.org/project/geographiclib>} 2.1),
|
|
129
|
+
Python 3.13.7 (with U{geographiclib<https://PyPI.org/project/geographiclib>} 2.1),
|
|
130
|
+
U{numpy<https://PyPI.org/project/numpy>} 2.3.3, U{scipy<https://PyPI.org/project/scipy>} 1.16.2,
|
|
131
|
+
U{GeoConvert<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.5 and
|
|
132
|
+
U{GeodSolve<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.5),
|
|
129
133
|
Python 3.12.7 (with U{geographiclib<https://PyPI.org/project/geographiclib>} 2.0,
|
|
130
134
|
U{numpy<https://PyPI.org/project/numpy>} 2.1.0, U{scipy<https://PyPI.org/project/scipy>} 1.14.1,
|
|
131
135
|
U{GeodSolve<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.5,
|
|
@@ -133,27 +137,23 @@ U{IntersectTool<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.
|
|
|
133
137
|
U{RhumbSolve<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.5),
|
|
134
138
|
Python 3.11.5 (with U{geographiclib<https://PyPI.org/project/geographiclib>} 2.0,
|
|
135
139
|
U{numpy<https://PyPI.org/project/numpy>} 1.24.2 and U{scipy<https://PyPI.org/project/scipy>} 1.10.1),
|
|
136
|
-
Python
|
|
137
|
-
U{numpy<https://PyPI.org/project/numpy>} 1.23.3, U{scipy<https://PyPI.org/project/scipy>} 1.9.1,
|
|
138
|
-
U{GeoConvert<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.5,
|
|
139
|
-
U{GeodSolve<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.5) and
|
|
140
|
-
Python 2.7.18 (with U{geographiclib<https://PyPI.org/project/geographiclib>} 1.50,
|
|
140
|
+
and with Python 2.7.18 (with U{geographiclib<https://PyPI.org/project/geographiclib>} 1.50,
|
|
141
141
|
U{numpy<https://PyPI.org/project/numpy>} 1.16.6, U{scipy<https://PyPI.org/project/scipy>} 1.2.2,
|
|
142
142
|
U{GeoConvert<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.5,
|
|
143
143
|
U{GeodSolve<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.5,
|
|
144
144
|
U{IntersectTool<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.5 and
|
|
145
145
|
U{RhumbSolve<https://GeographicLib.SourceForge.io/C++/doc/utilities.html>} 2.5), all in 64-bit on
|
|
146
|
-
macOS
|
|
146
|
+
macOS 26.0.1 Tahoe.
|
|
147
147
|
|
|
148
148
|
All tests ran with and without C{lazy import} for Python 3 and with command line option C{-W default} and
|
|
149
149
|
env variable C{PYGEODESY_WARNINGS=on} for all Python versions. The results of those tests are included in
|
|
150
150
|
the distribution files.
|
|
151
151
|
|
|
152
|
-
Test coverage has been measured with U{coverage<https://PyPI.org/project/coverage>} 7.
|
|
153
|
-
3.
|
|
154
|
-
|
|
152
|
+
Test coverage has been measured with U{coverage<https://PyPI.org/project/coverage>} 7.10.7 using Python
|
|
153
|
+
3.14, 3.13.7 and 3.12.7. The complete coverage report in HTML and a PDF summary are included in the
|
|
154
|
+
distribution files.
|
|
155
155
|
|
|
156
|
-
Python 3.
|
|
156
|
+
Python 3.14, 3.13.7, 3.12.7 and 3.11.5 run on Apple M4 Si (C{arm64}), I{natively}. Python 2.7.18 runs
|
|
157
157
|
on Intel (C{x86_64}) or Intel I{emulation} ("C{arm64_x86_64}", see function L{machine<pygeodesy.machine>}).
|
|
158
158
|
|
|
159
159
|
The tests also ran with Python 3.13.7 (and U{geographiclib<https://PyPI.org/project/geographiclib>} 2.1) on
|
|
@@ -166,7 +166,7 @@ in 64- and 32-bit.
|
|
|
166
166
|
A single-File and single-Directory application with C{pygeodesy} has been bundled using U{PyInstaller
|
|
167
167
|
<https://PyPI.org/project/pyinstaller>} 3.4 and 64-bit Python 3.7.3 on macOS 10.13.6 High Sierra.
|
|
168
168
|
|
|
169
|
-
Previously, the tests were run with Python 3.13.0-
|
|
169
|
+
Previously, the tests were run with Python 3.13.0-6, 3.12.0-6, 3.11.2-4, 3.10.1-7, 3.9.6, 3.9.1, 3.8.7, 3.7.1, 2.7.15,
|
|
170
170
|
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
|
|
171
171
|
2.7.13) (and U{geographiclib <https://PyPI.org/project/geographiclib>} 1.52, U{numpy<https://PyPI.org/project/numpy>}
|
|
172
172
|
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,
|
|
@@ -175,7 +175,7 @@ U{PyPy<https://PyPy.org>} 7.3.12 (Python 3.10.12), 7.3.1 (Python 3.6.9) and U{Py
|
|
|
175
175
|
1.16.5, 1.16.2, 1.15.2, 1.14.0, 1.13.1, 1.8.0rc1 or 1.6.2 and U{scipy<https://PyPI.org/project/scipy>} 1.5.0), U{PyPy
|
|
176
176
|
<https://PyPy.org>} 7.3.0 (Python 2.7.13 and 3.6.9), U{PyPy<https://PyPy.org>} 6.0.0 (Python 2.7.13 and 3.5.3)
|
|
177
177
|
and U{Intel-Python<https://software.Intel.com/en-us/distribution-for-python>} 3.5.3 (and U{numpy
|
|
178
|
-
<https://PyPI.org/project/numpy>} 1.11.3) on macOS 15.0-
|
|
178
|
+
<https://PyPI.org/project/numpy>} 1.11.3) on macOS 15.0-6 Sequoia, 14.0-6.1 Sonoma, 13.0-5.2 Ventura, 12.1-6 Monterey,
|
|
179
179
|
11.0-5.2-6.1 Big Sur (aka 10.16), 10.15.3, 10.15.5-7 Catalina, 10.14 Mojave, 10.13.6 High Sierra and 10.12 Sierra,
|
|
180
180
|
MacOS X 10.11 El Capitan and/or MacOS X 10.10 Yosemite, with U{Pythonista<https://OMZ-Software.com/pythonista>}3.2
|
|
181
181
|
(with geographiclib 1.50 or 1.49 and numpy 1.8.0) on iOS 14.4.2, 11.4.1, 12.0-3 on iPad4, iPhone6, iPhone10 and/or
|
|
@@ -187,10 +187,10 @@ Notes
|
|
|
187
187
|
=====
|
|
188
188
|
|
|
189
189
|
All Python source code has been statically U{checked<https://GitHub.com/ActiveState/code/tree/master/recipes/Python/
|
|
190
|
-
546532_PyChecker_postprocessor>} with U{Ruff<https://GitHub.com/astral-sh/ruff>} using Python 3.13.
|
|
190
|
+
546532_PyChecker_postprocessor>} with U{Ruff<https://GitHub.com/astral-sh/ruff>} using Python 3.13.7 and with
|
|
191
191
|
U{PyChecker<https://PyPI.org/project/pychecker>}, U{PyFlakes<https://PyPI.org/project/pyflakes>}, U{PyCodeStyle
|
|
192
192
|
<https://PyPI.org/project/pycodestyle>} (formerly Pep8) and U{McCabe<https://PyPI.org/project/mccabe>} using Python
|
|
193
|
-
2.7.18, both in 64-bit on macOS
|
|
193
|
+
2.7.18, both in 64-bit on macOS 26.0.1 Tahoe.
|
|
194
194
|
|
|
195
195
|
For a summary of all I{Karney}-based functionality in C{pygeodesy}, see module U{karney
|
|
196
196
|
<https://mrJean1.GitHub.io/PyGeodesy/docs/pygeodesy.karney-module.html>}.
|
|
@@ -605,7 +605,7 @@ else:
|
|
|
605
605
|
|
|
606
606
|
from pygeodesy.internals import _version2, _DOT_ # noqa: E402
|
|
607
607
|
# from pygeodesy.interns import _DOT_ # from .internals
|
|
608
|
-
__version__ = '25.
|
|
608
|
+
__version__ = '25.10.10'
|
|
609
609
|
# see setup.py for similar logic
|
|
610
610
|
version = _DOT_(*_version2(__version__, n=3))
|
|
611
611
|
|
pygeodesy/azimuthal.py
CHANGED
|
@@ -49,7 +49,7 @@ from pygeodesy.ellipsoidalBase import LatLonEllipsoidalBase as _LLEB, \
|
|
|
49
49
|
_isin, _xinstanceof
|
|
50
50
|
from pygeodesy.datums import _spherical_datum, _WGS84
|
|
51
51
|
from pygeodesy.errors import _ValueError, _xdatum, _xkwds
|
|
52
|
-
from pygeodesy.fmath import euclid,
|
|
52
|
+
from pygeodesy.fmath import euclid, hypot as _hypot, Fsum
|
|
53
53
|
# from pygeodesy.fsums import Fsum # from .fmath
|
|
54
54
|
# from pygeodesy.formy import antipode # _MODS
|
|
55
55
|
# from pygeodesy.internals import typename # from .karney
|
|
@@ -71,7 +71,7 @@ from pygeodesy.utily import asin1, atan1, atan2, atan2b, atan2d, \
|
|
|
71
71
|
from math import acos, degrees, fabs, sin, sqrt
|
|
72
72
|
|
|
73
73
|
__all__ = _ALL_LAZY.azimuthal
|
|
74
|
-
__version__ = '25.
|
|
74
|
+
__version__ = '25.09.29'
|
|
75
75
|
|
|
76
76
|
_EPS_K = _EPStol * _0_1 # Karney's eps_ or _EPSmin * _0_1?
|
|
77
77
|
_over_horizon_ = 'over horizon'
|
|
@@ -147,7 +147,7 @@ class _AzimuthalBase(_NamedBase):
|
|
|
147
147
|
'''I{Must be overloaded}.'''
|
|
148
148
|
self._notOverloaded(lat, lon, **name)
|
|
149
149
|
|
|
150
|
-
def _forward(self, lat, lon, name,
|
|
150
|
+
def _forward(self, lat, lon, name, _k_t):
|
|
151
151
|
'''(INTERNAL) Azimuthal (spherical) forward C{lat, lon} to C{x, y}.
|
|
152
152
|
'''
|
|
153
153
|
lat, lon = Lat_(lat), Lon_(lon)
|
|
@@ -155,16 +155,16 @@ class _AzimuthalBase(_NamedBase):
|
|
|
155
155
|
s0, c0 = self._sc0
|
|
156
156
|
|
|
157
157
|
cb *= ca
|
|
158
|
-
k, t =
|
|
158
|
+
k, t = _k_t(c0 * cb + s0 * sa)
|
|
159
159
|
if t:
|
|
160
160
|
r = k * self.radius
|
|
161
|
-
y = r *
|
|
161
|
+
y = r * (c0 * sa - s0 * cb)
|
|
162
162
|
e, n, z, _ = _enzh4(r * sb * ca, y, None)
|
|
163
163
|
else: # 0 or 180
|
|
164
164
|
e = n = z = _0_0
|
|
165
165
|
|
|
166
166
|
t = Azimuthal7Tuple(e, n, lat, lon, z, k, self.datum,
|
|
167
|
-
|
|
167
|
+
name=self._name__(name))
|
|
168
168
|
return t
|
|
169
169
|
|
|
170
170
|
def _forwards(self, *lls):
|
|
@@ -258,7 +258,7 @@ class _AzimuthalBase(_NamedBase):
|
|
|
258
258
|
if lea or fabs(c0) > EPS:
|
|
259
259
|
d = atan2d(e * sc, r * c0 * cc - n * s0 * sc)
|
|
260
260
|
else:
|
|
261
|
-
d = atan2d(e,
|
|
261
|
+
d = atan2d(e, (n if s0 < 0 else -n))
|
|
262
262
|
lon = _norm180(self.lon0 + d)
|
|
263
263
|
|
|
264
264
|
if LatLon is None:
|
|
@@ -745,8 +745,8 @@ class _GnomonicBase(_AzimuthalGeodesic):
|
|
|
745
745
|
|
|
746
746
|
@arg lat: Latitude of the location (C{degrees90}).
|
|
747
747
|
@arg lon: Longitude of the location (C{degrees180}).
|
|
748
|
-
@kwarg raiser:
|
|
749
|
-
|
|
748
|
+
@kwarg raiser: If C{False}, do not throw an error if the location lies
|
|
749
|
+
over the horizon (C{bool}).
|
|
750
750
|
@kwarg name: Optional C{B{name}=NN} for the location (C{str}).
|
|
751
751
|
|
|
752
752
|
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}
|
|
@@ -760,8 +760,6 @@ class _GnomonicBase(_AzimuthalGeodesic):
|
|
|
760
760
|
@raise AzimuthalError: Invalid B{C{lat}}, B{C{lon}} or the location lies
|
|
761
761
|
over the horizon and C{B{raiser}=True}.
|
|
762
762
|
'''
|
|
763
|
-
self._iteration = 0
|
|
764
|
-
|
|
765
763
|
r = self.geodesic.Inverse(self.lat0, self.lon0,
|
|
766
764
|
Lat_(lat), Lon_(lon), outmask=self._mask)
|
|
767
765
|
M = r.M21
|
|
@@ -776,7 +774,7 @@ class _GnomonicBase(_AzimuthalGeodesic):
|
|
|
776
774
|
e = n = NAN
|
|
777
775
|
|
|
778
776
|
t = self._7Tuple(e, n, r, _name__(name), M=M)
|
|
779
|
-
t.
|
|
777
|
+
t._iteration = self._iteration = 0
|
|
780
778
|
return t
|
|
781
779
|
|
|
782
780
|
def reverse(self, x, y, LatLon=None, **name_LatLon_kwds): # PYCHOK signature
|
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__ = '25.09.
|
|
29
|
+
__version__ = '25.09.11'
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
def _copysign_0_0(y):
|
|
@@ -186,6 +186,7 @@ _0_1 = _float( 0.1) # PYCHOK expected
|
|
|
186
186
|
_0_125 = _float( 0.125) # PYCHOK expected
|
|
187
187
|
_0_25 = _float( 0.25) # PYCHOK expected
|
|
188
188
|
_0_5 = _float( 0.5) # PYCHOK expected
|
|
189
|
+
_0_75 = _float( 0.75) # PYCHOK expected
|
|
189
190
|
_1_0 = _float( 1) # PYCHOK expected
|
|
190
191
|
_1_0_1T = _1_0, # PYCHOK 1-tuple
|
|
191
192
|
_1_5 = _float( 1.5) # PYCHOK expected
|
|
@@ -236,40 +237,35 @@ try:
|
|
|
236
237
|
# RADIX = Int( RADIX =_f_i.radix) # PYTHON system's float base
|
|
237
238
|
del _f_i
|
|
238
239
|
except ImportError: # PYCHOK no cover
|
|
239
|
-
DIG = Int( DIG =15)
|
|
240
|
+
DIG = Int( DIG =15) # PYCHOK system's 64-bit float decimal digits
|
|
240
241
|
EPS = _Float(EPS =2.220446049250313e-16) # PYCHOK EPSilon 2**-52, M{EPS +/- 1 != 1}
|
|
241
|
-
MANT_DIG = Int( MANT_DIG=53)
|
|
242
|
+
MANT_DIG = Int( MANT_DIG=53) # PYCHOK float mantissa bits ≈ 53 (C{int})
|
|
242
243
|
MAX = _Float(MAX =pow(_2_0, 1023) * (_2_0 - EPS)) # PYCHOK ≈ 10**308
|
|
243
|
-
MAX_EXP = Int( MAX_ESP =_log2(MAX))
|
|
244
|
+
MAX_EXP = Int( MAX_ESP =_log2(MAX)) # 308 base 10
|
|
244
245
|
MIN = _Float(MIN =pow(_2_0, -1021)) # PYCHOK ≈ 10**-308
|
|
245
|
-
MIN_EXP = Int(MIN_EXP =_log2(MIN))
|
|
246
|
-
# RADIX = Int(Radix =2)
|
|
247
|
-
|
|
248
|
-
EPS0 = _Float( EPS0 = EPS**2)
|
|
249
|
-
EPS02 = _Float( EPS02 = EPS**4)
|
|
250
|
-
EPS_2 = _Float( EPS_2 = EPS / _2_0)
|
|
251
|
-
EPS1 = _Float( EPS1 =_1_0 - EPS)
|
|
252
|
-
EPS2 = _Float( EPS2 = EPS * _2_0)
|
|
253
|
-
EPS4 = _Float( EPS4 = EPS * _4_0)
|
|
254
|
-
# _1EPS = _Float(_1EPS =_1_0 + EPS)
|
|
255
|
-
_1_EPS = _Float(_1_EPS =_1_0 / EPS)
|
|
256
|
-
# _2_EPS = _Float(_2_EPS =_2_0 / EPS)
|
|
257
|
-
_EPS2e4 = _Float(_EPS2e4= EPS2 * 1.e4)
|
|
258
|
-
_EPS4e8 = _Float(_EPS4e8= EPS4 * 1.e8)
|
|
259
|
-
_EPSjam = _Float(_EPSjam= pow(EPS,
|
|
260
|
-
_EPSmin = _Float(_EPSmin= sqrt(MIN))
|
|
261
|
-
_EPSqrt = _Float(_EPSqrt= sqrt(EPS))
|
|
262
|
-
_EPStol = _Float(_EPStol=_EPSqrt * _0_1)
|
|
246
|
+
MIN_EXP = Int(MIN_EXP =_log2(MIN)) # -307 base 10
|
|
247
|
+
# RADIX = Int(Radix =2) # base
|
|
248
|
+
|
|
249
|
+
EPS0 = _Float( EPS0 = EPS**2) # PYCHOK near-/non-zero comparison 4.930381e-32, or EPS or EPS_2
|
|
250
|
+
EPS02 = _Float( EPS02 = EPS**4) # PYCHOK near-zero-squared comparison 2.430865e-63
|
|
251
|
+
EPS_2 = _Float( EPS_2 = EPS / _2_0) # PYCHOK ≈ 1.110223024625e-16
|
|
252
|
+
EPS1 = _Float( EPS1 =_1_0 - EPS) # PYCHOK ≈ 0.9999999999999998
|
|
253
|
+
EPS2 = _Float( EPS2 = EPS * _2_0) # PYCHOK ≈ 4.440892098501e-16
|
|
254
|
+
EPS4 = _Float( EPS4 = EPS * _4_0) # PYCHOK ≈ 8.881784197001e-16
|
|
255
|
+
# _1EPS = _Float(_1EPS =_1_0 + EPS) # PYCHOK ≈ 1.0000000000000002
|
|
256
|
+
_1_EPS = _Float(_1_EPS =_1_0 / EPS) # PYCHOK = 4503599627370496.0
|
|
257
|
+
# _2_EPS = _Float(_2_EPS =_2_0 / EPS) # PYCHOK = 9007199254740992.0
|
|
258
|
+
_EPS2e4 = _Float(_EPS2e4= EPS2 * 1.e4) # PYCHOK ≈ 4.440892098501e-12
|
|
259
|
+
_EPS4e8 = _Float(_EPS4e8= EPS4 * 1.e8) # PYCHOK ≈ 8.881784197001e-08
|
|
260
|
+
_EPSjam = _Float(_EPSjam= pow(EPS, _0_75)) # PYCHOK = 1.818989403546e-12
|
|
261
|
+
_EPSmin = _Float(_EPSmin= sqrt(MIN)) # PYCHOK = 1.49166814624e-154
|
|
262
|
+
_EPSqrt = _Float(_EPSqrt= sqrt(EPS)) # PYCHOK = 1.49011611938e5-08
|
|
263
|
+
_EPStol = _Float(_EPStol=_EPSqrt * _0_1) # PYCHOK = 1.49011611938e5-09 == sqrt(EPS * _0_01)
|
|
263
264
|
|
|
264
265
|
_89_999 = _Float(_89_999=_90_0 * EPS1) # just below 90.0
|
|
265
266
|
# <https://Numbers.Computation.Free.FR/Constants/Miscellaneous/digits.html>
|
|
266
267
|
# _1__90 = _Float(_1__90 =_1_0 / _90_0) # PYCHOK = 0.011_111_111_111_111_111_111_111_111_111_111_111_111_111_111_11111
|
|
267
268
|
_2__PI = _Float(_2__PI =_2_0 / _pi) # PYCHOK = 0.636_619_772_367_581_343_075_535_053_490_057_448_137_838_582_96182
|
|
268
|
-
|
|
269
|
-
_1_16th = _Float(_1_16th=_1_0 / _16_0) # PYCHOK in .ellipsoids, .karney
|
|
270
|
-
_1_3rd = _Float(_1_3rd =_1_0 / _3_0) # PYCHOK in .fmath
|
|
271
|
-
_1_6th = _Float(_1_6th =_1_0 / _6_0) # PYCHOK in .fmath
|
|
272
|
-
|
|
273
269
|
_K0_UTM = _Float(_K0_UTM = 0.9996) # PYCHOK in .etm, .ktm, .utm, UTM scale at central meridian
|
|
274
270
|
# sqrt(2) <https://WikiPedia.org/wiki/Square_root_of_2>
|
|
275
271
|
# 1.414213562373095_048_801_688_724_209_698_078_569_671_875_376_948_073_176_679_737_99
|
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/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:
|
|
@@ -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.06'
|
|
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/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),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pygeodesy
|
|
3
|
-
Version: 25.
|
|
3
|
+
Version: 25.10.10
|
|
4
4
|
Summary: Pure Python geodesy tools
|
|
5
5
|
Home-page: https://GitHub.com/mrJean1/PyGeodesy
|
|
6
6
|
Author: Jean M. Brouwers
|
|
@@ -16,7 +16,6 @@ Classifier: License :: OSI Approved :: MIT License
|
|
|
16
16
|
Classifier: Operating System :: OS Independent
|
|
17
17
|
Classifier: Programming Language :: Python
|
|
18
18
|
Classifier: Programming Language :: Python :: 2.7
|
|
19
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
20
19
|
Classifier: Programming Language :: Python :: 3.11
|
|
21
20
|
Classifier: Programming Language :: Python :: 3.12
|
|
22
21
|
Classifier: Programming Language :: Python :: 3.13
|
|
@@ -43,7 +42,7 @@ provides a geodetic LatLon_ and a geocentric Cartesian_ class with methods and f
|
|
|
43
42
|
distance, surface area, perimeter, forward and reverse azimuth, initial and final bearing, intermediate
|
|
44
43
|
and nearest points, intersections of geodesic, great circle and rhumb lines, circle intersections and
|
|
45
44
|
secants, `3-point resections`_, triangulation, trilateration (by intersection, by overlap and in
|
|
46
|
-
3d),
|
|
45
|
+
3d), among other things.
|
|
47
46
|
|
|
48
47
|
Also included are modules for conversions to and from `Cassini-Soldner`_, ECEF_ (Earth-Centered,
|
|
49
48
|
Earth-Fixed cartesian), UTM_ (Universal Transverse Mercator and Exact_), UPS_ (Universal Polar
|
|
@@ -60,8 +59,9 @@ operations between (composite) polygons, functions to simplify_ or linearize a p
|
|
|
60
59
|
points (or a `numpy array`_), including implementations of the `Ramer-Douglas-Peucker`_,
|
|
61
60
|
`Visvalingam-Whyatt`_ and `Reumann-Witkam`_ algorithms and modified versions of the former.
|
|
62
61
|
|
|
63
|
-
Plus modules and classes to interpolate_ the Height_ of *LatLon* points and Geoid_ models, compute
|
|
64
|
-
various Fréchet_ or Hausdorff_ distances or perform *boolean* operations between (composite)
|
|
62
|
+
Plus modules and classes to interpolate_ the Height_ of *LatLon* points and Geoid_ models, to compute
|
|
63
|
+
various Fréchet_ or Hausdorff_ distances or to perform *boolean* operations between (composite)
|
|
64
|
+
polygons of *LatLon* points.
|
|
65
65
|
|
|
66
66
|
For further details see the documentation_, the descriptions of `Latitude/Longitude`_, Vincenty_ and
|
|
67
67
|
`Vector-based`_ geodesy, the original `JavaScript source`_ or docs_ and *Karney*\'s Python geographiclib_
|
|
@@ -120,22 +120,22 @@ test results (on macOS only) and the complete documentation_ generated by Epydoc
|
|
|
120
120
|
Tests
|
|
121
121
|
=====
|
|
122
122
|
|
|
123
|
-
The tests ran with Python 3.
|
|
124
|
-
|
|
125
|
-
numpy_ 1.
|
|
126
|
-
|
|
127
|
-
scipy_ 1.2.2, GeoConvert_ 2.5, GeodSolve_ 2.5, IntersectTool_ 2.5 and RhumbSolve_ 2.5),
|
|
128
|
-
|
|
123
|
+
The tests ran with Python 3.14 (with geographiclib_ 2.1), Python 3.13.7 (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.0.1 Tahoe in 64-bit.
|
|
129
129
|
|
|
130
130
|
All tests ran with and without ``lazy import`` for Python 3 and with command line option ``-W default``
|
|
131
131
|
and env variable ``PYGEODESY_WARNINGS=on`` for all Python versions. The results of those tests are
|
|
132
132
|
included in the distribution files.
|
|
133
133
|
|
|
134
|
-
Python 3.
|
|
134
|
+
Python 3.14, 3.13.7, 3.12.7 and 3.11.5 run on Apple Si M4 (``arm64``), *natively*. Python 2.7.18 runs
|
|
135
135
|
on Intel (``x86_64``) or Intel *emulation* (\"``arm64_x86_64``\", see function `pygeodesy.machine`_).
|
|
136
136
|
|
|
137
|
-
Test coverage has been measured with coverage_ 7.
|
|
138
|
-
|
|
137
|
+
Test coverage has been measured with coverage_ 7.10.7 using Python 3.14, 3.13.7 and 3.12.7. The complete
|
|
138
|
+
coverage report in HTML and a PDF summary are included in the distribution files.
|
|
139
139
|
|
|
140
140
|
The tests also ran with Python 3.13.7 (and geographiclib_ 2.1) on `Debian 12`_ in 64-bit only and with
|
|
141
141
|
Python 3.12.8 (and geographiclib_ 2.0) on `Windows 2019Server`_ in 64-bit only and with Python 2.7.18
|
|
@@ -144,13 +144,13 @@ Python 3.12.8 (and geographiclib_ 2.0) on `Windows 2019Server`_ in 64-bit only a
|
|
|
144
144
|
A single-File and single-Directory application with ``pygeodesy`` has been bundled using PyInstaller_ 3.4
|
|
145
145
|
and 64-bit Python 3.7.4 and 3.7.3 on macOS 10.13.6 High Sierra.
|
|
146
146
|
|
|
147
|
-
Previously, the tests were run with Python 3.13.0-
|
|
147
|
+
Previously, the tests were run with Python 3.13.0-6, 3.12.0-6, 3.11.2-4, 3.10.1-7, 3.9.1, 3.8.7, 3.7.1, 2.7.15,
|
|
148
148
|
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
149
|
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
150
|
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
|
|
151
151
|
and 2.6.9 (and numpy_ 1.19.0, 1.16.5, 1.16.2, 1.15.2, 1.14.0, 1.13.1, 1.8.0rc1 or 1.6.2 and scipy_ 1.5.0),
|
|
152
152
|
PyPy_ 7.3.0 (Python 2.7.13 and 3.6.9), PyPy_ 6.0.0 (Python 2.7.13 and 3.5.3) and `Intel-Python`_ 3.5.3 (and
|
|
153
|
-
numpy_ 1.11.3) on macOS 15.0-
|
|
153
|
+
numpy_ 1.11.3) on macOS 15.0-6 Sequoia, 14.0-6.1 Sonoma, 13.0-5.2 Ventura, 12.1-6 Monterey, 11.0-5.2-6.1 Big
|
|
154
154
|
Sur (aka 10.16), 10.15.3, 10.15.5-7 Catalina, 10.14 Mojave, 10.13.6 High Sierra and 10.12 Sierra, MacOS X
|
|
155
155
|
10.11 El Capitan and/or MacOS X 10.10 Yosemite, with Pythonista_ 3.2 (with geographiclib 1.50 or 1.49 and
|
|
156
156
|
numpy 1.8.0) on iOS 14.4.2, 11.4.1, 12.0-3 on iPad4, iPhone6, iPhone10 and/or iPhone12, with Pythonista_ 3.1
|
|
@@ -160,12 +160,12 @@ Server 2012R2, Windows 10 Pro and 32-bit Python 2.6.6 on Windows XP SP3.
|
|
|
160
160
|
Notes
|
|
161
161
|
=====
|
|
162
162
|
|
|
163
|
-
All Python source code has been statically checked_ with Ruff_ using Python 3.13.
|
|
164
|
-
PyCodeStyle_ (formerly Pep8) and McCabe_ using Python 2.7.18, both in 64-bit on macOS
|
|
163
|
+
All Python source code has been statically checked_ with Ruff_ using Python 3.13.7 and with PyChecker_, PyFlakes_,
|
|
164
|
+
PyCodeStyle_ (formerly Pep8) and McCabe_ using Python 2.7.18, both in 64-bit on macOS 26.0.1 Tahoe only.
|
|
165
165
|
|
|
166
166
|
For a summary of all *Karney*-based functionality in ``pygeodesy``, see module karney_.
|
|
167
167
|
|
|
168
|
-
*Last updated:
|
|
168
|
+
*Last updated: Oct 10, 2025.*
|
|
169
169
|
|
|
170
170
|
License
|
|
171
171
|
=======
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
pygeodesy/LICENSE,sha256=YfgAiyxOwY6P9Kkb1_5XN81nueTLrpb3Ffkv3EuPgFU,1144
|
|
2
|
-
pygeodesy/__init__.py,sha256
|
|
2
|
+
pygeodesy/__init__.py,sha256=-QifNyOMaiddBdni6VVqzLQtjjev0PS_AdfsyVXqz2k,42328
|
|
3
3
|
pygeodesy/__main__.py,sha256=HpOBmuhI7yVP1FIAEugvd9Lb54kzew-nM78be0r4SC4,5597
|
|
4
4
|
pygeodesy/albers.py,sha256=mb3YbVvoBq8a7AytT0HeVxe8DGEvx1KFN2Usl2ksKwk,30908
|
|
5
|
-
pygeodesy/azimuthal.py,sha256=
|
|
5
|
+
pygeodesy/azimuthal.py,sha256=GI7nM7RWDwOh5DKYrrZBZDHcP9aSJgCBSdgDm2ovLvY,49849
|
|
6
6
|
pygeodesy/basics.py,sha256=sKIyFcBNz6UzzY2YRr0bt1WuQLnEFUMfLKW7z4vCOII,32915
|
|
7
7
|
pygeodesy/booleans.py,sha256=4ROe0VvrGNW64HUrz8nKG0APs3XA_M3tV8IO631k2M8,73683
|
|
8
8
|
pygeodesy/cartesianBase.py,sha256=KX74yZE-fM7wHDnrV5OkAEyKwyZJy5o9VuzVjb1caZQ,45355
|
|
9
9
|
pygeodesy/clipy.py,sha256=a0azaK7YDmGDU8mVVKe2MvUiPEhqZ9XJ-9u0T1iHKbo,27779
|
|
10
|
-
pygeodesy/constants.py,sha256=
|
|
10
|
+
pygeodesy/constants.py,sha256=thlUllMuL_3ZY2hI3xPen1IdW0tAfQnQztMHsv01RBg,20525
|
|
11
11
|
pygeodesy/css.py,sha256=vdQax5m7BMSpr7PUyqedCSvx73ilWuhXQTp39i8FOfA,25793
|
|
12
12
|
pygeodesy/datums.py,sha256=Vp1fP7sSV1EuRbuO2scnZ3qiTZD1CvL4O12KSRlf1SU,34068
|
|
13
13
|
pygeodesy/dms.py,sha256=egtF9gjReovgaSKJ_27KHZjvo4vLDdLEZ7yXSf19EZs,42202
|
|
@@ -22,11 +22,11 @@ pygeodesy/ellipsoidalKarney.py,sha256=W_Liw5MxTqJJGsxMi50ui8grRSPKwkG2HH-Mv_mXQY
|
|
|
22
22
|
pygeodesy/ellipsoidalNvector.py,sha256=HLFjX6o26q2fzVCjLSL0PdEh96xhGtjfzo2V_k54j4A,30146
|
|
23
23
|
pygeodesy/ellipsoidalVincenty.py,sha256=zeTvid09NGuYJ1WJ__a3ApCBGSzX0A-Rhs8-sQXMNQQ,26273
|
|
24
24
|
pygeodesy/ellipsoids.py,sha256=hdBT-Vl5Ukq51s19brzctT0vZfh8qZYlbUjmrrQPE-Q,108817
|
|
25
|
-
pygeodesy/elliptic.py,sha256=
|
|
25
|
+
pygeodesy/elliptic.py,sha256=uWxzmr7woRKqhsBWm6iGTwag5Ga0L184szkPWN3diSg,45515
|
|
26
26
|
pygeodesy/epsg.py,sha256=VIBidzAEuoBF4LdlJ4r3WtpL0Ymhru8kf4fAgfFr5ok,8220
|
|
27
27
|
pygeodesy/errors.py,sha256=qML13IDmvSaVrWp5h9DeHw1L-9J7DTwn86wLsP_sOgw,32498
|
|
28
|
-
pygeodesy/etm.py,sha256=
|
|
29
|
-
pygeodesy/fmath.py,sha256=
|
|
28
|
+
pygeodesy/etm.py,sha256=swF0QL52uo_DK073hymix8IitMyArOf-n0LL98BGwRU,46796
|
|
29
|
+
pygeodesy/fmath.py,sha256=5gPHRqD5DbPqrM8BFRFVo1IYumKUVWoTcvEtzc8BFiE,37812
|
|
30
30
|
pygeodesy/formy.py,sha256=7-CdPiagdVrbDMjWieX_guN4RvFVCYKOM3yDKSFPRWU,69777
|
|
31
31
|
pygeodesy/frechet.py,sha256=dBnQ5ePuaUdKv62-e9RfovFDxELsZPQEKMLww9NOf7Q,35588
|
|
32
32
|
pygeodesy/fstats.py,sha256=M6UOrwmeGp6kjYuYfc6Iq9ibMJAFNm6D4C5GnvlJeuM,28348
|
|
@@ -35,14 +35,14 @@ pygeodesy/gars.py,sha256=AXioT4Lh1cwrd7fF6dHcVJw-9vu2oAnZrzo_ka2Y3Ts,11761
|
|
|
35
35
|
pygeodesy/geodesici.py,sha256=V2FW_xQUwm6HfiVoZoBXhipsAV0EjXHnAc_wUG78kAQ,74889
|
|
36
36
|
pygeodesy/geodesicw.py,sha256=xDxxxr4HOT-8Mh85zD6QZzyO-mfqUavfwQMStYrsF8c,30029
|
|
37
37
|
pygeodesy/geodsolve.py,sha256=_s6Wk13yTI8eTsaMpnzjqacNXLjPh_HoevmjECtrRjE,28668
|
|
38
|
-
pygeodesy/geohash.py,sha256=
|
|
39
|
-
pygeodesy/geoids.py,sha256=
|
|
38
|
+
pygeodesy/geohash.py,sha256=bqJMuA0-TH2vgOd7VaW1q4dw8KL43oCmV3eSjP90Bak,40124
|
|
39
|
+
pygeodesy/geoids.py,sha256=m0EqTAKCuOVxrRpoPdmgymu0i0ufV2xpdt_laJLFqqE,86129
|
|
40
40
|
pygeodesy/hausdorff.py,sha256=KGB0CIeNkBqR0sXIbRJvcgXPrM-4Mpi2aBOqDeZjqZ0,32269
|
|
41
|
-
pygeodesy/heights.py,sha256=
|
|
42
|
-
pygeodesy/internals.py,sha256=
|
|
41
|
+
pygeodesy/heights.py,sha256=q7ej8RO-iZ5hfNi3OxwO3w_Opk4xHAZIzHbcbFTO3CA,41011
|
|
42
|
+
pygeodesy/internals.py,sha256=8fddKdxThLLo17u3koRo4jW8g1yao1igEJMEnm-NamU,24711
|
|
43
43
|
pygeodesy/interns.py,sha256=QTP_6rStQ283DE-rL7rCAcfEffuiAXustBGkCY_DHJ0,23508
|
|
44
44
|
pygeodesy/iters.py,sha256=nKVp_LUQyTqOz_OLzY25g6-_xlKG7lmAnjKKMXESmiM,20345
|
|
45
|
-
pygeodesy/karney.py,sha256=
|
|
45
|
+
pygeodesy/karney.py,sha256=GJuruLHO7IjhwXYNh507EbHO5VFNXwhRpzIkaGCec7c,41652
|
|
46
46
|
pygeodesy/ktm.py,sha256=9eZ5Wk2HHhRl0IyypJ4guhhxGJLriWZm0Wfb3Z9Gf7Y,27270
|
|
47
47
|
pygeodesy/latlonBase.py,sha256=eF8tr0fP9nc8JMGbJ0JyeFfECZyjlBJbtIchKRdU4B4,75317
|
|
48
48
|
pygeodesy/lazily.py,sha256=bLCBDH13GY1LqVzoO6xmaeGsRDrBLHr-EqxUiSvOESo,47678
|
|
@@ -50,7 +50,7 @@ pygeodesy/lcc.py,sha256=nU_aWXgsxwB53c3CKM-dBQoDRoypkrY-tVmKmU9yQQ8,25785
|
|
|
50
50
|
pygeodesy/ltp.py,sha256=N3TMipTWKUOeZYzn3UeJJqe5J4Yk788390ohQM1ykAE,50893
|
|
51
51
|
pygeodesy/ltpTuples.py,sha256=t-n7p9A3JCVasv8LKCV4PkOTmXJZi91BkBFm8pBZM5o,59101
|
|
52
52
|
pygeodesy/mgrs.py,sha256=ZgCBH_M_YFxuFu5ukVOVetk-uftv-4GJP-QJrtoqtcU,29842
|
|
53
|
-
pygeodesy/named.py,sha256=
|
|
53
|
+
pygeodesy/named.py,sha256=_dlImd3OzHS1vqm673e7CEJVXkbczaAwckw8H8SGoEM,52787
|
|
54
54
|
pygeodesy/namedTuples.py,sha256=JlO8uWmR65RkT7Rdgc9knfI0-bqJeA-tm2ZKsesztVU,30598
|
|
55
55
|
pygeodesy/nvectorBase.py,sha256=r-O-ErwTXqDfLg4zYqhB4IqTJc8P8rbJlMm0XfQN2Gs,29927
|
|
56
56
|
pygeodesy/osgr.py,sha256=4mFUcn1vMOju3PK1rKohPtIlJZrBGPJrcRjFl-CoxqE,30852
|
|
@@ -62,8 +62,8 @@ pygeodesy/solveBase.py,sha256=mZdud0LveosWEXbufVzTMM9y6wuObS0O2clDX2LmRgE,18864
|
|
|
62
62
|
pygeodesy/sphericalBase.py,sha256=hq6dyeeIHBy_T0Q6PIwSvmo1U70Ir5KBeMTwQplzqHQ,32071
|
|
63
63
|
pygeodesy/sphericalNvector.py,sha256=bu0yB4PEq1cs6BS8QFqtljWpVEw7ESwq2yILOzGDuAc,54948
|
|
64
64
|
pygeodesy/sphericalTrigonometry.py,sha256=PqxNMSK8DI7TJuOtkQ5afzJtLfDzOkVe_tRdLTq9x14,64398
|
|
65
|
-
pygeodesy/streprs.py,sha256
|
|
66
|
-
pygeodesy/trf.py,sha256=
|
|
65
|
+
pygeodesy/streprs.py,sha256=UYlk5v-GEJHMDiHZsqLssY3h6J5LbFw9dsCsKJbiERs,23684
|
|
66
|
+
pygeodesy/trf.py,sha256=M0kzyclDJ5q4wCr-2HDIj6_J42FsrffnFGiyPkgHEmE,119216
|
|
67
67
|
pygeodesy/triaxials.py,sha256=V0MSYJxRgYDhZcF7HXnu7oFzRyWJkhwc6scuNjc6VVg,64046
|
|
68
68
|
pygeodesy/units.py,sha256=nH6uNqtaILtGRXqCcHVYBTfhGrv-WFt3w1aso6PA0kM,35419
|
|
69
69
|
pygeodesy/unitsBase.py,sha256=cVNKG24Fov73gLFPGwGdjvXmM-8fd3MDufVubABAMeE,14141
|
|
@@ -104,8 +104,8 @@ pygeodesy/geodesicx/_C4_27.py,sha256=grqtju94Nu9V_eQPqe_7aRbLCYflxRuK127pPOPwuDA
|
|
|
104
104
|
pygeodesy/geodesicx/_C4_30.py,sha256=I4ZuTy64yOq1IVgRtc_kqOL0HnKzXeTea7kTFSolcJs,201921
|
|
105
105
|
pygeodesy/geodesicx/__init__.py,sha256=1wUYni2aucT66bNkOqp1ZOix6a4rlBRHJimUDUWIgt4,2468
|
|
106
106
|
pygeodesy/geodesicx/__main__.py,sha256=ZWx2vPPaQEXwFBQWOjKYrjM9Deb0b-_778PxwiM1Rww,4330
|
|
107
|
-
pygeodesy/geodesicx/gx.py,sha256=
|
|
108
|
-
pygeodesy/geodesicx/gxarea.py,sha256=
|
|
107
|
+
pygeodesy/geodesicx/gx.py,sha256=uEXulVciKipCz28VMQqhtV0kLuy71vy-EFF42GWWi-Q,60438
|
|
108
|
+
pygeodesy/geodesicx/gxarea.py,sha256=a_yhNsjjRM0E9-WYBbhHjaefjLuAzhNQxTHiv0LnvO0,19588
|
|
109
109
|
pygeodesy/geodesicx/gxbases.py,sha256=qb1tYsh2nIvyXoVhU-pdmolANHj9tHZxiH2f7Ls3Jkw,6319
|
|
110
110
|
pygeodesy/geodesicx/gxline.py,sha256=9aUbLEok0ewg8j1UpZ1Ud7X0zH8Mu6QoUO2bjdpmEag,28284
|
|
111
111
|
pygeodesy/rhumb/__init__.py,sha256=MByyXXwg0kJRHckEfaxWMW_2i4U15rRRgN7iTzeOK_I,2207
|
|
@@ -113,7 +113,7 @@ pygeodesy/rhumb/aux_.py,sha256=2FbR_0Y0ofOROay2Z16oiLILhd7G50LUiatkQhBwEMA,16117
|
|
|
113
113
|
pygeodesy/rhumb/bases.py,sha256=R-QLV8a0KZUvaI1wEkyAG4yO-IQNNK4I2O7WRIMBJuo,54218
|
|
114
114
|
pygeodesy/rhumb/ekx.py,sha256=LlMjVJqb-Q5rJnexJi-0TPRkUZkJaPQ7fVRypxkxNjo,24058
|
|
115
115
|
pygeodesy/rhumb/solve.py,sha256=z8z_XYObTgz7w1skNLNcLBpe-EO_r0H4sVcZGlBcWnc,24005
|
|
116
|
-
pygeodesy-25.
|
|
117
|
-
pygeodesy-25.
|
|
118
|
-
pygeodesy-25.
|
|
119
|
-
pygeodesy-25.
|
|
116
|
+
pygeodesy-25.10.10.dist-info/METADATA,sha256=F_luIoHZU0UkQQxINpuceZKW7FOMvNxy3MOgTxdyocc,20126
|
|
117
|
+
pygeodesy-25.10.10.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
|
|
118
|
+
pygeodesy-25.10.10.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
|
|
119
|
+
pygeodesy-25.10.10.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|