pygeodesy 24.6.9__py2.py3-none-any.whl → 24.7.7__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 (87) hide show
  1. {PyGeodesy-24.6.9.dist-info → PyGeodesy-24.7.7.dist-info}/METADATA +2 -2
  2. PyGeodesy-24.7.7.dist-info/RECORD +117 -0
  3. pygeodesy/__init__.py +39 -32
  4. pygeodesy/__main__.py +6 -1
  5. pygeodesy/albers.py +2 -2
  6. pygeodesy/auxilats/__init__.py +1 -1
  7. pygeodesy/auxilats/auxAngle.py +40 -39
  8. pygeodesy/auxilats/auxDLat.py +3 -2
  9. pygeodesy/auxilats/auxLat.py +16 -18
  10. pygeodesy/auxilats/auxily.py +1 -1
  11. pygeodesy/azimuthal.py +10 -10
  12. pygeodesy/basics.py +16 -4
  13. pygeodesy/booleans.py +4 -4
  14. pygeodesy/cartesianBase.py +11 -14
  15. pygeodesy/css.py +14 -18
  16. pygeodesy/datums.py +6 -6
  17. pygeodesy/deprecated/__init__.py +1 -1
  18. pygeodesy/deprecated/classes.py +25 -4
  19. pygeodesy/deprecated/datum.py +3 -3
  20. pygeodesy/deprecated/functions.py +6 -8
  21. pygeodesy/dms.py +23 -27
  22. pygeodesy/ecef.py +4 -4
  23. pygeodesy/elevations.py +4 -4
  24. pygeodesy/ellipsoidalBase.py +23 -28
  25. pygeodesy/ellipsoidalBaseDI.py +19 -23
  26. pygeodesy/ellipsoidalExact.py +3 -3
  27. pygeodesy/ellipsoidalGeodSolve.py +15 -23
  28. pygeodesy/ellipsoidalKarney.py +37 -60
  29. pygeodesy/ellipsoidalNvector.py +38 -44
  30. pygeodesy/ellipsoidalVincenty.py +11 -14
  31. pygeodesy/ellipsoids.py +107 -101
  32. pygeodesy/errors.py +109 -48
  33. pygeodesy/etm.py +32 -44
  34. pygeodesy/formy.py +55 -58
  35. pygeodesy/frechet.py +18 -20
  36. pygeodesy/fsums.py +3 -3
  37. pygeodesy/gars.py +3 -4
  38. pygeodesy/geodesici.py +1696 -0
  39. pygeodesy/geodesicw.py +15 -15
  40. pygeodesy/geodesicx/__init__.py +4 -4
  41. pygeodesy/geodesicx/gx.py +34 -55
  42. pygeodesy/geodesicx/gxbases.py +20 -8
  43. pygeodesy/geodesicx/gxline.py +93 -88
  44. pygeodesy/geodsolve.py +108 -59
  45. pygeodesy/geohash.py +26 -34
  46. pygeodesy/geoids.py +28 -37
  47. pygeodesy/hausdorff.py +17 -18
  48. pygeodesy/heights.py +2 -2
  49. pygeodesy/internals.py +46 -13
  50. pygeodesy/interns.py +2 -2
  51. pygeodesy/karney.py +78 -15
  52. pygeodesy/ktm.py +13 -16
  53. pygeodesy/latlonBase.py +17 -19
  54. pygeodesy/lazily.py +28 -25
  55. pygeodesy/lcc.py +28 -31
  56. pygeodesy/ltp.py +7 -8
  57. pygeodesy/ltpTuples.py +71 -73
  58. pygeodesy/mgrs.py +8 -9
  59. pygeodesy/named.py +19 -10
  60. pygeodesy/nvectorBase.py +9 -10
  61. pygeodesy/osgr.py +9 -9
  62. pygeodesy/points.py +6 -6
  63. pygeodesy/rhumb/__init__.py +1 -1
  64. pygeodesy/rhumb/aux_.py +5 -5
  65. pygeodesy/rhumb/bases.py +30 -31
  66. pygeodesy/rhumb/ekx.py +3 -4
  67. pygeodesy/rhumb/solve.py +21 -22
  68. pygeodesy/solveBase.py +177 -123
  69. pygeodesy/sphericalBase.py +10 -11
  70. pygeodesy/sphericalNvector.py +13 -13
  71. pygeodesy/sphericalTrigonometry.py +86 -97
  72. pygeodesy/streprs.py +4 -34
  73. pygeodesy/triaxials.py +48 -43
  74. pygeodesy/units.py +208 -275
  75. pygeodesy/unitsBase.py +115 -107
  76. pygeodesy/ups.py +26 -31
  77. pygeodesy/utily.py +8 -8
  78. pygeodesy/utm.py +35 -40
  79. pygeodesy/utmups.py +43 -46
  80. pygeodesy/utmupsBase.py +8 -9
  81. pygeodesy/vector3d.py +26 -27
  82. pygeodesy/vector3dBase.py +6 -7
  83. pygeodesy/webmercator.py +19 -21
  84. pygeodesy/wgrs.py +18 -20
  85. PyGeodesy-24.6.9.dist-info/RECORD +0 -116
  86. {PyGeodesy-24.6.9.dist-info → PyGeodesy-24.7.7.dist-info}/WHEEL +0 -0
  87. {PyGeodesy-24.6.9.dist-info → PyGeodesy-24.7.7.dist-info}/top_level.txt +0 -0
@@ -23,13 +23,13 @@ The Journal of Navigation (2010), vol 63, nr 3, pp 395-417.
23
23
  # make sure int/int division yields float quotient, see .basics
24
24
  from __future__ import division as _; del _ # PYCHOK semicolon
25
25
 
26
- from pygeodesy.basics import issubclassof, map2, _xinstanceof
26
+ from pygeodesy.basics import issubclassof, map2, _xinstanceof, _xsubclassof
27
27
  from pygeodesy.datums import _earth_ellipsoid, _ellipsoidal_datum, _WGS84
28
28
  # from pygeodesy.dms import F_D, toDMS # _MODS
29
29
  from pygeodesy.ellipsoidalBase import CartesianEllipsoidalBase, \
30
30
  _nearestOn, LatLonEllipsoidalBase, \
31
31
  _TOL_M, _Wrap
32
- from pygeodesy.errors import _IsnotError, _xkwds, _xkwds_pop2
32
+ from pygeodesy.errors import _xkwds, _xkwds_pop2
33
33
  # from pygeodesy.fmath import fdot # from .nvectorBase
34
34
  from pygeodesy.interns import _Nv00_, _COMMASPACE_, _pole_ # PYCHOK used!
35
35
  from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS, _ALL_OTHER
@@ -48,7 +48,7 @@ from pygeodesy.units import Bearing, Distance, Height, Scalar
48
48
  # from math import fabs # from .nvectorBase
49
49
 
50
50
  __all__ = _ALL_LAZY.ellipsoidalNvector
51
- __version__ = '24.06.08'
51
+ __version__ = '24.06.15'
52
52
 
53
53
 
54
54
  class Ned(_Ned):
@@ -95,9 +95,9 @@ class Cartesian(CartesianEllipsoidalBase):
95
95
  override this L{LatLon} class or specify
96
96
  C{B{LatLon} is None}.
97
97
 
98
- @return: The geodetic point (L{LatLon}) or if B{C{LatLon}} is set
99
- to C{None}, an L{Ecef9Tuple}C{(x, y, z, lat, lon, height,
100
- C, M, datum)} with C{C} and C{M} if available.
98
+ @return: The geodetic point (L{LatLon}) or if C{B{LatLon} is None},
99
+ an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)}
100
+ with C{C} and C{M} if available.
101
101
 
102
102
  @raise TypeError: Invalid B{C{LatLon_and_kwds}}.
103
103
  '''
@@ -112,8 +112,8 @@ class Cartesian(CartesianEllipsoidalBase):
112
112
  override this C{Nvector} class or specify
113
113
  C{B{Nvector} is None}.
114
114
 
115
- @return: The C{n-vector} components (C{Nvector}) or if B{C{Nvector}}
116
- is set to C{None}, a L{Vector4Tuple}C{(x, y, z, h)}
115
+ @return: The C{n-vector} components (C{Nvector}) or if C{B{Nvector}
116
+ is None}, a L{Vector4Tuple}C{(x, y, z, h)}.
117
117
 
118
118
  @raise TypeError: Invalid B{C{Nvector_and_kwds}}.
119
119
  '''
@@ -176,9 +176,9 @@ class LatLon(LatLonNvectorBase, LatLonEllipsoidalBase):
176
176
 
177
177
  @return: Delta from this to the other point (B{C{Ned}}).
178
178
 
179
- @raise TypeError: The B{C{other}} point is not L{LatLon} or
180
- B{C{Ned}} is not L{pygeodesy.Ned} nor
181
- L{pygeodesy.Ned4Tuple} nor DEPRECATED L{Ned}.
179
+ @raise TypeError: The B{C{other}} point is not L{LatLon} or B{C{Ned}}
180
+ is not an L{Ned4Tuple<pygeodesy.Ned4Tuple>} nor an
181
+ L{Ned<pygeodesy.Ned>} nor a DEPRECATED L{Ned}.
182
182
 
183
183
  @raise ValueError: If ellipsoids are incompatible.
184
184
  '''
@@ -196,8 +196,8 @@ class LatLon(LatLonNvectorBase, LatLonEllipsoidalBase):
196
196
  N, kwds = _xkwds_pop2(Ned_and_kwds, Ned=Ned)
197
197
  if issubclassof(N, Ned4Tuple):
198
198
  ned_ += _MODS.ltp.Ltp(self, ecef=self.Ecef(self.datum)),
199
- elif not issubclassof(N, _Ned):
200
- raise _IsnotError(Fmt.sub_class(_Ned, Ned4Tuple), Ned=N)
199
+ else:
200
+ _xsubclassof(_Ned, Ned4Tuple, Ned=N)
201
201
  return N(*ned_, **_xkwds(kwds, name=self.name))
202
202
 
203
203
  # def destination(self, distance, bearing, radius=R_M, height=None):
@@ -223,7 +223,7 @@ class LatLon(LatLonNvectorBase, LatLonEllipsoidalBase):
223
223
  # y = gc.cross(v1).times(sin(r)) # component of v2 perpendicular to v1
224
224
  #
225
225
  # v2 = x.plus(y).unit()
226
- # return v2.toLatLon(height=self.height if height is C{None} else height)
226
+ # return v2.toLatLon(height=self._heigHt(height))
227
227
 
228
228
  def destinationNed(self, delta):
229
229
  '''Calculate the destination point using the supplied NED delta
@@ -234,8 +234,8 @@ class LatLon(LatLonNvectorBase, LatLonEllipsoidalBase):
234
234
 
235
235
  @return: Destination point (L{LatLon}).
236
236
 
237
- @raise TypeError: If B{C{delta}} is not L{pygeodesy.Ned} or
238
- DEPRECATED L{Ned}.
237
+ @raise TypeError: If B{C{delta}} is not an L{Ned<pygeodesy.Ned>}
238
+ or a DEPRECATED L{Ned}.
239
239
  '''
240
240
  _xinstanceof(_Ned, delta=delta)
241
241
 
@@ -391,9 +391,9 @@ class LatLon(LatLonNvectorBase, LatLonEllipsoidalBase):
391
391
  to override this L{Cartesian} class or specify
392
392
  C{B{Cartesian}=None}.
393
393
 
394
- @return: The geodetic point (L{Cartesian}) or if B{C{Cartesian}} is set
395
- to C{None}, an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M,
396
- datum)} with C{C} and C{M} if available.
394
+ @return: The geodetic point (L{Cartesian}) or if C{B{Cartesian} is None},
395
+ an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with
396
+ C{C} and C{M} if available.
397
397
 
398
398
  @raise TypeError: Invalid B{C{Cartesian}} or other B{C{Cartesian_and_kwds}}.
399
399
  '''
@@ -476,9 +476,9 @@ class Nvector(NvectorBase):
476
476
  to override this L{Cartesian} class or specify
477
477
  C{B{Cartesian} is None}.
478
478
 
479
- @return: The cartesian point (L{Cartesian}) or if B{C{Cartesian}} is set
480
- to C{None}, an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M,
481
- datum)} with C{C} and C{M} if available.
479
+ @return: The cartesian point (L{Cartesian}) or if C{B{Cartesian} is None},
480
+ an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with
481
+ C{C} and C{M} if available.
482
482
 
483
483
  @raise TypeError: Invalid B{C{Cartesian_and_kwds}}.
484
484
  '''
@@ -494,9 +494,9 @@ class Nvector(NvectorBase):
494
494
  to override this L{LatLon} class or specify
495
495
  C{B{LatLon} is None}.
496
496
 
497
- @return: The geodetic point (L{LatLon}) or if B{C{LatLon}} is set
498
- to C{None}, an L{Ecef9Tuple}C{(x, y, z, lat, lon, height,
499
- C, M, datum)} with C{C} and C{M} if available.
497
+ @return: The geodetic point (L{LatLon}) or if C{B{LatLon} is None},
498
+ an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)}
499
+ with C{C} and C{M} if available.
500
500
 
501
501
  @raise TypeError: Invalid B{C{LatLon_and_kwds}}.
502
502
  '''
@@ -528,29 +528,23 @@ def meanOf(points, datum=_WGS84, height=None, wrap=False,
528
528
 
529
529
  @arg points: Points to be averaged (L{LatLon}[]).
530
530
  @kwarg datum: Optional datum to use (L{Datum}).
531
- @kwarg height: Optional height at mean point, overriding
532
- the mean height (C{meter}).
533
- @kwarg wrap: If C{True}, wrap or I{normalize} B{C{points}}
534
- (C{bool}).
535
- @kwarg LatLon_and_kwds: Optional B{C{LatLon}} class to return
536
- the mean points and overriding this L{LatLon}
537
- (or C{None}) and additional B{C{LatLon}}
538
- keyword arguments, ignored if C{B{LatLon}
539
- is None}.
540
-
541
- @return: Geographic mean point and mean height (B{C{LatLon}})
542
- or if B{C{LatLon}} is C{None}, an L{Ecef9Tuple}C{(x,
543
- y, z, lat, lon, height, C, M, datum)} with C{C} and
544
- C{M} if available.
531
+ @kwarg height: Optional height at mean point, overriding the mean
532
+ height (C{meter}).
533
+ @kwarg wrap: If C{True}, wrap or I{normalize} B{C{points}} (C{bool}).
534
+ @kwarg LatLon_and_kwds: Optional B{C{LatLon}} class to return the mean
535
+ points (or C{None}) and additional B{C{LatLon}} keyword
536
+ arguments, ignored if C{B{LatLon} is None}.
537
+
538
+ @return: Geographic mean point and height (B{C{LatLon}}) or if C{B{LatLon}
539
+ is None}, an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M,
540
+ datum)} with C{C} and C{M} if available.
545
541
 
546
542
  @raise ValueError: Insufficient number of B{C{points}}.
547
543
  '''
548
544
  Ps = _Nvll.PointsIter(points, wrap=wrap)
549
- # geographic mean
550
- m = sumOf(p._N_vector for p in Ps.iterate(closed=False))
551
- kwds = _xkwds(LatLon_and_kwds, height=height, datum=datum,
552
- LatLon=LatLon, name__=meanOf)
553
- return m.toLatLon(**kwds)
545
+ n = sumOf(p._N_vector for p in Ps.iterate(closed=False))
546
+ return n.toLatLon(**_xkwds(LatLon_and_kwds, height=height, datum=datum,
547
+ LatLon=LatLon, name__=meanOf))
554
548
 
555
549
 
556
550
  def nearestOn(point, point1, point2, within=True, height=None, wrap=False,
@@ -72,7 +72,7 @@ from pygeodesy.utily import atan2b, atan2d, sincos2, sincos2d, unroll180, wrap18
72
72
  from math import atan2, cos, degrees, fabs, radians, tan
73
73
 
74
74
  __all__ = _ALL_LAZY.ellipsoidalVincenty
75
- __version__ = '23.12.18'
75
+ __version__ = '24.06.11'
76
76
 
77
77
  _antipodal_to_ = _SPACE_(_antipodal_, _to_)
78
78
 
@@ -102,7 +102,7 @@ class Cartesian(CartesianEllipsoidalBase):
102
102
  B{datum}=...} to override this L{LatLon}
103
103
  class or specify C{B{LatLon}=None}.
104
104
 
105
- @return: The geodetic point (L{LatLon}) or if B{C{LatLon}} is C{None},
105
+ @return: The geodetic point (L{LatLon}) or if C{B{LatLon} is None},
106
106
  an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)}
107
107
  with C{C} and C{M} if available.
108
108
 
@@ -175,20 +175,18 @@ class LatLon(LatLonEllipsoidalBaseDI):
175
175
  self._iterations = Number_(limit, name=_limit_, low=4, high=1000) + 1
176
176
 
177
177
  def toCartesian(self, **Cartesian_datum_kwds): # PYCHOK Cartesian=Cartesian, datum=None
178
- '''Convert this point to C{Vincenty}-based cartesian (ECEF)
179
- coordinates.
178
+ '''Convert this point to C{Vincenty}-based cartesian (ECEF) coordinates.
180
179
 
181
180
  @kwarg Cartesian_datum_kwds: Optional L{Cartesian}, B{C{datum}} and other
182
181
  keyword arguments, ignored if C{B{Cartesian}=None}. Use
183
182
  C{B{Cartesian}=...} to override this L{Cartesian} class
184
183
  or specify C{B{Cartesian}=None}.
185
184
 
186
- @return: The cartesian point (L{Cartesian}) or if B{C{Cartesian}}
187
- is C{None}, an L{Ecef9Tuple}C{(x, y, z, lat, lon, height,
188
- C, M, datum)} with C{C} and C{M} if available.
185
+ @return: The cartesian point (L{Cartesian}) or if C{B{Cartesian} is None},
186
+ an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with
187
+ C{C} and C{M} if available.
189
188
 
190
- @raise TypeError: Invalid B{C{Cartesian}}, B{C{datum}} or other
191
- B{C{Cartesian_datum_kwds}}.
189
+ @raise TypeError: Invalid B{C{Cartesian}}, B{C{datum}} or other B{C{Cartesian_datum_kwds}}.
192
190
  '''
193
191
  kwds = _xkwds(Cartesian_datum_kwds, Cartesian=Cartesian,
194
192
  datum=self.datum)
@@ -199,12 +197,11 @@ class LatLon(LatLonEllipsoidalBaseDI):
199
197
 
200
198
  @raise TypeError: The B{C{other}} point is not L{LatLon}.
201
199
 
202
- @raise ValueError: If this and the B{C{other}} point's L{Datum}
203
- ellipsoids are not compatible.
200
+ @raise ValueError: If this and the B{C{other}} point's L{Datum} ellipsoids are
201
+ not compatible.
204
202
 
205
- @raise VincentyError: Vincenty fails to converge for the current
206
- L{LatLon.epsilon} and L{LatLon.iterations}
207
- limits.
203
+ @raise VincentyError: Vincenty fails to converge for the current limits, see
204
+ L{epsilon<LatLon.epsilon>} and L{iterations<LatLon.iterations>}.
208
205
  '''
209
206
  E = self.ellipsoid()
210
207
  f = E.f