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
pygeodesy/azimuthal.py CHANGED
@@ -70,7 +70,7 @@ from pygeodesy.utily import asin1, atan1, atan2b, atan2d, sincos2, \
70
70
  from math import acos, atan2, degrees, fabs, sin, sqrt
71
71
 
72
72
  __all__ = _ALL_LAZY.azimuthal
73
- __version__ = '24.05.24'
73
+ __version__ = '24.06.11'
74
74
 
75
75
  _EPS_K = _EPStol * _0_1 # Karney's eps_ or _EPSmin * _0_1?
76
76
  _over_horizon_ = 'over horizon'
@@ -364,8 +364,8 @@ class Equidistant(_AzimuthalBase):
364
364
 
365
365
  @raise AzimuthalError: Invalid B{C{lat}} or B{C{lon}}.
366
366
 
367
- @note: The C{scale} will be C{-1} if B{C{(lat, lon)}} is antipodal to
368
- the projection center C{(lat0, lon0)}.
367
+ @note: The C{scale} will be C{-1} if B{C{(lat, lon)}} is antipodal to the
368
+ projection center C{(lat0, lon0)}.
369
369
  '''
370
370
  def _k_t(c):
371
371
  k = _N_1_0 if c < 0 else _1_0
@@ -389,7 +389,7 @@ class Equidistant(_AzimuthalBase):
389
389
  optional, additional B{C{LatLon}} keyword arguments,
390
390
  ignored if C{B{LatLon} is None}.
391
391
 
392
- @return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an
392
+ @return: The geodetic (C{LatLon}) or if C{B{LatLon} is None} an
393
393
  L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
394
394
 
395
395
  @note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon}
@@ -509,7 +509,7 @@ class _EquidistantBase(_AzimuthalGeodesic):
509
509
  optional, additional B{C{LatLon}} keyword arguments,
510
510
  ignored if C{B{LatLon} is None}.
511
511
 
512
- @return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an
512
+ @return: The geodetic (C{LatLon}) or if C{B{LatLon} is None} an
513
513
  L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
514
514
 
515
515
  @note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon}
@@ -680,7 +680,7 @@ class Gnomonic(_AzimuthalBase):
680
680
  optional, additional B{C{LatLon}} keyword arguments,
681
681
  ignored if C{B{LatLon} is None}.
682
682
 
683
- @return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an
683
+ @return: The geodetic (C{LatLon}) or if C{B{LatLon} is None} an
684
684
  L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
685
685
 
686
686
  @note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon}
@@ -791,7 +791,7 @@ class _GnomonicBase(_AzimuthalGeodesic):
791
791
  optional, additional B{C{LatLon}} keyword arguments,
792
792
  ignored if C{B{LatLon} is None}.
793
793
 
794
- @return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an
794
+ @return: The geodetic (C{LatLon}) or if C{B{LatLon} is None} an
795
795
  L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
796
796
 
797
797
  @raise AzimuthalError: No convergence.
@@ -984,7 +984,7 @@ class LambertEqualArea(_AzimuthalBase):
984
984
  and optional, additional B{C{LatLon}} keyword
985
985
  arguments, ignored if C{B{LatLon} is None}.
986
986
 
987
- @return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an
987
+ @return: The geodetic (C{LatLon}) or if C{B{LatLon} is None} an
988
988
  L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
989
989
 
990
990
  @note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon}
@@ -1038,7 +1038,7 @@ class Orthographic(_AzimuthalBase):
1038
1038
  optional, additional B{C{LatLon}} keyword arguments,
1039
1039
  ignored if C{B{LatLon} is None}.
1040
1040
 
1041
- @return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an
1041
+ @return: The geodetic (C{LatLon}) or if C{B{LatLon} is None} an
1042
1042
  L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
1043
1043
 
1044
1044
  @note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon}
@@ -1111,7 +1111,7 @@ class Stereographic(_AzimuthalBase):
1111
1111
  optional, additional B{C{LatLon}} keyword arguments,
1112
1112
  ignored if C{B{LatLon} is None}.
1113
1113
 
1114
- @return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an
1114
+ @return: The geodetic (C{LatLon}) or if C{B{LatLon} is None} an
1115
1115
  L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
1116
1116
 
1117
1117
  @note: The C{lat} will be in range C{[-90..90] degrees}, C{lon} in range
pygeodesy/basics.py CHANGED
@@ -30,13 +30,14 @@ from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS, _FOR_DOCS, _getenv,
30
30
  # from pygeodesy.nvectorBase import NvectorBase # _MODS
31
31
  # from pygeodesy.props import _update_all # _MODS
32
32
  # from pygeodesy.streprs import Fmt # _MODS
33
+ # from pygeodesy.unitsBase import _NamedUnit, Str # _MODS
33
34
 
34
35
  from copy import copy as _copy, deepcopy as _deepcopy
35
36
  from math import copysign as _copysign
36
37
  import inspect as _inspect
37
38
 
38
39
  __all__ = _ALL_LAZY.basics
39
- __version__ = '24.05.29'
40
+ __version__ = '24.07.06'
40
41
 
41
42
  _below_ = 'below'
42
43
  _list_tuple_types = (list, tuple)
@@ -159,19 +160,23 @@ def _args_kwds_names(func, splast=False):
159
160
  return tuple(args_kwds)
160
161
 
161
162
 
162
- def clips(sb, limit=50, white=NN):
163
+ def clips(sb, limit=50, white=NN, length=False):
163
164
  '''Clip a string to the given length limit.
164
165
 
165
166
  @arg sb: String (C{str} or C{bytes}).
166
167
  @kwarg limit: Length limit (C{int}).
167
168
  @kwarg white: Optionally, replace all whitespace (C{str}).
169
+ @kwarg len: IF C{True} append the original I{[length]} (C{bool}).
168
170
 
169
171
  @return: The clipped or unclipped B{C{sb}}.
170
172
  '''
171
- T = type(sb)
172
- if len(sb) > limit > 8:
173
+ T, n = type(sb), len(sb)
174
+ if n > limit > 8:
173
175
  h = limit // 2
174
176
  sb = T(_ELLIPSIS4_).join((sb[:h], sb[-h:]))
177
+ if length:
178
+ n = _MODS.streprs.Fmt.SQUARE(n)
179
+ sb = T(NN).join((sb, n))
175
180
  if white: # replace whitespace
176
181
  sb = T(white).join(sb.split())
177
182
  return sb
@@ -194,6 +199,13 @@ def copytype(x, y):
194
199
  return type(y)(x if x else _0_0)
195
200
 
196
201
 
202
+ def _enumereverse(iterable):
203
+ '''(INTERNAL) Reversed C{enumberate}.
204
+ '''
205
+ for j in _reverange(len(iterable)):
206
+ yield j, iterable[j]
207
+
208
+
197
209
  def halfs2(str2):
198
210
  '''Split a string in 2 halfs.
199
211
 
pygeodesy/booleans.py CHANGED
@@ -43,7 +43,7 @@ from pygeodesy.utily import fabs, _unrollon, _Wrap
43
43
  # from math import fabs # from .utily
44
44
 
45
45
  __all__ = _ALL_LAZY.booleans
46
- __version__ = '24.06.06'
46
+ __version__ = '24.06.15'
47
47
 
48
48
  _0_EPS = EPS # near-zero, positive
49
49
  _EPS_0 = -EPS # near-zero, negative
@@ -131,8 +131,8 @@ class _LatLonBool(_Named):
131
131
 
132
132
  @arg lat_ll: Latitude (C{scalar}) or a lat-/longitude (C{LatLon[FHP|GH]},
133
133
  C{Clip[FHP|GH]4Tuple} or some other C{LatLon}).
134
- @kwarg lon: Longitude (C{scalar}), iff B{C{lat_ll}} is scalar, ignored
135
- otherwise.
134
+ @kwarg lon: Longitude (C{scalar}), required B{C{lat_ll}} is scalar,
135
+ ignored otherwise.
136
136
  @kwarg height: Height (C{scalar}), conventionally C{meter}.
137
137
  @kwarg clipid: Clip identifier (C{int}).
138
138
  @kwarg wrap: If C{True}, wrap or I{normalize} B{C{lat}} and B{C{lon}} (C{bool}).
@@ -1961,7 +1961,7 @@ def _other(this, other):
1961
1961
  C = this.__class__
1962
1962
  if isinstance(other, C):
1963
1963
  return other
1964
- raise _IsnotError(C.__name__, other=other)
1964
+ raise _IsnotError(C, other=other)
1965
1965
 
1966
1966
 
1967
1967
  def _outside(x1, x2, lo, hi):
@@ -43,7 +43,7 @@ from pygeodesy.vector3d import Vector3d, _xyzhdlln4
43
43
  # from math import atan2, degrees, fabs, radians, sqrt # from .fmath, .utily
44
44
 
45
45
  __all__ = _ALL_LAZY.cartesianBase
46
- __version__ = '24.06.10'
46
+ __version__ = '24.06.11'
47
47
 
48
48
  _r_ = 'r'
49
49
  _theta_ = 'theta'
@@ -62,8 +62,7 @@ class CartesianBase(Vector3d):
62
62
  L{Ecef9Tuple}, L{Vector3Tuple} or L{Vector4Tuple}.
63
63
  @kwarg y: Cartesian Y coordinate (C{scalar}), ignored if B{C{x_xyz}}
64
64
  is not C{scalar}, otherwise same units as B{C{x_xyz}}.
65
- @kwarg z: Cartesian Z coordinate (C{scalar}), ignored if B{C{x_xyz}}
66
- is not C{scalar}, otherwise same units as B{C{x_xyz}}.
65
+ @kwarg z: Cartesian Z coordinate (C{scalar}), like B{C{y}}.
67
66
  @kwarg datum: Optional datum (L{Datum}, L{Ellipsoid}, L{Ellipsoid2}
68
67
  or L{a_f2Tuple}).
69
68
  @kwarg ll_name: Optional C{B{name}=NN} (C{str}) and optional, original
@@ -711,15 +710,15 @@ class CartesianBase(Vector3d):
711
710
  @kwarg datum: Optional datum (L{Datum}, L{Ellipsoid}, L{Ellipsoid2}
712
711
  or L{a_f2Tuple}).
713
712
  @kwarg height: Optional height, overriding the converted height
714
- (C{meter}), iff B{C{LatLon}} is not C{None}.
713
+ (C{meter}), only if C{B{LatLon} is not None}.
715
714
  @kwarg LatLon: Optional class to return the geodetic point
716
715
  (C{LatLon}) or C{None}.
717
716
  @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword
718
717
  arguments, ignored if C{B{LatLon} is None}.
719
718
 
720
- @return: The geodetic point (B{C{LatLon}}) or if B{C{LatLon}}
721
- is C{None}, an L{Ecef9Tuple}C{(x, y, z, lat, lon,
722
- height, C, M, datum)} with C{C} and C{M} if available.
719
+ @return: The geodetic point (B{C{LatLon}}) or if C{B{LatLon}
720
+ is None}, an L{Ecef9Tuple}C{(x, y, z, lat, lon, height,
721
+ C, M, datum)} with C{C} and C{M} if available.
723
722
 
724
723
  @raise TypeError: Invalid B{C{datum}} or B{C{LatLon_kwds}}.
725
724
  '''
@@ -775,7 +774,7 @@ class CartesianBase(Vector3d):
775
774
  C{B{Nvector} is None}.
776
775
 
777
776
  @return: An B{C{Nvector}} or a L{Vector4Tuple}C{(x, y, z, h)} if
778
- B{C{Nvector}} is C{None}.
777
+ C{B{Nvector} is None}.
779
778
 
780
779
  @raise TypeError: Invalid B{C{Nvector}}, B{C{datum}} or
781
780
  B{C{name_Nvector_kwds}} item.
@@ -851,7 +850,7 @@ class CartesianBase(Vector3d):
851
850
  arguments, ignored if C{B{Vector} is None}.
852
851
 
853
852
  @return: A B{C{Vector}} or a L{Vector3Tuple}C{(x, y, z)} if
854
- B{C{Vector}} is C{None}.
853
+ C{B{Vector} is None}.
855
854
 
856
855
  @raise TypeError: Invalid B{C{Vector}} or B{C{Vector_kwds}}.
857
856
  '''
@@ -923,8 +922,7 @@ def rtp2xyz(r_rtp, theta=0, phi=0, **name_Cartesian_and_kwds):
923
922
 
924
923
  @arg theta: Inclination B{C{theta}} (C{degrees} with respect to the positive z-axis),
925
924
  required if C{B{r_rtp}} is C{scalar}, ignored otherwise.
926
- @arg phi: Azimuthal angle B{C{phi}} (C{degrees}), required if C{B{r_rtp}} is C{scalar},
927
- ignored otherwise.
925
+ @arg phi: Azimuthal angle B{C{phi}} (C{degrees}), like B{C{theta}}.
928
926
 
929
927
  @see: Function L{rtp2xyz_} for further details.
930
928
  '''
@@ -942,8 +940,7 @@ def rtp2xyz_(r_rtp, theta=0, phi=0, **name_Cartesian_and_kwds):
942
940
  L{RadiusThetaPhi3Tuple} instance.
943
941
  @arg theta: Inclination B{C{theta}} (C{radians} with respect to the positive z-axis),
944
942
  required if C{B{r_rtp}} is C{scalar}, ignored otherwise.
945
- @arg phi: Azimuthal angle B{C{phi}} (C{radians}), required if C{B{r_rtp}} is C{scalar},
946
- ignored otherwise.
943
+ @arg phi: Azimuthal angle B{C{phi}} (C{radians}), like B{C{theta}}.
947
944
  @kwarg name_Cartesian_and_kwds: Optional C{B{name}=NN} (C{str}), a C{B{Cartesian}=None}
948
945
  class to return the coordinates and optional, additional C{B{Cartesian}}
949
946
  keyword arguments.
@@ -1017,7 +1014,7 @@ def xyz2rtp_(x_xyz, y=0, z=0, **name):
1017
1014
  C{Nvector}, L{Vector3d}, L{Vector3Tuple}, L{Vector4Tuple} or a C{tuple} or
1018
1015
  C{list} of 3+ C{scalar} items) if no C{y_z} specified.
1019
1016
  @arg y: Y component (C{scalar}), required if C{B{x_xyz}} is C{scalar}, ignored otherwise.
1020
- @arg z: Z component (C{scalar}), required if C{B{x_xyz}} is C{scalar}, ignored otherwise.
1017
+ @arg z: Z component (C{scalar}), like B{C{y}}.
1021
1018
  @kwarg name: Optional C{B{name}=NN} (C{str}).
1022
1019
 
1023
1020
  @return: L{RadiusThetaPhi3Tuple}C{(r, theta, phi)} with radial distance C{r} (C{meter},
pygeodesy/css.py CHANGED
@@ -33,7 +33,7 @@ from pygeodesy.units import Bearing, Degrees, Easting, Height, _heigHt, \
33
33
  # from math import fabs # from .karney
34
34
 
35
35
  __all__ = _ALL_LAZY.css
36
- __version__ = '24.05.24'
36
+ __version__ = '24.06.11'
37
37
 
38
38
 
39
39
  def _CS0(cs0):
@@ -312,7 +312,7 @@ class CassiniSoldner(_NamedBase):
312
312
  s, c = _sincos2d(m.lat1) # == self.lat0 == self.LatitudeOrigin()
313
313
  self._sb0, self._cb0 = _norm2(s * g.f1, c)
314
314
 
315
- def reverse(self, easting, northing, LatLon=None, **LatLon_kwds_name):
315
+ def reverse(self, easting, northing, LatLon=None, **name_LatLon_kwds):
316
316
  '''Convert a Cassini-Soldner location to (ellipsoidal) geodetic
317
317
  lat- and longitude.
318
318
 
@@ -320,12 +320,11 @@ class CassiniSoldner(_NamedBase):
320
320
  @arg northing: Northing of the location (C{meter}).
321
321
  @kwarg LatLon: Optional, ellipsoidal class to return the geodetic
322
322
  location as (C{LatLon}) or C{None}.
323
- @kwarg LatLon_kwds_name: Optional (C{LatLon}) keyword arguments,
324
- ignored if C{B{LatLon} is None} and optional
325
- C{B{name}=NN} inlieu of this this projection's
326
- name (C{str}).
323
+ @kwarg name_LatLon_kwds: Optional name C{B{name}=NN} (C{str}) and
324
+ optional, additional B{C{LatLon}} keyword arguments,
325
+ ignored if C{B{LatLon} is None}.
327
326
 
328
- @return: Geodetic location B{C{LatLon}} or if B{C{LatLon}} is C{None},
327
+ @return: Geodetic location B{C{LatLon}} or if C{B{LatLon} is None},
329
328
  a L{LatLon2Tuple}C{(lat, lon)}.
330
329
 
331
330
  @raise CSSError: Ellipsoidal mismatch of B{C{LatLon}} and this projection.
@@ -335,7 +334,7 @@ class CassiniSoldner(_NamedBase):
335
334
  @see: Method L{CassiniSoldner.reverse4}, L{CassiniSoldner.forward}.
336
335
  L{CassiniSoldner.forward4} and L{CassiniSoldner.forward6}.
337
336
  '''
338
- n, kwds = _name2__(LatLon_kwds_name, _or_nameof=self)
337
+ n, kwds = _name2__(name_LatLon_kwds, _or_nameof=self)
339
338
  r = self.reverse4(easting, northing, name=n)
340
339
  if LatLon is None:
341
340
  r = LatLon2Tuple(r.lat, r.lon, name=r.name) # PYCHOK expected
@@ -520,9 +519,8 @@ class Css(_NamedBase):
520
519
  @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword
521
520
  arguments, ignored if C{B{LatLon} is None}.
522
521
 
523
- @return: The geodetic point (B{C{LatLon}}) or if B{C{LatLon}}
524
- is C{None}, a L{LatLon4Tuple}C{(lat, lon, height,
525
- datum)}.
522
+ @return: The geodetic point (B{C{LatLon}}) or if C{B{LatLon} is
523
+ None}, a L{LatLon4Tuple}C{(lat, lon, height, datum)}.
526
524
 
527
525
  @raise TypeError: If B{C{LatLon}} or B{C{datum}} is not
528
526
  ellipsoidal or invalid B{C{height}} or
@@ -610,15 +608,13 @@ def toCss(latlon, cs0=None, height=None, Css=Css, **name):
610
608
  @arg latlon: Ellipsoidal point (C{LatLon} or L{LatLon4Tuple}).
611
609
  @kwarg cs0: Optional, the Cassini-Soldner projection to use
612
610
  (L{CassiniSoldner}).
613
- @kwarg height: Optional height for the point, overriding the
614
- default height (C{meter}).
615
- @kwarg Css: Optional class to return the location (L{Css}) or
616
- C{None}.
611
+ @kwarg height: Optional height for the point, overriding the default
612
+ height (C{meter}).
613
+ @kwarg Css: Optional class to return the location (L{Css}) or C{None}.
617
614
  @kwarg name: Optional B{C{Css}} C{B{name}=NN} (C{str}).
618
615
 
619
- @return: The Cassini-Soldner location (B{C{Css}}) or an
620
- L{EasNor3Tuple}C{(easting, northing, height)}
621
- if B{C{Css}} is C{None}.
616
+ @return: The Cassini-Soldner location (B{C{Css}}) or if C{B{Css} is
617
+ None}, an L{EasNor3Tuple}C{(easting, northing, height)}.
622
618
 
623
619
  @raise CSSError: Ellipsoidal mismatch of B{C{latlon}} and B{C{cs0}}.
624
620
 
pygeodesy/datums.py CHANGED
@@ -94,7 +94,7 @@ from pygeodesy.units import _isRadius, Radius_, radians
94
94
  # import operator as _operator # from .fmath
95
95
 
96
96
  __all__ = _ALL_LAZY.datums
97
- __version__ = '24.05.21'
97
+ __version__ = '24.06.24'
98
98
 
99
99
  _a_ellipsoid_ = _UNDER_(_a_, _ellipsoid_)
100
100
  _BD72_ = 'BD72'
@@ -248,18 +248,18 @@ class Transform(_NamedEnumItem):
248
248
  self.s = s = (s1 - _1_0) / _S1_S
249
249
  return s
250
250
 
251
- def toStr(self, prec=5, fmt=Fmt.g, **name): # PYCHOK expected
251
+ def toStr(self, prec=5, fmt=Fmt.g, **sep_name): # PYCHOK expected
252
252
  '''Return this transform as a string.
253
253
 
254
254
  @kwarg prec: Number of (decimal) digits, unstripped (C{int}).
255
255
  @kwarg fmt: Optional C{float} format (C{letter}).
256
- @kwarg name: Optional, override C{B{name}=NN} (C{str}) or
257
- C{None} to exclude this transform's name.
256
+ @kwarg sep_name: Optional C{B{name}=NN} (C{str}) or C{None}
257
+ to exclude this transform's name and separater
258
+ C{B{sep}=", "} to join the items (C{str}).
258
259
 
259
260
  @return: Transform attributes (C{str}).
260
261
  '''
261
- name, _ = _name2__(**name) # name=None
262
- return self._instr(name, prec, *_Names11, fmt=fmt)
262
+ return self._instr(*_Names11, fmt=fmt, prec=prec, **sep_name)
263
263
 
264
264
  def transform(self, x, y, z, inverse=False, **Vector_and_kwds):
265
265
  '''Transform a (cartesian) position, forward or inverse.
@@ -27,7 +27,7 @@ __all__ = (_ALL_DEPRECATED.deprecated_bases +
27
27
  _ALL_DEPRECATED.deprecated_classes +
28
28
  _ALL_DEPRECATED.deprecated_consterns +
29
29
  _ALL_DEPRECATED.deprecated_functions)
30
- __version__ = '24.04.17'
30
+ __version__ = '24.07.02'
31
31
 
32
32
  if _unLazy0:
33
33
  from pygeodesy.deprecated import bases, datum, nvector, rhumbBase, \
@@ -9,20 +9,20 @@ from pygeodesy.constants import NAN, _float
9
9
  from pygeodesy.interns import NN, _a12_, _area_, _band_, _convergence_, \
10
10
  _distance_, _gamma_, _i_, _lat_, _lon_, _ltp_
11
11
  from pygeodesy.deprecated.consterns import _Deprecated_Str
12
- from pygeodesy.karney import _GTuple, Rhumb8Tuple as _Rhumb8Tuple
12
+ from pygeodesy.karney import _GTuple, Rhumb8Tuple as _Rhumb8Tuple, ADict
13
13
  from pygeodesy.lazily import _ALL_DEPRECATED, _ALL_DOCS, _ALL_MODS as _MODS
14
14
  from pygeodesy.ltpTuples import Ned4Tuple as _Ned4Tuple
15
- # from pygeodesy.named import _NamedTuple # from .namedTuples
15
+ # from pygeodesy.named import ADict, _NamedTuple # from .karney, .namedTuples
16
16
  from pygeodesy.namedTuples import Forward4Tuple as _Forward4Tuple, \
17
17
  Reverse4Tuple as _Reverse4Tuple, \
18
18
  UtmUps5Tuple as _UtmUps5Tuple, _NamedTuple
19
19
  from pygeodesy.props import deprecated_class, deprecated_method
20
20
  from pygeodesy.resections import TriAngle5Tuple as _TriAngle5Tuple
21
21
  from pygeodesy.trf import TRFXform7Tuple as _TRFXform7Tuple
22
- from pygeodesy.units import Bearing, Int, Lat, Lon, Meter
22
+ from pygeodesy.units import Bearing, Int, Lamd, Lat, Lon, Meter, Phid
23
23
 
24
24
  __all__ = _ALL_DEPRECATED.deprecated_classes
25
- __version__ = '24.04.17'
25
+ __version__ = '24.07.02'
26
26
 
27
27
 
28
28
  class _Deprecated_NamedTuple(_NamedTuple):
@@ -151,6 +151,13 @@ def HeightIDW3(knots, **kwds): # PYCHOK no cover
151
151
  return HeightIDW3(knots, **kwds)
152
152
 
153
153
 
154
+ class Lam_(Lamd):
155
+ '''DEPRECATED on 2024.06.15, use class L{Lamd}.'''
156
+ def __init__(self, *args, **kwds): # PYCHOK signature
157
+ deprecated_class(self.__class__)
158
+ Lamd.__init__(self, *args, **kwds)
159
+
160
+
154
161
  class LatLonExact4Tuple(_Deprecated_NamedTuple):
155
162
  '''DEPRECATED, use class L{Reverse4Tuple}, item C{gamma} for C{convergence}.'''
156
163
  _Names_ = _reNames(_Reverse4Tuple._Names_, _gamma_, _convergence_)
@@ -163,6 +170,13 @@ class NearestOn4Tuple(_Deprecated_NamedTuple): # PYCHOK no cover
163
170
  _Units_ = ( Lat, Lon, Meter, Bearing)
164
171
 
165
172
 
173
+ class Phi_(Phid):
174
+ '''DEPRECATED on 2024.06.15, use class L{Phid}.'''
175
+ def __init__(self, *args, **kwds): # PYCHOK signature
176
+ deprecated_class(self.__class__)
177
+ Phid.__init__(self, *args, **kwds)
178
+
179
+
166
180
  class Ned3Tuple(_Deprecated_NamedTuple): # was in .ellipsoidalNvector
167
181
  '''DEPRECATED, use class L{Ned4Tuple}, ignoring item C{ltp}.'''
168
182
  assert _Ned4Tuple._Names_.index(_ltp_) == 3
@@ -250,6 +264,13 @@ class UtmUps4Tuple(_Deprecated_NamedTuple): # PYCHOK no cover
250
264
  _Units_ = (_Deprecated_Str,) + _UtmUps5Tuple._Units_[1:4]
251
265
 
252
266
 
267
+ class XDist(ADict):
268
+ '''DEPRECATED on 2024.07.02, use class L{XDict}.'''
269
+ def __init__(self, *args, **kwds): # PYCHOK signature
270
+ deprecated_class(self.__class__)
271
+ ADict.__init__(self, *args, **kwds)
272
+
273
+
253
274
  __all__ += _ALL_DOCS(_Deprecated_NamedTuple)
254
275
 
255
276
  # **) MIT License
@@ -5,17 +5,17 @@ u'''DEPRECATED on 2022.09.12, use module L{pygeodesy.datums} or L{pygeodesy.elli
5
5
  '''
6
6
 
7
7
  # XXX only the items previously public
8
- from pygeodesy.constants import R_M, R_MA, R_MB, R_KM, R_NM, R_SM, R_FM, R_VM
8
+ from pygeodesy.constants import R_FM, R_KM, R_M, R_MA, R_MB, R_NM, R_SM, R_VM
9
9
  from pygeodesy.datums import Datum, Datums, Transform, Transforms
10
10
  from pygeodesy.ellipsoids import Ellipsoid, Ellipsoids, Curvature2Tuple
11
11
  from pygeodesy.lazily import _ALL_DEPRECATED, _ALL_OTHER
12
12
 
13
13
  __all__ = _ALL_DEPRECATED.deprecated_datum
14
- __version__ = '23.11.26'
14
+ __version__ = '24.06.15'
15
15
 
16
16
  assert _ALL_OTHER(Curvature2Tuple, Datum, Ellipsoid, Transform) + \
17
17
  tuple(_.name for _ in (Datums, Ellipsoids, Transforms,
18
- R_M, R_MA, R_MB, R_KM, R_NM, R_SM, R_FM, R_VM)) == __all__
18
+ R_FM, R_KM, R_M, R_MA, R_MB, R_NM, R_SM, R_VM)) == __all__
19
19
 
20
20
  # **) MIT License
21
21
  #
@@ -14,7 +14,7 @@ from pygeodesy.props import deprecated_function
14
14
  from pygeodesy.units import Number_, Scalar_
15
15
 
16
16
  __all__ = _ALL_DEPRECATED.deprecated_functions
17
- __version__ = '24.05.25'
17
+ __version__ = '24.06.11'
18
18
 
19
19
  _WGS84 = _UTM = object()
20
20
 
@@ -41,9 +41,8 @@ def atand(x):
41
41
  def bounds(points, wrap=True, LatLon=None): # PYCHOK no cover
42
42
  '''DEPRECATED, use function L{pygeodesy.boundsOf}.
43
43
 
44
- @return: 2-Tuple C{(latlonSW, latlonNE)} as B{C{LatLon}}
45
- or 4-Tuple C{(latS, lonW, latN, lonE)} if
46
- B{C{LatLon}} is C{None}.
44
+ @return: 2-Tuple C{(latlonSW, latlonNE)}, each a B{C{LatLon}} or
45
+ 4-Tuple C{(latS, lonW, latN, lonE)} if C{B{LatLon} is None}.
47
46
  '''
48
47
  return tuple(_MODS.points.boundsOf(points, wrap=wrap, LatLon=LatLon))
49
48
 
@@ -253,7 +252,7 @@ def parseUTM(strUTM, datum=_WGS84, Utm=_UTM, name=NN): # PYCHOK no cover
253
252
  '''DEPRECATED, use function L{parseUTM5}.
254
253
 
255
254
  @return: The UTM coordinate (B{L{Utm}}) or 4-tuple C{(zone,
256
- hemisphere, easting, northing)} if B{C{Utm}} is C{None}.
255
+ hemisphere, easting, northing)} if C{B{Utm} is None}.
257
256
  '''
258
257
  d = _MODS.datums.Datums.WGS84 if datum is _WGS84 else datum # PYCHOK shadows?
259
258
  U = _MODS.utm.Utm if Utm is _UTM else Utm
@@ -305,9 +304,8 @@ def tienstra(pointA, pointB, pointC, alpha, **beta_gamma_useZ_Clas_and_kwds):
305
304
  def toUtm(latlon, lon=None, datum=None, Utm=_UTM, cmoff=True, name=NN): # PYCHOK no cover
306
305
  '''DEPRECATED, use function L{pygeodesy.toUtm8}.
307
306
 
308
- @return: The UTM coordinate (B{C{Utm}}) or a 6-tuple C{(zone,
309
- easting, northing, band, convergence, scale)} if
310
- B{C{Utm}} is C{None} or B{C{cmoff}} is C{False}.
307
+ @return: The UTM coordinate (B{C{Utm}}) or a 6-tuple C{(zone, easting, northing,
308
+ band, convergence, scale)} if C{B{Utm} is None} or C{B{cmoff} is False}.
311
309
  '''
312
310
  U = _MODS.utm.Utm if Utm is _UTM else Utm
313
311
  r = _MODS.utm.toUtm8(latlon, lon=lon, datum=datum, Utm=U, name=name, falsed=cmoff)
pygeodesy/dms.py CHANGED
@@ -85,7 +85,7 @@ except ImportError: # Python 3+
85
85
  from string import ascii_letters as _LETTERS
86
86
 
87
87
  __all__ = _ALL_LAZY.dms
88
- __version__ = '24.05.18'
88
+ __version__ = '24.06.11'
89
89
 
90
90
  _beyond_ = 'beyond'
91
91
  _DDDMMSS_ = 'DDDMMSS'
@@ -293,8 +293,8 @@ def clipDegrees(deg, limit):
293
293
 
294
294
  @return: Clipped value (C{degrees}).
295
295
 
296
- @raise RangeError: If B{C{deg}} outside the valid C{-/+B{limit}}
297
- range and L{pygeodesy.rangerrors} set to C{True}.
296
+ @raise RangeError: If B{C{deg}} outside the valid C{-/+B{limit}} range
297
+ and L{rangerrors<pygeodesy.rangerrors>} is C{True}.
298
298
  '''
299
299
  return _clip(deg, limit, _degrees_) if limit and limit > 0 else deg
300
300
 
@@ -307,8 +307,8 @@ def clipRadians(rad, limit):
307
307
 
308
308
  @return: Clipped value (C{radians}).
309
309
 
310
- @raise RangeError: If B{C{rad}} outside the valid C{-/+B{limit}}
311
- range and L{pygeodesy.rangerrors} set to C{True}.
310
+ @raise RangeError: If B{C{rad}} outside the valid C{-/+B{limit}} range
311
+ and L{rangerrors<pygeodesy.rangerrors>} is C{True}.
312
312
  '''
313
313
  return _clip(rad, limit, _radians_) if limit and limit > 0 else rad
314
314
 
@@ -456,17 +456,14 @@ def latlonDMS(lls, **m_form_prec_sep_s_D_M_S):
456
456
  C{LatLon.toStr} and functions L{pygeodesy.latDMS} and
457
457
  L{pygeodesy.lonDMS} for more details.
458
458
 
459
- @return: A C{tuple} of C{str}s if B{C{lls}} is a list, sequence,
460
- tuple, etc. of C{LatLon} instances or a single C{str}
461
- if B{C{lls}} is a single C{LatLon}.
459
+ @return: A C{tuple} of C{str}s if B{C{lls}} is a list, sequence, tuple, etc.
460
+ of C{LatLon}s or a single C{str} if B{C{lls}} is a single C{LatLon}.
462
461
 
463
- @see: Functions L{pygeodesy.latlonDMS_}, L{pygeodesy.latDMS},
464
- L{pygeodesy.lonDMS} and L{pygeodesy.toDMS} and method
465
- C{LatLon.toStr}.
462
+ @see: Functions L{pygeodesy.latlonDMS_}, L{pygeodesy.latDMS}, L{pygeodesy.lonDMS}
463
+ and L{pygeodesy.toDMS} and method C{LatLon.toStr}.
466
464
 
467
- @note: Keyword argument C{B{sep}=None} to join a C{str}ing
468
- from the returned C{tuple} has been I{DEPRECATED},
469
- use C{B{sep}.join(B{latlonDMS_}(...))} instead.
465
+ @note: Keyword argument C{B{sep}=None} to join a C{str}ing from the returned C{tuple}
466
+ has been I{DEPRECATED}, use C{B{sep}.join(B{latlonDMS_}(...))} instead.
470
467
  '''
471
468
  sep, kwds = _latlonDMS_sep2(latlonDMS, **m_form_prec_sep_s_D_M_S)
472
469
  if isLatLon(lls):
@@ -610,7 +607,7 @@ def parseDDDMMSS(strDDDMMSS, suffix=_NSEW_, sep=S_SEP, clip=0, sexagecimal=False
610
607
  B{C{suffix}} compass point.
611
608
 
612
609
  @raise RangeError: Value of B{C{strDDDMMSS}} outside the valid C{-/+B{clip}}
613
- range and L{pygeodesy.rangerrors} set to C{True}.
610
+ range and L{rangerrors<pygeodesy.rangerrors>} is C{True}.
614
611
 
615
612
  @note: Type C{str} values "[D]DD", "[D]DDMM", "[D]DDMMSS" and "[D]DD.MMSS"
616
613
  for B{C{strDDDMMSS}} are parsed properly only if I{either} unsigned
@@ -746,14 +743,13 @@ def parseDMS(strDMS, suffix=_NSEW_, sep=S_SEP, clip=0, **s_D_M_S): # MCCABE 14
746
743
 
747
744
  @raise ParseError: Invalid B{C{strDMS}} or B{C{clip}}.
748
745
 
749
- @raise RangeError: Value of B{C{strDMS}} outside the valid C{-/+B{clip}}
750
- range and L{pygeodesy.rangerrors} set to C{True}.
746
+ @raise RangeError: Value of B{C{strDMS}} outside the valid C{-/+B{clip}} range
747
+ and L{rangerrors<pygeodesy.rangerrors>} is C{True}.
751
748
 
752
- @note: Unlike function L{parseDDDMMSS}, type C{float}, C{int} and other
753
- non-C{str} B{C{strDMS}} values are considered decimal (and not
754
- sexagecimal) degrees. For example, C{int(1230)} is returned
755
- as 1230.0 I{and not as 12.5} degrees and C{float(345)} as 345.0
756
- I{and not as 3.75} degrees!
749
+ @note: Unlike function L{parseDDDMMSS}, type C{float}, C{int} and other non-C{str}
750
+ B{C{strDMS}} values are considered decimal (and not sexagecimal) degrees.
751
+ For example, C{int(1230)} is returned as 1230.0 I{and not as 12.5} degrees
752
+ and C{float(345)} as 345.0 I{and not as 3.75} degrees!
757
753
 
758
754
  @see: Functions L{pygeodesy.parseDDDMMSS}, L{pygeodesy.parseDMS2},
759
755
  L{pygeodesy.parse3llh} and L{pygeodesy.toDMS}.
@@ -780,7 +776,7 @@ def parseDMS2(strLat, strLon, sep=S_SEP, clipLat=90, clipLon=180, wrap=False, **
780
776
 
781
777
  @raise RangeError: Value of B{C{strLat}} or B{C{strLon}} outside the
782
778
  valid C{-/+B{clipLat}} or C{-/+B{clipLon}} range
783
- and L{pygeodesy.rangerrors} set to C{True}.
779
+ and L{rangerrors<pygeodesy.rangerrors>} is C{True}.
784
780
 
785
781
  @note: See the B{Notes} at function L{parseDMS}.
786
782
 
@@ -829,9 +825,9 @@ def parse3llh(strllh, height=0, sep=_COMMA_, clipLat=90, clipLon=180, wrap=False
829
825
  @return: A L{LatLon3Tuple}C{(lat, lon, height)} in C{degrees},
830
826
  C{degrees} and C{float}.
831
827
 
832
- @raise RangeError: Lat- or longitude value of B{C{strllh}} outside
833
- the valid C{-/+B{clipLat}} or C{-/+B{clipLon}}
834
- range and L{pygeodesy.rangerrors} set to C{True}.
828
+ @raise RangeError: Lat- or longitude value of B{C{strllh}} outside the
829
+ valid C{-/+B{clipLat}} or C{-/+B{clipLon}} range
830
+ and L{rangerrors<pygeodesy.rangerrors>} is C{True}.
835
831
 
836
832
  @raise ValueError: Invalid B{C{strllh}} or B{C{height}}.
837
833
 
@@ -870,7 +866,7 @@ def parseRad(strRad, suffix=_NSEW_, clip=0):
870
866
  @raise ParseError: Invalid B{C{strRad}} or B{C{clip}}.
871
867
 
872
868
  @raise RangeError: Value of B{C{strRad}} outside the valid C{-/+B{clip}}
873
- range and L{pygeodesy.rangerrors} set to C{True}.
869
+ range and L{rangerrors<pygeodesy.rangerrors>} is C{True}.
874
870
  '''
875
871
  def _Rad(strRad, suffix, clip):
876
872
  try:
pygeodesy/ecef.py CHANGED
@@ -86,7 +86,7 @@ from pygeodesy.utily import atan1, atan1d, atan2d, degrees90, degrees180, \
86
86
  from math import atan2, cos, degrees, fabs, radians, sqrt
87
87
 
88
88
  __all__ = _ALL_LAZY.ecef
89
- __version__ = '24.06.09'
89
+ __version__ = '24.06.11'
90
90
 
91
91
  _Ecef_ = 'Ecef'
92
92
  _prolate_ = 'prolate'
@@ -949,7 +949,7 @@ class EcefMatrix(_NamedTuple):
949
949
 
950
950
  @return: The matrix product (L{EcefMatrix}).
951
951
 
952
- @raise TypeError: If B{C{other}} is not L{EcefMatrix}.
952
+ @raise TypeError: If B{C{other}} is not an L{EcefMatrix}.
953
953
  '''
954
954
  _xinstanceof(EcefMatrix, other=other)
955
955
  # like LocalCartesian.MatrixMultiply, C{self.matrixTransposed3 X other.matrix3}
@@ -1185,7 +1185,7 @@ class Ecef9Tuple(_NamedTuple):
1185
1185
  B{C{LatLon}} keyword arguments.
1186
1186
 
1187
1187
  @return: An instance of C{B{LatLon}(lat, lon, **B{LatLon_kwds})}
1188
- or if B{C{LatLon}} is C{None}, a L{LatLon3Tuple}C{(lat, lon,
1188
+ or if C{B{LatLon} is None}, a L{LatLon3Tuple}C{(lat, lon,
1189
1189
  height)} respectively L{LatLon4Tuple}C{(lat, lon, height,
1190
1190
  datum)} depending on whether C{datum} is un-/specified.
1191
1191
 
@@ -1233,7 +1233,7 @@ class Ecef9Tuple(_NamedTuple):
1233
1233
  arguments, ignored if C{B{Vector} is None}.
1234
1234
 
1235
1235
  @return: A C{Vector}C{(x, y, z, **Vector_kwds)} instance or a
1236
- L{Vector3Tuple}C{(x, y, z)} if B{C{Vector}} is C{None}.
1236
+ L{Vector3Tuple}C{(x, y, z)} if C{B{Vector} is None}.
1237
1237
 
1238
1238
  @see: Propertes C{xyz} and C{xyzh}
1239
1239
  '''