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 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), conversions and unrolling, among other things.
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.13.7 (with U{geographiclib<https://PyPI.org/project/geographiclib>} 2.1),
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 3.10.8 (with U{geographiclib <https://PyPI.org/project/geographiclib>} 2.0,
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 15.6.1 Sequoia.
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.6.1 using Python
153
- 3.13.7, 3.12.7, 3.11.5 and 3.10.8. The complete coverage report in HTML and a PDF summary are included in
154
- the distribution files.
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.13.7, 3.12.7, 3.11.5 and 3.10.8 run on Apple M4 Si (C{arm64}), I{natively}. Python 2.7.18 runs
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-5, 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,
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-5 Sequoia, 14.0-6.1 Sonoma, 13.0-5.2 Ventura, 12.1-6 Monterey,
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.5 and with
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 15.6.1 Sequoia.
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.09.09'
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, fdot_, hypot as _hypot, Fsum
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.05.12'
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, _k_t_2):
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 = _k_t_2(fdot_(s0, sa, c0, cb))
158
+ k, t = _k_t(c0 * cb + s0 * sa)
159
159
  if t:
160
160
  r = k * self.radius
161
- y = r * fdot_(c0, sa, -s0, cb)
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
- name=self._name__(name))
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, (n if s0 < 0 else -n))
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: Do or don't throw an error (C{bool}) if
749
- the location lies over the horizon.
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._iteraton = 0
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.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) # PYCHOK system's 64-bit float decimal digits
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) # PYCHOK float mantissa bits ≈ 53 (C{int})
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)) # 308 base 10
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)) # -307 base 10
246
- # RADIX = Int(Radix =2) # base
247
-
248
- EPS0 = _Float( EPS0 = EPS**2) # PYCHOK near-/non-zero comparison 4.930381e-32, or EPS or EPS_2
249
- EPS02 = _Float( EPS02 = EPS**4) # PYCHOK near-zero-squared comparison 2.430865e-63
250
- EPS_2 = _Float( EPS_2 = EPS / _2_0) # PYCHOK ≈ 1.110223024625e-16
251
- EPS1 = _Float( EPS1 =_1_0 - EPS) # PYCHOK ≈ 0.9999999999999998
252
- EPS2 = _Float( EPS2 = EPS * _2_0) # PYCHOK ≈ 4.440892098501e-16
253
- EPS4 = _Float( EPS4 = EPS * _4_0) # PYCHOK ≈ 8.881784197001e-16
254
- # _1EPS = _Float(_1EPS =_1_0 + EPS) # PYCHOK ≈ 1.0000000000000002
255
- _1_EPS = _Float(_1_EPS =_1_0 / EPS) # PYCHOK = 4503599627370496.0
256
- # _2_EPS = _Float(_2_EPS =_2_0 / EPS) # PYCHOK = 9007199254740992.0
257
- _EPS2e4 = _Float(_EPS2e4= EPS2 * 1.e4) # PYCHOK ≈ 4.440892098501e-12
258
- _EPS4e8 = _Float(_EPS4e8= EPS4 * 1.e8) # PYCHOK ≈ 8.881784197001e-08
259
- _EPSjam = _Float(_EPSjam= pow(EPS, 0.75)) # PYCHOK = 1.818989403546e-12
260
- _EPSmin = _Float(_EPSmin= sqrt(MIN)) # PYCHOK = 1.49166814624e-154
261
- _EPSqrt = _Float(_EPSqrt= sqrt(EPS)) # PYCHOK = 1.49011611938e5-08
262
- _EPStol = _Float(_EPStol=_EPSqrt * _0_1) # PYCHOK = 1.49011611938e5-09 == sqrt(EPS * _0_01)
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.09.04'
103
+ __version__ = '25.10.10'
104
104
 
105
105
  _TolRD = zqrt(EPS * 0.002)
106
106
  _TolRF = zqrt(EPS * 0.030)
@@ -932,7 +932,7 @@ class Elliptic(_Named):
932
932
  raise _ellipticError(Elliptic._RFRD, x, y, z, m, cause=X)
933
933
  return float(R)
934
934
 
935
- _allPropertiesOf_n(16, Elliptic) # # PYCHOK assert, see Elliptic.reset
935
+ _allPropertiesOf_n(16, Elliptic) # PYCHOK assert, see Elliptic.reset
936
936
 
937
937
 
938
938
  class EllipticError(_ValueError):
pygeodesy/etm.py CHANGED
@@ -67,7 +67,7 @@ from pygeodesy.basics import _isin, map1, neg, neg_, _xinstanceof
67
67
  from pygeodesy.constants import EPS, EPS02, PI_2, PI_4, _K0_UTM, \
68
68
  _1_EPS, _0_0, _0_1, _0_5, _1_0, _2_0, \
69
69
  _3_0, _90_0, isnear0, isnear90
70
- from pygeodesy.constants import _4_0 # PYCHOK used!
70
+ from pygeodesy.constants import _0_75, _4_0 # PYCHOK used!
71
71
  from pygeodesy.datums import _ellipsoidal_datum, _WGS84, _EWGS84
72
72
  # from pygeodesy.ellipsoids import _EWGS84 # from .datums
73
73
  # from pygeodesy.elliptic import Elliptic # _MODS
@@ -93,7 +93,7 @@ from pygeodesy.utm import _cmlon, _LLEB, _parseUTM5, _toBand, _toXtm8, \
93
93
  from math import asinh, degrees, radians, sinh, sqrt
94
94
 
95
95
  __all__ = _ALL_LAZY.etm
96
- __version__ = '25.08.31'
96
+ __version__ = '25.09.15'
97
97
 
98
98
  _OVERFLOW = _1_EPS**2 # ~2e+31
99
99
  _TAYTOL = pow(EPS, 0.6)
@@ -410,7 +410,7 @@ class ExactTransverseMercator(_NamedBase):
410
410
  def _Ev_3cKE_4(self):
411
411
  '''(INTERNAL) Get and cache C{_Ev.cKE * 3 / 4}.
412
412
  '''
413
- return self._Ev_cKE * 0.75 # _0_75
413
+ return self._Ev_cKE * _0_75
414
414
 
415
415
  @Property_RO
416
416
  def _Ev_5cKE_4(self):
pygeodesy/fmath.py CHANGED
@@ -10,8 +10,8 @@ from __future__ import division as _; del _ # noqa: E702 ;
10
10
  from pygeodesy.basics import _copysign, copysign0, isbool, isint, isodd, \
11
11
  isscalar, len2, map1, _xiterable, typename
12
12
  from pygeodesy.constants import EPS0, EPS02, EPS1, NAN, PI, PI_2, PI_4, \
13
- _0_0, _0_125, _1_6th, _0_25, _1_3rd, _0_5, _1_0, \
14
- _1_5, _copysign_0_0, isfinite, remainder
13
+ _0_0, _0_125, _0_25, _0_5, _1_0, _1_5, \
14
+ _copysign_0_0, isfinite, remainder
15
15
  from pygeodesy.errors import _IsnotError, LenError, _TypeError, _ValueError, \
16
16
  _xError, _xkwds, _xkwds_pop2, _xsError
17
17
  from pygeodesy.fsums import _2float, Fsum, fsum, _isFsum_2Tuple, Fmt, unstr
@@ -25,10 +25,12 @@ from math import fabs, sqrt # pow
25
25
  import operator as _operator # in .datums, .trf, .utm
26
26
 
27
27
  __all__ = _ALL_LAZY.fmath
28
- __version__ = '25.08.31'
28
+ __version__ = '25.09.15'
29
29
 
30
30
  # sqrt(2) - 1 <https://WikiPedia.org/wiki/Square_root_of_2>
31
31
  _0_4142 = 0.41421356237309504880 # ~ 3_730_904_090_310_553 / 9_007_199_254_740_992
32
+ _1_3rd = _1_0 / 3
33
+ _1_6th = _1_0 / 6
32
34
  _2_3rd = _1_3rd * 2
33
35
  _h_lt_b_ = 'abs(h) < abs(b)'
34
36
 
pygeodesy/geodesicx/gx.py CHANGED
@@ -65,7 +65,7 @@ from pygeodesy.utily import atan2, atan2d as _atan2d_reverse, _unrollon, \
65
65
  from math import copysign, cos, degrees, fabs, radians, sqrt
66
66
 
67
67
  __all__ = ()
68
- __version__ = '25.09.02'
68
+ __version__ = '25.09.16'
69
69
 
70
70
  _MAXIT1 = 20
71
71
  _MAXIT2 = 10 + _MAXIT1 + MANT_DIG # MANT_DIG == C++ digits
@@ -188,7 +188,7 @@ class GeodesicExact(_GeodesicBase):
188
188
  <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1GeodesicExact.html>}
189
189
  and Python U{Geodesic.ArcDirect<https://GeographicLib.SourceForge.io/Python/doc/code.html>}.
190
190
  '''
191
- return self._GDictDirect(lat1, lon1, azi1, True, a12, outmask)
191
+ return self._GDictDirect(lat1, lon1, azi1, True, a12, outmask=outmask)
192
192
 
193
193
  def ArcDirectLine(self, lat1, lon1, azi1, a12, caps=Caps.ALL, **name):
194
194
  '''Define a L{GeodesicLineExact} in terms of the I{direct} geodesic problem and as arc length.
@@ -348,7 +348,7 @@ class GeodesicExact(_GeodesicBase):
348
348
  <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1GeodesicExact.html>}
349
349
  and Python U{Geodesic.Direct<https://GeographicLib.SourceForge.io/Python/doc/code.html>}.
350
350
  '''
351
- return self._GDictDirect(lat1, lon1, azi1, False, s12, outmask)
351
+ return self._GDictDirect(lat1, lon1, azi1, False, s12, outmask=outmask)
352
352
 
353
353
  def Direct3(self, lat1, lon1, azi1, s12): # PYCHOK outmask
354
354
  '''Return the destination lat, lon and reverse azimuth
@@ -356,7 +356,7 @@ class GeodesicExact(_GeodesicBase):
356
356
 
357
357
  @return: L{Destination3Tuple}C{(lat, lon, final)}.
358
358
  '''
359
- r = self._GDictDirect(lat1, lon1, azi1, False, s12, Caps._AZIMUTH_LATITUDE_LONGITUDE)
359
+ r = self._GDictDirect(lat1, lon1, azi1, False, s12, outmask=Caps._AZIMUTH_LATITUDE_LONGITUDE)
360
360
  return Destination3Tuple(r.lat2, r.lon2, r.azi2) # no iteration
361
361
 
362
362
  def _DirectLine(self, ll1, azi12, s12=0, **caps_name):
@@ -710,7 +710,7 @@ class GeodesicExact(_GeodesicBase):
710
710
  @return: L{Direct9Tuple}C{(a12, lat2, lon2, azi2,
711
711
  s12, m12, M12, M21, S12)}.
712
712
  '''
713
- r = self._GDictDirect(lat1, lon1, azi1, arcmode, s12_a12, outmask)
713
+ r = self._GDictDirect(lat1, lon1, azi1, arcmode, s12_a12, outmask=outmask)
714
714
  return r.toDirect9Tuple()
715
715
 
716
716
  def _GenInverse(self, lat1, lon1, lat2, lon2, outmask=Caps.STANDARD):
@@ -719,7 +719,7 @@ class GeodesicExact(_GeodesicBase):
719
719
  @return: L{Inverse10Tuple}C{(a12, s12, salp1, calp1, salp2, calp2,
720
720
  m12, M12, M21, S12)}.
721
721
  '''
722
- r = self._GDictInverse(lat1, lon1, lat2, lon2, outmask | Caps._SALP_CALPs_)
722
+ r = self._GDictInverse(lat1, lon1, lat2, lon2, outmask=outmask | Caps._SALP_CALPs_)
723
723
  return r.toInverse10Tuple()
724
724
 
725
725
  def _Inverse(self, ll1, ll2, wrap, **outmask):
@@ -752,7 +752,7 @@ class GeodesicExact(_GeodesicBase):
752
752
  <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1GeodesicExact.html>} and
753
753
  Python U{Geodesic.InverseLine<https://GeographicLib.SourceForge.io/Python/doc/code.html>}.
754
754
  '''
755
- return self._GDictInverse(lat1, lon1, lat2, lon2, outmask)
755
+ return self._GDictInverse(lat1, lon1, lat2, lon2, outmask=outmask)
756
756
 
757
757
  def Inverse1(self, lat1, lon1, lat2, lon2, wrap=False):
758
758
  '''Return the non-negative, I{angular} distance in C{degrees}.
@@ -764,7 +764,8 @@ class GeodesicExact(_GeodesicBase):
764
764
  # and .HeightIDWkarney._distances
765
765
  if wrap:
766
766
  _, lat2, lon2 = _Wrap.latlon3(lat1, lat2, lon2, True) # _Geodesic.LONG_UNROLL
767
- return fabs(self._GDictInverse(lat1, lon1, lat2, lon2, Caps.EMPTY).a12) # a12 always
767
+ r = self._GDictInverse(lat1, lon1, lat2, lon2, outmask=Caps.EMPTY)
768
+ return fabs(r.a12) # a12 always
768
769
 
769
770
  def Inverse3(self, lat1, lon1, lat2, lon2): # PYCHOK outmask
770
771
  '''Return the distance in C{meter} and the forward and
@@ -772,7 +773,7 @@ class GeodesicExact(_GeodesicBase):
772
773
 
773
774
  @return: L{Distance3Tuple}C{(distance, initial, final)}.
774
775
  '''
775
- r = self._GDictInverse(lat1, lon1, lat2, lon2, Caps.AZIMUTH_DISTANCE)
776
+ r = self._GDictInverse(lat1, lon1, lat2, lon2, outmask=Caps.AZIMUTH_DISTANCE)
776
777
  return Distance3Tuple(r.s12, wrap360(r.azi1), wrap360(r.azi2),
777
778
  iteration=r.iteration)
778
779
 
@@ -804,7 +805,7 @@ class GeodesicExact(_GeodesicBase):
804
805
  <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1GeodesicExact.html>} and
805
806
  Python U{Geodesic.InverseLine<https://GeographicLib.SourceForge.io/Python/doc/code.html>}.
806
807
  '''
807
- r = self._GDictInverse(lat1, lon1, lat2, lon2, caps | Caps._SALP_CALPs_)
808
+ r = self._GDictInverse(lat1, lon1, lat2, lon2, outmask=caps | Caps._SALP_CALPs_)
808
809
  return GeodesicLineExact(self, lat1, lon1, None, caps=caps, _s_calp1=(r.salp1, r.calp1),
809
810
  **name)._GenSet(self._debug, **r)
810
811
 
@@ -31,7 +31,7 @@ from pygeodesy.props import Property, Property_RO, property_RO
31
31
  from math import fmod as _fmod
32
32
 
33
33
  __all__ = ()
34
- __version__ = '25.06.04'
34
+ __version__ = '25.09.16'
35
35
 
36
36
 
37
37
  class GeodesicAreaExact(_NamedBase):
@@ -74,7 +74,7 @@ class GeodesicAreaExact(_NamedBase):
74
74
  self._g_gX = g = geodesic
75
75
  # use the class-level Caps since the values
76
76
  # differ between GeodesicExact and Geodesic
77
- self._mask = g.DISTANCE | g.LATITUDE | g.LONGITUDE
77
+ self._mask = g.DISTANCE | g.LATITUDE | g.LONGITUDE
78
78
  self._Peri = _Accumulator(name='_Peri')
79
79
  if not polyline: # perimeter and area
80
80
  self._mask |= g.AREA | g.LONG_UNROLL
@@ -188,7 +188,7 @@ class GeodesicAreaExact(_NamedBase):
188
188
  '''(INTERNAL) Edge helper.
189
189
  '''
190
190
  lon1 = self.lon1
191
- r = self._g_gX._GDictDirect(self.lat1, lon1, azi, False, s, self._mask)
191
+ r = self._g_gX._GDictDirect(self.lat1, lon1, azi, False, s, outmask=self._mask)
192
192
  if self._Area: # aka transitDirect
193
193
  # Count crossings of prime meridian exactly as
194
194
  # int(ceil(lon2 / 360)) - int(ceil(lon1 / 360))
@@ -219,7 +219,7 @@ class GeodesicAreaExact(_NamedBase):
219
219
  def _Inverse(self, lat1, lon1, lat2, lon2):
220
220
  '''(INTERNAL) Point helper.
221
221
  '''
222
- r = self._g_gX._GDictInverse(lat1, lon1, lat2, lon2, self._mask)
222
+ r = self._g_gX._GDictInverse(lat1, lon1, lat2, lon2, outmask=self._mask)
223
223
  if self._Area: # aka transit
224
224
  # count crossings of prime meridian as +1 or -1
225
225
  # if in east or west direction, otherwise 0
pygeodesy/geohash.py CHANGED
@@ -37,7 +37,7 @@ from pygeodesy.units import Degrees_, Int, Lat_, Lon_, Meter, Precision_, Str
37
37
  from math import fabs, ldexp, log10, radians
38
38
 
39
39
  __all__ = _ALL_LAZY.geohash
40
- __version__ = '25.04.21'
40
+ __version__ = '25.09.16'
41
41
 
42
42
  _formy = _MODS.into(formy=__name__)
43
43
  _MASK5 = 16, 8, 4, 2, 1 # PYCHOK used!
@@ -150,10 +150,10 @@ class _GH(object):
150
150
  '''
151
151
  def _encodes(lat, lon, prec, eps=0):
152
152
  s, w, n, e = self.SWNE4
153
- E, d, _mid = self.EncodeB32, True, _2mid
153
+ d, _mid = True, _2mid
154
154
  for _ in range(prec):
155
155
  i = 0
156
- for _ in range(5): # len(_MASK5)
156
+ for _ in _MASK5:
157
157
  i += i
158
158
  if d: # bisect longitude
159
159
  a = _mid(e, w)
@@ -170,7 +170,7 @@ class _GH(object):
170
170
  s = a
171
171
  i += 1
172
172
  d = not d
173
- yield E[i]
173
+ yield self.EncodeB32[i]
174
174
  if eps > 0: # infer prec
175
175
  if _2dab(lon, e, w) < eps and \
176
176
  _2dab(lat, n, s) < eps:
@@ -233,10 +233,10 @@ class _GH(object):
233
233
  if not (0 < nc <= _MaxPrec): # or geohash.startswith(_INV_)
234
234
  raise GeohashError(geohash=geohash, len=nc)
235
235
  s, w, n, e = self.SWNE4
236
- D, d, _mid = self.DecodeB32, True, _2mid
236
+ d, _mid = True, _2mid
237
237
  try:
238
238
  for j, c in enumerate(geohash.lower()):
239
- i = D[c]
239
+ i = self.DecodeB32[c]
240
240
  for m in mask5:
241
241
  if d: # longitude
242
242
  a = _mid(e, w)
pygeodesy/geoids.py CHANGED
@@ -28,7 +28,7 @@ or L{GeoidPGM} and download a C{geoid} model file, containing locations with
28
28
  known heights also referred to as the C{grid knots}. See the documentation of
29
29
  the interpolator class for references to available C{grid} models.
30
30
 
31
- C{>>> from pygeodesy import GeoidEGM96 # or -G2012B, -Karney or -PGM as GeoidXyz}
31
+ C{>>> from pygeodesy import GeoidEGM96 as GeoidXyz # or GeoidG2012B, -Karney or -PGM}
32
32
 
33
33
  2. Instantiate an interpolator with the C{geoid} model file and use keyword
34
34
  arguments to select different interpolation options
@@ -126,7 +126,7 @@ except ImportError: # Python 3+
126
126
  from io import BytesIO as _BytesIO # PYCHOK expected
127
127
 
128
128
  __all__ = _ALL_LAZY.geoids
129
- __version__ = '25.05.21'
129
+ __version__ = '25.09.26'
130
130
 
131
131
  _assert_ = 'assert'
132
132
  _bHASH_ = b'#'
pygeodesy/heights.py CHANGED
@@ -21,7 +21,7 @@ C{>>> ...}
21
21
 
22
22
  2. Select one of the C{Height} classes for height interpolation
23
23
 
24
- C{>>> from pygeodesy import HeightCubic # or other Height... as HeightXyz}
24
+ C{>>> from pygeodesy import HeightCubic as HeightXyz # or an other Height... class}
25
25
 
26
26
  3. Instantiate a height interpolator with the C{knots} and use keyword
27
27
  arguments to select different interpolation options
@@ -92,7 +92,7 @@ from pygeodesy.units import _isDegrees, Float_, Int_
92
92
  # from math import radians # from .points
93
93
 
94
94
  __all__ = _ALL_LAZY.heights
95
- __version__ = '25.05.26'
95
+ __version__ = '25.09.29'
96
96
 
97
97
  _error_ = 'error'
98
98
  _formy = _MODS.into(formy=__name__)
pygeodesy/internals.py CHANGED
@@ -202,7 +202,7 @@ class _MODS_Base(object):
202
202
  (_macOS_, p.mac_ver),
203
203
  (_Windows_, p.win32_ver),
204
204
  (_Nix, _MODS.nix_ver),
205
- ('Java', p.java_ver),
205
+ # removed Py 3.15 ('Java', p.java_ver),
206
206
  ('uname', p.uname)):
207
207
  v = v()[0]
208
208
  if v and n:
@@ -659,11 +659,10 @@ def _usage_argv(argv0, *args):
659
659
  '''(INTERNAL) Return 3-tuple C{(python, '-m', module, *args)}.
660
660
  '''
661
661
  o = _MODS.os
662
- m = o.path.dirname(argv0)
663
- m = m.replace(o.getcwd(), _ELLIPSIS_) \
664
- .replace(o.sep, _DOT_).strip()
665
- b = o.path.basename(argv0)
666
- b, x = o.path.splitext(b)
662
+ p = o.path
663
+ m = p.dirname(argv0).replace(o.getcwd(), _ELLIPSIS_) \
664
+ .replace(o.sep, _DOT_).strip()
665
+ b, x = p.splitext(p.basename(argv0))
667
666
  if x == '.py' and b != _DMAIN_:
668
667
  m = _DOT_(m or _pygeodesy_, b)
669
668
  p = NN(_python_, _MODS.sys_version_info2[0])
@@ -710,7 +709,7 @@ def _versions(sep=_SPACE_):
710
709
 
711
710
 
712
711
  __all__ = tuple(map(typename, (machine, print_, printf, typename)))
713
- __version__ = '25.09.05'
712
+ __version__ = '25.10.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, _0_0, \
149
- _1_16th, _1_0, _2_0, _180_0, _N_180_0, _360_0
148
+ from pygeodesy.constants import NAN, _isfinite as _math_isfinite, \
149
+ _0_0, _1_0, _2_0, _180_0, _N_180_0, _360_0
150
150
  from pygeodesy.errors import GeodesicError, _ValueError, _xkwds
151
151
  from pygeodesy.fmath import cbrt, fremainder, norm2 # Fhorner, Fsum
152
152
  from pygeodesy.internals import _getenv, _popen2, _PYGEODESY_ENV, typename, \
@@ -165,8 +165,9 @@ from pygeodesy.utily import atan2d, sincos2d, tand, _unrollon, fabs
165
165
  # from math import fabs # from .utily
166
166
 
167
167
  __all__ = _ALL_LAZY.karney
168
- __version__ = '25.08.31'
168
+ __version__ = '25.09.13'
169
169
 
170
+ _1_16th = _1_0 / 16
170
171
  _2_4_ = '2.4'
171
172
  _K_2_0 = _getenv(_PYGEODESY_ENV(typename(_xgeographiclib)[2:]), _2_)
172
173
  _K_2_4 = _K_2_0 == _2_4_
@@ -723,11 +724,10 @@ def _around(x): # in .utily.sincos2d
723
724
  try:
724
725
  return _wrapped.Math.AngRound(x)
725
726
  except AttributeError:
726
- b, a = _1_16th, fabs(x)
727
- if a < b:
728
- a -= b
729
- a += b
730
- x = _copysign(a, x)
727
+ z = _1_16th
728
+ w = z - fabs(x)
729
+ if w > 0: # don't "simplify" z - (z - x) to x
730
+ x = _copysign(z - w, x)
731
731
  return x
732
732
 
733
733
 
@@ -772,13 +772,13 @@ def _diff182(deg0, deg, K_2_0=False):
772
772
  try:
773
773
  return _wrapped.Math.AngDiff(deg0, deg)
774
774
  except AttributeError:
775
- if K_2_0 or _K_2_0: # geographiclib 2.0
776
- _r, _360 = fremainder, _360_0
777
- d, t = _sum2(_r(-deg0, _360),
778
- _r( deg, _360))
779
- d, t = _sum2(_r( d, _360), t)
775
+ if K_2_0 or _K_2_0: # geographiclib 2.0+
776
+ _r = fremainder
777
+ d, t = _sum2(_r(-deg0, _360_0),
778
+ _r( deg, _360_0))
779
+ d, t = _sum2(_r( d, _360_0), t)
780
780
  if _isin(d, _0_0, _180_0, _N_180_0):
781
- d = _copysign(d, -t if t else (deg - deg0))
781
+ d = _copysign(d, (-t) if t else (deg - deg0))
782
782
  else:
783
783
  _n = _norm180
784
784
  d, t = _sum2(_n(-deg0), _n(deg))
pygeodesy/named.py CHANGED
@@ -1247,7 +1247,7 @@ def modulename(clas, prefixed=None): # in .basics._xversion
1247
1247
  '''Return the class name optionally prefixed with the
1248
1248
  module name.
1249
1249
 
1250
- @arg clas: The class (any C{class}).
1250
+ @arg clas: The class (any C{class} or C{str}).
1251
1251
  @kwarg prefixed: Include the module name (C{bool}), see
1252
1252
  function C{classnaming}.
1253
1253
 
pygeodesy/streprs.py CHANGED
@@ -22,7 +22,7 @@ from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS
22
22
  from math import fabs, log10 as _log10
23
23
 
24
24
  __all__ = _ALL_LAZY.streprs
25
- __version__ = '25.04.14'
25
+ __version__ = '25.10.10'
26
26
 
27
27
  _at_ = 'at' # PYCHOK used!
28
28
  _EN_PREC = 6 # max MGRS/OSGR precision, 1 micrometer
@@ -545,22 +545,22 @@ def unstr(where, *args, **kwds_):
545
545
  @arg where: Class, function, method (C{type}) or name (C{str}).
546
546
  @arg args: Optional positional arguments.
547
547
  @kwarg kwds_: Optional keyword arguments, except C{B{_Cdot}=None},
548
- C{B{_ELLIPSIS}=False} and C{B{_fmt}=Fmt.g}.
548
+ C{B{_ELLIPSIS}=False}, C{B{_fmt}=Fmt.g} and C{B{_prec}=6}.
549
549
 
550
550
  @return: Representation (C{str}).
551
551
  '''
552
- def _C_e_g_kwds3(_Cdot=None, _ELLIPSIS=0, _fmt=Fmt.g, **kwds):
553
- return _Cdot, _ELLIPSIS, _fmt, kwds
552
+ def _C_e_fmt_prec_kwds(_Cdot=None, _ELLIPSIS=0, _fmt=Fmt.g, _prec=6, **kwds):
553
+ return _Cdot, _ELLIPSIS, dict(fmt=_fmt, prec=_prec), kwds
554
554
 
555
- C, e, g, kwds = _C_e_g_kwds3(**kwds_)
555
+ C, e, fmt_prec, kwds = _C_e_fmt_prec_kwds(**kwds_)
556
556
  if e and len(args) > (e + 1):
557
- t = reprs(args[:e], fmt=g)
557
+ t = reprs(args[:e], **fmt_prec)
558
558
  t += _ELLIPSIS_,
559
- t += reprs(args[-1:], fmt=g)
559
+ t += reprs(args[-1:], **fmt_prec)
560
560
  else:
561
- t = reprs(args, fmt=g) if args else ()
561
+ t = reprs(args, **fmt_prec) if args else ()
562
562
  if kwds:
563
- t += pairs(itemsorted(kwds), fmt=g)
563
+ t += pairs(itemsorted(kwds), **fmt_prec)
564
564
  n = where if isstr(where) else typename(where) # _NN_
565
565
  if C and hasattr(C, n):
566
566
  try: # bound method of class C?
pygeodesy/trf.py CHANGED
@@ -71,7 +71,7 @@ en/how-to-deal-with-etrs89-datum-and-time-dependent-transformation-parameters-45
71
71
 
72
72
  from pygeodesy.basics import _isin, map1, neg, isidentifier, isstr, _xinstanceof, \
73
73
  _xscalar, typename
74
- from pygeodesy.constants import _float as _F, _0_0s, _0_0, _0_001, _0_5, _1_0
74
+ from pygeodesy.constants import _float as _F, _0_0s, _0_0, _0_001, _0_5, _0_75, _1_0
75
75
  from pygeodesy.datums import Datums, _earth_datum, _equall, _GDA2020_, _Names7, \
76
76
  _negastr, Transform, _WGS84, _EWGS84, _operator
77
77
  # from pygeodesy.ellipsoids import _EWGS84 # from .datums
@@ -93,7 +93,7 @@ from math import ceil as _ceil, fabs
93
93
  # import operator as _operator # from .datums
94
94
 
95
95
  __all__ = _ALL_LAZY.trf
96
- __version__ = '25.05.12'
96
+ __version__ = '25.09.11'
97
97
 
98
98
  _EP0CH = Epoch(0, low=0)
99
99
  _Es = {_EP0CH: _EP0CH} # L{Epoch}s, deleted below
@@ -1336,7 +1336,7 @@ _trfX(_ITRF2020_, _ITRF94_, epoch=_E(2015),
1336
1336
  xform=_X( 6.5, -3.9, -77.9, 3.98, _0_0, _0_0, 0.36),
1337
1337
  rates=_R( 0.1, -0.6, -3.1, 0.12, _0_0, _0_0, 0.02))
1338
1338
  _trfX(_ITRF2020_, _ITRF93_, epoch=_E(2015),
1339
- xform=_X( -65.8, 1.9, -71.3, 4.47, -3.36, -4.33, 0.75),
1339
+ xform=_X( -65.8, 1.9, -71.3, 4.47, -3.36, -4.33, _0_75),
1340
1340
  rates=_R( -2.8, -0.2, -2.3, 0.12, -0.11, -0.19, 0.07))
1341
1341
  _trfX(_ITRF2020_, _ITRF92_, epoch=_E(2015),
1342
1342
  xform=_X( 14.5, -1.9, -85.9, 3.27, _0_0, _0_0, 0.36),
@@ -1459,7 +1459,7 @@ _trfX(_ITRF2000_, _ITRF93_, epoch=_E(1988),
1459
1459
  xform=_X( 12.7, 6.5, -20.9, 1.95, -0.39, 0.8, -1.14),
1460
1460
  rates=_R( -2.9, -0.2, -0.6, 0.01, -0.11, -0.19, 0.07))
1461
1461
  _trfX(_ITRF2000_, _ITRF92_, epoch=_E(1988),
1462
- xform=_X( 1.47, 1.35, -1.39, 0.75, _0_0, _0_0, -0.18),
1462
+ xform=_X( 1.47, 1.35, -1.39, _0_75, _0_0, _0_0, -0.18),
1463
1463
  rates=_R( _0_0, -0.06, -0.14, 0.01, _0_0, _0_0, 0.02))
1464
1464
  _trfX(_ITRF2000_, _ITRF91_, epoch=_E(1988),
1465
1465
  xform=_X( 26.7, 27.5, -19.9, 2.15, _0_0, _0_0, -0.18),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pygeodesy
3
- Version: 25.9.9
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), conversions and unrolling, among other things.
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) polygons.
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.13.7 (with geographiclib_ 2.1), 3.12.7 (with geographiclib_ 2.0, numpy_ 2.1.0,
124
- scipy_ 1.14.1, GeodSolve_ 2.5, IntersectTool_ 2.5 and RhumbSolve_ 2.5), 3.11.5 (with geographiclib_ 2.0,
125
- numpy_ 1.24.2 and scipy_ 1.10.1), Python 3.10.8 (with geographiclib_ 2.0, numpy_ 1.23.3, scipy_ 1.9.1,
126
- GeoConvert_ 2.5, GeodSolve_ 2.5), Python 3.9.6 and Python 2.7.18 (with geographiclib_ 1.50, numpy_ 1.16.6,
127
- scipy_ 1.2.2, GeoConvert_ 2.5, GeodSolve_ 2.5, IntersectTool_ 2.5 and RhumbSolve_ 2.5), all on macOS 15.6.1
128
- Sequoia in 64-bit.
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.13.7, 3.12.7, 3.11.5 and 3.10.8 run on Apple M4 Si (``arm64``), *natively*. Python 2.7.18 runs
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.6.1 using Python 3.13.7, 3.12.7, 3.11.5 and 3.10.8. The
138
- complete coverage report in HTML and a PDF summary are included in the distribution files.
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-5, 3.12.0-6, 3.11.2-4, 3.10.1-7, 3.9.1, 3.8.7, 3.7.1, 2.7.15,
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-5 Sequoia, 14.0-6.1 Sonoma, 13.0-5.2 Ventura, 12.1-6 Monterey, 11.0-5.2-6.1 Big
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.5 and with PyChecker_, PyFlakes_,
164
- PyCodeStyle_ (formerly Pep8) and McCabe_ using Python 2.7.18, both in 64-bit on macOS 15.6.1 Sequoia only.
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: Sep 09, 2025.*
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=IWSswTDqZR-HX68gyWXtq3a9e7f6DCQks4QpwJzZKTc,42337
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=acwIA1B7jmg1oDpJBuFitnOVHUWRUk7Y73yI8zqIGrc,49854
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=iOuKYv9_4-puEiUX6EuuKmBxhwXZLl2s_bLCefiAgAk,20652
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=R_-SY6W1kzRg-dc4xIM0jBOOUwUCTx46r4ovrPQxYIs,45518
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=_buzd1LyldAPa-RTFlohwkkFChTO10Yyk5IrP1kZ6kE,46797
29
- pygeodesy/fmath.py,sha256=IbXQiGoj5MH-fbdBC1BJQMx_1WVFr05Vzpt78LrhbT4,37788
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=1P9-k9sMN-ZVFr2iWbQpFi1lg3uNmChHFCIfETkgFJU,40153
39
- pygeodesy/geoids.py,sha256=OQvOVutr8R1CalStgxmNu2Mk3oMl4zpCY_OKh0KHpI8,86125
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=_Pn-6w4gGzdXCoA6m72rJm4hb-Fe2vxc8RiRRjq5iTI,41002
42
- pygeodesy/internals.py,sha256=HWSgcAuhoLHpTpOv0efGKd0Gb0rZqQbeapsr_DXWggk,24717
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=AlEwFlnj-gLwfGjoHGyyDj111tZE5_7pz19avsuGVK0,41626
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=Ivv_O2N-haps9GwrfMQuhM-zenTkceyNGw5hT5b8coU,52777
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=-4LErmfPLtGt1tLDBHhJam-zYq8p2Z2C5wDCMELEml4,23599
66
- pygeodesy/trf.py,sha256=gpsOJVER1KhITOtyiENQ4EnRONinLkzbujsfzzxHVv8,119209
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=Agny4JdMTBRkOPskWjpNzc3609ezJWRWVvLdFCm3uPE,60352
108
- pygeodesy/geodesicx/gxarea.py,sha256=UgniZh-WGteC86mMT7tWO_AG05gYJ5n4136cCk8hitc,19571
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.9.9.dist-info/METADATA,sha256=zUFYEcoqpmFzxV3TQ7Pe_bXu__9khC3lO21AD_FVny4,20186
117
- pygeodesy-25.9.9.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
118
- pygeodesy-25.9.9.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
119
- pygeodesy-25.9.9.dist-info/RECORD,,
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,,