pygeodesy 24.5.15__py2.py3-none-any.whl → 24.5.24__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.5.15.dist-info → PyGeodesy-24.5.24.dist-info}/METADATA +2 -2
- PyGeodesy-24.5.24.dist-info/RECORD +116 -0
- pygeodesy/__init__.py +1 -1
- pygeodesy/albers.py +41 -41
- pygeodesy/auxilats/__init__.py +1 -1
- pygeodesy/auxilats/auxAngle.py +32 -31
- pygeodesy/auxilats/auxLat.py +80 -51
- pygeodesy/azimuthal.py +123 -124
- pygeodesy/basics.py +8 -6
- pygeodesy/booleans.py +11 -12
- pygeodesy/cartesianBase.py +25 -23
- pygeodesy/clipy.py +3 -3
- pygeodesy/css.py +50 -42
- pygeodesy/datums.py +42 -41
- pygeodesy/dms.py +6 -6
- pygeodesy/ecef.py +23 -24
- pygeodesy/ellipsoidalBase.py +28 -27
- pygeodesy/ellipsoidalBaseDI.py +3 -4
- pygeodesy/ellipsoidalNvector.py +11 -12
- pygeodesy/ellipsoids.py +41 -35
- pygeodesy/elliptic.py +3 -4
- pygeodesy/epsg.py +4 -3
- pygeodesy/errors.py +34 -12
- pygeodesy/etm.py +62 -54
- pygeodesy/fmath.py +36 -30
- pygeodesy/formy.py +93 -65
- pygeodesy/frechet.py +117 -102
- pygeodesy/fstats.py +21 -14
- pygeodesy/fsums.py +67 -57
- pygeodesy/gars.py +10 -9
- pygeodesy/geodesicw.py +19 -17
- pygeodesy/geodesicx/__init__.py +1 -1
- pygeodesy/geodesicx/gx.py +40 -32
- pygeodesy/geodesicx/gxarea.py +12 -9
- pygeodesy/geodesicx/gxbases.py +3 -4
- pygeodesy/geodesicx/gxline.py +6 -8
- pygeodesy/geodsolve.py +28 -27
- pygeodesy/geohash.py +47 -44
- pygeodesy/geoids.py +34 -32
- pygeodesy/hausdorff.py +112 -99
- pygeodesy/heights.py +134 -127
- pygeodesy/internals.py +14 -9
- pygeodesy/interns.py +3 -6
- pygeodesy/iters.py +19 -17
- pygeodesy/karney.py +15 -12
- pygeodesy/ktm.py +25 -18
- pygeodesy/latlonBase.py +12 -11
- pygeodesy/lazily.py +4 -4
- pygeodesy/lcc.py +24 -25
- pygeodesy/ltp.py +83 -71
- pygeodesy/ltpTuples.py +7 -5
- pygeodesy/mgrs.py +3 -3
- pygeodesy/named.py +126 -42
- pygeodesy/namedTuples.py +33 -25
- pygeodesy/nvectorBase.py +7 -7
- pygeodesy/points.py +9 -9
- pygeodesy/rhumb/__init__.py +1 -1
- pygeodesy/solveBase.py +5 -5
- pygeodesy/sphericalTrigonometry.py +5 -5
- pygeodesy/streprs.py +5 -5
- pygeodesy/trf.py +5 -5
- pygeodesy/triaxials.py +67 -63
- pygeodesy/units.py +35 -35
- pygeodesy/unitsBase.py +24 -11
- pygeodesy/utm.py +53 -53
- pygeodesy/utmupsBase.py +10 -8
- pygeodesy/vector2d.py +6 -7
- pygeodesy/vector3d.py +16 -17
- pygeodesy/vector3dBase.py +4 -5
- PyGeodesy-24.5.15.dist-info/RECORD +0 -116
- {PyGeodesy-24.5.15.dist-info → PyGeodesy-24.5.24.dist-info}/WHEEL +0 -0
- {PyGeodesy-24.5.15.dist-info → PyGeodesy-24.5.24.dist-info}/top_level.txt +0 -0
pygeodesy/azimuthal.py
CHANGED
|
@@ -43,9 +43,8 @@ altitude in Earth radii<https://WikiPedia.org/wiki/Azimuthal_equidistant_project
|
|
|
43
43
|
from __future__ import division as _; del _ # PYCHOK semicolon
|
|
44
44
|
|
|
45
45
|
# from pygeodesy.basics import _xinstanceof # from .ellipsoidalBase
|
|
46
|
-
from pygeodesy.constants import EPS, EPS0, EPS1, NAN, isnon0, \
|
|
47
|
-
_EPStol,
|
|
48
|
-
_0_5, _1_0, _N_1_0, _2_0
|
|
46
|
+
from pygeodesy.constants import EPS, EPS0, EPS1, NAN, isnon0, _umod_360, \
|
|
47
|
+
_EPStol, _0_0, _0_1, _0_5, _1_0, _N_1_0, _2_0
|
|
49
48
|
from pygeodesy.ellipsoidalBase import LatLonEllipsoidalBase as _LLEB, \
|
|
50
49
|
_xinstanceof
|
|
51
50
|
from pygeodesy.datums import _spherical_datum, _WGS84
|
|
@@ -53,12 +52,12 @@ from pygeodesy.errors import _ValueError, _xdatum, _xkwds
|
|
|
53
52
|
from pygeodesy.fmath import euclid, hypot as _hypot, Fsum
|
|
54
53
|
# from pygeodesy.fsums import Fsum # from .fmath
|
|
55
54
|
# from pygeodesy.formy import antipode # _MODS
|
|
56
|
-
from pygeodesy.interns import
|
|
57
|
-
|
|
55
|
+
from pygeodesy.interns import _azimuth_, _datum_, _lat_, _lon_, _scale_, \
|
|
56
|
+
_SPACE_, _x_, _y_
|
|
58
57
|
from pygeodesy.karney import _norm180
|
|
59
58
|
from pygeodesy.latlonBase import _MODS, LatLonBase as _LLB
|
|
60
59
|
from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _FOR_DOCS # ALL_MODS
|
|
61
|
-
from pygeodesy.named import _NamedBase, _NamedTuple, _Pass
|
|
60
|
+
from pygeodesy.named import _name__, _name2__, _NamedBase, _NamedTuple, _Pass
|
|
62
61
|
from pygeodesy.namedTuples import LatLon2Tuple, LatLon4Tuple
|
|
63
62
|
from pygeodesy.props import deprecated_Property_RO, Property_RO, \
|
|
64
63
|
property_doc_, _update_all
|
|
@@ -71,7 +70,7 @@ from pygeodesy.utily import asin1, atan1, atan2b, atan2d, sincos2, \
|
|
|
71
70
|
from math import acos, atan2, degrees, fabs, sin, sqrt
|
|
72
71
|
|
|
73
72
|
__all__ = _ALL_LAZY.azimuthal
|
|
74
|
-
__version__ = '24.
|
|
73
|
+
__version__ = '24.05.24'
|
|
75
74
|
|
|
76
75
|
_EPS_K = _EPStol * _0_1 # Karney's eps_ or _EPSmin * _0_1?
|
|
77
76
|
_over_horizon_ = 'over horizon'
|
|
@@ -91,15 +90,15 @@ class _AzimuthalBase(_NamedBase):
|
|
|
91
90
|
'''(INTERNAL) Base class for azimuthal projections.
|
|
92
91
|
|
|
93
92
|
@see: I{Karney}'s C++ class U{AzimuthalEquidistant<https://GeographicLib.SourceForge.io/
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
93
|
+
C++/doc/classGeographicLib_1_1AzimuthalEquidistant.html>} and U{Gnomonic
|
|
94
|
+
<https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1Gnomonic.html>} or
|
|
95
|
+
the C{PyGeodesy} versions thereof L{EquidistantKarney} respectively L{GnomonicKarney}.
|
|
97
96
|
'''
|
|
98
97
|
_datum = _WGS84 # L{Datum}
|
|
99
98
|
_latlon0 = LatLon2Tuple(_0_0, _0_0) # lat0, lon0 (L{LatLon2Tuple})
|
|
100
99
|
_sc0 = _0_0, _1_0 # 2-Tuple C{sincos2d(lat0)}
|
|
101
100
|
|
|
102
|
-
def __init__(self, lat0, lon0, datum=None, name
|
|
101
|
+
def __init__(self, lat0, lon0, datum=None, **name):
|
|
103
102
|
'''New azimuthal projection.
|
|
104
103
|
|
|
105
104
|
@arg lat0: Latitude of the center point (C{degrees90}).
|
|
@@ -107,14 +106,14 @@ class _AzimuthalBase(_NamedBase):
|
|
|
107
106
|
@kwarg datum: Optional datum or ellipsoid (L{Datum}, L{Ellipsoid},
|
|
108
107
|
L{Ellipsoid2} or L{a_f2Tuple}) or I{scalar} earth
|
|
109
108
|
radius (C{meter}).
|
|
110
|
-
@kwarg name: Optional name for the projection (C{str}).
|
|
109
|
+
@kwarg name: Optional C{B{name}=NN} for the projection (C{str}).
|
|
111
110
|
|
|
112
111
|
@raise AzimuthalError: Invalid B{C{lat0}} or B{C{lon0}} or (spherical) B{C{datum}}.
|
|
113
112
|
|
|
114
113
|
@raise TypeError: Invalid B{C{datum}}.
|
|
115
114
|
'''
|
|
116
115
|
if datum not in (None, self._datum):
|
|
117
|
-
self._datum = _spherical_datum(datum, name
|
|
116
|
+
self._datum = _spherical_datum(datum, **name)
|
|
118
117
|
if name:
|
|
119
118
|
self.name = name
|
|
120
119
|
|
|
@@ -143,9 +142,9 @@ class _AzimuthalBase(_NamedBase):
|
|
|
143
142
|
|
|
144
143
|
f = flattening
|
|
145
144
|
|
|
146
|
-
def forward(self, lat, lon, name
|
|
145
|
+
def forward(self, lat, lon, **name): # PYCHOK no cover
|
|
147
146
|
'''I{Must be overloaded}.'''
|
|
148
|
-
self._notOverloaded(lat, lon, name
|
|
147
|
+
self._notOverloaded(lat, lon, **name)
|
|
149
148
|
|
|
150
149
|
def _forward(self, lat, lon, name, _k_t_2):
|
|
151
150
|
'''(INTERNAL) Azimuthal (spherical) forward C{lat, lon} to C{x, y}.
|
|
@@ -164,7 +163,7 @@ class _AzimuthalBase(_NamedBase):
|
|
|
164
163
|
e = n = z = _0_0
|
|
165
164
|
|
|
166
165
|
t = Azimuthal7Tuple(e, n, lat, lon, z, k, self.datum,
|
|
167
|
-
|
|
166
|
+
name=self._name__(name))
|
|
168
167
|
return t
|
|
169
168
|
|
|
170
169
|
def _forwards(self, *lls):
|
|
@@ -234,11 +233,11 @@ class _AzimuthalBase(_NamedBase):
|
|
|
234
233
|
Lon_(lon0=lon0, Error=AzimuthalError))
|
|
235
234
|
self._sc0 = sincos2d(self.lat0)
|
|
236
235
|
|
|
237
|
-
def reverse(self, x, y,
|
|
236
|
+
def reverse(self, x, y, LatLon=None, **name_LatLon_kwds): # PYCHOK no cover
|
|
238
237
|
'''I{Must be overloaded}.'''
|
|
239
|
-
self._notOverloaded(x, y,
|
|
238
|
+
self._notOverloaded(x, y, LatLon=LatLon, **name_LatLon_kwds)
|
|
240
239
|
|
|
241
|
-
def _reverse(self, x, y,
|
|
240
|
+
def _reverse(self, x, y, _c, lea, LatLon, **name_LatLon_kwds):
|
|
242
241
|
'''(INTERNAL) Azimuthal (spherical) reverse C{x, y} to C{lat, lon}.
|
|
243
242
|
'''
|
|
244
243
|
e, n, z, r = _enzh4(x, y)
|
|
@@ -262,10 +261,10 @@ class _AzimuthalBase(_NamedBase):
|
|
|
262
261
|
lon = _norm180(self.lon0 + d)
|
|
263
262
|
|
|
264
263
|
if LatLon is None:
|
|
265
|
-
t =
|
|
266
|
-
|
|
264
|
+
t, _ = _name2__(name_LatLon_kwds, _or_nameof=self)
|
|
265
|
+
t = Azimuthal7Tuple(e, n, lat, lon, z, k, self.datum, name=t)
|
|
267
266
|
else:
|
|
268
|
-
t = self._toLatLon(lat, lon, LatLon,
|
|
267
|
+
t = self._toLatLon(lat, lon, LatLon, name_LatLon_kwds)
|
|
269
268
|
return t
|
|
270
269
|
|
|
271
270
|
def _reverse2(self, x_t, *y):
|
|
@@ -276,11 +275,11 @@ class _AzimuthalBase(_NamedBase):
|
|
|
276
275
|
d = euclid(t.lat - self.lat0, t.lon - self.lon0) # degrees
|
|
277
276
|
return t, d
|
|
278
277
|
|
|
279
|
-
def _toLatLon(self, lat, lon, LatLon,
|
|
278
|
+
def _toLatLon(self, lat, lon, LatLon, name_LatLon_kwds):
|
|
280
279
|
'''(INTERNAL) Check B{C{LatLon}} and return an instance.
|
|
281
280
|
'''
|
|
282
|
-
kwds = _xkwds(
|
|
283
|
-
r =
|
|
281
|
+
kwds = _xkwds(name_LatLon_kwds, datum=self.datum, _or_nameof=self)
|
|
282
|
+
r = LatLon(lat, lon, **kwds) # handle .classof
|
|
284
283
|
B = _LLEB if self.datum.isEllipsoidal else _LLB
|
|
285
284
|
_xinstanceof(B, LatLon=r)
|
|
286
285
|
return r
|
|
@@ -350,12 +349,12 @@ class Equidistant(_AzimuthalBase):
|
|
|
350
349
|
if _FOR_DOCS:
|
|
351
350
|
__init__ = _AzimuthalBase.__init__
|
|
352
351
|
|
|
353
|
-
def forward(self, lat, lon, name
|
|
352
|
+
def forward(self, lat, lon, **name):
|
|
354
353
|
'''Convert a geodetic location to azimuthal equidistant east- and northing.
|
|
355
354
|
|
|
356
355
|
@arg lat: Latitude of the location (C{degrees90}).
|
|
357
356
|
@arg lon: Longitude of the location (C{degrees180}).
|
|
358
|
-
@kwarg name: Optional name for the location (C{str}).
|
|
357
|
+
@kwarg name: Optional C{B{name}=NN} for the location (C{str}).
|
|
359
358
|
|
|
360
359
|
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}
|
|
361
360
|
with easting C{x} and northing C{y} of point in C{meter} and C{lat}
|
|
@@ -380,15 +379,15 @@ class Equidistant(_AzimuthalBase):
|
|
|
380
379
|
|
|
381
380
|
return self._forward(lat, lon, name, _k_t)
|
|
382
381
|
|
|
383
|
-
def reverse(self, x, y,
|
|
382
|
+
def reverse(self, x, y, LatLon=None, **name_LatLon_kwds):
|
|
384
383
|
'''Convert an azimuthal equidistant location to geodetic lat- and longitude.
|
|
385
384
|
|
|
386
385
|
@arg x: Easting of the location (C{meter}).
|
|
387
386
|
@arg y: Northing of the location (C{meter}).
|
|
388
|
-
@kwarg
|
|
389
|
-
@kwarg
|
|
390
|
-
|
|
391
|
-
|
|
387
|
+
@kwarg LatLon: Class to use (C{LatLon}) or C{None}.
|
|
388
|
+
@kwarg name_LatLon_kwds: Optional C{B{name}=NN} forthe location and
|
|
389
|
+
optional, additional B{C{LatLon}} keyword arguments,
|
|
390
|
+
ignored if C{B{LatLon} is None}.
|
|
392
391
|
|
|
393
392
|
@return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an
|
|
394
393
|
L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
|
|
@@ -402,10 +401,10 @@ class Equidistant(_AzimuthalBase):
|
|
|
402
401
|
def _c(c):
|
|
403
402
|
return c if c > EPS else None
|
|
404
403
|
|
|
405
|
-
return self._reverse(x, y,
|
|
404
|
+
return self._reverse(x, y, _c, False, LatLon, **name_LatLon_kwds)
|
|
406
405
|
|
|
407
406
|
|
|
408
|
-
def equidistant(lat0, lon0, datum=_WGS84, exact=False, geodsolve=False, name
|
|
407
|
+
def equidistant(lat0, lon0, datum=_WGS84, exact=False, geodsolve=False, **name):
|
|
409
408
|
'''Return an L{EquidistantExact}, L{EquidistantGeodSolve} or (if I{Karney}'s
|
|
410
409
|
U{geographiclib<https://PyPI.org/project/geographiclib>} package is
|
|
411
410
|
installed) an L{EquidistantKarney}, otherwise an L{Equidistant} instance.
|
|
@@ -417,7 +416,7 @@ def equidistant(lat0, lon0, datum=_WGS84, exact=False, geodsolve=False, name=NN)
|
|
|
417
416
|
radius (C{meter}).
|
|
418
417
|
@kwarg exact: Return an L{EquidistantExact} instance.
|
|
419
418
|
@kwarg geodsolve: Return an L{EquidistantGeodSolve} instance.
|
|
420
|
-
@kwarg name: Optional name for the projection (C{str}).
|
|
419
|
+
@kwarg name: Optional C{B{name}=NN} for the projection (C{str}).
|
|
421
420
|
|
|
422
421
|
@return: An L{EquidistantExact}, L{EquidistantGeodSolve},
|
|
423
422
|
L{EquidistantKarney} or L{Equidistant} instance.
|
|
@@ -433,10 +432,10 @@ def equidistant(lat0, lon0, datum=_WGS84, exact=False, geodsolve=False, name=NN)
|
|
|
433
432
|
E = EquidistantExact if exact else (EquidistantGeodSolve if geodsolve else Equidistant)
|
|
434
433
|
if E is Equidistant:
|
|
435
434
|
try:
|
|
436
|
-
return EquidistantKarney(lat0, lon0, datum=datum, name
|
|
435
|
+
return EquidistantKarney(lat0, lon0, datum=datum, **name) # PYCHOK types
|
|
437
436
|
except ImportError:
|
|
438
437
|
pass
|
|
439
|
-
return E(lat0, lon0, datum=datum, name
|
|
438
|
+
return E(lat0, lon0, datum=datum, **name) # PYCHOK types
|
|
440
439
|
|
|
441
440
|
|
|
442
441
|
class _AzimuthalGeodesic(_AzimuthalBase):
|
|
@@ -452,36 +451,37 @@ class _AzimuthalGeodesic(_AzimuthalBase):
|
|
|
452
451
|
'''I{Must be overloaded}.'''
|
|
453
452
|
self._notOverloaded()
|
|
454
453
|
|
|
455
|
-
def _7Tuple(self, e, n, r, M=None
|
|
454
|
+
def _7Tuple(self, e, n, r, name_LatLon_kwds, M=None):
|
|
456
455
|
'''(INTERNAL) Return an C{Azimuthal7Tuple}.
|
|
457
456
|
'''
|
|
458
|
-
s = M
|
|
459
|
-
|
|
457
|
+
s = M
|
|
458
|
+
if s is None: # reciprocal, azimuthal scale
|
|
459
|
+
s = (r.m12 / r.s12) if r.a12 > _EPS_K else _1_0
|
|
460
460
|
z = _umod_360(r.azi2) # -180 <= r.azi2 < 180 ... 0 <= z < 360
|
|
461
|
-
|
|
462
|
-
|
|
461
|
+
t, _ = _name2__(name_LatLon_kwds, _or_nameof=self)
|
|
462
|
+
return Azimuthal7Tuple(e, n, r.lat2, r.lon2, z, s, self.datum, name=t)
|
|
463
463
|
|
|
464
464
|
|
|
465
465
|
class _EquidistantBase(_AzimuthalGeodesic):
|
|
466
466
|
'''(INTERNAL) Base for classes L{EquidistantExact}, L{EquidistantGeodSolve}
|
|
467
467
|
and L{EquidistantKarney}.
|
|
468
468
|
'''
|
|
469
|
-
def __init__(self, lat0, lon0, datum=_WGS84, name
|
|
469
|
+
def __init__(self, lat0, lon0, datum=_WGS84, **name):
|
|
470
470
|
'''New azimuthal L{EquidistantExact}, L{EquidistantGeodSolve} or
|
|
471
471
|
L{EquidistantKarney} projection.
|
|
472
472
|
'''
|
|
473
|
-
_AzimuthalGeodesic.__init__(self, lat0, lon0, datum=datum, name
|
|
473
|
+
_AzimuthalGeodesic.__init__(self, lat0, lon0, datum=datum, **name)
|
|
474
474
|
|
|
475
475
|
g = self.geodesic
|
|
476
476
|
# g.STANDARD = g.AZIMUTH | g.DISTANCE | g.LATITUDE | g.LONGITUDE
|
|
477
477
|
self._mask = g.REDUCEDLENGTH | g.STANDARD # | g.LONG_UNROLL
|
|
478
478
|
|
|
479
|
-
def forward(self, lat, lon, name
|
|
479
|
+
def forward(self, lat, lon, **name):
|
|
480
480
|
'''Convert an (ellipsoidal) geodetic location to azimuthal equidistant east- and northing.
|
|
481
481
|
|
|
482
482
|
@arg lat: Latitude of the location (C{degrees90}).
|
|
483
483
|
@arg lon: Longitude of the location (C{degrees180}).
|
|
484
|
-
@kwarg name: Optional name for the location (C{str}).
|
|
484
|
+
@kwarg name: Optional C{B{name}=NN} for the location (C{str}).
|
|
485
485
|
|
|
486
486
|
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}
|
|
487
487
|
with easting C{x} and northing C{y} of point in C{meter} and C{lat}
|
|
@@ -497,17 +497,17 @@ class _EquidistantBase(_AzimuthalGeodesic):
|
|
|
497
497
|
r = self.geodesic.Inverse(self.lat0, self.lon0,
|
|
498
498
|
Lat_(lat), Lon_(lon), outmask=self._mask)
|
|
499
499
|
x, y = sincos2d(r.azi1)
|
|
500
|
-
return self._7Tuple(x * r.s12, y * r.s12, r, name
|
|
500
|
+
return self._7Tuple(x * r.s12, y * r.s12, r, _name__(name))
|
|
501
501
|
|
|
502
|
-
def reverse(self, x, y,
|
|
502
|
+
def reverse(self, x, y, LatLon=None, **name_LatLon_kwds): # PYCHOK signature
|
|
503
503
|
'''Convert an azimuthal equidistant location to (ellipsoidal) geodetic lat- and longitude.
|
|
504
504
|
|
|
505
505
|
@arg x: Easting of the location (C{meter}).
|
|
506
506
|
@arg y: Northing of the location (C{meter}).
|
|
507
|
-
@kwarg name: Optional name for the location (C{str}).
|
|
508
507
|
@kwarg LatLon: Class to use (C{LatLon}) or C{None}.
|
|
509
|
-
@kwarg
|
|
510
|
-
|
|
508
|
+
@kwarg name_LatLon_kwds: Optional C{B{name}=NN} for the location and
|
|
509
|
+
optional, additional B{C{LatLon}} keyword arguments,
|
|
510
|
+
ignored if C{B{LatLon} is None}.
|
|
511
511
|
|
|
512
512
|
@return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an
|
|
513
513
|
L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
|
|
@@ -521,8 +521,8 @@ class _EquidistantBase(_AzimuthalGeodesic):
|
|
|
521
521
|
e, n, z, s = _enzh4(x, y)
|
|
522
522
|
|
|
523
523
|
r = self.geodesic.Direct(self.lat0, self.lon0, z, s, outmask=self._mask)
|
|
524
|
-
return self._7Tuple(e, n, r,
|
|
525
|
-
self._toLatLon(r.lat2, r.lon2, LatLon,
|
|
524
|
+
return self._7Tuple(e, n, r, name_LatLon_kwds) if LatLon is None else \
|
|
525
|
+
self._toLatLon(r.lat2, r.lon2, LatLon, name_LatLon_kwds)
|
|
526
526
|
|
|
527
527
|
|
|
528
528
|
class EquidistantExact(_EquidistantBase):
|
|
@@ -540,7 +540,7 @@ class EquidistantExact(_EquidistantBase):
|
|
|
540
540
|
of the projection, serve to specify completely the local affine transformation between
|
|
541
541
|
geographic and projected coordinates.
|
|
542
542
|
'''
|
|
543
|
-
def __init__(self, lat0, lon0, datum=_WGS84, name
|
|
543
|
+
def __init__(self, lat0, lon0, datum=_WGS84, **name):
|
|
544
544
|
'''New azimuthal L{EquidistantExact} projection.
|
|
545
545
|
|
|
546
546
|
@arg lat0: Latitude of center point (C{degrees90}).
|
|
@@ -548,11 +548,11 @@ class EquidistantExact(_EquidistantBase):
|
|
|
548
548
|
@kwarg datum: Optional datum or ellipsoid (L{Datum}, L{Ellipsoid},
|
|
549
549
|
L{Ellipsoid2} or L{a_f2Tuple}) or I{scalar} earth
|
|
550
550
|
radius (C{meter}).
|
|
551
|
-
@kwarg name: Optional name for the projection (C{str}).
|
|
551
|
+
@kwarg name: Optional C{B{name}=NN} for the projection (C{str}).
|
|
552
552
|
|
|
553
553
|
@raise AzimuthalError: Invalid B{C{lat0}} or B{C{lon0}} or B{C{datum}}.
|
|
554
554
|
'''
|
|
555
|
-
_EquidistantBase.__init__(self, lat0, lon0, datum=datum, name
|
|
555
|
+
_EquidistantBase.__init__(self, lat0, lon0, datum=datum, **name)
|
|
556
556
|
|
|
557
557
|
if _FOR_DOCS:
|
|
558
558
|
forward = _EquidistantBase.forward
|
|
@@ -573,7 +573,7 @@ class EquidistantGeodSolve(_EquidistantBase):
|
|
|
573
573
|
|
|
574
574
|
@see: L{EquidistantExact} and module L{geodsolve}.
|
|
575
575
|
'''
|
|
576
|
-
def __init__(self, lat0, lon0, datum=_WGS84, name
|
|
576
|
+
def __init__(self, lat0, lon0, datum=_WGS84, **name):
|
|
577
577
|
'''New azimuthal L{EquidistantGeodSolve} projection.
|
|
578
578
|
|
|
579
579
|
@arg lat0: Latitude of center point (C{degrees90}).
|
|
@@ -581,11 +581,11 @@ class EquidistantGeodSolve(_EquidistantBase):
|
|
|
581
581
|
@kwarg datum: Optional datum or ellipsoid (L{Datum}, L{Ellipsoid},
|
|
582
582
|
L{Ellipsoid2} or L{a_f2Tuple}) or I{scalar} earth
|
|
583
583
|
radius (C{meter}).
|
|
584
|
-
@kwarg name: Optional name for the projection (C{str}).
|
|
584
|
+
@kwarg name: Optional C{B{name}=NN} for the projection (C{str}).
|
|
585
585
|
|
|
586
586
|
@raise AzimuthalError: Invalid B{C{lat0}} or B{C{lon0}} or B{C{datum}}.
|
|
587
587
|
'''
|
|
588
|
-
_EquidistantBase.__init__(self, lat0, lon0, datum=datum, name
|
|
588
|
+
_EquidistantBase.__init__(self, lat0, lon0, datum=datum, **name)
|
|
589
589
|
|
|
590
590
|
if _FOR_DOCS:
|
|
591
591
|
forward = _EquidistantBase.forward
|
|
@@ -605,7 +605,7 @@ class EquidistantKarney(_EquidistantBase):
|
|
|
605
605
|
|
|
606
606
|
@see: L{EquidistantExact}.
|
|
607
607
|
'''
|
|
608
|
-
def __init__(self, lat0, lon0, datum=_WGS84, name
|
|
608
|
+
def __init__(self, lat0, lon0, datum=_WGS84, **name):
|
|
609
609
|
'''New azimuthal L{EquidistantKarney} projection.
|
|
610
610
|
|
|
611
611
|
@arg lat0: Latitude of center point (C{degrees90}).
|
|
@@ -613,14 +613,14 @@ class EquidistantKarney(_EquidistantBase):
|
|
|
613
613
|
@kwarg datum: Optional datum or ellipsoid (L{Datum}, L{Ellipsoid},
|
|
614
614
|
L{Ellipsoid2} or L{a_f2Tuple}) or I{scalar} earth
|
|
615
615
|
radius (C{meter}).
|
|
616
|
-
@kwarg name: Optional name for the projection (C{str}).
|
|
616
|
+
@kwarg name: Optional C{B{name}=NN} for the projection (C{str}).
|
|
617
617
|
|
|
618
618
|
@raise ImportError: Package U{geographiclib<https://PyPI.org/project/geographiclib>}
|
|
619
619
|
not installed or not found.
|
|
620
620
|
|
|
621
621
|
@raise AzimuthalError: Invalid B{C{lat0}} or B{C{lon0}} or B{C{datum}}.
|
|
622
622
|
'''
|
|
623
|
-
_EquidistantBase.__init__(self, lat0, lon0, datum=datum, name
|
|
623
|
+
_EquidistantBase.__init__(self, lat0, lon0, datum=datum, **name)
|
|
624
624
|
|
|
625
625
|
if _FOR_DOCS:
|
|
626
626
|
forward = _EquidistantBase.forward
|
|
@@ -648,12 +648,12 @@ class Gnomonic(_AzimuthalBase):
|
|
|
648
648
|
if _FOR_DOCS:
|
|
649
649
|
__init__ = _AzimuthalBase.__init__
|
|
650
650
|
|
|
651
|
-
def forward(self, lat, lon, name
|
|
651
|
+
def forward(self, lat, lon, **name):
|
|
652
652
|
'''Convert a geodetic location to azimuthal equidistant east- and northing.
|
|
653
653
|
|
|
654
654
|
@arg lat: Latitude of the location (C{degrees90}).
|
|
655
655
|
@arg lon: Longitude of the location (C{degrees180}).
|
|
656
|
-
@kwarg name: Optional name for the location (C{str}).
|
|
656
|
+
@kwarg name: Optional C{B{name}=NN} for the location (C{str}).
|
|
657
657
|
|
|
658
658
|
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}
|
|
659
659
|
with easting C{x} and northing C{y} of point in C{meter} and C{lat}
|
|
@@ -670,15 +670,15 @@ class Gnomonic(_AzimuthalBase):
|
|
|
670
670
|
|
|
671
671
|
return self._forward(lat, lon, name, _k_t)
|
|
672
672
|
|
|
673
|
-
def reverse(self, x, y,
|
|
673
|
+
def reverse(self, x, y, LatLon=None, **name_LatLon_kwds):
|
|
674
674
|
'''Convert an azimuthal equidistant location to geodetic lat- and longitude.
|
|
675
675
|
|
|
676
676
|
@arg x: Easting of the location (C{meter}).
|
|
677
677
|
@arg y: Northing of the location (C{meter}).
|
|
678
|
-
@kwarg
|
|
679
|
-
@kwarg
|
|
680
|
-
|
|
681
|
-
|
|
678
|
+
@kwarg LatLon: Class to use (C{LatLon}) or C{None}.
|
|
679
|
+
@kwarg name_LatLon_kwds: Optional C{B{name}=NN} for the location and
|
|
680
|
+
optional, additional B{C{LatLon}} keyword arguments,
|
|
681
|
+
ignored if C{B{LatLon} is None}.
|
|
682
682
|
|
|
683
683
|
@return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an
|
|
684
684
|
L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
|
|
@@ -692,10 +692,10 @@ class Gnomonic(_AzimuthalBase):
|
|
|
692
692
|
def _c(c):
|
|
693
693
|
return atan1(c) if c > EPS else None
|
|
694
694
|
|
|
695
|
-
return self._reverse(x, y,
|
|
695
|
+
return self._reverse(x, y, _c, False, LatLon, **name_LatLon_kwds)
|
|
696
696
|
|
|
697
697
|
|
|
698
|
-
def gnomonic(lat0, lon0, datum=_WGS84, exact=False, geodsolve=False, name
|
|
698
|
+
def gnomonic(lat0, lon0, datum=_WGS84, exact=False, geodsolve=False, **name):
|
|
699
699
|
'''Return a L{GnomonicExact} or (if I{Karney}'s U{geographiclib
|
|
700
700
|
<https://PyPI.org/project/geographiclib>} package is installed)
|
|
701
701
|
a L{GnomonicKarney}, otherwise a L{Gnomonic} instance.
|
|
@@ -707,7 +707,7 @@ def gnomonic(lat0, lon0, datum=_WGS84, exact=False, geodsolve=False, name=NN):
|
|
|
707
707
|
radius (C{meter}).
|
|
708
708
|
@kwarg exact: Return a L{GnomonicExact} instance.
|
|
709
709
|
@kwarg geodsolve: Return a L{GnomonicGeodSolve} instance.
|
|
710
|
-
@kwarg name: Optional name for the projection (C{str}).
|
|
710
|
+
@kwarg name: Optional C{B{name}=NN} for the projection (C{str}).
|
|
711
711
|
|
|
712
712
|
@return: A L{GnomonicExact}, L{GnomonicGeodSolve},
|
|
713
713
|
L{GnomonicKarney} or L{Gnomonic} instance.
|
|
@@ -723,33 +723,33 @@ def gnomonic(lat0, lon0, datum=_WGS84, exact=False, geodsolve=False, name=NN):
|
|
|
723
723
|
G = GnomonicExact if exact else (GnomonicGeodSolve if geodsolve else Gnomonic)
|
|
724
724
|
if G is Gnomonic:
|
|
725
725
|
try:
|
|
726
|
-
return GnomonicKarney(lat0, lon0, datum=datum, name
|
|
726
|
+
return GnomonicKarney(lat0, lon0, datum=datum, **name) # PYCHOK types
|
|
727
727
|
except ImportError:
|
|
728
728
|
pass
|
|
729
|
-
return G(lat0, lon0, datum=datum, name
|
|
729
|
+
return G(lat0, lon0, datum=datum, **name) # PYCHOK types
|
|
730
730
|
|
|
731
731
|
|
|
732
732
|
class _GnomonicBase(_AzimuthalGeodesic):
|
|
733
733
|
'''(INTERNAL) Base for classes L{GnomonicExact}, L{GnomonicGeodSolve}
|
|
734
734
|
and L{GnomonicKarney}.
|
|
735
735
|
'''
|
|
736
|
-
def __init__(self, lat0, lon0, datum=_WGS84, name
|
|
736
|
+
def __init__(self, lat0, lon0, datum=_WGS84, **name):
|
|
737
737
|
'''New azimuthal L{GnomonicExact} or L{GnomonicKarney} projection.
|
|
738
738
|
'''
|
|
739
|
-
_AzimuthalGeodesic.__init__(self, lat0, lon0, datum=datum, name
|
|
739
|
+
_AzimuthalGeodesic.__init__(self, lat0, lon0, datum=datum, **name)
|
|
740
740
|
|
|
741
741
|
g = self.geodesic
|
|
742
742
|
self._mask = g.ALL # | g.LONG_UNROLL
|
|
743
743
|
|
|
744
|
-
def forward(self, lat, lon,
|
|
744
|
+
def forward(self, lat, lon, raiser=True, **name): # PYCHOK signature
|
|
745
745
|
'''Convert an (ellipsoidal) geodetic location to azimuthal gnomonic east-
|
|
746
746
|
and northing.
|
|
747
747
|
|
|
748
748
|
@arg lat: Latitude of the location (C{degrees90}).
|
|
749
749
|
@arg lon: Longitude of the location (C{degrees180}).
|
|
750
|
-
@kwarg name: Optional name for the location (C{str}).
|
|
751
750
|
@kwarg raiser: Do or don't throw an error (C{bool}) if
|
|
752
751
|
the location lies over the horizon.
|
|
752
|
+
@kwarg name: Optional C{B{name}=NN} for the location (C{str}).
|
|
753
753
|
|
|
754
754
|
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}
|
|
755
755
|
with easting C{x} and northing C{y} in C{meter} and C{lat} and
|
|
@@ -777,19 +777,19 @@ class _GnomonicBase(_AzimuthalGeodesic):
|
|
|
777
777
|
else: # PYCHOK no cover
|
|
778
778
|
e = n = NAN
|
|
779
779
|
|
|
780
|
-
t = self._7Tuple(e, n, r, M=M
|
|
780
|
+
t = self._7Tuple(e, n, r, _name__(name), M=M)
|
|
781
781
|
t._iteraton = 0
|
|
782
782
|
return t
|
|
783
783
|
|
|
784
|
-
def reverse(self, x, y,
|
|
784
|
+
def reverse(self, x, y, LatLon=None, **name_LatLon_kwds): # PYCHOK signature
|
|
785
785
|
'''Convert an azimuthal gnomonic location to (ellipsoidal) geodetic lat- and longitude.
|
|
786
786
|
|
|
787
787
|
@arg x: Easting of the location (C{meter}).
|
|
788
788
|
@arg y: Northing of the location (C{meter}).
|
|
789
|
-
@kwarg name: Optional name for the location (C{str}).
|
|
790
789
|
@kwarg LatLon: Class to use (C{LatLon}) or C{None}.
|
|
791
|
-
@kwarg
|
|
792
|
-
|
|
790
|
+
@kwarg name_LatLon_kwds: Optional C{B{name}=NN} for the location and
|
|
791
|
+
optional, additional B{C{LatLon}} keyword arguments,
|
|
792
|
+
ignored if C{B{LatLon} is None}.
|
|
793
793
|
|
|
794
794
|
@return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an
|
|
795
795
|
L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
|
|
@@ -832,8 +832,8 @@ class _GnomonicBase(_AzimuthalGeodesic):
|
|
|
832
832
|
raise AzimuthalError(Fmt.no_convergence(d, a),
|
|
833
833
|
txt=unstr(self.reverse, x, y))
|
|
834
834
|
|
|
835
|
-
t = self._7Tuple(e, n, r, M=r.M12
|
|
836
|
-
self._toLatLon(r.lat2, r.lon2, LatLon,
|
|
835
|
+
t = self._7Tuple(e, n, r, name_LatLon_kwds, M=r.M12) if LatLon is None else \
|
|
836
|
+
self._toLatLon(r.lat2, r.lon2, LatLon, name_LatLon_kwds)
|
|
837
837
|
t._iteration = self._iteration = i
|
|
838
838
|
return t
|
|
839
839
|
|
|
@@ -846,7 +846,7 @@ class GnomonicExact(_GnomonicBase):
|
|
|
846
846
|
@see: I{Karney}'s U{Detailed Description<https://GeographicLib.SourceForge.io/C++/doc/
|
|
847
847
|
classGeographicLib_1_1Gnomonic.html>}, especially the B{Warning}.
|
|
848
848
|
'''
|
|
849
|
-
def __init__(self, lat0, lon0, datum=_WGS84, name
|
|
849
|
+
def __init__(self, lat0, lon0, datum=_WGS84, **name):
|
|
850
850
|
'''New azimuthal L{GnomonicExact} projection.
|
|
851
851
|
|
|
852
852
|
@arg lat0: Latitude of center point (C{degrees90}).
|
|
@@ -854,11 +854,11 @@ class GnomonicExact(_GnomonicBase):
|
|
|
854
854
|
@kwarg datum: Optional datum or ellipsoid (L{Datum}, L{Ellipsoid},
|
|
855
855
|
L{Ellipsoid2} or L{a_f2Tuple}) or I{scalar} earth
|
|
856
856
|
radius (C{meter}).
|
|
857
|
-
@kwarg name: Optional name for the projection (C{str}).
|
|
857
|
+
@kwarg name: Optional C{B{name}=NN} for the projection (C{str}).
|
|
858
858
|
|
|
859
859
|
@raise AzimuthalError: Invalid B{C{lat0}} or B{C{lon0}}.
|
|
860
860
|
'''
|
|
861
|
-
_GnomonicBase.__init__(self, lat0, lon0, datum=datum, name
|
|
861
|
+
_GnomonicBase.__init__(self, lat0, lon0, datum=datum, **name)
|
|
862
862
|
|
|
863
863
|
if _FOR_DOCS:
|
|
864
864
|
forward = _GnomonicBase.forward
|
|
@@ -879,7 +879,7 @@ class GnomonicGeodSolve(_GnomonicBase):
|
|
|
879
879
|
|
|
880
880
|
@see: L{GnomonicExact} and module L{geodsolve}.
|
|
881
881
|
'''
|
|
882
|
-
def __init__(self, lat0, lon0, datum=_WGS84, name
|
|
882
|
+
def __init__(self, lat0, lon0, datum=_WGS84, **name):
|
|
883
883
|
'''New azimuthal L{GnomonicGeodSolve} projection.
|
|
884
884
|
|
|
885
885
|
@arg lat0: Latitude of center point (C{degrees90}).
|
|
@@ -887,11 +887,11 @@ class GnomonicGeodSolve(_GnomonicBase):
|
|
|
887
887
|
@kwarg datum: Optional datum or ellipsoid (L{Datum}, L{Ellipsoid},
|
|
888
888
|
L{Ellipsoid2} or L{a_f2Tuple}) or I{scalar} earth
|
|
889
889
|
radius (C{meter}).
|
|
890
|
-
@kwarg name: Optional name for the projection (C{str}).
|
|
890
|
+
@kwarg name: Optional C{B{name}=NN} for the projection (C{str}).
|
|
891
891
|
|
|
892
892
|
@raise AzimuthalError: Invalid B{C{lat0}} or B{C{lon0}}.
|
|
893
893
|
'''
|
|
894
|
-
_GnomonicBase.__init__(self, lat0, lon0, datum=datum, name
|
|
894
|
+
_GnomonicBase.__init__(self, lat0, lon0, datum=datum, **name)
|
|
895
895
|
|
|
896
896
|
if _FOR_DOCS:
|
|
897
897
|
forward = _GnomonicBase.forward
|
|
@@ -911,7 +911,7 @@ class GnomonicKarney(_GnomonicBase):
|
|
|
911
911
|
|
|
912
912
|
@see: L{GnomonicExact}.
|
|
913
913
|
'''
|
|
914
|
-
def __init__(self, lat0, lon0, datum=_WGS84, name
|
|
914
|
+
def __init__(self, lat0, lon0, datum=_WGS84, **name):
|
|
915
915
|
'''New azimuthal L{GnomonicKarney} projection.
|
|
916
916
|
|
|
917
917
|
@arg lat0: Latitude of center point (C{degrees90}).
|
|
@@ -919,14 +919,14 @@ class GnomonicKarney(_GnomonicBase):
|
|
|
919
919
|
@kwarg datum: Optional datum or ellipsoid (L{Datum}, L{Ellipsoid},
|
|
920
920
|
L{Ellipsoid2} or L{a_f2Tuple}) or I{scalar} earth
|
|
921
921
|
radius (C{meter}).
|
|
922
|
-
@kwarg name: Optional name for the projection (C{str}).
|
|
922
|
+
@kwarg name: Optional C{B{name}=NN} for the projection (C{str}).
|
|
923
923
|
|
|
924
924
|
@raise ImportError: Package U{geographiclib<https://PyPI.org/project/geographiclib>}
|
|
925
925
|
not installed or not found.
|
|
926
926
|
|
|
927
927
|
@raise AzimuthalError: Invalid B{C{lat0}} or B{C{lon0}}.
|
|
928
928
|
'''
|
|
929
|
-
_GnomonicBase.__init__(self, lat0, lon0, datum=datum, name
|
|
929
|
+
_GnomonicBase.__init__(self, lat0, lon0, datum=datum, **name)
|
|
930
930
|
|
|
931
931
|
if _FOR_DOCS:
|
|
932
932
|
forward = _GnomonicBase.forward
|
|
@@ -951,12 +951,12 @@ class LambertEqualArea(_AzimuthalBase):
|
|
|
951
951
|
if _FOR_DOCS:
|
|
952
952
|
__init__ = _AzimuthalBase.__init__
|
|
953
953
|
|
|
954
|
-
def forward(self, lat, lon, name
|
|
954
|
+
def forward(self, lat, lon, **name):
|
|
955
955
|
'''Convert a geodetic location to azimuthal Lambert-equal-area east- and northing.
|
|
956
956
|
|
|
957
957
|
@arg lat: Latitude of the location (C{degrees90}).
|
|
958
958
|
@arg lon: Longitude of the location (C{degrees180}).
|
|
959
|
-
@kwarg name: Optional name for the location (C{str}).
|
|
959
|
+
@kwarg name: Optional C{B{name}=NN} for the location (C{str}).
|
|
960
960
|
|
|
961
961
|
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}
|
|
962
962
|
with easting C{x} and northing C{y} of point in C{meter} and C{lat}
|
|
@@ -974,15 +974,15 @@ class LambertEqualArea(_AzimuthalBase):
|
|
|
974
974
|
|
|
975
975
|
return self._forward(lat, lon, name, _k_t)
|
|
976
976
|
|
|
977
|
-
def reverse(self, x, y,
|
|
977
|
+
def reverse(self, x, y, LatLon=None, **name_LatLon_kwds):
|
|
978
978
|
'''Convert an azimuthal Lambert-equal-area location to geodetic lat- and longitude.
|
|
979
979
|
|
|
980
980
|
@arg x: Easting of the location (C{meter}).
|
|
981
981
|
@arg y: Northing of the location (C{meter}).
|
|
982
|
-
@kwarg
|
|
983
|
-
@kwarg
|
|
984
|
-
|
|
985
|
-
|
|
982
|
+
@kwarg LatLon: Class to use (C{LatLon}) or C{None}.
|
|
983
|
+
@kwarg name_LatLon_kwds: Optional C{B{name}=NN} for the location
|
|
984
|
+
and optional, additional B{C{LatLon}} keyword
|
|
985
|
+
arguments, ignored if C{B{LatLon} is None}.
|
|
986
986
|
|
|
987
987
|
@return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an
|
|
988
988
|
L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
|
|
@@ -997,7 +997,7 @@ class LambertEqualArea(_AzimuthalBase):
|
|
|
997
997
|
c *= _0_5
|
|
998
998
|
return (asin1(c) * _2_0) if c > EPS else None
|
|
999
999
|
|
|
1000
|
-
return self._reverse(x, y,
|
|
1000
|
+
return self._reverse(x, y, _c, True, LatLon, **name_LatLon_kwds)
|
|
1001
1001
|
|
|
1002
1002
|
|
|
1003
1003
|
class Orthographic(_AzimuthalBase):
|
|
@@ -1008,12 +1008,12 @@ class Orthographic(_AzimuthalBase):
|
|
|
1008
1008
|
if _FOR_DOCS:
|
|
1009
1009
|
__init__ = _AzimuthalBase.__init__
|
|
1010
1010
|
|
|
1011
|
-
def forward(self, lat, lon, name
|
|
1011
|
+
def forward(self, lat, lon, **name):
|
|
1012
1012
|
'''Convert a geodetic location to azimuthal orthographic east- and northing.
|
|
1013
1013
|
|
|
1014
1014
|
@arg lat: Latitude of the location (C{degrees90}).
|
|
1015
1015
|
@arg lon: Longitude of the location (C{degrees180}).
|
|
1016
|
-
@kwarg name: Optional name for the location (C{str}).
|
|
1016
|
+
@kwarg name: Optional C{B{name}=NN} for the location (C{str}).
|
|
1017
1017
|
|
|
1018
1018
|
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}
|
|
1019
1019
|
with easting C{x} and northing C{y} of point in C{meter} and C{lat}
|
|
@@ -1028,15 +1028,15 @@ class Orthographic(_AzimuthalBase):
|
|
|
1028
1028
|
|
|
1029
1029
|
return self._forward(lat, lon, name, _k_t)
|
|
1030
1030
|
|
|
1031
|
-
def reverse(self, x, y,
|
|
1031
|
+
def reverse(self, x, y, LatLon=None, **name_LatLon_kwds):
|
|
1032
1032
|
'''Convert an azimuthal orthographic location to geodetic lat- and longitude.
|
|
1033
1033
|
|
|
1034
1034
|
@arg x: Easting of the location (C{meter}).
|
|
1035
1035
|
@arg y: Northing of the location (C{meter}).
|
|
1036
|
-
@kwarg
|
|
1037
|
-
@kwarg
|
|
1038
|
-
|
|
1039
|
-
|
|
1036
|
+
@kwarg LatLon: Class to use (C{LatLon}) or C{None}.
|
|
1037
|
+
@kwarg name_LatLon_kwds: Optional C{B{name}=NN} for the location and
|
|
1038
|
+
optional, additional B{C{LatLon}} keyword arguments,
|
|
1039
|
+
ignored if C{B{LatLon} is None}.
|
|
1040
1040
|
|
|
1041
1041
|
@return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an
|
|
1042
1042
|
L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
|
|
@@ -1050,7 +1050,7 @@ class Orthographic(_AzimuthalBase):
|
|
|
1050
1050
|
def _c(c):
|
|
1051
1051
|
return asin1(c) if c > EPS else None
|
|
1052
1052
|
|
|
1053
|
-
return self._reverse(x, y,
|
|
1053
|
+
return self._reverse(x, y, _c, False, LatLon, **name_LatLon_kwds)
|
|
1054
1054
|
|
|
1055
1055
|
|
|
1056
1056
|
class Stereographic(_AzimuthalBase):
|
|
@@ -1064,12 +1064,12 @@ class Stereographic(_AzimuthalBase):
|
|
|
1064
1064
|
if _FOR_DOCS:
|
|
1065
1065
|
__init__ = _AzimuthalBase.__init__
|
|
1066
1066
|
|
|
1067
|
-
def forward(self, lat, lon, name
|
|
1067
|
+
def forward(self, lat, lon, **name):
|
|
1068
1068
|
'''Convert a geodetic location to azimuthal stereographic east- and northing.
|
|
1069
1069
|
|
|
1070
1070
|
@arg lat: Latitude of the location (C{degrees90}).
|
|
1071
1071
|
@arg lon: Longitude of the location (C{degrees180}).
|
|
1072
|
-
@kwarg name: Optional name for the location (C{str}).
|
|
1072
|
+
@kwarg name: Optional C{B{name}=NN} for the location (C{str}).
|
|
1073
1073
|
|
|
1074
1074
|
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}
|
|
1075
1075
|
with easting C{x} and northing C{y} of point in C{meter} and C{lat}
|
|
@@ -1097,33 +1097,32 @@ class Stereographic(_AzimuthalBase):
|
|
|
1097
1097
|
def k0(self, factor):
|
|
1098
1098
|
'''Set the central scale factor (C{scalar}).
|
|
1099
1099
|
'''
|
|
1100
|
-
n = Stereographic.k0.fget.__name__
|
|
1100
|
+
n = Stereographic.k0.fget.__name__ # 'k0', name__=Stereographic.k0.fget
|
|
1101
1101
|
self._k0 = Scalar_(factor, name=n, low=EPS, high=2) # XXX high=1, 2, other?
|
|
1102
1102
|
self._k02 = self._k0 * _2_0
|
|
1103
1103
|
|
|
1104
|
-
def reverse(self, x, y,
|
|
1104
|
+
def reverse(self, x, y, LatLon=None, **name_LatLon_kwds):
|
|
1105
1105
|
'''Convert an azimuthal stereographic location to geodetic lat- and longitude.
|
|
1106
1106
|
|
|
1107
1107
|
@arg x: Easting of the location (C{meter}).
|
|
1108
1108
|
@arg y: Northing of the location (C{meter}).
|
|
1109
|
-
@kwarg
|
|
1110
|
-
@kwarg
|
|
1111
|
-
|
|
1112
|
-
|
|
1109
|
+
@kwarg LatLon: Class to use (C{LatLon}) or C{None}.
|
|
1110
|
+
@kwarg name_LatLon_kwds: Optional C{B{name}=NN} for the location and
|
|
1111
|
+
optional, additional B{C{LatLon}} keyword arguments,
|
|
1112
|
+
ignored if C{B{LatLon} is None}.
|
|
1113
1113
|
|
|
1114
1114
|
@return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an
|
|
1115
1115
|
L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
|
|
1116
1116
|
|
|
1117
|
-
@note: The C{lat} will be in
|
|
1118
|
-
|
|
1119
|
-
projection is C{1} in I{radial} direction
|
|
1120
|
-
|
|
1121
|
-
perpendicular to this.
|
|
1117
|
+
@note: The C{lat} will be in range C{[-90..90] degrees}, C{lon} in range
|
|
1118
|
+
C{[-180..180] degrees} and C{azimuth} clockwise from true North.
|
|
1119
|
+
The C{scale} of the projection is C{1} in I{radial} direction and
|
|
1120
|
+
is C{1 / reciprocal} in the direction perpendicular to this.
|
|
1122
1121
|
'''
|
|
1123
1122
|
def _c(c):
|
|
1124
1123
|
return (atan2(c, self._k02) * _2_0) if c > EPS else None
|
|
1125
1124
|
|
|
1126
|
-
return self._reverse(x, y,
|
|
1125
|
+
return self._reverse(x, y, _c, False, LatLon, **name_LatLon_kwds)
|
|
1127
1126
|
|
|
1128
1127
|
|
|
1129
1128
|
__all__ += _ALL_DOCS(_AzimuthalBase, _AzimuthalGeodesic, _EquidistantBase, _GnomonicBase)
|