pygeodesy 24.11.11__py2.py3-none-any.whl → 24.12.12__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 (118) hide show
  1. {PyGeodesy-24.11.11.dist-info → PyGeodesy-24.12.12.dist-info}/METADATA +4 -4
  2. PyGeodesy-24.12.12.dist-info/RECORD +118 -0
  3. {PyGeodesy-24.11.11.dist-info → PyGeodesy-24.12.12.dist-info}/WHEEL +1 -1
  4. pygeodesy/__init__.py +4 -4
  5. pygeodesy/__main__.py +1 -1
  6. pygeodesy/albers.py +5 -5
  7. pygeodesy/auxilats/_CX_4.py +1 -1
  8. pygeodesy/auxilats/_CX_6.py +1 -1
  9. pygeodesy/auxilats/_CX_8.py +1 -1
  10. pygeodesy/auxilats/_CX_Rs.py +1 -1
  11. pygeodesy/auxilats/__init__.py +1 -1
  12. pygeodesy/auxilats/__main__.py +1 -1
  13. pygeodesy/auxilats/auxAngle.py +5 -5
  14. pygeodesy/auxilats/auxDLat.py +6 -6
  15. pygeodesy/auxilats/auxDST.py +2 -2
  16. pygeodesy/auxilats/auxLat.py +5 -5
  17. pygeodesy/auxilats/auxily.py +2 -2
  18. pygeodesy/azimuthal.py +5 -5
  19. pygeodesy/basics.py +1 -1
  20. pygeodesy/booleans.py +1 -1
  21. pygeodesy/cartesianBase.py +22 -61
  22. pygeodesy/clipy.py +1 -1
  23. pygeodesy/constants.py +3 -3
  24. pygeodesy/css.py +1 -1
  25. pygeodesy/datums.py +1 -1
  26. pygeodesy/deprecated/__init__.py +2 -2
  27. pygeodesy/deprecated/bases.py +1 -1
  28. pygeodesy/deprecated/classes.py +1 -1
  29. pygeodesy/deprecated/consterns.py +1 -1
  30. pygeodesy/deprecated/datum.py +1 -1
  31. pygeodesy/deprecated/functions.py +18 -8
  32. pygeodesy/deprecated/nvector.py +1 -1
  33. pygeodesy/deprecated/rhumbBase.py +1 -1
  34. pygeodesy/deprecated/rhumbaux.py +1 -1
  35. pygeodesy/deprecated/rhumbsolve.py +1 -1
  36. pygeodesy/deprecated/rhumbx.py +1 -1
  37. pygeodesy/dms.py +1 -1
  38. pygeodesy/ecef.py +53 -56
  39. pygeodesy/elevations.py +1 -1
  40. pygeodesy/ellipsoidalBase.py +3 -3
  41. pygeodesy/ellipsoidalBaseDI.py +1 -1
  42. pygeodesy/ellipsoidalExact.py +1 -1
  43. pygeodesy/ellipsoidalGeodSolve.py +1 -1
  44. pygeodesy/ellipsoidalKarney.py +1 -1
  45. pygeodesy/ellipsoidalNvector.py +1 -1
  46. pygeodesy/ellipsoidalVincenty.py +6 -5
  47. pygeodesy/ellipsoids.py +4 -5
  48. pygeodesy/elliptic.py +6 -6
  49. pygeodesy/epsg.py +1 -1
  50. pygeodesy/errors.py +1 -1
  51. pygeodesy/etm.py +5 -5
  52. pygeodesy/fmath.py +17 -16
  53. pygeodesy/formy.py +71 -104
  54. pygeodesy/frechet.py +1 -1
  55. pygeodesy/fstats.py +1 -1
  56. pygeodesy/fsums.py +32 -33
  57. pygeodesy/gars.py +1 -1
  58. pygeodesy/geodesici.py +4 -4
  59. pygeodesy/geodesicw.py +1 -1
  60. pygeodesy/geodesicx/_C4_24.py +2 -2
  61. pygeodesy/geodesicx/_C4_27.py +2 -2
  62. pygeodesy/geodesicx/_C4_30.py +2 -2
  63. pygeodesy/geodesicx/__init__.py +1 -1
  64. pygeodesy/geodesicx/__main__.py +1 -1
  65. pygeodesy/geodesicx/gx.py +6 -5
  66. pygeodesy/geodesicx/gxarea.py +2 -2
  67. pygeodesy/geodesicx/gxbases.py +2 -2
  68. pygeodesy/geodesicx/gxline.py +16 -12
  69. pygeodesy/geodsolve.py +1 -1
  70. pygeodesy/geohash.py +1 -1
  71. pygeodesy/geoids.py +1 -1
  72. pygeodesy/hausdorff.py +1 -1
  73. pygeodesy/heights.py +1 -1
  74. pygeodesy/internals.py +1 -1
  75. pygeodesy/interns.py +2 -3
  76. pygeodesy/iters.py +1 -1
  77. pygeodesy/karney.py +3 -3
  78. pygeodesy/ktm.py +16 -15
  79. pygeodesy/latlonBase.py +291 -341
  80. pygeodesy/lazily.py +11 -11
  81. pygeodesy/lcc.py +1 -1
  82. pygeodesy/ltp.py +46 -50
  83. pygeodesy/ltpTuples.py +145 -128
  84. pygeodesy/mgrs.py +1 -1
  85. pygeodesy/named.py +149 -3
  86. pygeodesy/namedTuples.py +58 -7
  87. pygeodesy/nvectorBase.py +122 -105
  88. pygeodesy/osgr.py +1 -1
  89. pygeodesy/points.py +1 -1
  90. pygeodesy/props.py +1 -1
  91. pygeodesy/resections.py +18 -17
  92. pygeodesy/rhumb/__init__.py +1 -1
  93. pygeodesy/rhumb/aux_.py +2 -2
  94. pygeodesy/rhumb/bases.py +2 -2
  95. pygeodesy/rhumb/ekx.py +4 -4
  96. pygeodesy/rhumb/solve.py +1 -1
  97. pygeodesy/simplify.py +289 -401
  98. pygeodesy/solveBase.py +1 -1
  99. pygeodesy/sphericalBase.py +1 -1
  100. pygeodesy/sphericalNvector.py +5 -5
  101. pygeodesy/sphericalTrigonometry.py +7 -6
  102. pygeodesy/streprs.py +10 -5
  103. pygeodesy/trf.py +1 -1
  104. pygeodesy/triaxials.py +23 -16
  105. pygeodesy/units.py +16 -16
  106. pygeodesy/unitsBase.py +1 -1
  107. pygeodesy/ups.py +4 -4
  108. pygeodesy/utily.py +202 -145
  109. pygeodesy/utm.py +5 -5
  110. pygeodesy/utmups.py +1 -1
  111. pygeodesy/utmupsBase.py +1 -1
  112. pygeodesy/vector2d.py +5 -5
  113. pygeodesy/vector3d.py +14 -3
  114. pygeodesy/vector3dBase.py +5 -5
  115. pygeodesy/webmercator.py +1 -1
  116. pygeodesy/wgrs.py +1 -1
  117. PyGeodesy-24.11.11.dist-info/RECORD +0 -118
  118. {PyGeodesy-24.11.11.dist-info → PyGeodesy-24.12.12.dist-info}/top_level.txt +0 -0
@@ -24,32 +24,32 @@ from pygeodesy.fsums import fsumf_, Fmt
24
24
  from pygeodesy.interns import _COMMASPACE_, _datum_, _no_, _phi_
25
25
  from pygeodesy.interns import _ellipsoidal_, _spherical_ # PYCHOK used!
26
26
  from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS
27
- from pygeodesy.named import _name2__, _Pass
27
+ from pygeodesy.named import _name2__, _NamedLocal, _Pass
28
28
  from pygeodesy.namedTuples import LatLon4Tuple, _NamedTupleTo , Vector3Tuple, \
29
29
  Vector4Tuple, Bearing2Tuple # PYCHOK .sphericalBase
30
30
  # from pygeodesy.nvectorBase import _N_vector # _MODS
31
31
  from pygeodesy.props import deprecated_method, Property, Property_RO, property_doc_, \
32
- property_RO, property_ROnce, _update_all
32
+ property_RO, _update_all
33
33
  # from pygeodesy,resections import cassini, collins5, pierlot, pierlotx, \
34
34
  # tienstra7 # _MODS
35
35
  # from pygeodesy.streprs import Fmt # from .fsums
36
36
  # from pygeodesy.triaxials import Triaxial_ # _MODS
37
37
  from pygeodesy.units import Degrees, Height, _heigHt, _isMeter, Meter, Radians
38
- from pygeodesy.utily import acos1, sincos2d, sincos2_, atan2, degrees, radians
38
+ from pygeodesy.utily import acos1, atan2, sincos2d, sincos2_, degrees, radians
39
39
  from pygeodesy.vector3d import Vector3d, _xyzhdlln4
40
40
  # from pygeodesy.vector3dBase import _xyz3 # _MODS
41
41
  # from pygeodesy import ltp # _MODS
42
42
 
43
- # from math import atan2, degrees, fabs, radians, sqrt # from .fmath, .utily
43
+ # from math import degrees, fabs, radians, sqrt # from .fmath, .utily
44
44
 
45
45
  __all__ = _ALL_LAZY.cartesianBase
46
- __version__ = '24.11.06'
46
+ __version__ = '24.12.04'
47
47
 
48
48
  _r_ = 'r'
49
49
  _theta_ = 'theta'
50
50
 
51
51
 
52
- class CartesianBase(Vector3d):
52
+ class CartesianBase(Vector3d, _NamedLocal):
53
53
  '''(INTERNAL) Base class for ellipsoidal and spherical C{Cartesian}.
54
54
  '''
55
55
  _datum = None # L{Datum}, to be overriden
@@ -211,12 +211,6 @@ class CartesianBase(Vector3d):
211
211
  r = Cartesian(*c, **kwds)
212
212
  return r.renamed(n) if n else r
213
213
 
214
- @property_ROnce
215
- def Ecef(self):
216
- '''Get the ECEF I{class} (L{EcefKarney}), I{once}.
217
- '''
218
- return _MODS.ecef.EcefKarney
219
-
220
214
  @Property_RO
221
215
  def _ecef9(self):
222
216
  '''(INTERNAL) Helper for L{toEcef}, L{toLocal} and L{toLtp} (L{Ecef9Tuple}).
@@ -231,14 +225,14 @@ class CartesianBase(Vector3d):
231
225
 
232
226
  def hartzell(self, los=False, earth=None):
233
227
  '''Compute the intersection of a Line-Of-Sight from this cartesian Point-Of-View
234
- (pov) and this cartesian's ellipsoid surface.
228
+ (pov) and this cartesian's C{datum} ellipsoid surface.
235
229
 
236
230
  @kwarg los: Line-Of-Sight, I{direction} to the ellipsoid (L{Los}, L{Vector3d}),
237
231
  C{True} for the I{normal, plumb} onto the surface or I{False} or
238
232
  C{None} to point to the center of the ellipsoid.
239
233
  @kwarg earth: The earth model (L{Datum}, L{Ellipsoid}, L{Ellipsoid2}, L{a_f2Tuple}
240
234
  or C{scalar} radius in C{meter}), overriding this cartesian's
241
- C{datum} ellipsoid.
235
+ datum.
242
236
 
243
237
  @return: The intersection (C{Cartesian}) with C{.height} set to the distance to
244
238
  this C{pov}.
@@ -284,7 +278,8 @@ class CartesianBase(Vector3d):
284
278
  return r
285
279
 
286
280
  def height3(self, earth=None, height=None, **Cartesian_and_kwds):
287
- '''Compute the cartesian at a height above or below this certesian's ellipsoid.
281
+ '''Compute the cartesian at a height above or below this certesian's
282
+ C{datum} ellipsoid surface.
288
283
 
289
284
  @kwarg earth: A datum, ellipsoid, triaxial ellipsoid or earth radius,
290
285
  I{overriding} this cartesian's datum (L{Datum}, L{Ellipsoid},
@@ -411,12 +406,6 @@ class CartesianBase(Vector3d):
411
406
  '''
412
407
  return self.toEcef().latlonheightdatum
413
408
 
414
- @Property_RO
415
- def _Ltp(self):
416
- '''(INTERNAL) Cache for L{toLtp}.
417
- '''
418
- return _MODS.ltp.Ltp(self._ecef9, ecef=self.Ecef(self.datum), name=self.name)
419
-
420
409
  @Property_RO
421
410
  def _N_vector(self):
422
411
  '''(INTERNAL) Get the (C{nvectorBase._N_vector_}).
@@ -696,8 +685,8 @@ class CartesianBase(Vector3d):
696
685
  def toEcef(self):
697
686
  '''Convert this cartesian to I{geodetic} (lat-/longitude) coordinates.
698
687
 
699
- @return: An L{Ecef9Tuple}C{(x, y, z, lat, lon, height,
700
- C, M, datum)} with C{C} and C{M} if available.
688
+ @return: An L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)}
689
+ with C{C} and C{M} if available.
701
690
 
702
691
  @raise EcefError: A C{.datum} or an ECEF issue.
703
692
  '''
@@ -706,18 +695,16 @@ class CartesianBase(Vector3d):
706
695
  def toLatLon(self, datum=None, height=None, LatLon=None, **LatLon_kwds): # see .ecef.Ecef9Tuple.toDatum
707
696
  '''Convert this cartesian to a I{geodetic} (lat-/longitude) point.
708
697
 
709
- @kwarg datum: Optional datum (L{Datum}, L{Ellipsoid}, L{Ellipsoid2}
710
- or L{a_f2Tuple}).
711
- @kwarg height: Optional height, overriding the converted height
712
- (C{meter}), only if C{B{LatLon} is not None}.
713
- @kwarg LatLon: Optional class to return the geodetic point
714
- (C{LatLon}) or C{None}.
715
- @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword
716
- arguments, ignored if C{B{LatLon} is None}.
698
+ @kwarg datum: Optional datum (L{Datum}, L{Ellipsoid}, L{Ellipsoid2} or L{a_f2Tuple}).
699
+ @kwarg height: Optional height, overriding the converted height (C{meter}), only if
700
+ C{B{LatLon} is not None}.
701
+ @kwarg LatLon: Optional class to return the geodetic point (C{LatLon}) or C{None}.
702
+ @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword arguments, ignored if
703
+ C{B{LatLon} is None}.
717
704
 
718
- @return: The geodetic point (B{C{LatLon}}) or if C{B{LatLon}
719
- is None}, an L{Ecef9Tuple}C{(x, y, z, lat, lon, height,
720
- C, M, datum)} with C{C} and C{M} if available.
705
+ @return: The geodetic point (B{C{LatLon}}) or if C{B{LatLon}is None}, an
706
+ L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with C{C}
707
+ and C{M} if available.
721
708
 
722
709
  @raise TypeError: Invalid B{C{datum}} or B{C{LatLon_kwds}}.
723
710
  '''
@@ -735,32 +722,6 @@ class CartesianBase(Vector3d):
735
722
  _xdatum(r.datum, d)
736
723
  return r
737
724
 
738
- def toLocal(self, Xyz=None, ltp=None, **Xyz_kwds):
739
- '''Convert this I{geocentric} cartesian to I{local} C{X}, C{Y} and C{Z}.
740
-
741
- @kwarg Xyz: Optional class to return C{X}, C{Y} and C{Z} (L{XyzLocal},
742
- L{Enu}, L{Ned}) or C{None}.
743
- @kwarg ltp: The I{local tangent plane} (LTP) to use, overriding this
744
- cartesian's LTP (L{Ltp}).
745
- @kwarg Xyz_kwds: Optional, additional B{C{Xyz}} keyword arguments,
746
- ignored if C{B{Xyz} is None}.
747
-
748
- @return: An B{C{Xyz}} instance or a L{Local9Tuple}C{(x, y, z, lat, lon,
749
- height, ltp, ecef, M)} if C{B{Xyz} is None} (with C{M=None}).
750
-
751
- @raise TypeError: Invalid B{C{ltp}}.
752
- '''
753
- return _MODS.ltp._toLocal(self, ltp, Xyz, Xyz_kwds) # self._ecef9
754
-
755
- def toLtp(self, Ecef=None, **name):
756
- '''Return the I{local tangent plane} (LTP) for this cartesian.
757
-
758
- @kwarg Ecef: Optional ECEF I{class} (L{EcefKarney}, ...
759
- L{EcefYou}), overriding this cartesian's C{Ecef}.
760
- @kwarg name: Optional C{B{name}=NN} (C{str}).
761
- '''
762
- return _MODS.ltp._toLtp(self, Ecef, self._ecef9, name) # self._Ltp
763
-
764
725
  def toNvector(self, Nvector=None, datum=None, **name_Nvector_kwds):
765
726
  '''Convert this cartesian to C{n-vector} components, I{including height}.
766
727
 
@@ -1030,7 +991,7 @@ __all__ += _ALL_DOCS(CartesianBase)
1030
991
 
1031
992
  # **) MIT License
1032
993
  #
1033
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
994
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1034
995
  #
1035
996
  # Permission is hereby granted, free of charge, to any person obtaining a
1036
997
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/clipy.py CHANGED
@@ -683,7 +683,7 @@ def clipSH3(points, corners, closed=False, inull=False):
683
683
 
684
684
  # **) MIT License
685
685
  #
686
- # Copyright (C) 2018-2024 -- mrJean1 at Gmail -- All Rights Reserved.
686
+ # Copyright (C) 2018-2025 -- mrJean1 at Gmail -- All Rights Reserved.
687
687
  #
688
688
  # Permission is hereby granted, free of charge, to any person obtaining a
689
689
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/constants.py CHANGED
@@ -348,8 +348,8 @@ def isfinite(obj):
348
348
  @arg obj: Value (C{scalar}, C{complex}, an L{Fsum} or
349
349
  L{Fsum2Tuple}).
350
350
 
351
- @return: C{False} if B{C{obj}} is C{INF}, C{NINF}
352
- or C{NAN}, C{True} otherwise.
351
+ @return: C{False} if B{C{obj}} is C{INF}, C{NINF} or
352
+ C{NAN}, C{True} otherwise.
353
353
 
354
354
  @raise TypeError: Non-scalar and non-complex B{C{obj}}.
355
355
  '''
@@ -515,7 +515,7 @@ if __name__ == '__main__':
515
515
 
516
516
  # **) MIT License
517
517
  #
518
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
518
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
519
519
  #
520
520
  # Permission is hereby granted, free of charge, to any person obtaining a
521
521
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/css.py CHANGED
@@ -642,7 +642,7 @@ def toCss(latlon, cs0=None, height=None, Css=Css, **name):
642
642
 
643
643
  # **) MIT License
644
644
  #
645
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
645
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
646
646
  #
647
647
  # Permission is hereby granted, free of charge, to any person obtaining a
648
648
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/datums.py CHANGED
@@ -733,7 +733,7 @@ if __name__ == '__main__':
733
733
 
734
734
  # **) MIT License
735
735
  #
736
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
736
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
737
737
  #
738
738
  # Permission is hereby granted, free of charge, to any person obtaining a
739
739
  # copy of this software and associated documentation files (the "Software"),
@@ -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.11.07'
30
+ __version__ = '24.11.28'
31
31
 
32
32
  if _unLazy0:
33
33
  from pygeodesy.deprecated import bases, datum, nvector, rhumbBase, \
@@ -40,7 +40,7 @@ else: # lazily import modules and exported attrs
40
40
 
41
41
  # **) MIT License
42
42
  #
43
- # Copyright (C) 2018-2024 -- mrJean1 at Gmail -- All Rights Reserved.
43
+ # Copyright (C) 2018-2025 -- mrJean1 at Gmail -- All Rights Reserved.
44
44
  #
45
45
  # Permission is hereby granted, free of charge, to any person obtaining a
46
46
  # copy of this software and associated documentation files (the "Software"),
@@ -19,7 +19,7 @@ class LatLonHeightBase(_LatLonBase): # PYCHOK no cover
19
19
 
20
20
  # **) MIT License
21
21
  #
22
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
22
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
23
23
  #
24
24
  # Permission is hereby granted, free of charge, to any person obtaining a
25
25
  # copy of this software and associated documentation files (the "Software"),
@@ -275,7 +275,7 @@ __all__ += _ALL_DOCS(_Deprecated_NamedTuple)
275
275
 
276
276
  # **) MIT License
277
277
  #
278
- # Copyright (C) 2018-2024 -- mrJean1 at Gmail -- All Rights Reserved.
278
+ # Copyright (C) 2018-2025 -- mrJean1 at Gmail -- All Rights Reserved.
279
279
  #
280
280
  # Permission is hereby granted, free of charge, to any person obtaining a
281
281
  # copy of this software and associated documentation files (the "Software"),
@@ -33,7 +33,7 @@ OK = _Deprecated_Str(OK='OK')
33
33
 
34
34
  # **) MIT License
35
35
  #
36
- # Copyright (C) 2018-2024 -- mrJean1 at Gmail -- All Rights Reserved.
36
+ # Copyright (C) 2018-2025 -- mrJean1 at Gmail -- All Rights Reserved.
37
37
  #
38
38
  # Permission is hereby granted, free of charge, to any person obtaining a
39
39
  # copy of this software and associated documentation files (the "Software"),
@@ -19,7 +19,7 @@ assert _ALL_OTHER(Curvature2Tuple, Datum, Ellipsoid, Transform) + \
19
19
 
20
20
  # **) MIT License
21
21
  #
22
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
22
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
23
23
  #
24
24
  # Permission is hereby granted, free of charge, to any person obtaining a
25
25
  # copy of this software and associated documentation files (the "Software"),
@@ -11,10 +11,10 @@ from pygeodesy.interns import NN, _area_, _COMMASPACE_, _negative_, \
11
11
  from pygeodesy.lazily import _ALL_DEPRECATED, _ALL_MODS as _MODS
12
12
  from pygeodesy.props import deprecated_function
13
13
  # from pygeodesy.resections import TriAngle5Tuple as _TriAngle5Tuple # from .classes
14
- from pygeodesy.units import Number_, Scalar_
14
+ from pygeodesy.units import _1mm, Number_, Scalar_
15
15
 
16
16
  __all__ = _ALL_DEPRECATED.deprecated_functions
17
- __version__ = '24.11.07'
17
+ __version__ = '24.11.28'
18
18
 
19
19
  _WGS84 = _UTM = object()
20
20
 
@@ -295,11 +295,21 @@ def scalar(value, low=EPS, high=1.0, name=_scalar_, Error=ValueError): # PYCHOK
295
295
 
296
296
 
297
297
  @deprecated_function
298
- def simplify2(points, pipe, radius=R_M, shortest=False, indices=False, **options): # PYCHOK no cover
299
- '''DEPRECATED, use function L{pygeodesy.simplifyRW}.
300
- '''
301
- return _MODS.simplify.simplifyRW(points, pipe, radius=radius, shortest=shortest,
302
- indices=indices, **options)
298
+ def simplify2(points, pipe=_1mm, **radius_shortest_indices_options): # PYCHOK no cover
299
+ '''DEPRECATED, use function L{pygeodesy.simplifyRW}.'''
300
+ return _MODS.simplify.simplifyRW(points, pipe=pipe, **radius_shortest_indices_options)
301
+
302
+
303
+ @deprecated_function
304
+ def simplifyRDPm(points, distance=_1mm, **radius_shortest_indices_options):
305
+ '''DEPRECATED on 2024.11.28, use function L{pygeodesy.simplifyRDP}C{(points, modified=True, ...)}.'''
306
+ return _MODS.simplify.simplifyRDP(points, modified=True, distance=distance, **radius_shortest_indices_options)
307
+
308
+
309
+ @deprecated_function
310
+ def simplifyVWm(points, area=_1mm, **radius_attr_indices_options):
311
+ '''DEPRECATED on 2024.11.28, use function L{pygeodesy.simplifyVW}C{(points, modified=True, ...)}.'''
312
+ return _MODS.simplify.simplifyVW(points, modified=True, area=area, **radius_attr_indices_options)
303
313
 
304
314
 
305
315
  @deprecated_function
@@ -366,7 +376,7 @@ def utmZoneBand2(lat, lon): # PYCHOK no cover
366
376
 
367
377
  # **) MIT License
368
378
  #
369
- # Copyright (C) 2018-2024 -- mrJean1 at Gmail -- All Rights Reserved.
379
+ # Copyright (C) 2018-2025 -- mrJean1 at Gmail -- All Rights Reserved.
370
380
  #
371
381
  # Permission is hereby granted, free of charge, to any person obtaining a
372
382
  # copy of this software and associated documentation files (the "Software"),
@@ -27,7 +27,7 @@ assert (_ALL_OTHER(LatLonNvectorBase, Nvector, sumOf) +
27
27
 
28
28
  # **) MIT License
29
29
  #
30
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
30
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
31
31
  #
32
32
  # Permission is hereby granted, free of charge, to any person obtaining a
33
33
  # copy of this software and associated documentation files (the "Software"),
@@ -11,7 +11,7 @@ __version__ = '23.11.26'
11
11
 
12
12
  # **) MIT License
13
13
  #
14
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
14
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
15
15
  #
16
16
  # Permission is hereby granted, free of charge, to any person obtaining a
17
17
  # copy of this software and associated documentation files (the "Software"),
@@ -12,7 +12,7 @@ __version__ = '23.12.02'
12
12
 
13
13
  # **) MIT License
14
14
  #
15
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
15
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
16
16
  #
17
17
  # Permission is hereby granted, free of charge, to any person obtaining a
18
18
  # copy of this software and associated documentation files (the "Software"),
@@ -12,7 +12,7 @@ __version__ = '23.11.26'
12
12
 
13
13
  # **) MIT License
14
14
  #
15
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
15
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
16
16
  #
17
17
  # Permission is hereby granted, free of charge, to any person obtaining a
18
18
  # copy of this software and associated documentation files (the "Software"),
@@ -12,7 +12,7 @@ __version__ = '23.11.30'
12
12
 
13
13
  # **) MIT License
14
14
  #
15
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
15
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
16
16
  #
17
17
  # Permission is hereby granted, free of charge, to any person obtaining a
18
18
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/dms.py CHANGED
@@ -941,7 +941,7 @@ def toDMS(deg, form=_F_DMS, prec=2, sep=S_SEP, ddd=2, neg=_MINUS_, pos=_PLUS_, *
941
941
 
942
942
  # **) MIT License
943
943
  #
944
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
944
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
945
945
  #
946
946
  # Permission is hereby granted, free of charge, to any person obtaining a
947
947
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/ecef.py CHANGED
@@ -73,20 +73,23 @@ from pygeodesy.interns import NN, _a_, _C_, _datum_, _ellipsoid_, _f_, _height_,
73
73
  _lat_, _lon_, _M_, _name_, _singular_, _SPACE_, \
74
74
  _x_, _xyz_, _y_, _z_
75
75
  from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS
76
- from pygeodesy.named import _name__, _name1__, _NamedBase, _NamedTuple, _Pass, _xnamed
76
+ from pygeodesy.named import _name__, _name1__, _NamedBase, _NamedLocal, \
77
+ _NamedTuple, _Pass, _xnamed
77
78
  from pygeodesy.namedTuples import LatLon2Tuple, LatLon3Tuple, \
78
79
  PhiLam2Tuple, Vector3Tuple, Vector4Tuple
79
- from pygeodesy.props import deprecated_method, Property_RO, property_ROver, property_doc_
80
+ from pygeodesy.props import deprecated_method, Property_RO, property_RO, \
81
+ property_ROver, property_doc_
80
82
  # from pygeodesy.streprs import Fmt, unstr # from .fsums
81
83
  from pygeodesy.units import _isRadius, Degrees, Height, Int, Lam, Lat, Lon, Meter, \
82
84
  Phi, Scalar, Scalar_
83
- from pygeodesy.utily import atan1, atan1d, atan2d, degrees90, degrees180, \
85
+ from pygeodesy.utily import atan1, atan1d, atan2, atan2d, degrees90, degrees180, \
84
86
  sincos2, sincos2_, sincos2d, sincos2d_
87
+ # from pygeodesy.vector3d import Vector3d # _MODS
85
88
 
86
- from math import atan2, cos, degrees, fabs, radians, sqrt
89
+ from math import cos, degrees, fabs, radians, sqrt
87
90
 
88
91
  __all__ = _ALL_LAZY.ecef
89
- __version__ = '24.10.28'
92
+ __version__ = '24.12.06'
90
93
 
91
94
  _Ecef_ = 'Ecef'
92
95
  _prolate_ = 'prolate'
@@ -266,7 +269,7 @@ class _EcefBase(_NamedBase):
266
269
  '''(INTERNAL) Get the valid geocentric classes. I{once}.
267
270
  '''
268
271
  return (Ecef9Tuple, # overwrite property_ROver
269
- _MODS.cartesianBase.CartesianBase)
272
+ _MODS.vector3d.Vector3d) # _MODS.cartesianBase.CartesianBase
270
273
 
271
274
  @Property_RO
272
275
  def _isYou(self):
@@ -326,7 +329,8 @@ class EcefFarrell21(_EcefBase):
326
329
  def reverse(self, xyz, y=None, z=None, M=None, **lon00_name): # PYCHOK unused M
327
330
  '''Convert from geocentric C{(x, y, z)} to geodetic C{(lat, lon, height)} using
328
331
  I{Farrell}'s U{Table 2.1<https://Books.Google.com/books?id=fW4foWASY6wC>},
329
- page 29.
332
+ page 29, aka the I{Heikkinen application} of U{Ferrari's solution
333
+ <https://WikiPedia.org/wiki/Geographic_coordinate_conversion>}.
330
334
 
331
335
  @arg xyz: A geocentric (C{Cartesian}, L{Ecef9Tuple}) or C{scalar} ECEF C{x}
332
336
  coordinate (C{meter}).
@@ -366,9 +370,9 @@ class EcefFarrell21(_EcefBase):
366
370
  p2 = p**2
367
371
  G = p2 + ez - e2 * (a2 - b2) # p2 + ez - e4 * a2
368
372
  F = b2 * z2 * 54
369
- t = e4 * p2 * F / G**3
370
- t = cbrt(sqrt(t * (t + _2_0)) + t + _1_0)
371
- G *= fsumf_(t , _1_0, _1_0 / t)
373
+ c = e4 * p2 * F / G**3
374
+ s = cbrt(sqrt(c * (c + _2_0)) + c + _1_0)
375
+ G *= fsumf_(s , _1_0, _1_0 / s) # k
372
376
  P = F / (G**2 * _3_0)
373
377
  Q = sqrt(_2_0 * e4 * P + _1_0)
374
378
  Q1 = Q + _1_0
@@ -376,7 +380,7 @@ class EcefFarrell21(_EcefBase):
376
380
  -P * ez / (Q * Q1),
377
381
  -P * p2 * _0_5))
378
382
  r = p + e2 * r0
379
- v = b2 / (sqrt(r**2 + ez) * a)
383
+ v = b2 / (sqrt(r**2 + ez) * a) # z0 / z
380
384
 
381
385
  h = hypot(r, z) * (_1_0 - v)
382
386
  lat = atan1d((e2_ * v + _1_0) * z, p)
@@ -1014,12 +1018,12 @@ class EcefMatrix(_NamedTuple):
1014
1018
  return xyz_
1015
1019
 
1016
1020
 
1017
- class Ecef9Tuple(_NamedTuple):
1018
- '''9-Tuple C{(x, y, z, lat, lon, height, C, M, datum)} with I{geocentric}
1019
- C{x}, C{y} and C{z} plus I{geodetic} C{lat}, C{lon} and C{height}, case
1020
- C{C} (see the C{Ecef*.reverse} methods) and optionally, the rotation
1021
- matrix C{M} (L{EcefMatrix}) and C{datum}, with C{lat} and C{lon} in
1022
- C{degrees} and C{x}, C{y}, C{z} and C{height} in C{meter}, conventionally.
1021
+ class Ecef9Tuple(_NamedTuple, _NamedLocal):
1022
+ '''9-Tuple C{(x, y, z, lat, lon, height, C, M, datum)} with I{geocentric} C{x},
1023
+ C{y} and C{z} plus I{geodetic} C{lat}, C{lon} and C{height}, case C{C} (see
1024
+ the C{Ecef*.reverse} methods) and optionally, rotation matrix C{M} (L{EcefMatrix})
1025
+ and C{datum}, with C{lat} and C{lon} in C{degrees} and C{x}, C{y}, C{z} and
1026
+ C{height} in C{meter}, conventionally.
1023
1027
  '''
1024
1028
  _Names_ = (_x_, _y_, _z_, _lat_, _lon_, _height_, _C_, _M_, _datum_)
1025
1029
  _Units_ = ( Meter, Meter, Meter, Lat, Lon, Height, Int, _Pass, _Pass)
@@ -1035,6 +1039,10 @@ class Ecef9Tuple(_NamedTuple):
1035
1039
  '''DEPRECATED, use method L{toDatum}.'''
1036
1040
  return self.toDatum(datum2)
1037
1041
 
1042
+ @property_RO
1043
+ def _ecef9(self):
1044
+ return self
1045
+
1038
1046
  @Property_RO
1039
1047
  def lam(self):
1040
1048
  '''Get the longitude in C{radians} (C{float}).
@@ -1088,12 +1096,19 @@ class Ecef9Tuple(_NamedTuple):
1088
1096
  @Property_RO
1089
1097
  def lonVermeille(self):
1090
1098
  '''Get the longitude in C{degrees [-225..+225]} after U{Vermeille
1091
- <https://Search.ProQuest.com/docview/639493848>} (2004), p 95.
1099
+ <https://Search.ProQuest.com/docview/639493848>} 2004, p 95.
1092
1100
 
1093
1101
  @see: Property C{lamVermeille}.
1094
1102
  '''
1095
1103
  return Lon(Vermeille=degrees(self.lamVermeille))
1096
1104
 
1105
+ def _ltp_toLocal(self, ltp, Cls_and_kwds, **nam_Cls): # for C{_NamedLocal}
1106
+ '''(INTERNAL) Invoke C{ltp._xLtp(ltp)._ecef2local}.
1107
+ '''
1108
+ Cls, kwds = self._ltp_toLocal2(Cls_and_kwds, **nam_Cls) # in ._NamedLocal
1109
+ ltp = self._ltp._xLtp(ltp, self._Ltp) # both in ._NamedLocal
1110
+ return ltp._ecef2local(self, Cls, kwds)
1111
+
1097
1112
  @Property_RO
1098
1113
  def phi(self):
1099
1114
  '''Get the latitude in C{radians} (C{float}).
@@ -1134,13 +1149,13 @@ class Ecef9Tuple(_NamedTuple):
1134
1149
  L{ellipsoidalNvector.Cartesian}, L{ellipsoidalVincenty.Cartesian},
1135
1150
  L{sphericalNvector.Cartesian} or L{sphericalTrigonometry.Cartesian})
1136
1151
  or C{None}.
1137
- @kwarg Cartesian_kwds: Optional, additional B{C{Cartesian}} keyword arguments, ignored
1152
+ @kwarg Cartesian_kwds: Optionally, additional B{C{Cartesian}} keyword arguments, ignored
1138
1153
  if C{B{Cartesian} is None}.
1139
1154
 
1140
- @return: A C{B{Cartesian}(x, y, z, **B{Cartesian_kwds})} instance or
1141
- a L{Vector4Tuple}C{(x, y, z, h)} if C{B{Cartesian} is None}.
1155
+ @return: A B{C{Cartesian}} instance or a L{Vector4Tuple}C{(x, y, z, h)} if C{B{Cartesian}
1156
+ is None}.
1142
1157
 
1143
- @raise TypeError: Invalid B{C{Cartesian}} or B{C{Cartesian_kwds}}.
1158
+ @raise TypeError: Invalid B{C{Cartesian}} or B{C{Cartesian_kwds}} item.
1144
1159
  '''
1145
1160
  if Cartesian in (None, Vector4Tuple):
1146
1161
  r = self.xyzh
@@ -1174,17 +1189,15 @@ class Ecef9Tuple(_NamedTuple):
1174
1189
  def toLatLon(self, LatLon=None, **LatLon_kwds):
1175
1190
  '''Return the geodetic C{(lat, lon, height[, datum])} coordinates.
1176
1191
 
1177
- @kwarg LatLon: Optional class to return C{(lat, lon, height[, datum])}
1178
- or C{None}.
1179
- @kwarg LatLon_kwds: Optional B{C{height}}, B{C{datum}} and other
1180
- B{C{LatLon}} keyword arguments.
1192
+ @kwarg LatLon: Optional class to return C{(lat, lon, height[, datum])} or C{None}.
1193
+ @kwarg LatLon_kwds: Optional B{C{height}}, B{C{datum}} and other B{C{LatLon}}
1194
+ keyword arguments.
1181
1195
 
1182
- @return: An instance of C{B{LatLon}(lat, lon, **B{LatLon_kwds})}
1183
- or if C{B{LatLon} is None}, a L{LatLon3Tuple}C{(lat, lon,
1184
- height)} respectively L{LatLon4Tuple}C{(lat, lon, height,
1185
- datum)} depending on whether C{datum} is un-/specified.
1196
+ @return: A B{C{LatLon}} instance or if C{B{LatLon} is None}, a L{LatLon4Tuple}C{(lat,
1197
+ lon, height, datum)} or L{LatLon3Tuple}C{(lat, lon, height)} if C{datum} is
1198
+ specified or not.
1186
1199
 
1187
- @raise TypeError: Invalid B{C{LatLon}} or B{C{LatLon_kwds}}.
1200
+ @raise TypeError: Invalid B{C{LatLon}} or B{C{LatLon_kwds}} item.
1188
1201
  '''
1189
1202
  lat, lon, D = self.lat, self.lon, self.datum # PYCHOK Ecef9Tuple
1190
1203
  kwds = _name1__(LatLon_kwds, _or_nameof=self)
@@ -1202,33 +1215,17 @@ class Ecef9Tuple(_NamedTuple):
1202
1215
  _xdatum(_xattr(r, datum=D), D)
1203
1216
  return r
1204
1217
 
1205
- def toLocal(self, ltp, Xyz=None, **Xyz_kwds):
1206
- '''Convert this geocentric to I{local} C{x}, C{y} and C{z}.
1207
-
1208
- @kwarg ltp: The I{local tangent plane} (LTP) to use (L{Ltp}).
1209
- @kwarg Xyz: Optional class to return C{x}, C{y} and C{z}
1210
- (L{XyzLocal}, L{Enu}, L{Ned}) or C{None}.
1211
- @kwarg Xyz_kwds: Optional, additional B{C{Xyz}} keyword
1212
- arguments, ignored if C{B{Xyz} is None}.
1213
-
1214
- @return: An B{C{Xyz}} instance or if C{B{Xyz} is None},
1215
- a L{Local9Tuple}C{(x, y, z, lat, lon, height,
1216
- ltp, ecef, M)} with C{M=None}, always.
1217
-
1218
- @raise TypeError: Invalid B{C{ltp}}.
1219
- '''
1220
- return _MODS.ltp._xLtp(ltp)._ecef2local(self, Xyz, Xyz_kwds)
1221
-
1222
1218
  def toVector(self, Vector=None, **Vector_kwds):
1223
- '''Return the geocentric C{(x, y, z)} coordinates as vector.
1219
+ '''Return these geocentric C{(x, y, z)} coordinates as vector.
1220
+
1221
+ @kwarg Vector: Optional vector class to return C{(x, y, z)} or C{None}.
1222
+ @kwarg Vector_kwds: Optional, additional B{C{Vector}} keyword arguments,
1223
+ ignored if C{B{Vector} is None}.
1224
1224
 
1225
- @kwarg Vector: Optional vector class to return C{(x, y, z)} or
1226
- C{None}.
1227
- @kwarg Vector_kwds: Optional, additional B{C{Vector}} keyword
1228
- arguments, ignored if C{B{Vector} is None}.
1225
+ @return: A B{C{Vector}} instance or a L{Vector3Tuple}C{(x, y, z)} if
1226
+ C{B{Vector} is None}.
1229
1227
 
1230
- @return: A C{Vector}C{(x, y, z, **Vector_kwds)} instance or a
1231
- L{Vector3Tuple}C{(x, y, z)} if C{B{Vector} is None}.
1228
+ @raise TypeError: Invalid B{C{Vector}} or B{C{Vector_kwds}} item.
1232
1229
 
1233
1230
  @see: Propertes C{xyz} and C{xyzh}
1234
1231
  '''
@@ -1316,7 +1313,7 @@ __all__ += _ALL_DOCS(_EcefBase)
1316
1313
 
1317
1314
  # **) MIT License
1318
1315
  #
1319
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
1316
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1320
1317
  #
1321
1318
  # Permission is hereby granted, free of charge, to any person obtaining a
1322
1319
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/elevations.py CHANGED
@@ -254,7 +254,7 @@ if __name__ == '__main__':
254
254
 
255
255
  # **) MIT License
256
256
  #
257
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
257
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
258
258
  #
259
259
  # Permission is hereby granted, free of charge, to any person obtaining a
260
260
  # copy of this software and associated documentation files (the "Software"),
@@ -35,7 +35,7 @@ from pygeodesy.units import Epoch, _isDegrees, Radius_, _1mm as _TOL_M
35
35
  # from math import fabs # from .latlonBase
36
36
 
37
37
  __all__ = _ALL_LAZY.ellipsoidalBase
38
- __version__ = '24.11.07'
38
+ __version__ = '24.12.04'
39
39
 
40
40
 
41
41
  class CartesianEllipsoidalBase(CartesianBase):
@@ -666,7 +666,7 @@ class LatLonEllipsoidalBase(LatLonBase):
666
666
  B{C{point2}} (C{bool}).
667
667
  @kwarg equidistant: An azimuthal equidistant projection (I{class} or function
668
668
  L{pygeodesy.equidistant}) or C{None} for this point's preferred
669
- C{Equidistant}, like L{Equidistant<LatLonEllipsoidalBase.Equistant>}.
669
+ C{Equidistant}, like L{Equidistant<LatLonEllipsoidalBase.Equidistant>}.
670
670
  @kwarg tol: Convergence tolerance (C{meter}, conventionally).
671
671
 
672
672
  @return: Closest point (C{LatLon}).
@@ -1148,7 +1148,7 @@ __all__ += _ALL_DOCS(CartesianEllipsoidalBase, LatLonEllipsoidalBase)
1148
1148
 
1149
1149
  # **) MIT License
1150
1150
  #
1151
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
1151
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1152
1152
  #
1153
1153
  # Permission is hereby granted, free of charge, to any person obtaining a
1154
1154
  # copy of this software and associated documentation files (the "Software"),