pygeodesy 24.10.24__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.10.24.dist-info → PyGeodesy-24.12.12.dist-info}/METADATA +6 -6
  2. PyGeodesy-24.12.12.dist-info/RECORD +118 -0
  3. {PyGeodesy-24.10.24.dist-info → PyGeodesy-24.12.12.dist-info}/WHEEL +1 -1
  4. pygeodesy/__init__.py +5 -5
  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 +55 -65
  19. pygeodesy/basics.py +35 -34
  20. pygeodesy/booleans.py +37 -37
  21. pygeodesy/cartesianBase.py +26 -65
  22. pygeodesy/clipy.py +1 -1
  23. pygeodesy/constants.py +7 -7
  24. pygeodesy/css.py +8 -9
  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 +10 -10
  29. pygeodesy/deprecated/consterns.py +1 -1
  30. pygeodesy/deprecated/datum.py +1 -1
  31. pygeodesy/deprecated/functions.py +23 -13
  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 +63 -69
  39. pygeodesy/elevations.py +1 -1
  40. pygeodesy/ellipsoidalBase.py +106 -121
  41. pygeodesy/ellipsoidalBaseDI.py +115 -119
  42. pygeodesy/ellipsoidalExact.py +36 -38
  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 +7 -8
  48. pygeodesy/elliptic.py +6 -6
  49. pygeodesy/epsg.py +1 -1
  50. pygeodesy/errors.py +25 -25
  51. pygeodesy/etm.py +84 -76
  52. pygeodesy/fmath.py +54 -51
  53. pygeodesy/formy.py +74 -106
  54. pygeodesy/frechet.py +1 -1
  55. pygeodesy/fstats.py +1 -1
  56. pygeodesy/fsums.py +82 -72
  57. pygeodesy/gars.py +1 -1
  58. pygeodesy/geodesici.py +4 -4
  59. pygeodesy/geodesicw.py +16 -15
  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 +3 -3
  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 +8 -17
  70. pygeodesy/geohash.py +1 -1
  71. pygeodesy/geoids.py +6 -6
  72. pygeodesy/hausdorff.py +1 -1
  73. pygeodesy/heights.py +3 -3
  74. pygeodesy/internals.py +64 -80
  75. pygeodesy/interns.py +2 -3
  76. pygeodesy/iters.py +1 -1
  77. pygeodesy/karney.py +4 -4
  78. pygeodesy/ktm.py +20 -21
  79. pygeodesy/latlonBase.py +296 -346
  80. pygeodesy/lazily.py +15 -15
  81. pygeodesy/lcc.py +5 -5
  82. pygeodesy/ltp.py +55 -59
  83. pygeodesy/ltpTuples.py +208 -192
  84. pygeodesy/mgrs.py +9 -10
  85. pygeodesy/named.py +153 -3
  86. pygeodesy/namedTuples.py +58 -7
  87. pygeodesy/nvectorBase.py +122 -105
  88. pygeodesy/osgr.py +10 -13
  89. pygeodesy/points.py +1 -1
  90. pygeodesy/props.py +3 -3
  91. pygeodesy/resections.py +26 -26
  92. pygeodesy/rhumb/__init__.py +2 -2
  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 +4 -4
  97. pygeodesy/simplify.py +291 -403
  98. pygeodesy/solveBase.py +1 -1
  99. pygeodesy/sphericalBase.py +1 -1
  100. pygeodesy/sphericalNvector.py +84 -127
  101. pygeodesy/sphericalTrigonometry.py +66 -71
  102. pygeodesy/streprs.py +10 -5
  103. pygeodesy/trf.py +1 -1
  104. pygeodesy/triaxials.py +23 -16
  105. pygeodesy/units.py +17 -17
  106. pygeodesy/unitsBase.py +1 -1
  107. pygeodesy/ups.py +4 -4
  108. pygeodesy/utily.py +202 -145
  109. pygeodesy/utm.py +10 -10
  110. pygeodesy/utmups.py +1 -1
  111. pygeodesy/utmupsBase.py +1 -1
  112. pygeodesy/vector2d.py +17 -17
  113. pygeodesy/vector3d.py +32 -23
  114. pygeodesy/vector3dBase.py +22 -19
  115. pygeodesy/webmercator.py +5 -5
  116. pygeodesy/wgrs.py +5 -5
  117. PyGeodesy-24.10.24.dist-info/RECORD +0 -118
  118. {PyGeodesy-24.10.24.dist-info → PyGeodesy-24.12.12.dist-info}/top_level.txt +0 -0
@@ -24,7 +24,7 @@ from pygeodesy.points import _areaError, ispolar # PYCHOK exported
24
24
  # from math import fabs # from .karney
25
25
 
26
26
  __all__ = _ALL_LAZY.ellipsoidalExact
27
- __version__ = '24.08.13'
27
+ __version__ = '24.11.06'
28
28
 
29
29
 
30
30
  class Cartesian(CartesianEllipsoidalBase):
@@ -119,30 +119,28 @@ def areaOf(points, datum=_WGS84, wrap=True):
119
119
 
120
120
 
121
121
  def intersection3(start1, end1, start2, end2, height=None, wrap=False, # was=True
122
- equidistant=None, tol=_TOL_M, LatLon=LatLon, **LatLon_kwds):
123
- '''I{Iteratively} compute the intersection point of two lines, each defined
124
- by two (ellipsoidal) points or by an (ellipsoidal) start point and an
125
- initial bearing from North.
122
+ equidistant=None, tol=_TOL_M, **LatLon_and_kwds):
123
+ '''I{Iteratively} compute the intersection point of two geodesic lines, each
124
+ given as two points or as an start point and a bearing from North.
126
125
 
127
126
  @arg start1: Start point of the first line (L{LatLon}).
128
127
  @arg end1: End point of the first line (L{LatLon}) or the initial bearing
129
- at the first point (compass C{degrees360}).
128
+ at B{C{start1}} (compass C{degrees360}).
130
129
  @arg start2: Start point of the second line (L{LatLon}).
131
130
  @arg end2: End point of the second line (L{LatLon}) or the initial bearing
132
- at the second point (compass C{degrees360}).
131
+ at B{C{start2}} (compass C{degrees360}).
133
132
  @kwarg height: Optional height at the intersection (C{meter}, conventionally)
134
133
  or C{None} for the mean height.
135
- @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the B{C{start2}}
136
- and B{C{end*}} points (C{bool}).
134
+ @kwarg wrap: If C{True}, wrap or I{normalize} and unroll B{C{start2}} and
135
+ both B{C{end*}} points (C{bool}).
137
136
  @kwarg equidistant: An azimuthal equidistant projection (I{class} or function
138
137
  L{pygeodesy.equidistant}) or C{None} for the preferred
139
138
  C{B{start1}.Equidistant}.
140
139
  @kwarg tol: Tolerance for convergence and for skew line distance and length
141
140
  (C{meter}, conventionally).
142
- @kwarg LatLon: Optional class to return the intersection points (L{LatLon})
143
- or C{None}.
144
- @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword arguments,
145
- ignored if C{B{LatLon} is None}.
141
+ @kwarg LatLon_and_kwds: Optional class C{B{LatLon}=}L{LatLon} to return the
142
+ intersection points and optionally, additional B{C{LatLon}}
143
+ keyword arguments, ignored if C{B{LatLon}=None}.
146
144
 
147
145
  @return: An L{Intersection3Tuple}C{(point, outside1, outside2)} with C{point}
148
146
  a B{C{LatLon}} or if C{B{LatLon} is None}, a L{LatLon4Tuple}C{(lat,
@@ -154,23 +152,23 @@ def intersection3(start1, end1, start2, end2, height=None, wrap=False, # was=Tr
154
152
  @raise TypeError: Invalid or non-ellipsoidal B{C{start1}}, B{C{end1}},
155
153
  B{C{start2}} or B{C{end2}} or invalid B{C{equidistant}}.
156
154
 
157
- @note: For each line specified with an initial bearing, a pseudo-end point
158
- is computed as the C{destination} along that bearing at about 1.5
159
- times the distance from the start point to an initial gu-/estimate
160
- of the intersection point (and between 1/8 and 3/8 of the authalic
161
- earth perimeter).
155
+ @note: For each line specified with an initial bearing, a pseudo-end point is
156
+ computed as the C{destination} along that bearing at about 1.5 times the
157
+ distance from the start point to an initial gu-/estimate of the intersection
158
+ point (and between 1/8 and 3/8 of the authalic earth perimeter).
162
159
 
163
160
  @see: U{The B{ellipsoidal} case<https://GIS.StackExchange.com/questions/48937/
164
161
  calculating-intersection-of-two-circles>} and U{Karney's paper
165
162
  <https://ArXiv.org/pdf/1102.1215.pdf>}, pp 20-21, section B{14. MARITIME
166
163
  BOUNDARIES} for more details about the iteration algorithm.
167
164
  '''
165
+ kwds = _xkwds(LatLon_and_kwds, LatLon=LatLon)
168
166
  return _intersection3(start1, end1, start2, end2, height=height, wrap=wrap,
169
- equidistant=equidistant, tol=tol, LatLon=LatLon, **LatLon_kwds)
167
+ equidistant=equidistant, tol=tol, **kwds)
170
168
 
171
169
 
172
170
  def intersections2(center1, radius1, center2, radius2, height=None, wrap=False, # was=True
173
- equidistant=None, tol=_TOL_M, LatLon=LatLon, **LatLon_kwds):
171
+ equidistant=None, tol=_TOL_M, **LatLon_and_kwds):
174
172
  '''I{Iteratively} compute the intersection points of two circles, each defined
175
173
  by an (ellipsoidal) center point and a radius.
176
174
 
@@ -189,10 +187,9 @@ def intersections2(center1, radius1, center2, radius2, height=None, wrap=False,
189
187
  the preferred C{B{center1}.Equidistant}.
190
188
  @kwarg tol: Convergence tolerance (C{meter}, same units as B{C{radius1}}
191
189
  and B{C{radius2}}).
192
- @kwarg LatLon: Optional class to return the intersection points (L{LatLon})
193
- or C{None}.
194
- @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword arguments,
195
- ignored if C{B{LatLon} is None}.
190
+ @kwarg LatLon_and_kwds: Optional class C{B{LatLon}=}L{LatLon} to return the
191
+ intersection points and optionally, additional B{C{LatLon}}
192
+ keyword arguments, ignored if C{B{LatLon}=None}.
196
193
 
197
194
  @return: 2-Tuple of the intersection points, each a B{C{LatLon}} instance
198
195
  or L{LatLon4Tuple}C{(lat, lon, height, datum)} if C{B{LatLon} is
@@ -214,8 +211,9 @@ def intersections2(center1, radius1, center2, radius2, height=None, wrap=False,
214
211
  U{sphere-sphere<https://MathWorld.Wolfram.com/Sphere-SphereIntersection.html>}
215
212
  intersections.
216
213
  '''
214
+ kwds = _xkwds(LatLon_and_kwds, LatLon=LatLon)
217
215
  return _intersections2(center1, radius1, center2, radius2, height=height, wrap=wrap,
218
- equidistant=equidistant, tol=tol, LatLon=LatLon, **LatLon_kwds)
216
+ equidistant=equidistant, tol=tol, **kwds)
219
217
 
220
218
 
221
219
  def isclockwise(points, datum=_WGS84, wrap=True):
@@ -245,9 +243,9 @@ def isclockwise(points, datum=_WGS84, wrap=True):
245
243
 
246
244
 
247
245
  def nearestOn(point, point1, point2, within=True, height=None, wrap=False,
248
- equidistant=None, tol=_TOL_M, LatLon=LatLon, **LatLon_kwds):
249
- '''I{Iteratively} locate the closest point on the geodesic between
250
- two other (ellispoidal) points.
246
+ equidistant=None, tol=_TOL_M, **LatLon_and_kwds):
247
+ '''I{Iteratively} locate the closest point on the geodesic (line)
248
+ between two other (ellipsoidal) points.
251
249
 
252
250
  @arg point: Reference point (C{LatLon}).
253
251
  @arg point1: Start point of the geodesic (C{LatLon}).
@@ -265,16 +263,15 @@ def nearestOn(point, point1, point2, within=True, height=None, wrap=False,
265
263
  or function L{pygeodesy.equidistant}) or C{None}
266
264
  for the preferred C{B{point}.Equidistant}.
267
265
  @kwarg tol: Convergence tolerance (C{meter}).
268
- @kwarg LatLon: Optional class to return the closest point
269
- (L{LatLon}) or C{None}.
270
- @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword
271
- arguments, ignored if C{B{LatLon} is None}.
266
+ @kwarg LatLon_and_kwds: Optional class C{B{LatLon}=}L{LatLon} to return the
267
+ closest point and optionally, additional B{C{LatLon}} keyword
268
+ arguments, ignored if C{B{LatLon}=None}.
272
269
 
273
- @return: Closest point, a B{C{LatLon}} instance or if C{B{LatLon}
274
- is None}, a L{LatLon4Tuple}C{(lat, lon, height, datum)}.
270
+ @return: Closest point, a B{C{LatLon}} instance or if C{B{LatLon} is None},
271
+ a L{LatLon4Tuple}C{(lat, lon, height, datum)}.
275
272
 
276
- @raise TypeError: Invalid or non-ellipsoidal B{C{point}}, B{C{point1}}
277
- or B{C{point2}} or invalid B{C{equidistant}}.
273
+ @raise TypeError: Invalid or non-ellipsoidal B{C{point}}, B{C{point1}} or
274
+ B{C{point2}} or invalid B{C{equidistant}}.
278
275
 
279
276
  @raise ValueError: No convergence for the B{C{tol}}.
280
277
 
@@ -283,8 +280,9 @@ def nearestOn(point, point1, point2, within=True, height=None, wrap=False,
283
280
  <https://ArXiv.org/pdf/1102.1215.pdf>}, pp 20-21, section B{14. MARITIME
284
281
  BOUNDARIES} for more details about the iteration algorithm.
285
282
  '''
283
+ kwds = _xkwds(LatLon_and_kwds, LatLon=LatLon)
286
284
  return _nearestOn(point, point1, point2, within=within, height=height, wrap=wrap,
287
- equidistant=equidistant, tol=tol, LatLon=LatLon, **LatLon_kwds)
285
+ equidistant=equidistant, tol=tol, **kwds)
288
286
 
289
287
 
290
288
  def perimeterOf(points, closed=False, datum=_WGS84, wrap=True):
@@ -322,7 +320,7 @@ __all__ += _ALL_OTHER(Cartesian, LatLon, # classes
322
320
 
323
321
  # **) MIT License
324
322
  #
325
- # Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
323
+ # Copyright (C) 2016-2025 -- mrJean1 at Gmail -- All Rights Reserved.
326
324
  #
327
325
  # Permission is hereby granted, free of charge, to any person obtaining a
328
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}.
@@ -811,9 +810,9 @@ class Ellipsoid(_NamedEnumItem):
811
810
 
812
811
  eccentricity = e # eccentricity
813
812
  # eccentricity2 = e2 # eccentricity squared
814
- eccentricity1st2 = e2 # first eccentricity squared
815
- eccentricity2nd2 = e22 # second eccentricity squared
816
- eccentricity3rd2 = e32 # third eccentricity squared
813
+ eccentricity1st2 = e2 # first eccentricity squared, signed
814
+ eccentricity2nd2 = e22 # second eccentricity squared, signed
815
+ eccentricity3rd2 = e32 # third eccentricity squared, signed
817
816
 
818
817
  def ecef(self, Ecef=None):
819
818
  '''Return U{ECEF<https://WikiPedia.org/wiki/ECEF>} converter.
@@ -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
@@ -27,7 +27,7 @@ from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS, _PYTHON_X_DEV
27
27
  from copy import copy as _copy
28
28
 
29
29
  __all__ = _ALL_LAZY.errors # _ALL_DOCS('_InvalidError', '_IsnotError') _under
30
- __version__ = '24.10.14'
30
+ __version__ = '24.11.02'
31
31
 
32
32
  _argument_ = 'argument'
33
33
  _box_ = 'box'
@@ -777,7 +777,7 @@ except AttributeError:
777
777
  return d
778
778
 
779
779
 
780
- # def _xkwds_bool(inst, **kwds): # no longer in .frechet, .hausdorff, .heights
780
+ # def _xkwds_bool(inst, **kwds): # unused
781
781
  # '''(INTERNAL) Set applicable C{bool} properties/attributes.
782
782
  # '''
783
783
  # for n, v in kwds.items():
@@ -789,18 +789,18 @@ except AttributeError:
789
789
  # setattr(inst, NN(_UNDER_, n), v)
790
790
 
791
791
 
792
- def _xkwds_from(orig, *args, **kwds):
793
- '''(INTERNAL) Return the items from C{orig} with the keys
794
- from C{kwds} and a value not in C{args} and C{kwds}.
795
- '''
796
- def _items(orig, args, items):
797
- for n, m in items:
798
- if n in orig: # n in (orig.keys() & kwds.keys())
799
- t = orig[n]
800
- if t is not m and t not in args:
801
- yield n, t
802
-
803
- return _items(orig, args, kwds.items())
792
+ # def _xkwds_from(orig, *args, **kwds): # unused
793
+ # '''(INTERNAL) Return the items from C{orig} with the keys
794
+ # from C{kwds} and a value not in C{args} and C{kwds}.
795
+ # '''
796
+ # def _items(orig, args, items):
797
+ # for n, m in items:
798
+ # if n in orig: # n in (orig.keys() & kwds.keys())
799
+ # t = orig[n]
800
+ # if t is not m and t not in args:
801
+ # yield n, t
802
+ #
803
+ # return _items(orig, args, kwds.items())
804
804
 
805
805
 
806
806
  def _xkwds_get(kwds, **name_default):
@@ -813,14 +813,14 @@ def _xkwds_get(kwds, **name_default):
813
813
  raise _xAssertionError(_xkwds_get, kwds, **name_default)
814
814
 
815
815
 
816
- def _xkwds_get_(kwds, **names_defaults):
817
- '''(INTERNAL) Yield each C{kwds} value or its C{default}
818
- in I{case-insensitive, alphabetical} C{name} order.
819
- '''
820
- if not isinstance(kwds, dict):
821
- raise _xAssertionError(_xkwds_get_, kwds)
822
- for n, v in _MODS.basics.itemsorted(names_defaults):
823
- yield kwds.get(n, v)
816
+ # def _xkwds_get_(kwds, **names_defaults): # unused
817
+ # '''(INTERNAL) Yield each C{kwds} value or its C{default}
818
+ # in I{case-insensitive, alphabetical} C{name} order.
819
+ # '''
820
+ # if not isinstance(kwds, dict):
821
+ # raise _xAssertionError(_xkwds_get_, kwds)
822
+ # for n, v in _MODS.basics.itemsorted(names_defaults):
823
+ # yield kwds.get(n, v)
824
824
 
825
825
 
826
826
  def _xkwds_get1(kwds, **name_default):
@@ -844,11 +844,11 @@ def _xkwds_item2(kwds):
844
844
  raise _xAssertionError(_xkwds_item2, kwds)
845
845
 
846
846
 
847
- def _xkwds_kwds(kwds, **names_defaults):
847
+ def _xkwds_kwds(kwds, **names_defaults): # in .geodesici # PYCHOK no cover
848
848
  '''(INTERNAL) Return a C{dict} of C{named_defaults} items replaced with C{kwds}.
849
849
  '''
850
850
  if not isinstance(kwds, dict):
851
- raise _xAssertionError(_xkwds_get_, kwds)
851
+ raise _xAssertionError(_xkwds_kwds, kwds)
852
852
  _g = kwds.get
853
853
  return dict((n, _g(n, v)) for n, v in names_defaults.items())
854
854
 
@@ -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"),