pygeodesy 24.11.11__py2.py3-none-any.whl → 25.1.5__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-25.1.5.dist-info}/METADATA +34 -35
  2. PyGeodesy-25.1.5.dist-info/RECORD +118 -0
  3. {PyGeodesy-24.11.11.dist-info → PyGeodesy-25.1.5.dist-info}/WHEEL +1 -1
  4. pygeodesy/__init__.py +19 -19
  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 +60 -8
  20. pygeodesy/booleans.py +1 -1
  21. pygeodesy/cartesianBase.py +22 -61
  22. pygeodesy/clipy.py +1 -1
  23. pygeodesy/constants.py +5 -5
  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 +86 -2
  29. pygeodesy/deprecated/consterns.py +1 -1
  30. pygeodesy/deprecated/datum.py +5 -5
  31. pygeodesy/deprecated/functions.py +42 -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 +18 -17
  53. pygeodesy/formy.py +409 -555
  54. pygeodesy/frechet.py +29 -86
  55. pygeodesy/fstats.py +1 -1
  56. pygeodesy/fsums.py +32 -33
  57. pygeodesy/gars.py +1 -1
  58. pygeodesy/geodesici.py +7 -7
  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 +2 -2
  64. pygeodesy/geodesicx/__main__.py +4 -5
  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 +277 -203
  72. pygeodesy/hausdorff.py +23 -81
  73. pygeodesy/heights.py +115 -150
  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 +323 -409
  80. pygeodesy/lazily.py +53 -44
  81. pygeodesy/lcc.py +1 -1
  82. pygeodesy/ltp.py +46 -50
  83. pygeodesy/ltpTuples.py +147 -130
  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 +341 -211
  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-25.1.5.dist-info}/top_level.txt +0 -0
@@ -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.12.31'
18
18
 
19
19
  _WGS84 = _UTM = object()
20
20
 
@@ -84,6 +84,30 @@ def copysign(x, y): # PYCHOK no cover
84
84
  return _MODS.basics.copysign0(x, y)
85
85
 
86
86
 
87
+ @deprecated_function
88
+ def cosineAndoyerLambert(lat1, lon1, lat2, lon2, **datum_wrap):
89
+ '''DEPRECATED on 2024.12.31, use function L{pygeodesy.cosineLaw} with C{B{corr}=1}.'''
90
+ return _MODS.formy.cosineLaw(lat1, lon1, lat2, lon2, corr=1, **datum_wrap)
91
+
92
+
93
+ @deprecated_function
94
+ def cosineAndoyerLambert_(phi2, phi1, lam21, **datum):
95
+ '''DEPRECATED on 2024.12.31, use function L{pygeodesy.cosineLaw_} with C{B{corr}=1}.'''
96
+ return _MODS.formy.cosineLaw_(phi2, phi1, lam21, corr=1, **datum)
97
+
98
+
99
+ @deprecated_function
100
+ def cosineForsytheAndoyerLambert(lat1, lon1, lat2, lon2, **datum_wrap):
101
+ '''DEPRECATED on 2024.12.31, use function L{pygeodesy.cosineLaw} with C{B{corr}=2}.'''
102
+ return _MODS.formy.cosineLaw(lat1, lon1, lat2, lon2, corr=2, **datum_wrap)
103
+
104
+
105
+ @deprecated_function
106
+ def cosineForsytheAndoyerLambert_(phi2, phi1, lam21, **datum):
107
+ '''DEPRECATED on 2024.12.31, use function L{pygeodesy.cosineLaw_} with C{B{corr}=2}.'''
108
+ return _MODS.formy.cosineLaw_(phi2, phi1, lam21, corr=2, **datum)
109
+
110
+
87
111
  @deprecated_function
88
112
  def decodeEPSG2(arg): # PYCHOK no cover
89
113
  '''DEPRECATED, use function L{epsg.decode2}.
@@ -295,11 +319,21 @@ def scalar(value, low=EPS, high=1.0, name=_scalar_, Error=ValueError): # PYCHOK
295
319
 
296
320
 
297
321
  @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)
322
+ def simplify2(points, pipe=_1mm, **radius_shortest_indices_options): # PYCHOK no cover
323
+ '''DEPRECATED, use function L{pygeodesy.simplifyRW}.'''
324
+ return _MODS.simplify.simplifyRW(points, pipe=pipe, **radius_shortest_indices_options)
325
+
326
+
327
+ @deprecated_function
328
+ def simplifyRDPm(points, distance=_1mm, **radius_shortest_indices_options):
329
+ '''DEPRECATED on 2024.11.28, use function L{pygeodesy.simplifyRDP}C{(points, modified=True, ...)}.'''
330
+ return _MODS.simplify.simplifyRDP(points, modified=True, distance=distance, **radius_shortest_indices_options)
331
+
332
+
333
+ @deprecated_function
334
+ def simplifyVWm(points, area=_1mm, **radius_attr_indices_options):
335
+ '''DEPRECATED on 2024.11.28, use function L{pygeodesy.simplifyVW}C{(points, modified=True, ...)}.'''
336
+ return _MODS.simplify.simplifyVW(points, modified=True, area=area, **radius_attr_indices_options)
303
337
 
304
338
 
305
339
  @deprecated_function
@@ -366,7 +400,7 @@ def utmZoneBand2(lat, lon): # PYCHOK no cover
366
400
 
367
401
  # **) MIT License
368
402
  #
369
- # Copyright (C) 2018-2024 -- mrJean1 at Gmail -- All Rights Reserved.
403
+ # Copyright (C) 2018-2025 -- mrJean1 at Gmail -- All Rights Reserved.
370
404
  #
371
405
  # Permission is hereby granted, free of charge, to any person obtaining a
372
406
  # 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, Xyz_kwds, **Xyz): # overloads C{_NamedLocal}'s
1106
+ '''(INTERNAL) Invoke C{ltp._xLtp(ltp)._ecef2local}.
1107
+ '''
1108
+ Xyz_ = self._ltp_toLocal2(Xyz_kwds, **Xyz) # in ._NamedLocal
1109
+ ltp = self._ltp._xLtp(ltp, self._Ltp) # both in ._NamedLocal
1110
+ return ltp._ecef2local(self, *Xyz_)
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"),
@@ -885,7 +885,7 @@ del _1_0, _0_01
885
885
 
886
886
  # **) MIT License
887
887
  #
888
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
888
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
889
889
  #
890
890
  # Permission is hereby granted, free of charge, to any person obtaining a
891
891
  # copy of this software and associated documentation files (the "Software"),
@@ -320,7 +320,7 @@ __all__ += _ALL_OTHER(Cartesian, LatLon, # classes
320
320
 
321
321
  # **) MIT License
322
322
  #
323
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
323
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
324
324
  #
325
325
  # Permission is hereby granted, free of charge, to any person obtaining a
326
326
  # copy of this software and associated documentation files (the "Software"),
@@ -314,7 +314,7 @@ __all__ += _ALL_OTHER(Cartesian, LatLon, # classes
314
314
 
315
315
  # **) MIT License
316
316
  #
317
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
317
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
318
318
  #
319
319
  # Permission is hereby granted, free of charge, to any person obtaining a
320
320
  # copy of this software and associated documentation files (the "Software"),
@@ -359,7 +359,7 @@ __all__ += _ALL_OTHER(Cartesian, LatLon, # classes
359
359
 
360
360
  # **) MIT License
361
361
  #
362
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
362
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
363
363
  #
364
364
  # Permission is hereby granted, free of charge, to any person obtaining a
365
365
  # copy of this software and associated documentation files (the "Software"),
@@ -657,7 +657,7 @@ __all__ += _ALL_OTHER(Cartesian, LatLon, Ned, Nvector, # classes
657
657
 
658
658
  # **) MIT License
659
659
  #
660
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
660
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
661
661
  #
662
662
  # Permission is hereby granted, free of charge, to any person obtaining a
663
663
  # copy of this software and associated documentation files (the "Software"),
@@ -67,12 +67,13 @@ from pygeodesy.props import deprecated_function, deprecated_method, \
67
67
  property_doc_, property_RO
68
68
  # from pygeodesy.streprs import Fmt # from .points
69
69
  from pygeodesy.units import Number_, Scalar_
70
- from pygeodesy.utily import atan2b, atan2d, sincos2, sincos2d, unroll180, wrap180
70
+ from pygeodesy.utily import atan2, atan2b, atan2d, sincos2, sincos2d, \
71
+ unroll180, wrap180
71
72
 
72
- from math import atan2, cos, degrees, fabs, radians, tan
73
+ from math import cos, degrees, fabs, radians, tan as _tan
73
74
 
74
75
  __all__ = _ALL_LAZY.ellipsoidalVincenty
75
- __version__ = '24.10.12'
76
+ __version__ = '24.11.26'
76
77
 
77
78
  _antipodal_to_ = _SPACE_(_antipodal_, _to_)
78
79
 
@@ -383,7 +384,7 @@ def _sincos22(sa):
383
384
  def _sincostan3r(a, f):
384
385
  # I{Reduced} 3-tuple C{(sin(B{a}), cos(B{a}), tan(B{a}))}
385
386
  if a: # see L{sincostan3}
386
- t = (_1_0 - f) * tan(a)
387
+ t = (_1_0 - f) * _tan(a)
387
388
  if t:
388
389
  c = _1_0 / hypot1(t)
389
390
  s = c * t
@@ -567,7 +568,7 @@ __all__ += _ALL_DOCS(Cartesian, LatLon, intersecant2, # from .ellipsoidalBaseDI
567
568
 
568
569
  # **) MIT License
569
570
  #
570
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
571
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
571
572
  #
572
573
  # Permission is hereby granted, free of charge, to any person obtaining a
573
574
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/ellipsoids.py CHANGED
@@ -90,10 +90,10 @@ from pygeodesy.units import Bearing_, Distance, Float, Float_, Height, Lamd, Lat
90
90
  Meter2, Meter3, Phi, Phid, Radius, Radius_, Scalar
91
91
  from pygeodesy.utily import atan1, atan1d, atan2b, degrees90, m2radians, radians2m, sincos2d
92
92
 
93
- from math import asinh, atan, atanh, cos, degrees, exp, fabs, radians, sin, sinh, sqrt, tan
93
+ from math import asinh, atan, atanh, cos, degrees, exp, fabs, radians, sin, sinh, sqrt, tan # as _tan
94
94
 
95
95
  __all__ = _ALL_LAZY.ellipsoids
96
- __version__ = '24.10.15'
96
+ __version__ = '24.11.26'
97
97
 
98
98
  _f_0_0 = Float(f =_0_0) # zero flattening
99
99
  _f__0_0 = Float(f_=_0_0) # zero inverse flattening
@@ -660,8 +660,7 @@ class Ellipsoid(_NamedEnumItem):
660
660
 
661
661
  @arg lat: Geodetic latitude (C{degrees90}, C{str}).
662
662
 
663
- @return: A L{Circle4Tuple}C{(radius, height, lat, beta)}
664
- instance.
663
+ @return: A L{Circle4Tuple}C{(radius, height, lat, beta)}.
665
664
 
666
665
  @raise RangeError: Latitude B{C{lat}} outside valid range and
667
666
  L{rangerrors<pygeodesy.rangerrors>} is C{True}.
@@ -2427,7 +2426,7 @@ if __name__ == '__main__':
2427
2426
 
2428
2427
  # **) MIT License
2429
2428
  #
2430
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
2429
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
2431
2430
  #
2432
2431
  # Permission is hereby granted, free of charge, to any person obtaining a
2433
2432
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/elliptic.py CHANGED
@@ -24,7 +24,7 @@ Following is a copy of I{Karney}'s U{EllipticFunction.hpp
24
24
  <https://GeographicLib.SourceForge.io/C++/doc/EllipticFunction_8hpp_source.html>}
25
25
  file C{Header}.
26
26
 
27
- Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2023)
27
+ Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2024)
28
28
  and licensed under the MIT/X11 License. For more information, see the
29
29
  U{GeographicLib<https://GeographicLib.SourceForge.io>} documentation.
30
30
 
@@ -93,13 +93,13 @@ from pygeodesy.named import _Named, _NamedTuple, _ALL_LAZY, Fmt, unstr
93
93
  from pygeodesy.props import _allPropertiesOf_n, Property_RO, _update_all
94
94
  # from pygeodesy.streprs import Fmt, unstr # from .named
95
95
  from pygeodesy.units import Scalar, Scalar_
96
- # from pygeodesy.utily import sincos2 as _sincos2 # from .karney
96
+ from pygeodesy.utily import atan2 # sincos2 as _sincos2
97
97
 
98
- from math import asin, asinh, atan, atan2, ceil, cosh, fabs, floor, \
99
- radians, sin, sinh, sqrt, tan, tanh
98
+ from math import asin, asinh, atan, ceil, cosh, fabs, floor, radians, \
99
+ sin, sinh, sqrt, tan, tanh # tan as _tan
100
100
 
101
101
  __all__ = _ALL_LAZY.elliptic
102
- __version__ = '24.10.14'
102
+ __version__ = '24.11.26'
103
103
 
104
104
  _TolRD = zqrt(EPS * 0.002)
105
105
  _TolRF = zqrt(EPS * 0.030)
@@ -1246,7 +1246,7 @@ def _RJ(inst, x, y, z, p, *over):
1246
1246
 
1247
1247
  # **) MIT License
1248
1248
  #
1249
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
1249
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1250
1250
  #
1251
1251
  # Permission is hereby granted, free of charge, to any person obtaining a
1252
1252
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/epsg.py CHANGED
@@ -223,7 +223,7 @@ __all__ += _ALL_DOCS(decode2, encode)
223
223
 
224
224
  # **) MIT License
225
225
  #
226
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
226
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
227
227
  #
228
228
  # Permission is hereby granted, free of charge, to any person obtaining a
229
229
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/errors.py CHANGED
@@ -914,7 +914,7 @@ def _xStrError(*Refs, **name_value_Error): # in .gars, .geohash, .wgrs
914
914
 
915
915
  # **) MIT License
916
916
  #
917
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
917
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
918
918
  #
919
919
  # Permission is hereby granted, free of charge, to any person obtaining a
920
920
  # copy of this software and associated documentation files (the "Software"),
pygeodesy/etm.py CHANGED
@@ -17,7 +17,7 @@ Following is a copy of I{Karney}'s U{TransverseMercatorExact.hpp
17
17
  <https://GeographicLib.SourceForge.io/C++/doc/TransverseMercatorExact_8hpp_source.html>}
18
18
  file C{Header}.
19
19
 
20
- Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2023) and licensed
20
+ Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2008-2024) and licensed
21
21
  under the MIT/X11 License. For more information, see the U{GeographicLib<https://
22
22
  GeographicLib.SourceForge.io>} documentation.
23
23
 
@@ -86,14 +86,14 @@ from pygeodesy.props import deprecated_method, deprecated_property_RO, \
86
86
  property_doc_, _allPropertiesOf_n
87
87
  from pygeodesy.streprs import Fmt, pairs, unstr
88
88
  from pygeodesy.units import Degrees, Scalar_
89
- from pygeodesy.utily import atan1d, atan2d, _loneg, sincos2
89
+ from pygeodesy.utily import atan1d, atan2, atan2d, _loneg, sincos2
90
90
  from pygeodesy.utm import _cmlon, _LLEB, _parseUTM5, _toBand, _toXtm8, \
91
91
  _to7zBlldfn, Utm, UTMError
92
92
 
93
- from math import asinh, atan2, degrees, radians, sinh, sqrt
93
+ from math import asinh, degrees, radians, sinh, sqrt
94
94
 
95
95
  __all__ = _ALL_LAZY.etm
96
- __version__ = '24.11.04'
96
+ __version__ = '24.11.24'
97
97
 
98
98
  _OVERFLOW = _1_EPS**2 # ~2e+31
99
99
  _TAYTOL = pow(EPS, 0.6)
@@ -1197,7 +1197,7 @@ if __name__ == '__main__': # MCCABE 16
1197
1197
 
1198
1198
  # **) MIT License
1199
1199
  #
1200
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
1200
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
1201
1201
  #
1202
1202
  # Permission is hereby granted, free of charge, to any person obtaining a
1203
1203
  # copy of this software and associated documentation files (the "Software"),