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/karney.py CHANGED
@@ -143,13 +143,14 @@ from pygeodesy.basics import _copysign, int1s, isint, itemsorted, neg, unsigned0
143
143
  _xgeographiclib, _zip, _version_info
144
144
  from pygeodesy.constants import NAN, _isfinite as _math_isfinite, _0_0, \
145
145
  _1_16th, _1_0, _2_0, _180_0, _N_180_0, _360_0
146
- from pygeodesy.errors import GeodesicError, _ValueError, _xkwds, _xkwds_get1
146
+ from pygeodesy.errors import GeodesicError, _ValueError, _xkwds, _xkwds_get1, \
147
+ _xkwds_kwds, _xkwds_not
147
148
  from pygeodesy.fmath import cbrt, fremainder, norm2
148
149
  # from pygeodesy.internals import _version_info # from .basics
149
- from pygeodesy.interns import _2_, _a12_, _area_, _azi2_, _azi12_, _composite_, \
150
- _lat1_, _lat2_, _lon1_, _lon2_, _m12_, _M12_, \
151
- _M21_, _number_, _s12_, _S12_, _UNDER_, \
152
- _BAR_, NN # PYCHOK used!
150
+ from pygeodesy.interns import NN, _2_, _a12_, _area_, _azi1_, _azi2_, _azi12_, \
151
+ _composite_, _lat1_, _lat2_, _lon1_, _lon2_, \
152
+ _m12_, _M12_, _M21_, _number_, _s12_, _S12_, \
153
+ _UNDER_, _X_, _BAR_ # PYCHOK used!
153
154
  from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS, _getenv
154
155
  from pygeodesy.named import ADict, _NamedBase, _NamedTuple, notImplemented, _Pass
155
156
  from pygeodesy.props import deprecated_method, Property_RO
@@ -160,7 +161,7 @@ from pygeodesy.utily import atan2d, sincos2d, tand, _unrollon, fabs
160
161
  # from math import fabs # from .utily
161
162
 
162
163
  __all__ = _ALL_LAZY.karney
163
- __version__ = '24.05.31'
164
+ __version__ = '24.07.09'
164
165
 
165
166
  _K_2_0 = _getenv('PYGEODESY_GEOGRAPHICLIB', _2_) == _2_
166
167
  _perimeter_ = 'perimeter'
@@ -211,10 +212,10 @@ class Caps(object): # PYCHOK
211
212
  '''(INTERNAL) Overriden by C{Caps} below.
212
213
  '''
213
214
  EMPTY = 0 # formerly aka NONE
214
- _CAP_1 = 1 << 0 # for goedesicw only
215
- _CAP_1p = 1 << 1 # for goedesicw only
216
- # _CAP_2 = 1 << 2
217
- _CAP_3 = 1 << 3 # for goedesicw only
215
+ _CAP_1 = 1 << 0 # for goedesici/-w
216
+ _CAP_1p = 1 << 1 # for goedesici/-w
217
+ _CAP_2 = 1 << 2
218
+ _CAP_3 = 1 << 3 # for goedesici/-w
218
219
  # _CAP_4 = 1 << 4
219
220
  # _CAP_ALL = 0x1F
220
221
  # _CAP_MASK = _CAP_ALL
@@ -233,7 +234,9 @@ class Caps(object): # PYCHOK
233
234
  _DIRECT3 = AZIMUTH | LATITUDE | LONGITUDE | _CAP_3 # for goedesicw only
234
235
  _INVERSE3 = AZIMUTH | DISTANCE | _CAP_1 # for goedesicw only
235
236
  _STD = STANDARD | _CAP_3 | _CAP_1 # for goedesicw only
236
- _STD_LINE = _STD | _CAP_1p # for goedesicw only
237
+ _STD_LINE = _STD | _CAP_2 | _CAP_1p # for goedesici/-w
238
+
239
+ LINE_CAPS = _STD_LINE | REDUCEDLENGTH | GEODESICSCALE # .geodesici only
237
240
 
238
241
  LINE_OFF = 1 << 15 # Line without updates from parent geodesic or rhumb
239
242
  LONG_UNROLL = 1 << 16 # unroll C{lon2} in .Direct and .Position
@@ -246,14 +249,14 @@ class Caps(object): # PYCHOK
246
249
  AZIMUTH_DISTANCE_AREA = AZIMUTH | DISTANCE | AREA
247
250
 
248
251
  _ANGLE_ONLY = 1 << 18 # angular distance C{a12} only
249
- _SALPs_CALPs = 1 << 19 # (INTERNAL) GeodesicExact._GenInverse
252
+ _S_CALPs_ = 1 << 19 # (INTERNAL) GeodesicExact._GenInverse
250
253
 
251
254
  _DEBUG_AREA = 1 << 20 # (INTERNAL) include Line details
252
255
  _DEBUG_DIRECT = 1 << 21 # (INTERNAL) include Direct details
253
256
  _DEBUG_INVERSE = 1 << 22 # (INTERNAL) include Inverse details
254
257
  _DEBUG_LINE = 1 << 23 # (INTERNAL) include Line details
255
258
  _DEBUG_ALL = _DEBUG_AREA | _DEBUG_DIRECT | _DEBUG_INVERSE | \
256
- _DEBUG_LINE | _ANGLE_ONLY | _SALPs_CALPs
259
+ _DEBUG_LINE | _ANGLE_ONLY | _S_CALPs_
257
260
 
258
261
  _OUT_ALL = ALL
259
262
  _OUT_MASK = ALL | LONG_UNROLL | REVERSE2 | _DEBUG_ALL
@@ -271,7 +274,7 @@ class Caps(object): # PYCHOK
271
274
  s = []
272
275
  for c, C in itemsorted(self.__class__.__dict__):
273
276
  if isint(C) and (Csk & C) and int1s(C) == 1 \
274
- and (C in (Caps.REVERSE2, Caps._SALPs_CALPs)
277
+ and (C in (Caps.REVERSE2, Caps._S_CALPs_)
275
278
  or c.replace(_UNDER_, NN).isupper()):
276
279
  s.append(c)
277
280
  return sep.join(s) if sep else tuple(s)
@@ -308,6 +311,15 @@ and C{ALL} - all of the above.
308
311
 
309
312
  C{STANDARD} = C{AZIMUTH | DISTANCE | DISTANCE_IN | LATITUDE | LONGITUDE}'''
310
313
 
314
+ _KEY2Caps = dict(azi2=Caps.AZIMUTH, # see GDict._unCaps
315
+ lat2=Caps.LATITUDE,
316
+ lon2=Caps.LONGITUDE,
317
+ m12 =Caps.REDUCEDLENGTH,
318
+ M12 =Caps.GEODESICSCALE,
319
+ M21 =Caps.GEODESICSCALE,
320
+ s12 =Caps.DISTANCE,
321
+ S12 =Caps.AREA)
322
+
311
323
 
312
324
  class _CapsBase(_NamedBase): # in .auxilats, .geodesicx.gxbases
313
325
  '''(INTERNAL) Base class for C{[_]Geodesic*Exact}.
@@ -320,11 +332,13 @@ class _CapsBase(_NamedBase): # in .auxilats, .geodesicx.gxbases
320
332
  EMPTY = Caps.EMPTY # aka NONE
321
333
  GEODESICSCALE = Caps.GEODESICSCALE
322
334
  LATITUDE = Caps.LATITUDE
335
+ LINE_CAPS = Caps.LINE_CAPS
323
336
  LINE_OFF = Caps.LINE_OFF
324
337
  LONGITUDE = Caps.LONGITUDE
325
338
  LONG_UNROLL = Caps.LONG_UNROLL
326
339
  REDUCEDLENGTH = Caps.REDUCEDLENGTH
327
340
  STANDARD = Caps.STANDARD
341
+ _STD_LINE = Caps._STD_LINE # for geodesici
328
342
 
329
343
  _caps = 0 # None
330
344
  _debug = 0 # or Caps._DEBUG_...
@@ -418,6 +432,12 @@ class GDict(ADict): # XXX _NamedDict
418
432
  '''
419
433
  return self._toTuple(Inverse10Tuple, dflt)
420
434
 
435
+ def _toNAN(self, outmask): # .GeodesicLineExact._GenPosition
436
+ '''(INTERNAL) Convert this C{GDict} to all C{NAN}s.
437
+ '''
438
+ d = dict((n, NAN) for n in GeodSolve12Tuple._Names_)
439
+ return self.set_(**d)._unCaps(outmask)
440
+
421
441
  @deprecated_method
422
442
  def toRhumb7Tuple(self, dflt=NAN): # PYCHOK no cover
423
443
  '''DEPRECATED on 23.12.07, use method C{toRhumb8Tuple}.
@@ -453,6 +473,39 @@ class GDict(ADict): # XXX _NamedDict
453
473
  t = tuple(_g(self, n, dflt) for n in nTuple._Names_)
454
474
  return nTuple(t, iteration=self._iteration)
455
475
 
476
+ def _2X(self, gl, _2X=_X_): # .Intesectool, .Intersector
477
+ '''(INTERNAL) Rename attr tail from C{-2} to C{-X} or C{-M}.
478
+ '''
479
+ X = GDict(self)
480
+ for n in (_lat2_, _lon2_, _azi2_, _s12_, _a12_):
481
+ if n in X: # X._X = X._2
482
+ X[n[:-1] + _2X] = X.pop(n)
483
+ v = getattr(gl, n, X)
484
+ if v is not X: # X._2 = gl._2
485
+ X[n] = v
486
+ return X
487
+
488
+ def _unCaps(self, outmask): # in .geodsolve
489
+ '''(INTERNAL) Remove superfluous items.
490
+ '''
491
+ for k, m in _KEY2Caps.items():
492
+ if k in self and not (outmask & m):
493
+ self.pop(k) # delattr(self, k)
494
+ return self
495
+
496
+
497
+ class GeodSolve12Tuple(_GTuple):
498
+ '''12-Tuple C{(lat1, lon1, azi1, lat2, lon2, azi2, s12, a12, m12, M12, M21, S12)} with
499
+ angles C{lat1}, C{lon1}, C{azi1}, C{lat2}, C{lon2} and C{azi2} and arc C{a12} all in
500
+ C{degrees}, initial C{azi1} and final C{azi2} forward azimuths, distance C{s12} and
501
+ reduced length C{m12} in C{meter}, area C{S12} in C{meter} I{squared} and geodesic
502
+ scale factors C{M12} and C{M21}, both C{scalar}, see U{GeodSolve
503
+ <https://GeographicLib.SourceForge.io/C++/doc/GeodSolve.1.html>}.
504
+ '''
505
+ # from GeodSolve --help option -f ... lat1 lon1 azi1 lat2 lon2 azi2 s12 a12 m12 M12 M21 S12
506
+ _Names_ = (_lat1_, _lon1_, _azi1_, _lat2_, _lon2_, _azi2_, _s12_, _a12_, _m12_, _M12_, _M21_, _S12_)
507
+ _Units_ = (_Lat, _Lon, _Azi, _Lat, _Lon, _Azi, _M, _Deg, _Pass, _Pass, _Pass, _M2)
508
+
456
509
 
457
510
  class Inverse10Tuple(_GTuple):
458
511
  '''10-Tuple C{(a12, s12, salp1, calp1, salp2, calp2, m12, M12, M21, S12)} with arc length
@@ -671,6 +724,16 @@ def _isfinite(x): # mimick geomath.Math.isfinite
671
724
  return _math_isfinite(x) # and fabs(x) <= _MAX
672
725
 
673
726
 
727
+ def _llz2line(line, **llz2):
728
+ '''(INTERNAL) Set C{line.lat2, .lon2, .azi2} from C{llz2}.
729
+ '''
730
+ if llz2:
731
+ llz2 = _xkwds_not(None, **_xkwds_kwds(llz2, lat2=None, lon2=None, azi2=None))
732
+ if llz2:
733
+ line.__dict__.update(llz2)
734
+ return line
735
+
736
+
674
737
  def _norm2(x, y): # mimick geomath.Math.norm
675
738
  '''Normalize C{B{x}} and C{B{y}}.
676
739
 
@@ -882,7 +945,7 @@ def _unroll2(lon1, lon2, wrap=False): # see .ellipsoidalBaseDI._intersects2
882
945
  '''Unroll B{C{lon2 - lon1}} like C{geodesic.Geodesic.Inverse}.
883
946
 
884
947
  @return: 2-Tuple C{(B{lon2} - B{lon1}, B{lon2})} with B{C{lon2}}
885
- unrolled if B{C{wrap}} is C{True}, normalized otherwise.
948
+ unrolled if C{B{wrap} is True}, normalized otherwise.
886
949
  '''
887
950
  if wrap:
888
951
  d, t = _diff182(lon1, lon2)
pygeodesy/ktm.py CHANGED
@@ -67,7 +67,7 @@ from cmath import polar
67
67
  from math import atan2, asinh, cos, cosh, degrees, fabs, sin, sinh, sqrt, tanh
68
68
 
69
69
  __all__ = _ALL_LAZY.ktm
70
- __version__ = '24.05.24'
70
+ __version__ = '24.06.11'
71
71
 
72
72
 
73
73
  class KTMError(_ValueError):
@@ -119,18 +119,16 @@ class KTransverseMercator(_NamedBase):
119
119
  raiser=False, **TMorder_name):
120
120
  '''New L{KTransverseMercator}.
121
121
 
122
- @kwarg a_earth: This rhumb's earth (L{Ellipsoid}, L{Ellipsoid2},
123
- L{a_f2Tuple}, L{Datum}, 2-tuple (C{a, f})) or the
124
- equatorial radius (C{scalar}, C{meter}).
125
- @kwarg f: The ellipsoid's flattening (C{scalar}), iff B{C{a_earth}}
126
- is a C{scalar}, ignored otherwise.
122
+ @kwarg a_earth: This rhumb's earth (L{Ellipsoid}, L{Ellipsoid2}, L{a_f2Tuple},
123
+ L{Datum}, 2-tuple (C{a, f})) or the equatorial radius (C{meter}).
124
+ @kwarg f: The ellipsoid's flattening (C{scalar}), required if B{C{a_earth}} is
125
+ is C{meter}, ignored otherwise.
127
126
  @kwarg lon0: The central meridian (C{degrees180}).
128
127
  @kwarg k0: Central scale factor (C{scalar}).
129
- @kwarg raiser: If C{True}, throw a L{KTMError} for C{forward}
130
- singularities (C{bool}).
131
- @kwarg TMorder_name: Optional C{B{name}=NN} (C{str}) and optional
132
- keyword argument C{B{TMorder}=6} for the order of
133
- this L{KTransverseMercator}, see property C{TMorder}.
128
+ @kwarg raiser: If C{True}, throw a L{KTMError} for C{forward} singularities (C{bool}).
129
+ @kwarg TMorder_name: Optional C{B{name}=NN} (C{str}) and optional keyword argument
130
+ C{B{TMorder}=6} for the order of this L{KTransverseMercator}, see
131
+ property C{TMorder}.
134
132
 
135
133
  @raise KTMError: Invalid B{C{a_earth}}, B{C{f}} or B{C{TMorder}}.
136
134
  '''
@@ -229,14 +227,13 @@ class KTransverseMercator(_NamedBase):
229
227
  @arg lon0: Central meridian of the projection (C{degrees180}).
230
228
  @kwarg name: Optional C{B{name}=NN} (C{str}).
231
229
 
232
- @return: L{Forward4Tuple}C{(easting, northing, gamma, scale)}
233
- with C{easting} and C{northing} in C{meter}, unfalsed, the
230
+ @return: L{Forward4Tuple}C{(easting, northing, gamma, scale)} with
231
+ C{easting} and C{northing} in C{meter}, unfalsed, the
234
232
  meridian convergence C{gamma} at point in C{degrees180}
235
233
  and the C{scale} of projection at point C{scalar}. Any
236
234
  value may be C{NAN}, C{NINF} or C{INF} for singularities.
237
235
 
238
- @raise KTMError: For singularities, iff property C{raiser} is
239
- C{True}.
236
+ @raise KTMError: For singularities, iff property C{raiser} is C{True}.
240
237
  '''
241
238
  lat, _lat = _unsigned2(_fix90(lat - self._lat0))
242
239
  lon, _ = _diff182((self.lon0 if lon0 is None else lon0), lon)
@@ -343,7 +340,7 @@ class KTransverseMercator(_NamedBase):
343
340
  @arg lat0: Latitude of the central parallel (C{degrees90}).
344
341
  @arg lon0: Longitude of the central parallel (C{degrees180}).
345
342
 
346
- @return: 2-Tuple C{(lat0, lon0)} of the previous central
343
+ @return: 2-Tuple C{(lat0, lon0)} with the previous central
347
344
  parallel and meridian.
348
345
 
349
346
  @raise KTMError: Invalid B{C{lat0}} or B{C{lon0}}.
pygeodesy/latlonBase.py CHANGED
@@ -54,7 +54,7 @@ from contextlib import contextmanager
54
54
  from math import asin, cos, degrees, fabs, radians
55
55
 
56
56
  __all__ = _ALL_LAZY.latlonBase
57
- __version__ = '24.06.07'
57
+ __version__ = '24.06.11'
58
58
 
59
59
  _formy = _MODS.into(formy=__name__)
60
60
 
@@ -143,17 +143,17 @@ class LatLonBase(_NamedBase):
143
143
  bounding box centered at this location.
144
144
 
145
145
  @arg wide: Longitudinal box width (C{meter}, same units as
146
- B{C{radius}} or C{degrees} if B{C{radius}} is C{None}).
146
+ B{C{radius}} or C{degrees} if C{B{radius} is None}).
147
147
  @arg tall: Latitudinal box size (C{meter}, same units as
148
- B{C{radius}} or C{degrees} if B{C{radius}} is C{None}).
148
+ B{C{radius}} or C{degrees} if C{B{radius} is None}).
149
149
  @kwarg radius: Mean earth radius (C{meter}) or C{None} if I{both}
150
150
  B{C{wide}} and B{C{tall}} are in C{degrees}.
151
151
  @kwarg height: Height for C{latlonSW} and C{latlonNE} (C{meter}),
152
152
  overriding the point's height.
153
153
  @kwarg name: Optional C{B{name}=NN} (C{str}).
154
154
 
155
- @return: A L{Bounds2Tuple}C{(latlonSW, latlonNE)}, the
156
- lower-left and upper-right corner (C{LatLon}).
155
+ @return: A L{Bounds2Tuple}C{(latlonSW, latlonNE)}, the lower-left
156
+ and upper-right corner (C{LatLon}).
157
157
 
158
158
  @see: U{https://www.Movable-Type.co.UK/scripts/latlong-db.html}
159
159
  '''
@@ -1396,13 +1396,12 @@ class LatLonBase(_NamedBase):
1396
1396
  (C{meter}, conventionally).
1397
1397
  @kwarg Cartesian: Optional class to return the geocentric
1398
1398
  coordinates (C{Cartesian}) or C{None}.
1399
- @kwarg Cartesian_kwds: Optional, additional B{C{Cartesian}}
1400
- keyword arguments, ignored if
1401
- C{B{Cartesian} is None}.
1399
+ @kwarg Cartesian_kwds: Optional, additional B{C{Cartesian}} keyword
1400
+ arguments, ignored if C{B{Cartesian} is None}.
1402
1401
 
1403
- @return: A B{C{Cartesian}} or if B{C{Cartesian}} is C{None},
1404
- an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M,
1405
- datum)} with C{C=0} and C{M} if available.
1402
+ @return: A B{C{Cartesian}} or if B{C{Cartesian} is None}, an
1403
+ L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)}
1404
+ with C{C=0} and C{M} if available.
1406
1405
 
1407
1406
  @raise TypeError: Invalid B{C{Cartesian}} or B{C{Cartesian_kwds}}.
1408
1407
 
@@ -1512,11 +1511,10 @@ class LatLonBase(_NamedBase):
1512
1511
  additional B{C{Nvector}} keyword arguments, ignored if
1513
1512
  C{B{Nvector} is None}.
1514
1513
 
1515
- @return: An B{C{Nvector}} or a L{Vector4Tuple}C{(x, y, z, h)} if
1516
- B{C{Nvector}} is C{None}.
1514
+ @return: An named B{C{Nvector}} or if C{B{Nvector} is None} a named
1515
+ L{Vector4Tuple}C{(x, y, z, h)}.
1517
1516
 
1518
- @raise TypeError: Invalid B{C{h}}, B{C{Nvector}} or
1519
- B{C{name_Nvector_kwds}} item.
1517
+ @raise TypeError: Invalid B{C{h}}, B{C{Nvector}} or B{C{name_Nvector_kwds}}.
1520
1518
 
1521
1519
  @see: Methods C{toCartesian}, C{toVector} and C{toVector3d}.
1522
1520
  '''
@@ -1548,7 +1546,7 @@ class LatLonBase(_NamedBase):
1548
1546
 
1549
1547
  @return: This point in the specified C{B{form}at}, etc. (C{str} or
1550
1548
  a 2- or 3-tuple C{(lat_str, lon_str[, height_str])} if
1551
- C{B{joined}=NN} or C{B{joined}=None}).
1549
+ B{C{joined}} is C{NN} or C{None}).
1552
1550
 
1553
1551
  @see: Function L{pygeodesy.latDMS} or L{pygeodesy.lonDMS} for more
1554
1552
  details about keyword arguments C{B{form}at}, C{B{prec}ision},
@@ -1569,10 +1567,10 @@ class LatLonBase(_NamedBase):
1569
1567
  @kwarg Vector_kwds: Optional, additional B{C{Vector}} keyword
1570
1568
  arguments, ignored if C{B{Vector} is None}.
1571
1569
 
1572
- @return: A named B{C{Vector}} or if B{C{Vector}} is C{None} a
1570
+ @return: A named B{C{Vector}} or if C{B{Vector} is None} a
1573
1571
  named L{Vector3Tuple}C{(x, y, z)}.
1574
1572
 
1575
- @raise TypeError: Invalid B{C{Vector}} or B{C{Vector_kwds}} item.
1573
+ @raise TypeError: Invalid B{C{Vector}} or B{C{Vector_kwds}}.
1576
1574
 
1577
1575
  @see: Methods C{toCartesian}, C{toNvector} and C{toVector3d}.
1578
1576
  '''
@@ -1587,7 +1585,7 @@ class LatLonBase(_NamedBase):
1587
1585
 
1588
1586
  @return: Named, unit vector or vector (L{Vector3d}).
1589
1587
 
1590
- @raise TypeError: Invalid B{C{Vector3d_kwds}} item.
1588
+ @raise TypeError: Invalid B{C{Vector3d_kwds}}.
1591
1589
 
1592
1590
  @see: Methods C{toCartesian}, C{toNvector} and C{toVector}.
1593
1591
  '''
pygeodesy/lazily.py CHANGED
@@ -48,26 +48,27 @@ except ImportError as x: # Python 2.6-
48
48
  from os import getenv as _getenv
49
49
  # import sys as _sys # from .interns
50
50
 
51
- __as__ = ' as '
52
- _dunder_all_ = '__all__' # in .__main__
53
- _enabled_ = 'enabled'
54
- _FOR_DOCS = _getenv('PYGEODESY_FOR_DOCS', NN) # for epydoc ...
55
- _i0 = () # PYCHOK empty tuple
56
- _init__all__ = _FOR_DOCS or _getenv('PYGEODESY_INIT__ALL__', _dunder_all_) == _dunder_all_ # PYCHOK exported
57
- _lazily_ = 'lazily'
58
- _lazily_imported_ = _SPACE_(_HASH_, _lazily_, 'imported')
59
- _PYGEODESY_GEOCONVERT_ = 'PYGEODESY_GEOCONVERT' # PYCHOK .mgrs, test.bases
60
- _PYGEODESY_GEODSOLVE_ = 'PYGEODESY_GEODSOLVE' # PYCHOK .geodsolve, test.bases
61
- _PYGEODESY_LAZY_IMPORT_ = 'PYGEODESY_LAZY_IMPORT'
62
- _PYGEODESY_RHUMBSOLVE_ = 'PYGEODESY_RHUMBSOLVE' # PYCHOK .rhumb.solve, test.bases
63
- _PYTHON_X_DEV = getattr(_sys, '_xoptions', {}).get('dev', # Python 3.2+
51
+ __as__ = ' as '
52
+ _dunder_all_ = '__all__' # in .__main__
53
+ _enabled_ = 'enabled'
54
+ _FOR_DOCS = _getenv('PYGEODESY_FOR_DOCS', NN) # for epydoc ...
55
+ _i0 = () # PYCHOK empty tuple
56
+ _init__all__ = _FOR_DOCS or _getenv('PYGEODESY_INIT__ALL__', _dunder_all_) == _dunder_all_ # PYCHOK exported
57
+ _lazily_ = 'lazily'
58
+ _lazily_imported_ = _SPACE_(_HASH_, _lazily_, 'imported')
59
+ _PYGEODESY_GEOCONVERT_ = 'PYGEODESY_GEOCONVERT' # PYCHOK .mgrs, test.bases
60
+ _PYGEODESY_GEODSOLVE_ = 'PYGEODESY_GEODSOLVE' # PYCHOK .geodsolve, test.bases
61
+ _PYGEODESY_INTERSECTTOOL_ = 'PYGEODESY_INTERSECTTOOL' # PYCHOK .intersectool, test.bases
62
+ _PYGEODESY_LAZY_IMPORT_ = 'PYGEODESY_LAZY_IMPORT'
63
+ _PYGEODESY_RHUMBSOLVE_ = 'PYGEODESY_RHUMBSOLVE' # PYCHOK .rhumb.solve, test.bases
64
+ _PYTHON_X_DEV = getattr(_sys, '_xoptions', {}).get('dev', # Python 3.2+
64
65
  _getenv('PYTHONDEVMODE', NN)) # PYCHOK exported
65
- _sys_version_info2 = _sys.version_info[:2] # in .basics, .fmath, ...
66
- _unlazy = _unLazy0 = _isfrozen or _sys_version_info2 < (3, 7) # PYCHOK mod.__getattr__ 3.7+
67
- _WARNINGS_X_DEV = _getenv('PYGEODESY_WARNINGS', NN) and (
68
- _PYTHON_X_DEV or bool(_sys.warnoptions)) # PYCHOK .props
66
+ _sys_version_info2 = _sys.version_info[:2] # in .basics, .fmath, ...
67
+ _unlazy = _unLazy0 = _isfrozen or _sys_version_info2 < (3, 7) # PYCHOK mod.__getattr__ 3.7+
68
+ _WARNINGS_X_DEV = _getenv('PYGEODESY_WARNINGS', NN) and (
69
+ _PYTHON_X_DEV or bool(_sys.warnoptions)) # PYCHOK .props
69
70
  # @module_property[_RO?] <https://GitHub.com/jtushman/proxy_tools/>
70
- isLazy = None # see @var isLazy in .__init__
71
+ isLazy = None # see @var isLazy in .__init__
71
72
 
72
73
 
73
74
  class LazyAttributeError(AttributeError):
@@ -283,6 +284,8 @@ _ALL_LAZY = _NamedEnum_RO(_name='_ALL_LAZY',
283
284
  fsums=_i('Fsum', 'DivMod2Tuple', 'Fsum2Tuple', 'ResidualError',
284
285
  'fsum', 'fsum_', 'fsumf_', 'fsum1', 'fsum1_', 'fsum1f_'),
285
286
  gars=_i('Garef', 'GARSError'),
287
+ geodesici=_i('Intersectool', 'Intersectool5Tuple', 'Middle5Tuple',
288
+ 'Intersector', 'Intersector5Tuple', 'XDict'),
286
289
  geodesicw=_i('Geodesic', 'GeodesicLine', 'Geodesic_WGS84'),
287
290
  geodesicx=_i('gx', 'gxarea', 'gxbases', 'gxline', # modules
288
291
  'GeodesicAreaExact', 'GeodesicExact', 'GeodesicLineExact', 'PolygonArea'),
@@ -367,9 +370,9 @@ _ALL_LAZY = _NamedEnum_RO(_name='_ALL_LAZY',
367
370
  units=_i('Band', 'Bearing', 'Bearing_', 'Bool',
368
371
  'Degrees', 'Degrees_', 'Degrees2', 'Distance', 'Distance_', 'Easting', 'Epoch',
369
372
  'Feet', 'FIx', 'Float_', 'Height', 'Height_', 'HeightX', 'Int_',
370
- 'Lam', 'Lam_', 'Lat', 'Lat_', 'Lon', 'Lon_',
373
+ 'Lam', 'Lamd', 'Lat', 'Lat_', 'Lon', 'Lon_',
371
374
  'Meter', 'Meter_', 'Meter2', 'Meter3', 'Northing', 'Number_',
372
- 'Phi', 'Phi_', 'Precision_', 'Radians', 'Radians_', 'Radians2',
375
+ 'Phi', 'Phid', 'Precision_', 'Radians', 'Radians_', 'Radians2',
373
376
  'Radius_', 'Scalar', 'Scalar_', 'Zone'),
374
377
  unitsBase=_i('Float', 'Int', 'Radius', 'Str'),
375
378
  ups=_i('Ups', 'UPSError', 'parseUPS5', 'toUps8', 'upsZoneBand5'),
@@ -406,13 +409,13 @@ _ALL_DEPRECATED = _NamedEnum_RO(_name='_ALL_DEPRECATED',
406
409
  deprecated_bases=_i('LatLonHeightBase', 'points2'),
407
410
  deprecated_classes=_i('ClipCS3Tuple', 'EasNorExact4Tuple', 'EcefCartesian', 'Fn_rt',
408
411
  'HeightIDW', 'HeightIDW2', 'HeightIDW3', 'Helmert7Tuple',
409
- 'LatLonExact4Tuple', 'NearestOn4Tuple', 'Ned3Tuple',
410
- 'RefFrameError', 'Rhumb7Tuple', 'RhumbOrder2Tuple',
411
- 'Transform7Tuple', 'TriAngle4Tuple', 'UtmUps4Tuple'),
412
+ 'Lam_', 'LatLonExact4Tuple', 'NearestOn4Tuple', 'Ned3Tuple',
413
+ 'Phi_', 'RefFrameError', 'Rhumb7Tuple', 'RhumbOrder2Tuple',
414
+ 'Transform7Tuple', 'TriAngle4Tuple', 'UtmUps4Tuple', 'XDist'),
412
415
  deprecated_consterns=_i('EPS1_2', 'MANTIS', 'OK'),
413
416
  deprecated_datum=_i('Curvature2Tuple', 'Datum', 'Ellipsoid', 'Transform', # assert
414
417
  'Datums', 'Ellipsoids', 'Transforms',
415
- 'R_M', 'R_MA', 'R_MB', 'R_KM', 'R_NM', 'R_SM', 'R_FM', 'R_VM'),
418
+ 'R_FM', 'R_KM', 'R_M', 'R_MA', 'R_MB', 'R_NM', 'R_SM', 'R_VM'),
416
419
  deprecated_functions=_i('anStr', 'areaof', 'atand', 'bounds', # most of the DEPRECATED functions, except ...
417
420
  'clipCS3', 'clipDMS', 'clipStr', 'collins', 'copysign', # ... ellipsoidal, spherical flavors
418
421
  'decodeEPSG2', 'encodeEPSG', 'enStr2', 'equirectangular_', 'equirectangular3',
@@ -518,7 +521,7 @@ class _ALL_MODS(_internals._MODS_Base):
518
521
  _internals._MODS = _ALL_MODS = _ALL_MODS() # PYCHOK singleton
519
522
 
520
523
  __all__ = _ALL_LAZY.lazily
521
- __version__ = '24.06.05'
524
+ __version__ = '24.07.09'
522
525
 
523
526
 
524
527
  def _ALL_OTHER(*objs):
pygeodesy/lcc.py CHANGED
@@ -41,14 +41,14 @@ from pygeodesy.namedTuples import EasNor3Tuple, LatLonDatum3Tuple, \
41
41
  LatLon2Tuple, _LL4Tuple, PhiLam2Tuple
42
42
  from pygeodesy.props import deprecated_method, Property, Property_RO, _update_all
43
43
  from pygeodesy.streprs import Fmt, _fstrENH2, _xzipairs
44
- from pygeodesy.units import Easting, Height, _heigHt, Lam_, Northing, Phi_, \
44
+ from pygeodesy.units import Easting, Height, _heigHt, Lamd, Northing, Phid, \
45
45
  Scalar_
46
46
  from pygeodesy.utily import atan1, degrees90, degrees180, sincos2, tanPI_2_2
47
47
 
48
48
  from math import atan, fabs, log, radians, sin, sqrt
49
49
 
50
50
  __all__ = _ALL_LAZY.lcc
51
- __version__ = '24.06.09'
51
+ __version__ = '24.06.24'
52
52
 
53
53
  _E0_ = 'E0'
54
54
  _N0_ = 'N0'
@@ -107,8 +107,8 @@ class Conic(_NamedEnumItem):
107
107
  _xinstanceof(_LLEB, latlon0=latlon0)
108
108
  self._phi0, self._lam0 = latlon0.philam
109
109
 
110
- self._par1 = Phi_(par1=par1)
111
- self._par2 = self._par1 if par2 is None else Phi_(par2=par2)
110
+ self._par1 = Phid(par1=par1)
111
+ self._par2 = self._par1 if par2 is None else Phid(par2=par2)
112
112
 
113
113
  if k0 != 1:
114
114
  self._k0 = Scalar_(k0=k0)
@@ -117,7 +117,7 @@ class Conic(_NamedEnumItem):
117
117
  if N0:
118
118
  self._N0 = Easting(N0=N0, falsed=True)
119
119
  if opt3:
120
- self._opt3 = Lam_(opt3=opt3)
120
+ self._opt3 = Lamd(opt3=opt3)
121
121
 
122
122
  self.toDatum(latlon0.datum)._dup2(self)
123
123
  self._register(Conics, name)
@@ -278,20 +278,19 @@ class Conic(_NamedEnumItem):
278
278
 
279
279
  return c
280
280
 
281
- def toStr(self, prec=8, name=NN, **unused): # PYCHOK expected
281
+ def toStr(self, prec=8, **name): # PYCHOK expected
282
282
  '''Return this conic as a string.
283
283
 
284
284
  @kwarg prec: Number of (decimal) digits, unstripped (C{int}).
285
- @kwarg name: Overriding name (C{str}) or C{None} to exclude
286
- this conic's name.
285
+ @kwarg name: Overriding C{B{name}=NN} (C{str}) or C{None} to
286
+ exclude this conic's name.
287
287
 
288
288
  @return: Conic attributes (C{str}).
289
289
  '''
290
- a = [name, prec, _lat0_, _lon0_, _par1_, _par2_,
291
- _E0_, _N0_, _k0_, _SP_]
290
+ a = [_lat0_, _lon0_, _par1_, _par2_, _E0_, _N0_, _k0_, _SP_]
292
291
  if self._SP == 1:
293
292
  _ = a.pop(a.index(_par2_))
294
- return self._instr(datum=self.datum, *a)
293
+ return self._instr(datum=self.datum, prec=prec, *a, **name)
295
294
 
296
295
  def _dup2(self, c):
297
296
  '''(INTERNAL) Copy this conic to C{c}.
@@ -537,22 +536,21 @@ class Lcc(_NamedBase):
537
536
  def toLatLon(self, LatLon=None, datum=None, height=None, **LatLon_kwds):
538
537
  '''Convert this L{Lcc} to an (ellipsoidal) geodetic point.
539
538
 
540
- @kwarg LatLon: Optional, ellipsoidal class to return the
541
- geodetic point (C{LatLon}) or C{None}.
542
- @kwarg datum: Optional datum to use, otherwise use this
543
- B{C{Lcc}}'s conic.datum (L{Datum}, L{Ellipsoid},
544
- L{Ellipsoid2} or L{a_f2Tuple}).
545
- @kwarg height: Optional height for the point, overriding
546
- the default height (C{meter}).
547
- @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword
548
- arguments, ignored if C{B{LatLon} is None}.
539
+ @kwarg LatLon: Optional, ellipsoidal class to return the geodetic
540
+ point (C{LatLon}) or C{None}.
541
+ @kwarg datum: Optional datum to use, otherwise use this B{C{Lcc}}'s
542
+ conic.datum (L{Datum}, L{Ellipsoid}, L{Ellipsoid2} or
543
+ L{a_f2Tuple}).
544
+ @kwarg height: Optional height for the point, overriding the default height
545
+ (C{meter}).
546
+ @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword arguments,
547
+ ignored if C{B{LatLon} is None}.
549
548
 
550
- @return: The point (B{C{LatLon}}) or a
551
- L{LatLon4Tuple}C{(lat, lon, height, datum)}
552
- if B{C{LatLon}} is C{None}.
549
+ @return: The point (B{C{LatLon}}) or if C{B{LatLon} is None}, a
550
+ L{LatLon4Tuple}C{(lat, lon, height, datum)}.
553
551
 
554
- @raise TypeError: If B{C{LatLon}} or B{C{datum}} is
555
- not ellipsoidal or not valid.
552
+ @raise TypeError: If B{C{LatLon}} or B{C{datum}} is not ellipsoidal or
553
+ not valid.
556
554
  '''
557
555
  if LatLon:
558
556
  _xsubclassof(_LLEB, LatLon=LatLon)
@@ -622,13 +620,12 @@ def toLcc(latlon, conic=Conics.WRF_Lb, height=None, Lcc=Lcc,
622
620
  @kwarg height: Optional height for the point, overriding the
623
621
  default height (C{meter}).
624
622
  @kwarg Lcc: Class to return the I{Lambert} location (L{Lcc}).
625
- @kwarg name_Lcc_kwds: Optional C{B{name}=NN} (C{str}) for the
626
- location and optional, additional B{C{Lcc}} keyword
627
- arguments, ignored if B{C{Lcc}} is C{None}.
623
+ @kwarg name_Lcc_kwds: Optional C{B{name}=NN} (C{str}) and optional,
624
+ additional B{C{Lcc}} keyword arguments, ignored if
625
+ B{C{Lcc} is None}.
628
626
 
629
- @return: The I{Lambert} location (L{Lcc}) or an
630
- L{EasNor3Tuple}C{(easting, northing, height)} if
631
- C{B{Lcc} is None}.
627
+ @return: The I{Lambert} location (L{Lcc}) or if C{B{Lcc} is None},
628
+ an L{EasNor3Tuple}C{(easting, northing, height)}.
632
629
 
633
630
  @raise TypeError: If B{C{latlon}} is not ellipsoidal.
634
631
  '''
pygeodesy/ltp.py CHANGED
@@ -44,7 +44,7 @@ from pygeodesy.vector3d import _ALL_LAZY, Vector3d
44
44
  # from math import fabs, floor as _floor # from .fmath, .fsums
45
45
 
46
46
  __all__ = _ALL_LAZY.ltp
47
- __version__ = '24.06.07'
47
+ __version__ = '24.06.11'
48
48
 
49
49
  _height0_ = _height_ + _0_
50
50
  _narrow_ = 'narrow'
@@ -154,7 +154,7 @@ class Attitude(_NamedBase):
154
154
  additional B{C{Vector}} keyword arguments, ignored if
155
155
  C{B{Vector} is None}.
156
156
 
157
- @return: A named B{C{Vector}} instance or if B{C{Vector}} is C{None},
157
+ @return: A named B{C{Vector}} instance or if C{B{Vector} is None},
158
158
  a named L{Vector3Tuple}C{(x, y, z)}.
159
159
 
160
160
  @raise AttitudeError: Invalid B{C{x_xyz}}, B{C{y}} or B{C{z}}.
@@ -419,13 +419,12 @@ class LocalCartesian(_NamedBase):
419
419
  @kwarg latlonh0: The (geodetic) origin (C{LatLon}, L{LatLon4Tuple}, L{Ltp}
420
420
  L{LocalCartesian} or L{Ecef9Tuple}) or the C{scalar}
421
421
  latitude of the (goedetic) origin (C{degrees}).
422
- @kwarg lon0: Longitude of the (goedetic) origin (C{degrees}) for C{scalar}
423
- B{C{latlonh0}}, ignored otherwise.
422
+ @kwarg lon0: Longitude of the (goedetic) origin (C{degrees}), required if
423
+ B{C{latlonh0}} is C{scalar}, ignored otherwise.
424
424
  @kwarg height0: Optional height (C{meter}, conventionally) at the (goedetic)
425
425
  origin perpendicular to and above (or below) the ellipsoid's
426
- surface and for C{scalar} B{C{latlonh0}}, ignored otherwise.
427
- @kwarg ecef: An ECEF converter (L{EcefKarney} I{only}) for C{scalar}
428
- B{C{latlonh0}}, ignored otherwise.
426
+ surface, like B{C{lon0}}.
427
+ @kwarg ecef: An ECEF converter (L{EcefKarney} I{only}), like B{C{lon0}}.
429
428
  @kwarg lon00_name: Optional C{B{name}=NN} (C{str}) and keyword argument
430
429
  C{B{lon00}=B{lon0}} for the arbitrary I{polar} longitude
431
430
  (C{degrees}), see method C{reverse} and property C{lon00}
@@ -1104,7 +1103,7 @@ def tyr3d(tilt=INT0, yaw=INT0, roll=INT0, Vector=Vector3d, **name_Vector_kwds):
1104
1103
  additional B{C{Vector}} keyword arguments, ignored if
1105
1104
  C{B{Vector} is None}.
1106
1105
 
1107
- @return: A named B{C{Vector}} instance or if B{C{Vector}} is C{None},
1106
+ @return: A named B{C{Vector}} instance or if C{B{Vector} is None},
1108
1107
  a named L{Vector3Tuple}C{(x, y, z)}.
1109
1108
 
1110
1109
  @raise AttitudeError: Invalid B{C{tilt}}, B{C{yaw}} or B{C{roll}}.