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.
- {PyGeodesy-24.6.9.dist-info → PyGeodesy-24.7.7.dist-info}/METADATA +2 -2
- PyGeodesy-24.7.7.dist-info/RECORD +117 -0
- pygeodesy/__init__.py +39 -32
- pygeodesy/__main__.py +6 -1
- pygeodesy/albers.py +2 -2
- pygeodesy/auxilats/__init__.py +1 -1
- pygeodesy/auxilats/auxAngle.py +40 -39
- pygeodesy/auxilats/auxDLat.py +3 -2
- pygeodesy/auxilats/auxLat.py +16 -18
- pygeodesy/auxilats/auxily.py +1 -1
- pygeodesy/azimuthal.py +10 -10
- pygeodesy/basics.py +16 -4
- pygeodesy/booleans.py +4 -4
- pygeodesy/cartesianBase.py +11 -14
- pygeodesy/css.py +14 -18
- pygeodesy/datums.py +6 -6
- pygeodesy/deprecated/__init__.py +1 -1
- pygeodesy/deprecated/classes.py +25 -4
- pygeodesy/deprecated/datum.py +3 -3
- pygeodesy/deprecated/functions.py +6 -8
- pygeodesy/dms.py +23 -27
- pygeodesy/ecef.py +4 -4
- pygeodesy/elevations.py +4 -4
- pygeodesy/ellipsoidalBase.py +23 -28
- pygeodesy/ellipsoidalBaseDI.py +19 -23
- pygeodesy/ellipsoidalExact.py +3 -3
- pygeodesy/ellipsoidalGeodSolve.py +15 -23
- pygeodesy/ellipsoidalKarney.py +37 -60
- pygeodesy/ellipsoidalNvector.py +38 -44
- pygeodesy/ellipsoidalVincenty.py +11 -14
- pygeodesy/ellipsoids.py +107 -101
- pygeodesy/errors.py +109 -48
- pygeodesy/etm.py +32 -44
- pygeodesy/formy.py +55 -58
- pygeodesy/frechet.py +18 -20
- pygeodesy/fsums.py +3 -3
- pygeodesy/gars.py +3 -4
- pygeodesy/geodesici.py +1696 -0
- pygeodesy/geodesicw.py +15 -15
- pygeodesy/geodesicx/__init__.py +4 -4
- pygeodesy/geodesicx/gx.py +34 -55
- pygeodesy/geodesicx/gxbases.py +20 -8
- pygeodesy/geodesicx/gxline.py +93 -88
- pygeodesy/geodsolve.py +108 -59
- pygeodesy/geohash.py +26 -34
- pygeodesy/geoids.py +28 -37
- pygeodesy/hausdorff.py +17 -18
- pygeodesy/heights.py +2 -2
- pygeodesy/internals.py +46 -13
- pygeodesy/interns.py +2 -2
- pygeodesy/karney.py +78 -15
- pygeodesy/ktm.py +13 -16
- pygeodesy/latlonBase.py +17 -19
- pygeodesy/lazily.py +28 -25
- pygeodesy/lcc.py +28 -31
- pygeodesy/ltp.py +7 -8
- pygeodesy/ltpTuples.py +71 -73
- pygeodesy/mgrs.py +8 -9
- pygeodesy/named.py +19 -10
- pygeodesy/nvectorBase.py +9 -10
- pygeodesy/osgr.py +9 -9
- pygeodesy/points.py +6 -6
- pygeodesy/rhumb/__init__.py +1 -1
- pygeodesy/rhumb/aux_.py +5 -5
- pygeodesy/rhumb/bases.py +30 -31
- pygeodesy/rhumb/ekx.py +3 -4
- pygeodesy/rhumb/solve.py +21 -22
- pygeodesy/solveBase.py +177 -123
- pygeodesy/sphericalBase.py +10 -11
- pygeodesy/sphericalNvector.py +13 -13
- pygeodesy/sphericalTrigonometry.py +86 -97
- pygeodesy/streprs.py +4 -34
- pygeodesy/triaxials.py +48 -43
- pygeodesy/units.py +208 -275
- pygeodesy/unitsBase.py +115 -107
- pygeodesy/ups.py +26 -31
- pygeodesy/utily.py +8 -8
- pygeodesy/utm.py +35 -40
- pygeodesy/utmups.py +43 -46
- pygeodesy/utmupsBase.py +8 -9
- pygeodesy/vector3d.py +26 -27
- pygeodesy/vector3dBase.py +6 -7
- pygeodesy/webmercator.py +19 -21
- pygeodesy/wgrs.py +18 -20
- PyGeodesy-24.6.9.dist-info/RECORD +0 -116
- {PyGeodesy-24.6.9.dist-info → PyGeodesy-24.7.7.dist-info}/WHEEL +0 -0
- {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.
|
|
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
|
|
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
|
|
212
|
-
|
|
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}).
|
pygeodesy/ellipsoidalBase.py
CHANGED
|
@@ -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
|
|
22
|
-
|
|
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.
|
|
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{
|
|
124
|
-
|
|
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{
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
229
|
-
@kwarg height: Optional height above (or below) the earth surface
|
|
230
|
-
|
|
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
|
-
|
|
236
|
-
|
|
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
|
-
|
|
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
|
-
|
|
246
|
-
|
|
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
|
-
|
|
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):
|
pygeodesy/ellipsoidalBaseDI.py
CHANGED
|
@@ -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,
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
@kwarg wrap: If C{True}, wrap or I{normalize} and unroll the
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
@return: A L{NearestOn8Tuple}C{(closest, distance, fi, j, start,
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
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{
|
|
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
|
-
|
|
576
|
-
|
|
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
|
|
pygeodesy/ellipsoidalExact.py
CHANGED
|
@@ -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__ = '
|
|
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{
|
|
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{
|
|
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.
|
|
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{
|
|
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
|
-
|
|
78
|
-
|
|
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
|
-
|
|
83
|
-
|
|
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{
|
|
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
|
|
pygeodesy/ellipsoidalKarney.py
CHANGED
|
@@ -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
|
-
|
|
8
|
-
L{
|
|
9
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
59
|
-
|
|
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{
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
75
|
-
|
|
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
|
-
|
|
108
|
-
|
|
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
|
-
|
|
113
|
-
|
|
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{
|
|
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}.
|