pygeodesy 24.6.9__py2.py3-none-any.whl → 24.7.7__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. {PyGeodesy-24.6.9.dist-info → PyGeodesy-24.7.7.dist-info}/METADATA +2 -2
  2. PyGeodesy-24.7.7.dist-info/RECORD +117 -0
  3. pygeodesy/__init__.py +39 -32
  4. pygeodesy/__main__.py +6 -1
  5. pygeodesy/albers.py +2 -2
  6. pygeodesy/auxilats/__init__.py +1 -1
  7. pygeodesy/auxilats/auxAngle.py +40 -39
  8. pygeodesy/auxilats/auxDLat.py +3 -2
  9. pygeodesy/auxilats/auxLat.py +16 -18
  10. pygeodesy/auxilats/auxily.py +1 -1
  11. pygeodesy/azimuthal.py +10 -10
  12. pygeodesy/basics.py +16 -4
  13. pygeodesy/booleans.py +4 -4
  14. pygeodesy/cartesianBase.py +11 -14
  15. pygeodesy/css.py +14 -18
  16. pygeodesy/datums.py +6 -6
  17. pygeodesy/deprecated/__init__.py +1 -1
  18. pygeodesy/deprecated/classes.py +25 -4
  19. pygeodesy/deprecated/datum.py +3 -3
  20. pygeodesy/deprecated/functions.py +6 -8
  21. pygeodesy/dms.py +23 -27
  22. pygeodesy/ecef.py +4 -4
  23. pygeodesy/elevations.py +4 -4
  24. pygeodesy/ellipsoidalBase.py +23 -28
  25. pygeodesy/ellipsoidalBaseDI.py +19 -23
  26. pygeodesy/ellipsoidalExact.py +3 -3
  27. pygeodesy/ellipsoidalGeodSolve.py +15 -23
  28. pygeodesy/ellipsoidalKarney.py +37 -60
  29. pygeodesy/ellipsoidalNvector.py +38 -44
  30. pygeodesy/ellipsoidalVincenty.py +11 -14
  31. pygeodesy/ellipsoids.py +107 -101
  32. pygeodesy/errors.py +109 -48
  33. pygeodesy/etm.py +32 -44
  34. pygeodesy/formy.py +55 -58
  35. pygeodesy/frechet.py +18 -20
  36. pygeodesy/fsums.py +3 -3
  37. pygeodesy/gars.py +3 -4
  38. pygeodesy/geodesici.py +1696 -0
  39. pygeodesy/geodesicw.py +15 -15
  40. pygeodesy/geodesicx/__init__.py +4 -4
  41. pygeodesy/geodesicx/gx.py +34 -55
  42. pygeodesy/geodesicx/gxbases.py +20 -8
  43. pygeodesy/geodesicx/gxline.py +93 -88
  44. pygeodesy/geodsolve.py +108 -59
  45. pygeodesy/geohash.py +26 -34
  46. pygeodesy/geoids.py +28 -37
  47. pygeodesy/hausdorff.py +17 -18
  48. pygeodesy/heights.py +2 -2
  49. pygeodesy/internals.py +46 -13
  50. pygeodesy/interns.py +2 -2
  51. pygeodesy/karney.py +78 -15
  52. pygeodesy/ktm.py +13 -16
  53. pygeodesy/latlonBase.py +17 -19
  54. pygeodesy/lazily.py +28 -25
  55. pygeodesy/lcc.py +28 -31
  56. pygeodesy/ltp.py +7 -8
  57. pygeodesy/ltpTuples.py +71 -73
  58. pygeodesy/mgrs.py +8 -9
  59. pygeodesy/named.py +19 -10
  60. pygeodesy/nvectorBase.py +9 -10
  61. pygeodesy/osgr.py +9 -9
  62. pygeodesy/points.py +6 -6
  63. pygeodesy/rhumb/__init__.py +1 -1
  64. pygeodesy/rhumb/aux_.py +5 -5
  65. pygeodesy/rhumb/bases.py +30 -31
  66. pygeodesy/rhumb/ekx.py +3 -4
  67. pygeodesy/rhumb/solve.py +21 -22
  68. pygeodesy/solveBase.py +177 -123
  69. pygeodesy/sphericalBase.py +10 -11
  70. pygeodesy/sphericalNvector.py +13 -13
  71. pygeodesy/sphericalTrigonometry.py +86 -97
  72. pygeodesy/streprs.py +4 -34
  73. pygeodesy/triaxials.py +48 -43
  74. pygeodesy/units.py +208 -275
  75. pygeodesy/unitsBase.py +115 -107
  76. pygeodesy/ups.py +26 -31
  77. pygeodesy/utily.py +8 -8
  78. pygeodesy/utm.py +35 -40
  79. pygeodesy/utmups.py +43 -46
  80. pygeodesy/utmupsBase.py +8 -9
  81. pygeodesy/vector3d.py +26 -27
  82. pygeodesy/vector3dBase.py +6 -7
  83. pygeodesy/webmercator.py +19 -21
  84. pygeodesy/wgrs.py +18 -20
  85. PyGeodesy-24.6.9.dist-info/RECORD +0 -116
  86. {PyGeodesy-24.6.9.dist-info → PyGeodesy-24.7.7.dist-info}/WHEEL +0 -0
  87. {PyGeodesy-24.6.9.dist-info → PyGeodesy-24.7.7.dist-info}/top_level.txt +0 -0
pygeodesy/elevations.py CHANGED
@@ -34,7 +34,7 @@ from pygeodesy.units import Lat, Lon, Meter, Scalar, Str
34
34
  # from math import fabs # from .karney
35
35
 
36
36
  __all__ = _ALL_LAZY.elevations
37
- __version__ = '24.05.13'
37
+ __version__ = '24.06.11'
38
38
 
39
39
  try:
40
40
  from urllib2 import urlopen # quote, urlcleanup
@@ -152,7 +152,7 @@ def elevation2(lat, lon, timeout=2.0):
152
152
 
153
153
  @raise ValueError: Invalid B{C{timeout}}.
154
154
 
155
- @note: The returned C{elevation} is C{None} if B{C{lat}} or B{C{lon}} is
155
+ @note: The returned C{elevation is None} if B{C{lat}} or B{C{lon}} is
156
156
  invalid or outside the C{Conterminous US (CONUS)}, if conversion
157
157
  failed or if the query timed out. The C{"error"} is the C{HTTP-,
158
158
  IO-, SSL-} or other C{-Error} as a string (C{str}).
@@ -208,8 +208,8 @@ def geoidHeight2(lat, lon, model=0, timeout=2.0):
208
208
 
209
209
  @raise ValueError: Invalid B{C{timeout}}.
210
210
 
211
- @note: The returned C{height} is C{None} if B{C{lat}} or B{C{lon}}
212
- is invalid or outside the C{Conterminous US (CONUS)}, if the
211
+ @note: The returned C{height is None} if B{C{lat}} or B{C{lon}} is
212
+ invalid or outside the C{Conterminous US (CONUS)}, if the
213
213
  B{C{model}} was invalid, if conversion failed or if the query
214
214
  timed out. The C{"error"} is the C{HTTP-, IO-, SSL-, URL-}
215
215
  or other C{-Error} as a string (C{str}).
@@ -18,9 +18,8 @@ from pygeodesy.cartesianBase import CartesianBase # PYCHOK used!
18
18
  from pygeodesy.datums import Datum, Datums, _earth_ellipsoid, _ellipsoidal_datum, \
19
19
  Transform, _WGS84, _EWGS84, _xinstanceof # _spherical_datum
20
20
  # from pygeodesy.ellipsoids import _EWGS84 # from .datums
21
- from pygeodesy.errors import _incompatible, _IsnotError, RangeError, _TypeError, \
22
- _ValueError, _xattr, _xellipsoidal, _xError, _xkwds, \
23
- _xkwds_not
21
+ from pygeodesy.errors import _IsnotError, RangeError, _TypeError, _xattr, _xellipsoidal, \
22
+ _xellipsoids, _xError, _xkwds, _xkwds_not
24
23
  # from pygeodesy.fmath import favg # _MODS
25
24
  from pygeodesy.interns import NN, _COMMA_, _ellipsoidal_
26
25
  from pygeodesy.latlonBase import LatLonBase, _trilaterate5, fabs, _Wrap
@@ -36,7 +35,7 @@ from pygeodesy.units import Epoch, _isDegrees, Radius_, _1mm as _TOL_M
36
35
  # from math import fabs # from .latlonBase
37
36
 
38
37
  __all__ = _ALL_LAZY.ellipsoidalBase
39
- __version__ = '24.06.06'
38
+ __version__ = '24.06.24'
40
39
 
41
40
 
42
41
  class CartesianEllipsoidalBase(CartesianBase):
@@ -120,13 +119,13 @@ class CartesianEllipsoidalBase(CartesianBase):
120
119
  @kwarg Vector_kwds: Optional, additional B{C{Vector}} keyword arguments,
121
120
  ignored if C{B{Vector} is None}.
122
121
 
123
- @return: If B{C{sphere}} is C{True}, a 2-tuple of the C{center} and C{radius}
124
- of the intersection of the I{spheres}. The C{radius} is C{0.0} for
122
+ @return: If C{B{sphere} is True}, a 2-tuple of the C{center} and C{radius} of
123
+ the intersection of the I{spheres}. The C{radius} is C{0.0} for
125
124
  abutting spheres (and the C{center} is aka the I{radical center}).
126
125
 
127
- If B{C{sphere}} is C{False}, a 2-tuple with the two intersection
128
- points of the I{circles}. For abutting circles, both points are
129
- the same instance, aka the I{radical center}.
126
+ If C{B{sphere} is False}, a 2-tuple with the two intersection points
127
+ of the I{circles}. For abutting circles, both points are the same
128
+ instance, aka the I{radical center}.
130
129
 
131
130
  @raise IntersectionError: Concentric, invalid or non-intersecting spheres or circles.
132
131
 
@@ -224,26 +223,25 @@ class LatLonEllipsoidalBase(LatLonBase):
224
223
 
225
224
  @arg latlonh: Latitude (C{degrees} or DMS C{str} with N or S suffix) or
226
225
  a previous C{LatLon} instance provided C{B{lon}=None}.
227
- @kwarg lon: Longitude (C{degrees} or DMS C{str} with E or W suffix) or
228
- C(None), indicating B{C{latlonh}} is a C{LatLon}.
229
- @kwarg height: Optional height above (or below) the earth surface
230
- (C{meter}, same units as the datum's ellipsoid axes).
226
+ @kwarg lon: Longitude (C{degrees} or DMS C{str} with E or W suffix) or C(None),
227
+ indicating B{C{latlonh}} is a C{LatLon}.
228
+ @kwarg height: Optional height above (or below) the earth surface (C{meter},
229
+ same units as the datum's ellipsoid axes).
231
230
  @kwarg datum: Optional, ellipsoidal datum to use (L{Datum}, L{Ellipsoid},
232
231
  L{Ellipsoid2} or L{a_f2Tuple}).
233
232
  @kwarg reframe: Optional reference frame (L{RefFrame}).
234
- @kwarg epoch: Optional epoch to observe for B{C{reframe}} (C{scalar}),
235
- a non-zero, fractional calendar year; silently ignored
236
- if C{B{reframe}=None}.
237
- @kwarg wrap: If C{True}, wrap or I{normalize} B{C{lat}} and B{C{lon}}
238
- (C{bool}).
233
+ @kwarg epoch: Optional epoch to observe for B{C{reframe}} (C{scalar}), a
234
+ non-zero, fractional calendar year, but silently ignored if
235
+ C{B{reframe}=None}.
236
+ @kwarg wrap: If C{True}, wrap or I{normalize} B{C{lat}} and B{C{lon}} (C{bool}).
239
237
  @kwarg name: Optional C{B{name}=NN} (C{str}).
240
238
 
241
- @raise RangeError: Value of C{lat} or B{C{lon}} outside the valid
242
- range and L{rangerrors} set to C{True}.
239
+ @raise RangeError: Value of C{lat} or B{C{lon}} outside the valid range and
240
+ L{rangerrors} set to C{True}.
243
241
 
244
- @raise TypeError: If B{C{latlonh}} is not a C{LatLon}, B{C{datum}} is
245
- not a L{Datum}, B{C{reframe}} is not a L{RefFrame}
246
- or B{C{epoch}} is not C{scalar} non-zero.
242
+ @raise TypeError: If B{C{latlonh}} is not a C{LatLon}, B{C{datum}} is not a
243
+ L{Datum}, B{C{reframe}} is not a L{RefFrame} or B{C{epoch}}
244
+ is not C{scalar} non-zero.
247
245
 
248
246
  @raise UnitError: Invalid B{C{lat}}, B{C{lon}} or B{C{height}}.
249
247
  '''
@@ -300,8 +298,7 @@ class LatLonEllipsoidalBase(LatLonBase):
300
298
  def datum(self, datum):
301
299
  '''Set this point's datum I{without conversion} (L{Datum}).
302
300
 
303
- @raise TypeError: The B{C{datum}} is not a L{Datum}
304
- or not ellipsoidal.
301
+ @raise TypeError: The B{C{datum}} is not a L{Datum} or not ellipsoidal.
305
302
  '''
306
303
  _xinstanceof(Datum, datum=datum)
307
304
  if not datum.isEllipsoidal:
@@ -410,9 +407,7 @@ class LatLonEllipsoidalBase(LatLonBase):
410
407
  e = other.datum.ellipsoid
411
408
  except AttributeError:
412
409
  e = E # no datum, XXX assume equivalent?
413
- if e != E:
414
- raise _ValueError(e.named2, txt=_incompatible(E.named2))
415
- return E
410
+ return _xellipsoids(E, e)
416
411
 
417
412
  @property_doc_(''' this point's observed or C{reframe} epoch (C{float}).''')
418
413
  def epoch(self):
@@ -7,7 +7,7 @@ class C{LatLonEllipsoidalBaseDI} and functions.
7
7
  # make sure int/int division yields float quotient, see .basics
8
8
  from __future__ import division as _; del _ # PYCHOK semicolon
9
9
 
10
- from pygeodesy.basics import isLatLon, issubclassof, map2
10
+ from pygeodesy.basics import isLatLon, _xsubclassof
11
11
  from pygeodesy.constants import EPS, MAX, PI, PI2, PI_4, isnear0, isnear1, \
12
12
  _EPSqrt as _TOL, _0_0, _0_5, _1_5, _3_0
13
13
  # from pygeodesy.dms import F_DMS # _MODS
@@ -20,8 +20,7 @@ from pygeodesy.formy import _isequalTo, opposing, _radical2
20
20
  from pygeodesy.interns import _antipodal_, _concentric_, _ellipsoidal_, \
21
21
  _exceed_PI_radians_, _low_, _near_, \
22
22
  _SPACE_, _too_
23
- from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS, \
24
- _dunder_nameof
23
+ from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS
25
24
  from pygeodesy.namedTuples import Bearing2Tuple, Destination2Tuple, \
26
25
  Intersection3Tuple, NearestOn2Tuple, \
27
26
  NearestOn8Tuple, _LL4Tuple
@@ -35,7 +34,7 @@ from pygeodesy.utily import m2km, unroll180, _unrollon, _unrollon3, \
35
34
  from math import degrees, radians
36
35
 
37
36
  __all__ = _ALL_LAZY.ellipsoidalBaseDI
38
- __version__ = '24.05.19'
37
+ __version__ = '24.06.17'
39
38
 
40
39
  _polar__ = 'polar?'
41
40
  _B2END = _1_5 # _intersect3 bearing to pseudo-end point factor
@@ -111,9 +110,8 @@ class LatLonEllipsoidalBaseDI(LatLonEllipsoidalBase):
111
110
  def _Direct(self, distance, bearing, LL, height): # overloaded by I{Vincenty}
112
111
  '''(INTERNAL) I{Karney}'s C{Direct} method.
113
112
 
114
- @return: A L{Destination2Tuple}C{(destination, final)} or
115
- a L{Destination3Tuple}C{(lat, lon, final)} if
116
- B{C{LL}} is C{None}.
113
+ @return: A L{Destination2Tuple}C{(destination, final)} or a
114
+ L{Destination3Tuple}C{(lat, lon, final)} if C{B{LL} is None}.
117
115
  '''
118
116
  g = self.geodesic
119
117
  r = g.Direct3(self.lat, self.lon, bearing, distance)
@@ -337,17 +335,17 @@ class LatLonEllipsoidalBaseDI(LatLonEllipsoidalBase):
337
335
 
338
336
  @arg points: The path or polygon points (C{LatLon}[]).
339
337
  @kwarg closed: Optionally, close the polygon (C{bool}).
340
- @kwarg height: Optional height, overriding the height of this and
341
- all other points (C{meter}, conventionally). If
342
- B{C{height}} is C{None}, the height of each point
343
- is taken into account for distances.
344
- @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the
345
- B{C{points}} (C{bool}).
346
-
347
- @return: A L{NearestOn8Tuple}C{(closest, distance, fi, j, start,
348
- end, initial, final)} with C{distance} in C{meter},
349
- conventionally and with the C{closest}, the C{start}
350
- the C{end} point each an instance of this C{LatLon}.
338
+ @kwarg height: Optional height, overriding the height of this and all
339
+ other points (C{meter}, conventionally). If C{B{height}
340
+ is None}, each point's height is taken into account to
341
+ compute distances.
342
+ @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the B{C{points}}
343
+ (C{bool}).
344
+
345
+ @return: A L{NearestOn8Tuple}C{(closest, distance, fi, j, start, end,
346
+ initial, final)} with C{distance} in C{meter}, conventionally
347
+ and with the C{closest}, the C{start} the C{end} point each
348
+ an instance of this C{LatLon}.
351
349
 
352
350
  @raise PointsError: Insufficient number of B{C{points}}.
353
351
 
@@ -422,7 +420,7 @@ class LatLonEllipsoidalBaseDI(LatLonEllipsoidalBase):
422
420
  conventionally) or C{None} for an interpolated height.
423
421
  @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the B{C{point}}
424
422
  and/or B{C{other}} (C{bool}).
425
- @kwarg tol: Convergence tolerance (C{scalar}).
423
+ @kwarg tol: Convergence tolerance (C{meter}).
426
424
 
427
425
  @return: The intersection point, an instance of this C{LatLon}.
428
426
 
@@ -572,10 +570,8 @@ def _Equidistant00(equidistant, p1):
572
570
  if equidistant is None or not callable(equidistant):
573
571
  equidistant = p1.Equidistant
574
572
  else:
575
- Eqs = _MODS.azimuthal._Equidistants
576
- if not issubclassof(equidistant, *Eqs): # PYCHOK no cover
577
- t = map2(_dunder_nameof, Eqs)
578
- raise _IsnotError(*t, equidistant=equidistant)
573
+ _xsubclassof(*_MODS.azimuthal._Equidistants,
574
+ equidistant=equidistant)
579
575
  return equidistant(0, 0, p1.datum)
580
576
 
581
577
 
@@ -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__ = '22.02.18'
27
+ __version__ = '24.06.11'
28
28
 
29
29
 
30
30
  class Cartesian(CartesianEllipsoidalBase):
@@ -39,7 +39,7 @@ class Cartesian(CartesianEllipsoidalBase):
39
39
  B{datum}=...} to override this L{LatLon} class
40
40
  or specify C{B{LatLon}=None}.
41
41
 
42
- @return: The geodetic point (L{LatLon}) or if B{C{LatLon}} is C{None},
42
+ @return: The geodetic point (L{LatLon}) or if C{B{LatLon} is None},
43
43
  an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)}
44
44
  with C{C} and C{M} if available.
45
45
 
@@ -78,7 +78,7 @@ class LatLon(LatLonEllipsoidalBaseDI):
78
78
  L{Cartesian} class or set C{B{Cartesian}=None}.
79
79
 
80
80
  @return: The cartesian (ECEF) coordinates as (L{Cartesian}) or if
81
- B{C{Cartesian}} is C{None}, an L{Ecef9Tuple}C{(x, y, z, lat,
81
+ C{B{Cartesian} is None}, an L{Ecef9Tuple}C{(x, y, z, lat,
82
82
  lon, height, C, M, datum)} with C{C} and C{M} if available.
83
83
 
84
84
  @raise TypeError: Invalid B{C{Cartesian}}, B{C{datum}} or other
@@ -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.ellipsoidalGeodSolve
27
- __version__ = '24.05.25'
27
+ __version__ = '24.06.11'
28
28
 
29
29
 
30
30
  class Cartesian(CartesianEllipsoidalBase):
@@ -39,7 +39,7 @@ class Cartesian(CartesianEllipsoidalBase):
39
39
  B{datum}=...} to override this L{LatLon}
40
40
  class or specify C{B{LatLon}=None}.
41
41
 
42
- @return: The geodetic point (L{LatLon}) or if B{C{LatLon}} is C{None},
42
+ @return: The geodetic point (L{LatLon}) or if C{B{LatLon} is None},
43
43
  an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)}
44
44
  with C{C} and C{M} if available.
45
45
 
@@ -73,18 +73,15 @@ class LatLon(LatLonEllipsoidalBaseDI):
73
73
  def toCartesian(self, **Cartesian_datum_kwds): # PYCHOK Cartesian=Cartesian, datum=None
74
74
  '''Convert this point to exact cartesian (ECEF) coordinates.
75
75
 
76
- @kwarg Cartesian_datum_kwds: Optional L{Cartesian}, B{C{datum}}
77
- and other keyword arguments, ignored if C{B{Cartesian} is None}.
78
- Use C{B{Cartesian}=...} to override this L{Cartesian} class
79
- or set C{B{Cartesian}=None}.
76
+ @kwarg Cartesian_datum_kwds: Optional L{Cartesian}, B{C{datum}} and other keyword
77
+ arguments, ignored if C{B{Cartesian} is None}. Use C{B{Cartesian}=Class}
78
+ to override this L{Cartesian} class or set C{B{Cartesian}=None}.
80
79
 
81
- @return: The cartesian (ECEF) coordinates (L{Cartesian}) or if
82
- B{C{Cartesian}} is C{None}, an L{Ecef9Tuple}C{(x, y, z,
83
- lat, lon, height, C, M, datum)} with C{C} and C{M} if
84
- available.
80
+ @return: The cartesian (ECEF) coordinates (L{Cartesian}) or if C{B{Cartesian} is
81
+ None}, an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with
82
+ C{C} and C{M} if available.
85
83
 
86
- @raise TypeError: Invalid B{C{Cartesian}}, B{C{datum}} or other
87
- B{C{Cartesian_datum_kwds}}.
84
+ @raise TypeError: Invalid B{C{Cartesian}}, B{C{datum}} or other B{C{Cartesian_datum_kwds}}.
88
85
  '''
89
86
  kwds = _xkwds(Cartesian_datum_kwds, Cartesian=Cartesian, datum=self.datum)
90
87
  return LatLonEllipsoidalBaseDI.toCartesian(self, **kwds)
@@ -93,25 +90,20 @@ class LatLon(LatLonEllipsoidalBaseDI):
93
90
  def areaOf(points, datum=_WGS84, wrap=True):
94
91
  '''Compute the area of an (ellipsoidal) polygon or composite.
95
92
 
96
- @arg points: The polygon points (L{LatLon}[], L{BooleanFHP} or
97
- L{BooleanGH}).
93
+ @arg points: The polygon points (L{LatLon}[], L{BooleanFHP} or L{BooleanGH}).
98
94
  @kwarg datum: Optional datum (L{Datum}).
99
- @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the
100
- B{C{points}} (C{bool}).
95
+ @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the B{C{points}} (C{bool}).
101
96
 
102
- @return: Area (C{meter}, same as units of the B{C{datum}}'s
103
- ellipsoid axes, I{squared}).
97
+ @return: Area (C{meter}, same as units of the B{C{datum}}'s ellipsoid axes, I{squared}).
104
98
 
105
99
  @raise PointsError: Insufficient number of B{C{points}}.
106
100
 
107
101
  @raise TypeError: Some B{C{points}} are not L{LatLon}.
108
102
 
109
- @raise ValueError: Invalid C{B{wrap}=False}, unwrapped, unrolled
110
- longitudes not supported.
103
+ @raise ValueError: Invalid C{B{wrap}=False}, unwrapped, unrolled longitudes not supported.
111
104
 
112
- @see: Functions L{pygeodesy.areaOf}, L{ellipsoidalExact.areaOf},
113
- L{ellipsoidalKarney.areaOf}, L{sphericalNvector.areaOf}
114
- and L{sphericalTrigonometry.areaOf}.
105
+ @see: Functions L{pygeodesy.areaOf}, L{ellipsoidalExact.areaOf}, L{ellipsoidalKarney.areaOf},
106
+ L{sphericalNvector.areaOf} and L{sphericalTrigonometry.areaOf}.
115
107
  '''
116
108
  return fabs(_polygon(datum.ellipsoid.geodsolve, points, True, False, wrap))
117
109
 
@@ -3,13 +3,12 @@
3
3
 
4
4
  u'''Ellipsoidal, I{Karney}-based geodesy.
5
5
 
6
- Ellipsoidal geodetic (lat-/longitude) L{LatLon} and geocentric
7
- (ECEF) L{Cartesian} classes and functions L{areaOf}, L{intersections2},
8
- L{isclockwise}, L{nearestOn} and L{perimeterOf}, all requiring I{Charles
9
- Karney}'s U{geographiclib <https://PyPI.org/project/geographiclib>}
10
- Python package to be installed.
6
+ Ellipsoidal geodetic (lat-/longitude) L{LatLon} and geocentric (ECEF) L{Cartesian}
7
+ classes and functions L{areaOf}, L{intersection3}, L{intersections2}, L{isclockwise},
8
+ L{nearestOn} and L{perimeterOf}, requiring I{Charles F.F. Karney}'s U{geographiclib
9
+ <https://PyPI.org/project/geographiclib>} Python package to be installed.
11
10
 
12
- Here's an example usage of C{ellipsoidalKarney}:
11
+ A usage example of C{ellipsoidalKarney}:
13
12
 
14
13
  >>> from pygeodesy.ellipsoidalKarney import LatLon
15
14
  >>> Newport_RI = LatLon(41.49008, -71.312796)
@@ -43,25 +42,23 @@ from pygeodesy.props import deprecated_method, Property_RO
43
42
  # from math import fabs # from .karney
44
43
 
45
44
  __all__ = _ALL_LAZY.ellipsoidalKarney
46
- __version__ = '24.05.25'
45
+ __version__ = '24.06.11'
47
46
 
48
47
 
49
48
  class Cartesian(CartesianEllipsoidalBase):
50
- '''Extended to convert C{Karney}-based L{Cartesian} to
51
- C{Karney}-based L{LatLon} points.
49
+ '''Extended to convert C{Karney}-based L{Cartesian} to C{Karney}-based L{LatLon} points.
52
50
  '''
53
51
 
54
52
  def toLatLon(self, **LatLon_and_kwds): # PYCHOK LatLon=LatLon, datum=None
55
53
  '''Convert this cartesian point to a C{Karney}-based geodetic point.
56
54
 
57
- @kwarg LatLon_and_kwds: Optional L{LatLon} and L{LatLon} keyword
58
- arguments as C{datum}. Use C{B{LatLon}=...,
59
- B{datum}=...} to override this L{LatLon}
60
- class or specify C{B{LatLon}=None}.
55
+ @kwarg LatLon_and_kwds: Optional L{LatLon} and L{LatLon} keyword arguments
56
+ as C{datum}. Use C{B{LatLon}=..., B{datum}=...} to override
57
+ this L{LatLon} class or specify C{B{LatLon}=None}.
61
58
 
62
- @return: The geodetic point (L{LatLon}) or if B{C{LatLon}} is C{None},
63
- an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)}
64
- with C{C} and C{M} if available.
59
+ @return: The geodetic point (L{LatLon}) or if C{B{LatLon} is None}, an
60
+ L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with C{C}
61
+ and C{M} if available.
65
62
 
66
63
  @raise TypeError: Invalid B{C{LatLon_and_kwds}} argument.
67
64
  '''
@@ -70,13 +67,9 @@ class Cartesian(CartesianEllipsoidalBase):
70
67
 
71
68
 
72
69
  class LatLon(LatLonEllipsoidalBaseDI):
73
- '''An ellipsoidal L{LatLon} similar to L{ellipsoidalVincenty.LatLon}
74
- but using I{Charles F. F. Karney}'s Python U{geographiclib
75
- <https://PyPI.org/project/geographiclib>} to compute geodesic
76
- distances, bearings (azimuths), etc.
77
-
78
- @note: This L{LatLon} class requires the U{geographiclib
79
- <https://PyPI.org/project/geographiclib>} package.
70
+ '''An ellipsoidal L{LatLon} similar to L{ellipsoidalVincenty.LatLon} but using
71
+ I{Karney}'s Python U{geographiclib<https://PyPI.org/project/geographiclib>}
72
+ to compute geodesic distances, bearings (azimuths), etc.
80
73
  '''
81
74
 
82
75
  @deprecated_method
@@ -103,52 +96,41 @@ class LatLon(LatLonEllipsoidalBaseDI):
103
96
  def toCartesian(self, **Cartesian_datum_kwds): # PYCHOK Cartesian=Cartesian, datum=None
104
97
  '''Convert this point to C{Karney}-based cartesian (ECEF) coordinates.
105
98
 
106
- @kwarg Cartesian_datum_kwds: Optional L{Cartesian}, B{C{datum}}
107
- and other keyword arguments, ignored if C{B{Cartesian} is None}.
108
- Use C{B{Cartesian}=...} to override this L{Cartesian} class or
109
- set C{B{Cartesian}=None}.
99
+ @kwarg Cartesian_datum_kwds: Optional L{Cartesian}, B{C{datum}} and other keyword
100
+ arguments, ignored if C{B{Cartesian} is None}. Use C{B{Cartesian}=...} to
101
+ override this L{Cartesian} class or set C{B{Cartesian}=None}.
110
102
 
111
- @return: The cartesian (ECEF) coordinates (L{Cartesian}) or if
112
- B{C{Cartesian}} is C{None}, an L{Ecef9Tuple}C{(x, y, z,
113
- lat, lon, height, C, M, datum)} with C{C} and C{M} if
114
- available.
103
+ @return: The cartesian (ECEF) coordinates (L{Cartesian}) or if C{B{Cartesian} is
104
+ None}, an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with
105
+ C{C} and C{M} if available.
115
106
 
116
- @raise TypeError: Invalid B{C{Cartesian}}, B{C{datum}} or other
117
- B{C{Cartesian_datum_kwds}}.
107
+ @raise TypeError: Invalid B{C{Cartesian}}, B{C{datum}} or other B{C{Cartesian_datum_kwds}}.
118
108
  '''
119
109
  kwds = _xkwds(Cartesian_datum_kwds, Cartesian=Cartesian, datum=self.datum)
120
110
  return LatLonEllipsoidalBaseDI.toCartesian(self, **kwds)
121
111
 
122
112
 
123
113
  def areaOf(points, datum=_WGS84, wrap=True):
124
- '''Compute the area of an (ellipsoidal) polygon or composite.
114
+ '''Compute the area of an (ellipsoidal) polygon or composite using I{Karney}'s
115
+ U{geographiclib<https://PyPI.org/project/geographiclib>} package.
125
116
 
126
- @arg points: The polygon points (L{LatLon}[], L{BooleanFHP}
127
- or L{BooleanGH}).
117
+ @arg points: The polygon points (L{LatLon}[], L{BooleanFHP} or L{BooleanGH}).
128
118
  @kwarg datum: Optional datum (L{Datum}).
129
- @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the
130
- B{C{points}} (C{bool}).
119
+ @kwarg wrap: If C{True}, wrap or I{normalize} and unroll the B{C{points}} (C{bool}).
131
120
 
132
- @return: Area (C{meter}, same as units of the B{C{datum}}'s
133
- ellipsoid axes, I{squared}).
121
+ @return: Area (C{meter}, same as units of the B{C{datum}}'s ellipsoid axes, I{squared}).
134
122
 
135
- @raise ImportError: Package U{geographiclib
136
- <https://PyPI.org/project/geographiclib>}
123
+ @raise ImportError: Package U{geographiclib<https://PyPI.org/project/geographiclib>}
137
124
  not installed or not found.
138
125
 
139
126
  @raise PointsError: Insufficient number of B{C{points}}.
140
127
 
141
128
  @raise TypeError: Some B{C{points}} are not L{LatLon}.
142
129
 
143
- @raise ValueError: Invalid C{B{wrap}=False}, unwrapped, unrolled
144
- longitudes not supported.
145
-
146
- @note: This function requires the U{geographiclib
147
- <https://PyPI.org/project/geographiclib>} package.
130
+ @raise ValueError: Invalid C{B{wrap}=False}, unwrapped, unrolled longitudes not supported.
148
131
 
149
- @see: Functions L{pygeodesy.areaOf}, L{ellipsoidalExact.areaOf},
150
- L{ellipsoidalGeodSolve.areaOf}, L{sphericalNvector.areaOf}
151
- and L{sphericalTrigonometry.areaOf}.
132
+ @see: Functions L{pygeodesy.areaOf}, L{ellipsoidalExact.areaOf}, L{ellipsoidalGeodSolve.areaOf},
133
+ L{sphericalNvector.areaOf} and L{sphericalTrigonometry.areaOf}.
152
134
 
153
135
  @note: The U{area of a polygon enclosing a pole<https://GeographicLib.SourceForge.io/
154
136
  C++/doc/classGeographicLib_1_1GeodesicExact.html#a3d7a9155e838a09a48dc14d0c3fac525>}
@@ -259,7 +241,8 @@ def intersections2(center1, radius1, center2, radius2, height=None, wrap=False,
259
241
 
260
242
 
261
243
  def isclockwise(points, datum=_WGS84, wrap=True):
262
- '''Determine the direction of a path or polygon.
244
+ '''Determine the direction of a path or polygon using I{Karney}'s
245
+ U{geographiclib<https://PyPI.org/project/geographiclib>} package.
263
246
 
264
247
  @arg points: The path or polygon points (C{LatLon}[]).
265
248
  @kwarg datum: Optional datum (L{Datum}).
@@ -276,11 +259,7 @@ def isclockwise(points, datum=_WGS84, wrap=True):
276
259
 
277
260
  @raise TypeError: Some B{C{points}} are not C{LatLon}.
278
261
 
279
- @raise ValueError: The B{C{points}} enclose a pole or zero
280
- area.
281
-
282
- @note: This function requires the U{geographiclib
283
- <https://PyPI.org/project/geographiclib>} package.
262
+ @raise ValueError: The B{C{points}} enclose a pole or zero area.
284
263
 
285
264
  @see: L{pygeodesy.isclockwise}.
286
265
  '''
@@ -340,7 +319,8 @@ def nearestOn(point, point1, point2, within=True, height=None, wrap=False,
340
319
 
341
320
 
342
321
  def perimeterOf(points, closed=False, datum=_WGS84, wrap=True):
343
- '''Compute the perimeter of an (ellipsoidal) polygon or composite.
322
+ '''Compute the perimeter of an (ellipsoidal) polygon or composite using I{Karney}'s
323
+ U{geographiclib<https://PyPI.org/project/geographiclib>} package.
344
324
 
345
325
  @arg points: The polygon points (L{LatLon}[], L{BooleanFHP} or
346
326
  L{BooleanGH}).
@@ -365,9 +345,6 @@ def perimeterOf(points, closed=False, datum=_WGS84, wrap=True):
365
345
  longitudes not supported or C{B{closed}=False}
366
346
  with C{B{points}} a composite.
367
347
 
368
- @note: This function requires the U{geographiclib
369
- <https://PyPI.org/project/geographiclib>} package.
370
-
371
348
  @see: Functions L{pygeodesy.perimeterOf}, L{ellipsoidalExact.perimeterOf},
372
349
  L{ellipsoidalGeodSolve.perimeterOf}, L{sphericalNvector.perimeterOf}
373
350
  and L{sphericalTrigonometry.perimeterOf}.