pygeodesy 25.4.25__py2.py3-none-any.whl → 25.5.25__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.
Files changed (85) hide show
  1. pygeodesy/__init__.py +191 -189
  2. pygeodesy/__main__.py +2 -2
  3. pygeodesy/albers.py +4 -4
  4. pygeodesy/auxilats/_CX_Rs.py +3 -3
  5. pygeodesy/auxilats/auxAngle.py +2 -2
  6. pygeodesy/auxilats/auxDLat.py +2 -2
  7. pygeodesy/auxilats/auxDST.py +2 -2
  8. pygeodesy/auxilats/auxLat.py +2 -2
  9. pygeodesy/auxilats/auxily.py +2 -2
  10. pygeodesy/azimuthal.py +2 -2
  11. pygeodesy/basics.py +1 -1
  12. pygeodesy/booleans.py +8 -8
  13. pygeodesy/cartesianBase.py +7 -6
  14. pygeodesy/clipy.py +2 -2
  15. pygeodesy/constants.py +2 -2
  16. pygeodesy/datums.py +2 -2
  17. pygeodesy/deprecated/__init__.py +8 -8
  18. pygeodesy/deprecated/bases.py +2 -2
  19. pygeodesy/deprecated/rhumbBase.py +2 -2
  20. pygeodesy/deprecated/rhumbaux.py +2 -2
  21. pygeodesy/deprecated/rhumbsolve.py +2 -2
  22. pygeodesy/deprecated/rhumbx.py +2 -2
  23. pygeodesy/ecef.py +15 -26
  24. pygeodesy/ecefLocals.py +186 -0
  25. pygeodesy/ellipsoidalBase.py +2 -2
  26. pygeodesy/ellipsoidalBaseDI.py +7 -6
  27. pygeodesy/ellipsoidalExact.py +3 -3
  28. pygeodesy/ellipsoidalNvector.py +4 -4
  29. pygeodesy/ellipsoidalVincenty.py +15 -14
  30. pygeodesy/ellipsoids.py +23 -30
  31. pygeodesy/elliptic.py +2 -2
  32. pygeodesy/errors.py +1 -1
  33. pygeodesy/etm.py +2 -2
  34. pygeodesy/fmath.py +28 -13
  35. pygeodesy/formy.py +2 -2
  36. pygeodesy/frechet.py +5 -5
  37. pygeodesy/fstats.py +2 -2
  38. pygeodesy/fsums.py +38 -29
  39. pygeodesy/gars.py +2 -3
  40. pygeodesy/geodesici.py +4 -4
  41. pygeodesy/geodesicx/__init__.py +3 -3
  42. pygeodesy/geodesicx/gx.py +2 -2
  43. pygeodesy/geodesicx/gxarea.py +2 -2
  44. pygeodesy/geodesicx/gxline.py +2 -2
  45. pygeodesy/geoids.py +5 -5
  46. pygeodesy/hausdorff.py +4 -4
  47. pygeodesy/heights.py +2 -2
  48. pygeodesy/iters.py +1 -1
  49. pygeodesy/karney.py +2 -2
  50. pygeodesy/ktm.py +2 -2
  51. pygeodesy/latlonBase.py +10 -8
  52. pygeodesy/lazily.py +46 -22
  53. pygeodesy/lcc.py +2 -2
  54. pygeodesy/ltp.py +54 -57
  55. pygeodesy/ltpTuples.py +34 -35
  56. pygeodesy/mgrs.py +3 -3
  57. pygeodesy/named.py +2 -147
  58. pygeodesy/namedTuples.py +3 -3
  59. pygeodesy/nvectorBase.py +2 -2
  60. pygeodesy/osgr.py +2 -2
  61. pygeodesy/points.py +2 -3
  62. pygeodesy/props.py +16 -16
  63. pygeodesy/resections.py +90 -82
  64. pygeodesy/rhumb/aux_.py +2 -2
  65. pygeodesy/rhumb/bases.py +3 -3
  66. pygeodesy/rhumb/ekx.py +3 -4
  67. pygeodesy/rhumb/solve.py +2 -2
  68. pygeodesy/simplify.py +2 -2
  69. pygeodesy/solveBase.py +2 -2
  70. pygeodesy/sphericalBase.py +6 -6
  71. pygeodesy/sphericalNvector.py +2 -2
  72. pygeodesy/sphericalTrigonometry.py +6 -5
  73. pygeodesy/trf.py +4 -4
  74. pygeodesy/triaxials.py +2 -2
  75. pygeodesy/units.py +7 -8
  76. pygeodesy/utily.py +2 -2
  77. pygeodesy/utmupsBase.py +55 -33
  78. pygeodesy/vector2d.py +16 -10
  79. pygeodesy/vector3d.py +3 -3
  80. pygeodesy/webmercator.py +2 -2
  81. {pygeodesy-25.4.25.dist-info → pygeodesy-25.5.25.dist-info}/METADATA +20 -19
  82. pygeodesy-25.5.25.dist-info/RECORD +119 -0
  83. pygeodesy-25.4.25.dist-info/RECORD +0 -118
  84. {pygeodesy-25.4.25.dist-info → pygeodesy-25.5.25.dist-info}/WHEEL +0 -0
  85. {pygeodesy-25.4.25.dist-info → pygeodesy-25.5.25.dist-info}/top_level.txt +0 -0
pygeodesy/units.py CHANGED
@@ -7,18 +7,17 @@ L{Feet}, L{Meter}, L{Radians}, etc.
7
7
  '''
8
8
 
9
9
  from pygeodesy.basics import isscalar, issubclassof, signOf, typename
10
- from pygeodesy.constants import EPS, EPS1, PI, PI2, PI_2, _umod_360, _0_0, \
11
- _0_001, _0_5, INT0 # PYCHOK for .mgrs, .namedTuples
10
+ from pygeodesy.constants import EPS, EPS1, PI, PI2, PI_2, _umod_360, _0_0, _0_001
12
11
  from pygeodesy.dms import F__F, F__F_, S_NUL, S_SEP, parseDMS, parseRad, _toDMS
13
12
  from pygeodesy.errors import _AssertionError, TRFError, UnitError, _xattr, _xcallable
14
13
  # from pygeodesy.internals import typename # from .basics
15
14
  from pygeodesy.interns import NN, _azimuth_, _band_, _bearing_, _COMMASPACE_, \
16
15
  _degrees_, _degrees2_, _distance_, _E_, _easting_, \
17
- _epoch_, _EW_, _feet_, _height_, _lam_, _lat_, _LatLon_, \
18
- _lon_, _meter_, _meter2_, _N_, _negative_, _northing_, \
16
+ _epoch_, _EW_, _feet_, _height_, _lam_, _lat_, _lon_, \
17
+ _meter_, _meter2_, _N_, _negative_, _northing_, _radians_, \
19
18
  _NS_, _NSEW_, _number_, _PERCENT_, _phi_, _precision_, \
20
- _radians_, _radians2_, _radius_, _S_, _scalar_, \
21
- _units_, _W_, _zone_, _std_ # PYCHOK used!
19
+ _radians2_, _radius_, _S_, _scalar_, \
20
+ _W_, _zone_, _std_ # PYCHOK used!
22
21
  from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS
23
22
  # from pygeodesy.named import _name__ # _MODS
24
23
  from pygeodesy.props import Property_RO
@@ -28,7 +27,7 @@ from pygeodesy.unitsBase import Float, Int, _NamedUnit, Radius, Str, Fmt, fstr
28
27
  from math import degrees, isnan, radians
29
28
 
30
29
  __all__ = _ALL_LAZY.units
31
- __version__ = '25.04.14'
30
+ __version__ = '25.05.12'
32
31
 
33
32
 
34
33
  class Float_(Float):
@@ -861,7 +860,7 @@ def _std_repr(*Classes):
861
860
  '''
862
861
  from pygeodesy.internals import _getenv
863
862
  for C in Classes:
864
- if hasattr(C, typename(_std_repr)): # PYCHOK del _std_repr
863
+ if hasattr(C, typename(_std_repr)): # noqa: F821 del
865
864
  env = 'PYGEODESY_%s_STD_REPR' % (typename(C).upper(),)
866
865
  if _getenv(env, _std_).lower() != _std_:
867
866
  C._std_repr = False
pygeodesy/utily.py CHANGED
@@ -9,7 +9,7 @@ and U{Vector-based geodesy<https://www.Movable-Type.co.UK/scripts/latlong-vector
9
9
  and published under the same MIT Licence**.
10
10
  '''
11
11
  # make sure int/int division yields float quotient, see .basics
12
- from __future__ import division as _; del _ # PYCHOK semicolon
12
+ from __future__ import division as _; del _ # noqa: E702 ;
13
13
 
14
14
  from pygeodesy.basics import _copysign, isinstanceof, isint, isstr
15
15
  from pygeodesy.constants import EPS, EPS0, INF, NAN, PI, PI2, PI_2, R_M, \
@@ -28,7 +28,7 @@ from math import acos, asin, atan2 as _atan2, cos, degrees, fabs, radians, \
28
28
  sin, tan as _tan # pow
29
29
 
30
30
  __all__ = _ALL_LAZY.utily
31
- __version__ = '25.04.14'
31
+ __version__ = '25.05.12'
32
32
 
33
33
  _G_DEG = _float( 400.0 / _360_0) # grades per degree
34
34
  _G_RAD = _float( 400.0 / PI2) # grades per radian
pygeodesy/utmupsBase.py CHANGED
@@ -5,10 +5,10 @@ u'''(INTERNAL) Private class C{UtmUpsBase}, functions and constants
5
5
  for modules L{epsg}, L{etm}, L{mgrs}, L{ups} and L{utm}.
6
6
  '''
7
7
  # make sure int/int division yields float quotient, see .basics
8
- from __future__ import division as _; del _ # PYCHOK semicolon
8
+ from __future__ import division as _; del _ # noqa: E702 ;
9
9
 
10
- from pygeodesy.basics import _isin, isint, isscalar, isstr, neg_, \
11
- _xinstanceof, _xsubclassof
10
+ from pygeodesy.basics import _copysign, _isin, isint, isscalar, isstr, \
11
+ neg_, _xinstanceof, _xsubclassof
12
12
  from pygeodesy.constants import _float, _0_0, _0_5, _N_90_0, _180_0
13
13
  from pygeodesy.datums import _ellipsoidal_datum, _WGS84
14
14
  from pygeodesy.dms import degDMS, parseDMS2
@@ -29,10 +29,10 @@ from pygeodesy.streprs import Fmt, fstr, _fstrENH2, _xzipairs
29
29
  from pygeodesy.units import Band, Easting, Lat, Northing, Phi, Scalar, Zone
30
30
  from pygeodesy.utily import atan1, _Wrap, wrap360
31
31
 
32
- from math import cos, degrees, fabs, sin, tan
32
+ from math import cos, degrees, fabs, sin, tan # copysign as _copysign
33
33
 
34
34
  __all__ = _ALL_LAZY.utmupsBase
35
- __version__ = '25.04.25'
35
+ __version__ = '25.05.12'
36
36
 
37
37
  _UPS_BANDS = _A_, _B_, _Y_, _Z_ # UPS polar bands SE, SW, NE, NW
38
38
  # _UTM_BANDS = _MODS.utm._Bands
@@ -195,43 +195,65 @@ class UtmUpsBase(_NamedBase):
195
195
  self._notOverloaded(self)
196
196
 
197
197
  def _footpoint(self, y, lat0, makris):
198
- '''(INTERNAL) Compute to foot-point latitude in C{radians}.
198
+ '''(INTERNAL) Return the foot-point latitude in C{radians}.
199
199
  '''
200
+ F = _MODS.fsums.Fsum
201
+ E = self.datum.ellipsoid
200
202
  if y is None:
201
203
  _, y = self.eastingnorthing2(falsed=False)
202
- S = _MODS.fsums.Fsum
203
- E = self.datum.ellipsoid
204
- P = S(E.Llat(lat0), y)
204
+ B = F(E.Llat(lat0), y)
205
205
  if E.isSpherical:
206
- p = P.fover(E.a)
206
+ r = B.fover(E.a) # == E.b
207
+
207
208
  elif makris:
208
- r = P.fover(E.b)
209
- p = fabs(r)
210
- if p:
209
+ b = B.fover(E.b)
210
+ r = fabs(b)
211
+ if r:
211
212
  e2 = E.e22 # E.e22abs?
212
213
  e4 = E.e4
213
214
 
214
- e1 = S(e2 / 4, -11 / 64 * e4, -1).as_iscalar
215
- e2 = S(e2 / 8, -13 / 128 * e4) .as_iscalar
216
- e4 *= cos(p)**2 / 8
217
-
218
- s = sin(p * 2)
219
- p = -p
220
- U = S(e1 * p, e2 * s, e4 * p, (5 / 8 * e4) * s**2)
221
- p = atan1(E.a * tan(float(U)) / E.b)
222
- if r < 0: # copysign(p, y)
223
- p = -p
224
- else: # PyGeodetics
215
+ e1 = F(-1, e2 / 4, -11 / 64 * e4).as_iscalar
216
+ e2 = F( e2 / 8, -13 / 128 * e4).as_iscalar
217
+ e4 *= cos(r)**2 / 8
218
+
219
+ s = sin(r * 2)
220
+ r = -r
221
+ U = F(e1 * r, e2 * s, e4 * r, e4 / 8 * 5 * s**2)
222
+ r = _copysign(atan1(E.a * tan(float(U)) / E.b), b)
223
+
224
+ # elif clins: # APRIL-ZJU/clins/include/utils/gps_convert_utils.h
225
+ # n = E.n
226
+ # n2 = n**2
227
+ # n3 = n**3
228
+ # n4 = n**4
229
+ # n5 = n**5
230
+ # A = F(1, n2 / 4, n4 / 64).fmul((E.a + E.b) / 2)
231
+ # r = B.fover(A)
232
+ # R = F(r)
233
+ # if clins: # FootpointLatitude, GPS-Theory-Practice, 1994
234
+ # R += F(3 / 2 * n, -27 / 32 * n3, 269 / 512 * n5).fmul(sin(r * 2))
235
+ # R += F( 21 / 16 * n2, -55 / 32 * n4).fmul(sin(r * 4))
236
+ # R += F( 151 / 96 * n3, -417 / 128 * n5).fmul(sin(r * 6))
237
+ # R += (1097 / 512 * n4) * sin(r * 8)
238
+ # else: # GPS-Theory-Practice, 1992, page 234-235
239
+ # R += F(-3 / 2 * n, 9 / 16 * n3, -3 / 32 * n5).fmul(sin(r * 2))
240
+ # R += F( 15 / 16 * n2, -15 / 32 * n4).fmul(sin(r * 4))
241
+ # R += F( -35 / 48 * n3, 105 / 256 * n4).fmul(sin(r * 6)) # n5?
242
+ # r = float(R)
243
+
244
+ else: # PyGeodetics/src/geodetics/footpoint_latitude.py
225
245
  f = E.f
226
246
  f2 = f**2
227
247
  f3 = f**3
228
- B0 = S(1, -f / 2, f2 / 16, f3 / 32) * E.a
229
- r = P.fover(B0)
230
- P = S(r, S(3 / 4 * f, 3 / 8 * f2, 21 / 256 * f3) * sin(r * 2),
231
- S( 21 / 64 * f2, 21 / 64 * f3) * sin(r * 4),
232
- 151 / 768 * f3 * sin(r * 6))
233
- p = float(P)
234
- return p
248
+ B0 = F(1, -f / 2, f2 / 16, f3 / 32).fmul(E.a)
249
+ r = B.fover(B0)
250
+ R = F(r)
251
+ R += F(3 / 4 * f, 3 / 8 * f2, 21 / 256 * f3).fmul(sin(r * 2))
252
+ R += F( 21 / 64 * f2, 21 / 64 * f3).fmul(sin(r * 4))
253
+ R += (151 / 768 * f3) * sin(r * 6)
254
+ r = float(R)
255
+
256
+ return r
235
257
 
236
258
  @Property_RO
237
259
  def gamma(self):
@@ -251,8 +273,8 @@ class UtmUpsBase(_NamedBase):
251
273
  def latFootPoint(self, northing=None, lat0=0, makris=False):
252
274
  '''Compute the foot-point latitude in C{degrees}.
253
275
 
254
- @arg northing: Northing (C{meter}, same units this datum's ellipsoid's axes),
255
- overriding this I{unfalsed} northing.
276
+ @arg northing: Northing (C{meter}, same units this ellipsoid's axes),
277
+ overriding this northing, I{unfalsed}.
256
278
  @kwarg lat0: Geodetic latitude of the meridian's origin (C{degrees}).
257
279
  @kwarg makris: If C{True}, use C{Makris}' formula, otherwise C{PyGeodetics}'.
258
280
 
pygeodesy/vector2d.py CHANGED
@@ -2,8 +2,8 @@
2
2
  # -*- coding: utf-8 -*-
3
3
 
4
4
  u'''2- or 3-D vectorial functions L{circin6}, L{circum3}, L{circum4_},
5
- L{iscolinearWith}, L{meeus2}, L{nearestOn}, L{radii11}, L{soddy4},
6
- L{triaxum5} and L{trilaterate2d2}.
5
+ L{iscolinearWith}, L{meeus2}, L{radii11}, L{soddy4}, L{triaxum5} and
6
+ L{trilaterate2d2}.
7
7
 
8
8
  @note: Functions L{circin6}, L{circum3}, L{circum4_}, L{soddy4} and
9
9
  L{triaxum5} require U{numpyhttps://PyPI.org/project/numpy>}
@@ -16,7 +16,7 @@ from pygeodesy.constants import EPS, EPS0, EPS02, EPS4, INF, INT0, \
16
16
  _1_0, _1_0_1T, _N_1_0, _2_0, _N_2_0, _4_0
17
17
  from pygeodesy.errors import _and, _AssertionError, IntersectionError, NumPyError, \
18
18
  PointsError, TriangleError, _xError, _xkwds
19
- from pygeodesy.fmath import fabs, fdot, fdot_, hypot, hypot2_, sqrt
19
+ from pygeodesy.fmath import fabs, fdot, Fdot_, fdot_, hypot, hypot2_, sqrt
20
20
  from pygeodesy.fsums import _Fsumf_, fsumf_, fsum1f_
21
21
  # from pygeodesy.internals import typename # from .basics
22
22
  from pygeodesy.interns import NN, _a_, _and_, _b_, _c_, _center_, _coincident_, \
@@ -24,19 +24,19 @@ from pygeodesy.interns import NN, _a_, _and_, _b_, _c_, _center_, _coincident_,
24
24
  _intersection_, _invalid_, _near_, _no_, _of_, \
25
25
  _radius_, _rIn_, _s_, _SPACE_, _too_, _with_
26
26
  # from pygeodesy.lazily import _ALL_LAZY # from .named
27
- from pygeodesy.named import _ALL_LAZY, _NamedTuple, _Pass, Property_RO
27
+ from pygeodesy.named import _ALL_LAZY, _NamedTuple, _Pass
28
28
  from pygeodesy.namedTuples import LatLon3Tuple, Vector2Tuple
29
- # from pygeodesy.props import Property_RO # from .named
29
+ from pygeodesy.props import deprecated_function, Property_RO
30
30
  from pygeodesy.streprs import Fmt, unstr
31
31
  from pygeodesy.units import Float, Int, Meter, Radius, Radius_
32
- from pygeodesy.vector3d import iscolinearWith, nearestOn, _nearestOn2, _nVc, \
33
- _otherV3d, trilaterate3d2, Vector3d # PYCHOK unused
32
+ from pygeodesy.vector3d import _nearestOn2, _nVc, _otherV3d, trilaterate3d2, \
33
+ Vector3d, nearestOn as _nearestOn3d # DEPRECATED
34
34
 
35
35
  from contextlib import contextmanager
36
36
  # from math import fabs, sqrt # from .fmath
37
37
 
38
38
  __all__ = _ALL_LAZY.vector2d
39
- __version__ = '25.04.16'
39
+ __version__ = '25.05.09'
40
40
 
41
41
  _cA_ = 'cA'
42
42
  _cB_ = 'cB'
@@ -395,6 +395,12 @@ def _meeus4(A, point2, point3, circum=False, useZ=True, clas=None, **clas_kwds):
395
395
  return r, t, p2, p3
396
396
 
397
397
 
398
+ @deprecated_function
399
+ def nearestOn(point, point1, point2, **within_useZ_Vector_and_kwds):
400
+ '''DEPRECATED on 2025.05.06, use L{pygeodesy.nearestOn<pygeodesy.vector3d.nearestOn>}.'''
401
+ return _nearestOn3d(point, point1, point2, **within_useZ_Vector_and_kwds)
402
+
403
+
398
404
  class _numpy(object): # see also .formy._idllmn6, .geodesicw._wargs, .latlonBase._toCartesian3
399
405
  '''(INTERNAL) Partial C{NumPy} wrapper.
400
406
  '''
@@ -755,8 +761,8 @@ def _trilaterate2d2(x1, y1, radius1, x2, y2, radius2, x3, y3, radius3,
755
761
  raise IntersectionError(_and(_astr(x1=x1, y1=y1, radius1=r1),
756
762
  _astr(x2=x2, y2=y2, radius2=r2),
757
763
  _astr(x3=x3, y3=y3, radius3=r3)), txt=t)
758
- t = Vector2Tuple(fdot_(c, e, -b, f) / q,
759
- fdot_(a, f, -c, d) / q, name=typename(trilaterate2d2))
764
+ t = Vector2Tuple(Fdot_(c, e, -b, f).fover(q),
765
+ Fdot_(a, f, -c, d).fover(q), name=typename(trilaterate2d2))
760
766
 
761
767
  if eps and eps > 0: # check distances to center vs radius
762
768
  for x, y, r in ((x1, y1, r1), (x2, y2, r2), (x3, y3, r3)):
pygeodesy/vector3d.py CHANGED
@@ -3,8 +3,8 @@
3
3
 
4
4
  u'''Extended 3-D vector class L{Vector3d} and functions.
5
5
 
6
- Function L{intersection3d3}, L{intersections2}, L{parse3d}, L{sumOf} and
7
- L{trilaterate3d2}.
6
+ Functions L{intersection3d3}, L{intersections2}, L{nearestOn}, L{parse3d},
7
+ L{sumOf} and L{trilaterate3d2}.
8
8
  '''
9
9
 
10
10
  from pygeodesy.constants import EPS, EPS0, EPS1, EPS4, INT0, isnear0, \
@@ -32,7 +32,7 @@ from pygeodesy.vector3dBase import Vector3dBase
32
32
  # from math import fabs, sqrt # from .fmath
33
33
 
34
34
  __all__ = _ALL_LAZY.vector3d
35
- __version__ = '25.04.21'
35
+ __version__ = '25.05.07'
36
36
 
37
37
  _vector2d = _MODS.into(vector2d=__name__)
38
38
 
pygeodesy/webmercator.py CHANGED
@@ -16,7 +16,7 @@ and U{Implementation Practice Web Mercator Map Projection<https://Web.Archive.or
16
16
  http://earth-info.nga.mil/GandG/wgs84/web_mercator/(U)%20NGA_SIG_0011_1.0.0_WEBMERC.pdf>}.
17
17
  '''
18
18
  # make sure int/int division yields float quotient, see .basics
19
- from __future__ import division as _; del _ # PYCHOK semicolon
19
+ from __future__ import division as _; del _ # noqa: E702 ;
20
20
 
21
21
  from pygeodesy.basics import _isin, _splituple, _xinstanceof, typename
22
22
  from pygeodesy.constants import PI_2, R_MA, _2_0
@@ -37,7 +37,7 @@ from pygeodesy.utily import degrees90, degrees180
37
37
  from math import atan, atanh, exp, radians, sin, tanh
38
38
 
39
39
  __all__ = _ALL_LAZY.webmercator
40
- __version__ = '25.04.14'
40
+ __version__ = '25.05.12'
41
41
 
42
42
  # _FalseEasting = 0 # false Easting (C{meter})
43
43
  # _FalseNorthing = 0 # false Northing (C{meter})
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pygeodesy
3
- Version: 25.4.25
3
+ Version: 25.5.25
4
4
  Summary: Pure Python geodesy tools
5
5
  Home-page: https://GitHub.com/mrJean1/PyGeodesy
6
6
  Author: Jean M. Brouwers
@@ -28,9 +28,9 @@ Classifier: Topic :: Scientific/Engineering :: GIS
28
28
  PyGeodesy
29
29
  =========
30
30
 
31
- A pure Python implementation of ``geodesy`` tools for various ellipsoidal and spherical
32
- earth models using precision exact, elliptic, trigonometric, vector-based, iterative and
33
- approximate methods for geodetic (lat-/longitude), geocentric (ECEF_ cartesian) and certain
31
+ A pure Python implementation of ``geodesy`` tools for various ellipsoidal and spherical earth
32
+ models using precision exact, elliptic, trigonometric, vector-based, iterative and approximate
33
+ methods for geodetic (lat-/longitude), geocentric (ECEF_ cartesian), local (LTP_) and certain
34
34
  `triaxial ellipsoidal`_ coordinates.
35
35
 
36
36
  Transcoded in part from `JavaScript originals`_ by *Chris Veness (C) 2005-2024* and from several
@@ -120,10 +120,10 @@ Tests
120
120
  =====
121
121
 
122
122
  The tests ran with Python 3.13.3 (with geographiclib_ 2.0), 3.12.7 (with geographiclib_ 2.0, numpy_ 2.1.0,
123
- scipy_ 1.14.1, GeodSolve_ 2.3, IntersectTool_ 2.3 and RhumbSolve_ 2.3), 3.11.5 (with geographiclib_ 2.0,
123
+ scipy_ 1.14.1, GeodSolve_ 2.5, IntersectTool_ 2.5 and RhumbSolve_ 2.5), 3.11.5 (with geographiclib_ 2.0,
124
124
  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,
125
- GeoConvert_ 2.3, GeodSolve_ 2.3), Python 3.9.6 and Python 2.7.18 (with geographiclib_ 1.50, numpy_ 1.16.6,
126
- scipy_ 1.2.2, GeoConvert_ 2.3, GeodSolve_ 2.3, IntersectTool_ 2.3 and RhumbSolve_ 2.3), all on macOS 15.4.1
125
+ GeoConvert_ 2.5, GeodSolve_ 2.5), Python 3.9.6 and Python 2.7.18 (with geographiclib_ 1.50, numpy_ 1.16.6,
126
+ scipy_ 1.2.2, GeoConvert_ 2.5, GeodSolve_ 2.5, IntersectTool_ 2.5 and RhumbSolve_ 2.5), all on macOS 15.5
127
127
  Sequoia in 64-bit.
128
128
 
129
129
  All tests ran with and without ``lazy import`` for Python 3 and with command line option ``-W default``
@@ -133,11 +133,11 @@ included in the distribution files.
133
133
  Python 3.13.3, 3.12.7, 3.11.5 and 3.10.8 run on Apple M4 Si (``arm64``), *natively*. Python 2.7.18 runs
134
134
  on Intel (``x86_64``) or Intel *emulation* (\"``arm64_x86_64``\", see function `pygeodesy.machine`_).
135
135
 
136
- Test coverage has been measured with coverage_ 7.6.1 using Python 3.13.1, 3.12.7, 3.11.5 and 3.10.8. The
136
+ Test coverage has been measured with coverage_ 7.6.1 using Python 3.13.3, 3.12.7, 3.11.5 and 3.10.8. The
137
137
  complete coverage report in HTML and a PDF summary are included in the distribution files.
138
138
 
139
139
  The tests also ran with Python 3.13.3 (and geographiclib_ 2.0) on `Debian 12`_ in 64-bit only and with
140
- Python 3.12.5 (and geographiclib_ 2.0) on `Windows 2019Server`_ in 64-bit only and with Python 2.7.18
140
+ Python 3.12.8 (and geographiclib_ 2.0) on `Windows 2019Server`_ in 64-bit only and with Python 2.7.18
141
141
  (and with geographiclib_ 1.52) on `Windows 10`_ in 64- and 32-bit.
142
142
 
143
143
  A single-File and single-Directory application with ``pygeodesy`` has been bundled using PyInstaller_ 3.4
@@ -149,22 +149,22 @@ 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
149
149
  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
150
150
  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),
151
151
  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
152
- numpy_ 1.11.3) on macOS 14.0-6.1 Sonoma, 13.0-5.2 Ventura, 12.1-6 Monterey, 11.0-5.2-6.1 Big Sur (aka 10.16),
153
- 10.15.3, 10.15.5-7 Catalina, 10.14 Mojave, 10.13.6 High Sierra and 10.12 Sierra, MacOS X 10.11 El Capitan
154
- and/or MacOS X 10.10 Yosemite, with Pythonista_ 3.2 (with geographiclib 1.50 or 1.49 and numpy 1.8.0) on
155
- iOS 14.4.2, 11.4.1, 12.0-3 on iPad4, iPhone6, iPhone10 and/or iPhone12, with Pythonista_ 3.1 on iOS 10.3.3,
156
- 11.0.3, 11.1.2 and 11.3 on iPad4, all in 64-bit only and with 32-bit Python 2.7.14 on Windows Server 2012R2,
157
- Windows 10 Pro and 32-bit Python 2.6.6 on Windows XP SP3.
152
+ numpy_ 1.11.3) on macOS 15.0-4 Sequoia, 14.0-6.1 Sonoma, 13.0-5.2 Ventura, 12.1-6 Monterey, 11.0-5.2-6.1 Big
153
+ 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
154
+ 10.11 El Capitan and/or MacOS X 10.10 Yosemite, with Pythonista_ 3.2 (with geographiclib 1.50 or 1.49 and
155
+ 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
156
+ on iOS 10.3.3, 11.0.3, 11.1.2 and 11.3 on iPad4, all in 64-bit only and with 32-bit Python 2.7.14 on Windows
157
+ Server 2012R2, Windows 10 Pro and 32-bit Python 2.6.6 on Windows XP SP3.
158
158
 
159
159
  Notes
160
160
  =====
161
161
 
162
- All Python source code has been statically checked_ with PyChecker_, PyFlakes_, PyCodeStyle_ (formerly Pep8)
163
- and McCabe_ using Python 2.7.18 and with Flake8_ using Python 3.11.5, both in 64-bit on macOS 15.4.1 Sequoia.
162
+ All Python source code has been statically checked_ with Ruff_ using Python 3.13.3 and with PyChecker_, PyFlakes_,
163
+ PyCodeStyle_ (formerly Pep8) and McCabe_ using Python 2.7.18, both in 64-bit on macOS 15.5 Sequoia only.
164
164
 
165
165
  For a summary of all *Karney*-based functionality in ``pygeodesy``, see module karney_.
166
166
 
167
- *Last updated: Apr 25, 2025.*
167
+ *Last updated: May 25, 2025.*
168
168
 
169
169
  License
170
170
  =======
@@ -218,7 +218,6 @@ DEALINGS IN THE SOFTWARE.
218
218
  .. _Epydoc: https://PyPI.org/project/epydoc
219
219
  .. _equidistant: https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1AzimuthalEquidistant.html
220
220
  .. _Exact: https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1GeodesicExact.html
221
- .. _Flake8: https://PyPI.org/project/flake8
222
221
  .. _Forster-Hormann-Popa: https://www.ScienceDirect.com/science/article/pii/S259014861930007X
223
222
  .. _Fréchet: https://WikiPedia.org/wiki/Frechet_distance
224
223
  .. _Garefs (GARS): https://WikiPedia.org/wiki/Global_Area_Reference_System
@@ -244,6 +243,7 @@ DEALINGS IN THE SOFTWARE.
244
243
  .. _Latitude/Longitude: https://www.Movable-Type.co.UK/scripts/latlong.html
245
244
  .. _LatLon: https://mrJean1.GitHub.io/PyGeodesy/docs/pygeodesy-LatLon-attributes-table.html
246
245
  .. _Liang-Barsky: https://www.CS.Helsinki.FI/group/goa/viewing/leikkaus/intro.html
246
+ .. _LTP: https://WikiPedia.org/wiki/Local_tangent_plane_coordinates
247
247
  .. _McCabe: https://PyPI.org/project/mccabe
248
248
  .. _MGRS: https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1MGRS.html
249
249
  .. _MIT License: https://OpenSource.org/licenses/MIT
@@ -264,6 +264,7 @@ DEALINGS IN THE SOFTWARE.
264
264
  .. _Ramer-Douglas-Peucker: https://WikiPedia.org/wiki/Ramer-Douglas-Peucker_algorithm
265
265
  .. _Reumann-Witkam: https://psimpl.SourceForge.net/reumann-witkam.html
266
266
  .. _RhumbSolve: https://GeographicLib.SourceForge.io/C++/doc/utilities.html
267
+ .. _Ruff: https://GitHub.com/astral-sh/ruff
267
268
  .. _scipy: https://PyPI.org/project/scipy
268
269
  .. _simplify: https://Bost.Ocks.org/mike/simplify
269
270
  .. _Sutherland-Hodgman: https://WikiPedia.org/wiki/Sutherland-Hodgman_algorithm
@@ -0,0 +1,119 @@
1
+ pygeodesy/LICENSE,sha256=YfgAiyxOwY6P9Kkb1_5XN81nueTLrpb3Ffkv3EuPgFU,1144
2
+ pygeodesy/__init__.py,sha256=lJoIhQqDE5sqmoU2P-S8CbYP2AR1CEMSqZvNu9ulO4U,42290
3
+ pygeodesy/__main__.py,sha256=B7CImXa4fm8lEqjTTp5AEalqIhldNpghdHtJkyMdyh0,5522
4
+ pygeodesy/albers.py,sha256=mb3YbVvoBq8a7AytT0HeVxe8DGEvx1KFN2Usl2ksKwk,30908
5
+ pygeodesy/azimuthal.py,sha256=acwIA1B7jmg1oDpJBuFitnOVHUWRUk7Y73yI8zqIGrc,49854
6
+ pygeodesy/basics.py,sha256=ErpbLgHNerGPKiOIlWKdKzq6lO0dhoZjaywTnCn8PyE,32905
7
+ pygeodesy/booleans.py,sha256=ncA4SV-2TX78CUsRKRgFh43g5NhkW_Iy1mnnudA3Nog,73683
8
+ pygeodesy/cartesianBase.py,sha256=tvb1pGUTvSkIAInNhrnHXjBCwnQrVn6a-H2fipoapKE,45365
9
+ pygeodesy/clipy.py,sha256=a0azaK7YDmGDU8mVVKe2MvUiPEhqZ9XJ-9u0T1iHKbo,27779
10
+ pygeodesy/constants.py,sha256=xU8_niBOG4VFdWEqCi4XARiNJEAmprSTPCNkUrG3Bec,19899
11
+ pygeodesy/css.py,sha256=Vn4MSpCagj55L_SM47AVX6V5sPglG17X1JJiU1rW1yA,25797
12
+ pygeodesy/datums.py,sha256=Vp1fP7sSV1EuRbuO2scnZ3qiTZD1CvL4O12KSRlf1SU,34068
13
+ pygeodesy/dms.py,sha256=CKXt2EOYFBluQV5q6cFYppJl3dCvvEB_0E84J0ki6ws,42202
14
+ pygeodesy/ecef.py,sha256=DcWNhnOZC7-Olns9c1XI9p4MmuC00KN5rZ5W1UQVUxw,59009
15
+ pygeodesy/ecefLocals.py,sha256=zoxGUJeYX2UXzR9r0jaByrvfrrpmrvAhjyQsz433RjA,7794
16
+ pygeodesy/elevations.py,sha256=WrWPZNgkZX9Ys_1ij_gyE4jzdIv85JYAaR2cK3vc4gQ,10879
17
+ pygeodesy/ellipsoidalBase.py,sha256=n6VHIaRZ6UvC1H36qolKxwlHJX5BZysvgE3iir-PunE,55743
18
+ pygeodesy/ellipsoidalBaseDI.py,sha256=PbSJkUUHpRGYgnnciMD-sWqTCReZv_FAc8SUonF3ZbI,38544
19
+ pygeodesy/ellipsoidalExact.py,sha256=YVGVUmBTYu4NuYZdIx2f6zCCXM6Tqbv2nlkXQBqhvus,16973
20
+ pygeodesy/ellipsoidalGeodSolve.py,sha256=wHv9UHYqnoU_PH8zgRJ-kA1-o-7zZLs1-O_zZHSQb1U,16666
21
+ pygeodesy/ellipsoidalKarney.py,sha256=5RfQzNJFq4VklDnr3TRo6kh29rcQ4D7XkXUr_2Zqf38,18721
22
+ pygeodesy/ellipsoidalNvector.py,sha256=HLFjX6o26q2fzVCjLSL0PdEh96xhGtjfzo2V_k54j4A,30146
23
+ pygeodesy/ellipsoidalVincenty.py,sha256=5syxUVS5RbTz9ZATU4ViegJPFBpdZWt6i8ZGVInype4,26122
24
+ pygeodesy/ellipsoids.py,sha256=v964yZIL2nCc8MJgt3nzV6pczaQsQubXmX_sAh_nrBw,107765
25
+ pygeodesy/elliptic.py,sha256=JkZzRytShhZsLnS-t031UA49DZnKXjob6ocGQZKI-GA,45020
26
+ pygeodesy/epsg.py,sha256=VIBidzAEuoBF4LdlJ4r3WtpL0Ymhru8kf4fAgfFr5ok,8220
27
+ pygeodesy/errors.py,sha256=OUEJ51M3c-JH1n0BBbRtPTCDX0I00rH_BQPYSRoKrqo,32043
28
+ pygeodesy/etm.py,sha256=NDtpmbQmbGieV64iJ-EDIAvD9ryjrW0hiD3wBBtxULk,46744
29
+ pygeodesy/fmath.py,sha256=sIN7mW2KOiK0yU93mvmHo1OOTkGxKvwRinvyr_Qdf6I,37689
30
+ pygeodesy/formy.py,sha256=7-CdPiagdVrbDMjWieX_guN4RvFVCYKOM3yDKSFPRWU,69777
31
+ pygeodesy/frechet.py,sha256=k-6pWb3WQAXXIUdAzG2AnFxvnmK7k-GHj4CoYdzDNbg,35592
32
+ pygeodesy/fstats.py,sha256=M6UOrwmeGp6kjYuYfc6Iq9ibMJAFNm6D4C5GnvlJeuM,28348
33
+ pygeodesy/fsums.py,sha256=3pXl8rfDPeKzXHEhtf9qNzBtUme4ckskDx3HWfJbfyg,103988
34
+ pygeodesy/gars.py,sha256=AXioT4Lh1cwrd7fF6dHcVJw-9vu2oAnZrzo_ka2Y3Ts,11761
35
+ pygeodesy/geodesici.py,sha256=wPUDlRPOcj3MvvWA0CtnZvC30t1onKyZYvR51iCjgks,74891
36
+ pygeodesy/geodesicw.py,sha256=dafScZ4nVuC_vlHXuYlSan32CsIEiL9uNcJYfnY1NtQ,29004
37
+ pygeodesy/geodsolve.py,sha256=fFlyNlkEOpkJaeddEuKwfhtqaZjmVs0egNGM5cwFFoc,29101
38
+ pygeodesy/geohash.py,sha256=1P9-k9sMN-ZVFr2iWbQpFi1lg3uNmChHFCIfETkgFJU,40153
39
+ pygeodesy/geoids.py,sha256=Uke9Lvb0QzMicWyE_H6dwYoCGhby3-1rCAQ-TIoCSgo,86129
40
+ pygeodesy/hausdorff.py,sha256=3iDV4FetRrHcz2D1ddswx56XNi18zzCE2HMTDDoK6sI,32273
41
+ pygeodesy/heights.py,sha256=FfBP1-Zw9XCjp3sBrTqtgZr_KKeejne2cizW0Lhkg_U,41014
42
+ pygeodesy/internals.py,sha256=0jfelLhG50VY0hgy2qzqUvEFDJrcLDfpI_eNs4Go6BI,24028
43
+ pygeodesy/interns.py,sha256=IBM_RuZDmP__4TUx9MLCU3L-Vx5uZz0VBi2eoH0hV44,23467
44
+ pygeodesy/iters.py,sha256=nKVp_LUQyTqOz_OLzY25g6-_xlKG7lmAnjKKMXESmiM,20345
45
+ pygeodesy/karney.py,sha256=xlkRlmg66XRdL1ale2sWHhxfostQU86II4qwNyk-ewM,40938
46
+ pygeodesy/ktm.py,sha256=3CLwbRvk-sr4qs8R9fdJ_ejokgZEjKHULV7wzzuonHU,27259
47
+ pygeodesy/latlonBase.py,sha256=B7wNE-IJf-Sm3NKhCXdrgwRbH_4dBGluZlQdxTJqp8s,75320
48
+ pygeodesy/lazily.py,sha256=2FzJkIQK7LftAXXYxMbqTQUAWth7T3syIhqm8Z9bhuo,47609
49
+ pygeodesy/lcc.py,sha256=N31gphU0nSrc-i2CeJYux7CgbHrTfHwAXajta-mV57s,25790
50
+ pygeodesy/ltp.py,sha256=N3TMipTWKUOeZYzn3UeJJqe5J4Yk788390ohQM1ykAE,50893
51
+ pygeodesy/ltpTuples.py,sha256=t-n7p9A3JCVasv8LKCV4PkOTmXJZi91BkBFm8pBZM5o,59101
52
+ pygeodesy/mgrs.py,sha256=ZgCBH_M_YFxuFu5ukVOVetk-uftv-4GJP-QJrtoqtcU,29842
53
+ pygeodesy/named.py,sha256=NjRLzk0bNSJbPBaqFPjG0UagZj6MarF9O4ZQVQsyV7o,52898
54
+ pygeodesy/namedTuples.py,sha256=JlO8uWmR65RkT7Rdgc9knfI0-bqJeA-tm2ZKsesztVU,30598
55
+ pygeodesy/nvectorBase.py,sha256=XnA_DlqbgYPpF7y_BQHQVmntpI3M5fe0q8h3zX-PKbs,29930
56
+ pygeodesy/osgr.py,sha256=4mFUcn1vMOju3PK1rKohPtIlJZrBGPJrcRjFl-CoxqE,30852
57
+ pygeodesy/points.py,sha256=2vQpgqxJiC7Cgn03pqiezTM4I-CTquv9tQZi4uYWjpw,64497
58
+ pygeodesy/props.py,sha256=ALaBNSPLpaDjFTtwdYeTVqMZhGqLLiERTCAmTrGrjd0,24608
59
+ pygeodesy/resections.py,sha256=vCbnEyNghGkblrPA58-MspaxkZcInnvRgS-oSBIe1hM,43796
60
+ pygeodesy/simplify.py,sha256=O04NSb0ezXM8z3lCcajXbetZuum6PURAOPYTsJ27gxI,22068
61
+ pygeodesy/solveBase.py,sha256=I2oW7zaPoVUkD7IB9Ro0paU-T1vie1lomg83f71twDY,18468
62
+ pygeodesy/sphericalBase.py,sha256=T3vZJV7FSb7Y_cZJDZeIuBL_qh-YvRNBNOuQABwXPp4,32087
63
+ pygeodesy/sphericalNvector.py,sha256=uS40EpEQfVaz3-fwFBNfHg4gOkk1CWcm1tHrvfpQbmc,54824
64
+ pygeodesy/sphericalTrigonometry.py,sha256=fATw2WUWvY3smtg0vwIczIsl9GamsjwJ3zEwM-subv0,64110
65
+ pygeodesy/streprs.py,sha256=-4LErmfPLtGt1tLDBHhJam-zYq8p2Z2C5wDCMELEml4,23599
66
+ pygeodesy/trf.py,sha256=gpsOJVER1KhITOtyiENQ4EnRONinLkzbujsfzzxHVv8,119209
67
+ pygeodesy/triaxials.py,sha256=V0MSYJxRgYDhZcF7HXnu7oFzRyWJkhwc6scuNjc6VVg,64046
68
+ pygeodesy/units.py,sha256=nH6uNqtaILtGRXqCcHVYBTfhGrv-WFt3w1aso6PA0kM,35419
69
+ pygeodesy/unitsBase.py,sha256=cVNKG24Fov73gLFPGwGdjvXmM-8fd3MDufVubABAMeE,14141
70
+ pygeodesy/ups.py,sha256=k7MDyq_aKO70m8sEeOCvpFb3nyrBmBdbdPST-UgxgeA,23349
71
+ pygeodesy/utily.py,sha256=ZJKuwoo97K7GE56-cA8bGrvyz9mN9OoOMnSOEOw0mj0,40025
72
+ pygeodesy/utm.py,sha256=kcXliftP9q0nTxviIOixVyvResK2Jydj-G52CXJiSuQ,31123
73
+ pygeodesy/utmups.py,sha256=31RD8l7M-vcRXU9_wnkb_PNUcKjOr1HAmwjOndjkgXE,13176
74
+ pygeodesy/utmupsBase.py,sha256=PptZ4Mm8BaDUCA8v1sK54o8idw_24kq6loAuYv0bejE,22730
75
+ pygeodesy/vector2d.py,sha256=djVevQCHZWfzbwmPIZRpPFeKY6pkrOAsydrYAW4pqK8,40309
76
+ pygeodesy/vector3d.py,sha256=sC7u9tgFFWoWHFxqtO-dvKVuiEzraw50TDU_QpdDbYw,43045
77
+ pygeodesy/vector3dBase.py,sha256=BHenp3NGpfhVbJ6JMgdNLx6vAcwDWDJIxl9hAdp-AVw,36301
78
+ pygeodesy/webmercator.py,sha256=z3Ft5TeHc9FoLA8zQhzTrSuShHSz0aHjanbvj53ohmo,15016
79
+ pygeodesy/wgrs.py,sha256=1MK72g3HsfdsvChM6rBy_auxzSvWHSoer8fEuT4LinI,15503
80
+ pygeodesy/auxilats/_CX_4.py,sha256=DX67nZ1E4nOis8d_wQ8tn5T-SAVNDBJH3kp9IuQc8lM,6830
81
+ pygeodesy/auxilats/_CX_6.py,sha256=T89kMuUijlLZzmqoI8XiTGTOzj4A4SKhCyt_rOroCq4,11278
82
+ pygeodesy/auxilats/_CX_8.py,sha256=Ff_VTStb-dZkGz7-RL1tzymPgPbTwtl_6EzPquPMamc,18900
83
+ pygeodesy/auxilats/_CX_Rs.py,sha256=hMPcfAQbkD1DzwrRTB9pecfoytxHilPp5__n6UYUNlE,8679
84
+ pygeodesy/auxilats/__init__.py,sha256=g3x06SdwuCPcerCHZRyvwY8xaKR5IxZ1YV3AwTnONNg,2883
85
+ pygeodesy/auxilats/__main__.py,sha256=jH0ShJaDR8zWfoLPXuut37BJbVWVDsAm9rb4xc25XOY,3340
86
+ pygeodesy/auxilats/auxAngle.py,sha256=yptBTS1bVjUBkHSq1XV28b-TKJaYAtib_xqRJvECZmA,16734
87
+ pygeodesy/auxilats/auxDLat.py,sha256=lvffZo8DdVWWEHusPNXRYQeoCFfZcG5rNhgEooL5Xu0,10956
88
+ pygeodesy/auxilats/auxDST.py,sha256=ab8ByHMmX1dWBmGgOGxYUlmkZqTKKpawg5maLYYrG7M,10464
89
+ pygeodesy/auxilats/auxLat.py,sha256=2d6uliIVfxOHp8qibom-8l5T7bLONSyTr6LRTt4OwRs,31972
90
+ pygeodesy/auxilats/auxily.py,sha256=2pXzqlOb1Jy8RKcpKFaqy0yFrzhhc7WK666PD3T-_MI,8085
91
+ pygeodesy/deprecated/__init__.py,sha256=QkeQNBFL8OukeYlea0F0PGVUffqs8ZMAN8jDOuHVNvI,2823
92
+ pygeodesy/deprecated/bases.py,sha256=pL4fEW7PTrDc_coggRCcnrs3izp-MWUEyvr6yBNzgMw,1649
93
+ pygeodesy/deprecated/classes.py,sha256=_H9-QnSVA4iLRKwN16FO8WOE51Qin0zNMNb_kSWgnjU,16388
94
+ pygeodesy/deprecated/consterns.py,sha256=RC-YvqQXAEVoIaLnaLrIrA1Mr3oXLk3HT9n1HLvGCSs,1917
95
+ pygeodesy/deprecated/datum.py,sha256=aeY-POZBZrKKiTnrhqOImV5AfiXu2-9Vz8xu_d4ze2g,1910
96
+ pygeodesy/deprecated/functions.py,sha256=mpgYzx_ynbIrfy9WBDfjhNtI-sRx7nKwucyGaxqE10k,15792
97
+ pygeodesy/deprecated/nvector.py,sha256=rttz-znpX2Tm1ttoJt8_E8V_9n_ZciKi_CvvbwFmZQM,2117
98
+ pygeodesy/deprecated/rhumbBase.py,sha256=y1DcGwGBfIbbTK5upm1XgkbCVIlpGc5MLDn5WxcuLp8,1370
99
+ pygeodesy/deprecated/rhumbaux.py,sha256=pikSwb5cIE-MVwHPFjwGd-JYau_Of-Lf6wgghjNWS98,1423
100
+ pygeodesy/deprecated/rhumbsolve.py,sha256=GRyrxUTT19gjSe8BohUswxXRBjoNWrzQryPbqTH2XhE,1426
101
+ pygeodesy/deprecated/rhumbx.py,sha256=YSzTywlDLfVYZmJjAEi_gLtWbsf4eGxZembaL3wOTuk,1420
102
+ pygeodesy/geodesicx/_C4_24.py,sha256=3OkzOxf0DdO1QL4N9CVYjpOgFCm8FcYjCyvcTLpL2wc,90707
103
+ pygeodesy/geodesicx/_C4_27.py,sha256=grqtju94Nu9V_eQPqe_7aRbLCYflxRuK127pPOPwuDA,134215
104
+ pygeodesy/geodesicx/_C4_30.py,sha256=I4ZuTy64yOq1IVgRtc_kqOL0HnKzXeTea7kTFSolcJs,201921
105
+ pygeodesy/geodesicx/__init__.py,sha256=KXnzEGNtOtOke01y72dkIgT6sAwOP3zd6wgXho1F3T4,2468
106
+ pygeodesy/geodesicx/__main__.py,sha256=ugi6c-4y91WOMJIL0N-wgXhoGhV90QJIFji2MaIGLiA,4329
107
+ pygeodesy/geodesicx/gx.py,sha256=nvErvXV6ELc5_B2qBffFMf_n6qbk_g4ewChEuzbgVKI,60791
108
+ pygeodesy/geodesicx/gxarea.py,sha256=zedg2zYlQv4DK0gwr3JeQWdtWcFuLSjzls8ddrk4Av0,19461
109
+ pygeodesy/geodesicx/gxbases.py,sha256=EF9IL_oQBSlF70_ROag-DRBoU-ASWKlX-l-wfrUEQYs,6130
110
+ pygeodesy/geodesicx/gxline.py,sha256=WaptQVCDqdVoyhLOP2e0g5fq-UuDOjz86B1bEjLs1SY,27653
111
+ pygeodesy/rhumb/__init__.py,sha256=DsE5a16CUYWE5YTuo1U8mnDCtykuWw7VeGx23Yny_VU,2207
112
+ pygeodesy/rhumb/aux_.py,sha256=NeHkNLS2ULh3sTb3eBTtmRih9SZNyVJKMtJj7imKkuI,16117
113
+ pygeodesy/rhumb/bases.py,sha256=P5AQyL-MTbJaO4oKH_Y7qcusQxaHoAii0hJVQ9mT7hU,54250
114
+ pygeodesy/rhumb/ekx.py,sha256=GMY6ik4fgiRrjek-42cpZxU3U2bdoAcY6ZcbZRckpII,24026
115
+ pygeodesy/rhumb/solve.py,sha256=z8z_XYObTgz7w1skNLNcLBpe-EO_r0H4sVcZGlBcWnc,24005
116
+ pygeodesy-25.5.25.dist-info/METADATA,sha256=mvciPhcidpH1u2mDSmMdSRQykcl7CDCqanD46bFFzM0,20102
117
+ pygeodesy-25.5.25.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
118
+ pygeodesy-25.5.25.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
119
+ pygeodesy-25.5.25.dist-info/RECORD,,