pygeodesy 25.5.5__py2.py3-none-any.whl → 25.5.25__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/__init__.py +186 -186
- pygeodesy/__main__.py +2 -2
- pygeodesy/albers.py +4 -4
- pygeodesy/auxilats/_CX_Rs.py +3 -3
- pygeodesy/auxilats/auxAngle.py +2 -2
- pygeodesy/auxilats/auxDLat.py +2 -2
- pygeodesy/auxilats/auxDST.py +2 -2
- pygeodesy/auxilats/auxLat.py +2 -2
- pygeodesy/auxilats/auxily.py +2 -2
- pygeodesy/azimuthal.py +2 -2
- pygeodesy/booleans.py +2 -2
- pygeodesy/cartesianBase.py +2 -2
- pygeodesy/clipy.py +2 -2
- pygeodesy/constants.py +2 -2
- pygeodesy/datums.py +2 -2
- pygeodesy/deprecated/__init__.py +8 -8
- pygeodesy/deprecated/bases.py +2 -2
- pygeodesy/deprecated/rhumbBase.py +2 -2
- pygeodesy/deprecated/rhumbaux.py +2 -2
- pygeodesy/deprecated/rhumbsolve.py +2 -2
- pygeodesy/deprecated/rhumbx.py +2 -2
- pygeodesy/ecef.py +3 -4
- pygeodesy/ellipsoidalBase.py +2 -2
- pygeodesy/ellipsoidalBaseDI.py +7 -6
- pygeodesy/ellipsoidalExact.py +3 -3
- pygeodesy/ellipsoidalNvector.py +4 -4
- pygeodesy/ellipsoidalVincenty.py +15 -14
- pygeodesy/ellipsoids.py +4 -4
- pygeodesy/elliptic.py +2 -2
- pygeodesy/errors.py +1 -1
- pygeodesy/etm.py +2 -2
- pygeodesy/fmath.py +9 -9
- pygeodesy/formy.py +2 -2
- pygeodesy/frechet.py +5 -5
- pygeodesy/fstats.py +2 -2
- pygeodesy/fsums.py +37 -28
- pygeodesy/gars.py +2 -3
- pygeodesy/geodesici.py +4 -4
- pygeodesy/geodesicx/__init__.py +3 -3
- pygeodesy/geodesicx/gx.py +2 -2
- pygeodesy/geodesicx/gxarea.py +2 -2
- pygeodesy/geodesicx/gxline.py +2 -2
- pygeodesy/geoids.py +5 -5
- pygeodesy/hausdorff.py +4 -4
- pygeodesy/heights.py +2 -2
- pygeodesy/iters.py +1 -1
- pygeodesy/karney.py +2 -2
- pygeodesy/ktm.py +2 -2
- pygeodesy/latlonBase.py +3 -4
- pygeodesy/lazily.py +1 -1
- pygeodesy/lcc.py +2 -2
- pygeodesy/ltp.py +5 -5
- pygeodesy/mgrs.py +3 -3
- pygeodesy/namedTuples.py +3 -3
- pygeodesy/nvectorBase.py +2 -2
- pygeodesy/osgr.py +2 -2
- pygeodesy/points.py +2 -3
- pygeodesy/props.py +16 -16
- pygeodesy/resections.py +30 -24
- pygeodesy/rhumb/aux_.py +2 -2
- pygeodesy/rhumb/bases.py +3 -3
- pygeodesy/rhumb/ekx.py +3 -4
- pygeodesy/rhumb/solve.py +2 -2
- pygeodesy/simplify.py +2 -2
- pygeodesy/solveBase.py +2 -2
- pygeodesy/sphericalBase.py +6 -6
- pygeodesy/sphericalNvector.py +2 -2
- pygeodesy/sphericalTrigonometry.py +6 -5
- pygeodesy/trf.py +4 -4
- pygeodesy/triaxials.py +2 -2
- pygeodesy/units.py +7 -8
- pygeodesy/utily.py +2 -2
- pygeodesy/utmupsBase.py +2 -2
- pygeodesy/vector2d.py +13 -7
- pygeodesy/vector3d.py +3 -3
- pygeodesy/webmercator.py +2 -2
- {pygeodesy-25.5.5.dist-info → pygeodesy-25.5.25.dist-info}/METADATA +16 -16
- pygeodesy-25.5.25.dist-info/RECORD +119 -0
- pygeodesy-25.5.5.dist-info/RECORD +0 -119
- {pygeodesy-25.5.5.dist-info → pygeodesy-25.5.25.dist-info}/WHEEL +0 -0
- {pygeodesy-25.5.5.dist-info → pygeodesy-25.5.25.dist-info}/top_level.txt +0 -0
pygeodesy/namedTuples.py
CHANGED
|
@@ -10,7 +10,7 @@ of C{_NamedTuple} defined in C{pygeodesy.named}.
|
|
|
10
10
|
|
|
11
11
|
from pygeodesy.basics import isinstanceof, issubclassof, map1, _xinstanceof
|
|
12
12
|
# from pygeodesy.cartesianBase import CartesianBase # _MODS
|
|
13
|
-
|
|
13
|
+
from pygeodesy.constants import INT0
|
|
14
14
|
# from pygeodesy.dms import toDMS # _MODS
|
|
15
15
|
from pygeodesy.errors import _TypeError, _xattr, _xkwds, _xkwds_not
|
|
16
16
|
from pygeodesy.interns import NN, _1_, _2_, _a_, _A_, _area_, _angle_, _b_, _B_, \
|
|
@@ -26,10 +26,10 @@ from pygeodesy.props import deprecated_property_RO, property_RO
|
|
|
26
26
|
from pygeodesy.units import Band, Bearing, Degrees, Degrees2, Easting, FIx, \
|
|
27
27
|
Height, Int, Lam, Lat, Lon, Meter, Meter2, \
|
|
28
28
|
Northing, Number_, Phi, Precision_, Radians, \
|
|
29
|
-
Radius, Scalar, Str
|
|
29
|
+
Radius, Scalar, Str
|
|
30
30
|
|
|
31
31
|
__all__ = _ALL_LAZY.namedTuples
|
|
32
|
-
__version__ = '
|
|
32
|
+
__version__ = '25.05.12'
|
|
33
33
|
|
|
34
34
|
# __DUNDER gets mangled in class
|
|
35
35
|
_closest_ = 'closest'
|
pygeodesy/nvectorBase.py
CHANGED
|
@@ -16,7 +16,7 @@ from pygeodesy.constants import EPS, EPS0, EPS1, EPS_2, R_M, \
|
|
|
16
16
|
# from pygeodesy.datums import _spherical_datum # from .formy
|
|
17
17
|
from pygeodesy.errors import IntersectionError, _ValueError, VectorError, \
|
|
18
18
|
_xattrs, _xkwds, _xkwds_pop2
|
|
19
|
-
from pygeodesy.fmath import
|
|
19
|
+
from pygeodesy.fmath import fidw, hypot
|
|
20
20
|
from pygeodesy.fsums import Fsum, fsumf_
|
|
21
21
|
from pygeodesy.formy import _isequalTo, _spherical_datum
|
|
22
22
|
# from pygeodesy.internals import _under # from .named
|
|
@@ -38,7 +38,7 @@ from pygeodesy.vector3d import Vector3d, _xyzhdlln4
|
|
|
38
38
|
from math import degrees, fabs, sqrt
|
|
39
39
|
|
|
40
40
|
__all__ = _ALL_LAZY.nvectorBase
|
|
41
|
-
__version__ = '25.
|
|
41
|
+
__version__ = '25.05.12'
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
class NvectorBase(Vector3d): # XXX kept private
|
pygeodesy/osgr.py
CHANGED
|
@@ -24,7 +24,7 @@ U{A Guide<https://www.OrdnanceSurvey.co.UK/documents/resources/guide-coordinate-
|
|
|
24
24
|
and U{Ordnance Survey National Grid<https://WikiPedia.org/wiki/Ordnance_Survey_National_Grid>}.
|
|
25
25
|
'''
|
|
26
26
|
# make sure int/int division yields float quotient, see .basics
|
|
27
|
-
from __future__ import division as _; del _ #
|
|
27
|
+
from __future__ import division as _; del _ # noqa: E702 ;
|
|
28
28
|
|
|
29
29
|
from pygeodesy.basics import halfs2, isbool, isfloat, map1, \
|
|
30
30
|
_splituple, _xsubclassof, typename
|
|
@@ -54,7 +54,7 @@ from pygeodesy.utily import degrees90, degrees180, sincostan3, truncate
|
|
|
54
54
|
from math import cos, fabs, radians, sin, sqrt
|
|
55
55
|
|
|
56
56
|
__all__ = _ALL_LAZY.osgr
|
|
57
|
-
__version__ = '25.
|
|
57
|
+
__version__ = '25.05.12'
|
|
58
58
|
|
|
59
59
|
_equivalent_ = 'equivalent'
|
|
60
60
|
_OSGR_ = 'OSGR'
|
pygeodesy/points.py
CHANGED
|
@@ -52,8 +52,7 @@ from pygeodesy.named import classname, _NamedTuple, nameof, \
|
|
|
52
52
|
notImplemented, notOverloaded
|
|
53
53
|
from pygeodesy.namedTuples import Bounds2Tuple, Bounds4Tuple, LatLon2Tuple, \
|
|
54
54
|
NearestOn3Tuple, NearestOn5Tuple, \
|
|
55
|
-
Point3Tuple, Vector3Tuple
|
|
56
|
-
PhiLam2Tuple # PYCHOK shared
|
|
55
|
+
Point3Tuple, Vector3Tuple
|
|
57
56
|
from pygeodesy.props import Property_RO, property_doc_, property_RO
|
|
58
57
|
from pygeodesy.streprs import Fmt, instr
|
|
59
58
|
from pygeodesy.units import Number_, Radius, Scalar, Scalar_
|
|
@@ -63,7 +62,7 @@ from pygeodesy.utily import atan2b, degrees90, degrees180, degrees2m, \
|
|
|
63
62
|
from math import cos, fabs, fmod as _fmod, radians, sin
|
|
64
63
|
|
|
65
64
|
__all__ = _ALL_LAZY.points
|
|
66
|
-
__version__ = '25.
|
|
65
|
+
__version__ = '25.05.12'
|
|
67
66
|
|
|
68
67
|
_ilat_ = 'ilat'
|
|
69
68
|
_ilon_ = 'ilon'
|
pygeodesy/props.py
CHANGED
|
@@ -26,7 +26,7 @@ from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS, \
|
|
|
26
26
|
from functools import wraps as _wraps
|
|
27
27
|
|
|
28
28
|
__all__ = _ALL_LAZY.props
|
|
29
|
-
__version__ = '25.
|
|
29
|
+
__version__ = '25.05.21'
|
|
30
30
|
|
|
31
31
|
_class_ = 'class'
|
|
32
32
|
_DNL_ = _NL_ * 2 # PYCHOK used!
|
|
@@ -460,7 +460,7 @@ def _deprecated(call, kind, qual_d):
|
|
|
460
460
|
@see: Brett Slatkin, "Effective Python", 2019 page 105, 2nd
|
|
461
461
|
ed, Addison-Wesley.
|
|
462
462
|
'''
|
|
463
|
-
doc =
|
|
463
|
+
doc = _DEPRECATEDof(call)
|
|
464
464
|
|
|
465
465
|
@_wraps(call) # PYCHOK self?
|
|
466
466
|
def _deprecated_call(*args, **kwds):
|
|
@@ -517,6 +517,17 @@ def _deprecated_module(name): # PYCHOK no cover
|
|
|
517
517
|
_throwarning(_module_, name, _dont_use_)
|
|
518
518
|
|
|
519
519
|
|
|
520
|
+
def _DEPRECATEDof(obj):
|
|
521
|
+
'''(INTERNAL) Get uniform DEPRECATED __doc__ string.
|
|
522
|
+
'''
|
|
523
|
+
try:
|
|
524
|
+
d = obj.__doc__.strip()
|
|
525
|
+
i = d.find(_DEPRECATED_)
|
|
526
|
+
except AttributeError:
|
|
527
|
+
i = -1
|
|
528
|
+
return _DOT_(_DEPRECATED_, NN) if i < 0 else d[i:]
|
|
529
|
+
|
|
530
|
+
|
|
520
531
|
if _WARNINGS_X_DEV:
|
|
521
532
|
class deprecated_property(_PropertyBase):
|
|
522
533
|
'''Decorator for a DEPRECATED C{property} or C{Property}.
|
|
@@ -524,7 +535,7 @@ if _WARNINGS_X_DEV:
|
|
|
524
535
|
def __init__(self, method):
|
|
525
536
|
'''Decorator for a DEPRECATED C{property} or C{Property} getter.
|
|
526
537
|
'''
|
|
527
|
-
doc =
|
|
538
|
+
doc = _DEPRECATEDof(method)
|
|
528
539
|
|
|
529
540
|
def _fget(inst): # PYCHOK no cover
|
|
530
541
|
'''Get the C{property} or C{Property} value.
|
|
@@ -554,7 +565,7 @@ if _WARNINGS_X_DEV:
|
|
|
554
565
|
'''Set the C{property} or C{Property} value.
|
|
555
566
|
'''
|
|
556
567
|
q = _qualified(inst, self.name)
|
|
557
|
-
_throwarning(typename(property), q,
|
|
568
|
+
_throwarning(typename(property), q, _DEPRECATEDof(method))
|
|
558
569
|
method(inst, val)
|
|
559
570
|
# self._update(inst) # un-cache this item
|
|
560
571
|
|
|
@@ -594,7 +605,7 @@ def deprecated_property_RO(method):
|
|
|
594
605
|
def _deprecated_RO(method, _RO):
|
|
595
606
|
'''(INTERNAL) Create a DEPRECATED C{property_RO} or C{Property_RO}.
|
|
596
607
|
'''
|
|
597
|
-
doc =
|
|
608
|
+
doc = _DEPRECATEDof(method)
|
|
598
609
|
|
|
599
610
|
if _WARNINGS_X_DEV:
|
|
600
611
|
|
|
@@ -614,17 +625,6 @@ def _deprecated_RO(method, _RO):
|
|
|
614
625
|
return _RO(method, doc=doc)
|
|
615
626
|
|
|
616
627
|
|
|
617
|
-
def _DOCof(obj):
|
|
618
|
-
'''(INTERNAL) Get uniform DEPRECATED __doc__ string.
|
|
619
|
-
'''
|
|
620
|
-
try:
|
|
621
|
-
d = obj.__doc__.strip()
|
|
622
|
-
i = d.find(_DEPRECATED_)
|
|
623
|
-
except AttributeError:
|
|
624
|
-
i = -1
|
|
625
|
-
return _DOT_(_DEPRECATED_, NN) if i < 0 else d[i:]
|
|
626
|
-
|
|
627
|
-
|
|
628
628
|
def _qualified(inst, name):
|
|
629
629
|
'''(INTERNAL) Fully qualify a name.
|
|
630
630
|
'''
|
pygeodesy/resections.py
CHANGED
|
@@ -10,7 +10,7 @@ L{triAngle}, L{triAngle5}, L{triSide}, L{triSide2} and L{triSide4}.
|
|
|
10
10
|
U{Pierlot<http://www.Telecom.ULg.ac.BE/publi/publications/pierlot/Pierlot2014ANewThree>}.
|
|
11
11
|
'''
|
|
12
12
|
# make sure int/int division yields float quotient
|
|
13
|
-
from __future__ import division as _; del _ #
|
|
13
|
+
from __future__ import division as _; del _ # noqa: E702 ;
|
|
14
14
|
|
|
15
15
|
from pygeodesy.basics import map1, map2, _zip, _ALL_LAZY, typename
|
|
16
16
|
from pygeodesy.constants import EPS, EPS0, EPS02, INT0, PI, PI2, PI_2, PI_4, \
|
|
@@ -34,7 +34,7 @@ from pygeodesy.vector3d import _otherV3d, Vector3d
|
|
|
34
34
|
from math import cos, degrees, fabs, radians, sin, sqrt
|
|
35
35
|
|
|
36
36
|
__all__ = _ALL_LAZY.resections
|
|
37
|
-
__version__ = '25.05.
|
|
37
|
+
__version__ = '25.05.12'
|
|
38
38
|
|
|
39
39
|
_concyclic_ = 'concyclic'
|
|
40
40
|
_PA_ = 'PA'
|
|
@@ -798,12 +798,12 @@ def triArea(a, b, c):
|
|
|
798
798
|
try:
|
|
799
799
|
r, y, x = sorted(map1(float, a, b, c))
|
|
800
800
|
if r > 0: # r = min(a, b, c)
|
|
801
|
-
|
|
802
|
-
d =
|
|
803
|
-
r = (
|
|
801
|
+
s = r
|
|
802
|
+
d = x - y
|
|
803
|
+
r = (s + d) * (s - d)
|
|
804
804
|
if r:
|
|
805
|
-
|
|
806
|
-
r *= (
|
|
805
|
+
y += x
|
|
806
|
+
r *= (y + s) * (y - s)
|
|
807
807
|
if r < 0:
|
|
808
808
|
raise ValueError(_negative_)
|
|
809
809
|
return sqrt(r / _16_0) if r else _0_0
|
|
@@ -927,9 +927,11 @@ def triSide4(radA, radB, c):
|
|
|
927
927
|
sc = fsum1f_(sa * cb, sb * ca)
|
|
928
928
|
if sc < EPS0 or min(sa, sb) < 0:
|
|
929
929
|
raise ValueError(_invalid_)
|
|
930
|
-
sc
|
|
931
|
-
|
|
932
|
-
|
|
930
|
+
sc = c / sc
|
|
931
|
+
sa *= sc
|
|
932
|
+
sd = sa * sb
|
|
933
|
+
sb *= sc
|
|
934
|
+
return TriSide4Tuple(sa, sb, rC, sd, name=typename(triSide4))
|
|
933
935
|
|
|
934
936
|
except (TypeError, ValueError) as x:
|
|
935
937
|
raise TriangleError(radA=radA, radB=radB, c=c, cause=x)
|
|
@@ -948,7 +950,8 @@ def wildberger3(a, b, c, alpha, beta, R3=min):
|
|
|
948
950
|
@arg alpha: Angle subtended by triangle side B{C{b}} (C{degrees}, non-negative).
|
|
949
951
|
@arg beta: Angle subtended by triangle side B{C{a}} (C{degrees}, non-negative).
|
|
950
952
|
@kwarg R3: Callable to determine C{R3} from C{(R3 - C)**2 = D}, typically standard
|
|
951
|
-
Python function C{min} or C{max}, invoked with 2 arguments
|
|
953
|
+
Python function C{min} or C{max}, invoked with 2 arguments, each
|
|
954
|
+
C{float} or an L{Fsum<pygeodesy.fsums.Fsum>}.
|
|
952
955
|
|
|
953
956
|
@return: L{Survey3Tuple}C{(PA, PB, PC)} with distance from survey point C{P} to
|
|
954
957
|
each of the triangle corners C{A}, C{B} and C{C}, same units as B{C{a}},
|
|
@@ -962,19 +965,20 @@ def wildberger3(a, b, c, alpha, beta, R3=min):
|
|
|
962
965
|
U{Devine Proportions, page 252<http://www.MS.LT/derlius/WildbergerDivineProportions.pdf>}
|
|
963
966
|
and function L{snellius3}.
|
|
964
967
|
'''
|
|
965
|
-
def
|
|
968
|
+
def _sin2(x):
|
|
966
969
|
return sin(x)**2
|
|
967
970
|
|
|
968
971
|
def _vpa(r3, q2, q3, s2, s3):
|
|
972
|
+
r4 = r3 * _4_0
|
|
973
|
+
s4 = r4 * s2
|
|
974
|
+
if isnear0(s4):
|
|
975
|
+
raise ValueError(_coincident_)
|
|
969
976
|
r1 = s2 * q3 / s3
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
R -= r # ... - r) / s3
|
|
974
|
-
n = -R.fover(s3)
|
|
975
|
-
if n < 0 or r < EPS0:
|
|
977
|
+
N2 = _Fsumf_(r1, r3, -q2)**2
|
|
978
|
+
n = (r4 * r1 - N2).fover(s4)
|
|
979
|
+
if n < 0:
|
|
976
980
|
raise ValueError(_coincident_)
|
|
977
|
-
return sqrt(
|
|
981
|
+
return sqrt(n) if n else _0_0
|
|
978
982
|
|
|
979
983
|
try:
|
|
980
984
|
a, b, c, da, db = _noneg(a, b, c, alpha, beta)
|
|
@@ -983,21 +987,23 @@ def wildberger3(a, b, c, alpha, beta, R3=min):
|
|
|
983
987
|
raise ValueError(_coincident_)
|
|
984
988
|
|
|
985
989
|
ra, rb = map1(radians, da, db)
|
|
986
|
-
s1, s2, s3 = s = map1(
|
|
990
|
+
s1, s2, s3 = s = map1(_sin2, rb, ra, ra + rb) # rb, ra!
|
|
987
991
|
if min(s) < EPS02:
|
|
988
992
|
raise ValueError(_or(_coincident_, _colinear_))
|
|
993
|
+
s += _Fsumf_(*s), # == fsum1(s),
|
|
989
994
|
|
|
990
995
|
Q = _Fsumf_(*q) # == a**2 + b**2 + ...
|
|
991
|
-
s += _Fsumf_(*s), # == fsum1(s),
|
|
992
996
|
C0 = Fdot(s, q1, q2, q3, -Q * _0_5)
|
|
993
997
|
r3 = C0.fover(-s3) # C0 /= -s3
|
|
998
|
+
|
|
994
999
|
Q *= Q # Q**2 - 2 * (a**4 + b**4 ...
|
|
995
|
-
Q -= hypot2_(*q) *_2_0 # ... + c**4)
|
|
996
|
-
|
|
1000
|
+
Q -= hypot2_(*q) * _2_0 # ... + c**4)
|
|
1001
|
+
Q *= s1 * s2 # Q * s1 * s2 / s3
|
|
1002
|
+
d0 = Q.fover(s3)
|
|
997
1003
|
if d0 > EPS02: # > c0
|
|
998
1004
|
_xcallable(R3=R3)
|
|
999
1005
|
d0 = sqrt(d0)
|
|
1000
|
-
r3 = R3(
|
|
1006
|
+
r3 = R3(C0 + d0, C0 - d0).as_iscalar # XXX min or max
|
|
1001
1007
|
elif d0 < (-EPS02):
|
|
1002
1008
|
raise ValueError(_negative_)
|
|
1003
1009
|
|
pygeodesy/rhumb/aux_.py
CHANGED
|
@@ -26,7 +26,7 @@ License. For more information, see the U{GeographicLib<https://GeographicLib.So
|
|
|
26
26
|
windows/win32/fileio/naming-a-file#naming-conventions>} with and without extension.
|
|
27
27
|
'''
|
|
28
28
|
# make sure int/int division yields float quotient
|
|
29
|
-
from __future__ import division as _; del _ #
|
|
29
|
+
from __future__ import division as _; del _ # noqa: E702 ;
|
|
30
30
|
|
|
31
31
|
from pygeodesy.auxilats.auxAngle import AuxMu, AuxPhi, hypot
|
|
32
32
|
from pygeodesy.auxilats.auxDLat import AuxDLat, _DClenshaw
|
|
@@ -48,7 +48,7 @@ from pygeodesy.rhumb.bases import RhumbBase, RhumbLineBase, \
|
|
|
48
48
|
from math import ceil as _ceil, fabs, radians
|
|
49
49
|
|
|
50
50
|
__all__ = _ALL_LAZY.rhumb_aux_
|
|
51
|
-
__version__ = '25.
|
|
51
|
+
__version__ = '25.05.12'
|
|
52
52
|
|
|
53
53
|
# DIGITS = (sizeof(real) * 8) bits
|
|
54
54
|
# = (ctypes.sizeof(ctypes.c_double(1.0)) * 8) bits
|
pygeodesy/rhumb/bases.py
CHANGED
|
@@ -21,7 +21,7 @@ Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2014-2024) and lice
|
|
|
21
21
|
License. For more information, see the U{GeographicLib<https://GeographicLib.SourceForge.io>} documentation.
|
|
22
22
|
'''
|
|
23
23
|
# make sure int/int division yields float quotient
|
|
24
|
-
from __future__ import division as _; del _ #
|
|
24
|
+
from __future__ import division as _; del _ # noqa: E702 ;
|
|
25
25
|
|
|
26
26
|
from pygeodesy.basics import _copysign, itemsorted, unsigned0, _xinstanceof
|
|
27
27
|
from pygeodesy.constants import EPS, EPS0, EPS1, INT0, NAN, _over, \
|
|
@@ -44,7 +44,7 @@ from pygeodesy.namedTuples import Distance2Tuple, LatLon2Tuple
|
|
|
44
44
|
from pygeodesy.props import deprecated_method, Property, Property_RO, \
|
|
45
45
|
property_RO, _update_all
|
|
46
46
|
from pygeodesy.streprs import Fmt, pairs
|
|
47
|
-
from pygeodesy.units import Float_, Lat, Lon, Meter, Radius_
|
|
47
|
+
from pygeodesy.units import Float_, Lat, Lon, Meter, Radius_
|
|
48
48
|
from pygeodesy.utily import acos1, _azireversed, _loneg, sincos2d, sincos2d_, \
|
|
49
49
|
_unrollon, _Wrap
|
|
50
50
|
from pygeodesy.vector3d import _intersect3d3, Vector3d # in .Intersection below
|
|
@@ -52,7 +52,7 @@ from pygeodesy.vector3d import _intersect3d3, Vector3d # in .Intersection below
|
|
|
52
52
|
from math import cos, fabs
|
|
53
53
|
|
|
54
54
|
__all__ = ()
|
|
55
|
-
__version__ = '25.
|
|
55
|
+
__version__ = '25.05.12'
|
|
56
56
|
|
|
57
57
|
_anti_ = _Dash('anti')
|
|
58
58
|
_rls = [] # instances of C{RbumbLine...} to be updated
|
pygeodesy/rhumb/ekx.py
CHANGED
|
@@ -20,7 +20,7 @@ Copyright (C) U{Charles Karney<mailto:Karney@Alum.MIT.edu>} (2014-2024) and lice
|
|
|
20
20
|
License. For more information, see the U{GeographicLib<https://GeographicLib.SourceForge.io>} documentation.
|
|
21
21
|
'''
|
|
22
22
|
# make sure int/int division yields float quotient
|
|
23
|
-
from __future__ import division as _; del _ #
|
|
23
|
+
from __future__ import division as _; del _ # noqa: E702 ;
|
|
24
24
|
|
|
25
25
|
from pygeodesy.basics import copysign0, neg
|
|
26
26
|
from pygeodesy.constants import PI_2, _0_0s, _0_0, _0_5, _1_0, \
|
|
@@ -31,8 +31,7 @@ from pygeodesy.errors import RhumbError, _xkwds_pop2, _Xorder
|
|
|
31
31
|
from pygeodesy.fmath import hypot, hypot1
|
|
32
32
|
# from pygeodesy.fsums import fsum1f_ # _MODS
|
|
33
33
|
# from pygeodesy.karney import Caps # from .rhumb.bases
|
|
34
|
-
from pygeodesy.ktm import
|
|
35
|
-
_AlpCoeffs, _BetCoeffs # PYCHOK used!
|
|
34
|
+
from pygeodesy.ktm import _Xs, _AlpCoeffs, _BetCoeffs # PYCHOK used!
|
|
36
35
|
from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS
|
|
37
36
|
from pygeodesy.props import deprecated_method, Property, Property_RO, \
|
|
38
37
|
property_RO
|
|
@@ -43,7 +42,7 @@ from pygeodesy.utily import atan1, sincos2_
|
|
|
43
42
|
from math import asinh, atan, cos, cosh, radians, sin, sinh, sqrt, tan # as _tan
|
|
44
43
|
|
|
45
44
|
__all__ = _ALL_LAZY.rhumb_ekx
|
|
46
|
-
__version__ = '25.
|
|
45
|
+
__version__ = '25.05.12'
|
|
47
46
|
|
|
48
47
|
|
|
49
48
|
class Rhumb(RhumbBase):
|
pygeodesy/rhumb/solve.py
CHANGED
|
@@ -9,7 +9,7 @@ as an (exact) rhumb or rhumb line from I{either GeographicLib 2.0 or 2.2+}.
|
|
|
9
9
|
path of the C{RhumbSolve} executable.
|
|
10
10
|
'''
|
|
11
11
|
from pygeodesy.basics import _xinstanceof
|
|
12
|
-
from pygeodesy.constants import
|
|
12
|
+
from pygeodesy.constants import _180_0, _N_180_0, _over, _0_0 # PYCHOK used!
|
|
13
13
|
from pygeodesy.errors import RhumbError # PYCHOK used!
|
|
14
14
|
from pygeodesy.interns import NN, _a12_, _azi12_, _DMAIN_, _lat2_, _lon2_, _s12_, \
|
|
15
15
|
_S12_, _UNDER_
|
|
@@ -21,7 +21,7 @@ from pygeodesy.solveBase import _SolveGDictBase, _SolveGDictLineBase
|
|
|
21
21
|
from pygeodesy.utily import _unrollon, _Wrap, wrap360
|
|
22
22
|
|
|
23
23
|
__all__ = _ALL_LAZY.rhumb_solve
|
|
24
|
-
__version__ = '25.
|
|
24
|
+
__version__ = '25.05.07'
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
class _RhumbSolveBase(_SolveGDictBase):
|
pygeodesy/simplify.py
CHANGED
|
@@ -65,7 +65,7 @@ See:
|
|
|
65
65
|
- U{https://PyPI.org/project/simplification}
|
|
66
66
|
'''
|
|
67
67
|
# make sure int/int division yields float quotient, see .basics
|
|
68
|
-
from __future__ import division as _; del _ #
|
|
68
|
+
from __future__ import division as _; del _ # noqa: E702 ;
|
|
69
69
|
|
|
70
70
|
# from pygeodesy.basics import len2 # from .fmath
|
|
71
71
|
from pygeodesy.constants import EPS, R_M, _1_0
|
|
@@ -80,7 +80,7 @@ from pygeodesy.units import _ALL_LAZY, _1mm, Radius_
|
|
|
80
80
|
from math import degrees, fabs, radians
|
|
81
81
|
|
|
82
82
|
__all__ = _ALL_LAZY.simplify
|
|
83
|
-
__version__ = '
|
|
83
|
+
__version__ = '25.05.12'
|
|
84
84
|
|
|
85
85
|
|
|
86
86
|
# try:
|
pygeodesy/solveBase.py
CHANGED
|
@@ -20,10 +20,10 @@ from pygeodesy.named import callername, _name2__, notOverloaded
|
|
|
20
20
|
from pygeodesy.props import Property, Property_RO, property_RO, _update_all
|
|
21
21
|
from pygeodesy.streprs import Fmt, fstr, fstrzs, pairs, strs
|
|
22
22
|
from pygeodesy.units import Precision_
|
|
23
|
-
from pygeodesy.utily import unroll180
|
|
23
|
+
from pygeodesy.utily import unroll180
|
|
24
24
|
|
|
25
25
|
__all__ = _ALL_LAZY.solveBase
|
|
26
|
-
__version__ = '25.
|
|
26
|
+
__version__ = '25.05.12'
|
|
27
27
|
|
|
28
28
|
_ERROR_ = 'ERROR'
|
|
29
29
|
|
pygeodesy/sphericalBase.py
CHANGED
|
@@ -10,10 +10,10 @@ and published under the same MIT Licence**, see
|
|
|
10
10
|
U{Latitude/Longitude<https://www.Movable-Type.co.UK/scripts/latlong.html>}.
|
|
11
11
|
'''
|
|
12
12
|
# make sure int/int division yields float quotient, see .basics
|
|
13
|
-
from __future__ import division as _; del _ #
|
|
13
|
+
from __future__ import division as _; del _ # noqa: E702 ;
|
|
14
14
|
|
|
15
15
|
from pygeodesy.basics import _copysign, isbool, _isin, isinstanceof, map1
|
|
16
|
-
from pygeodesy.cartesianBase import CartesianBase
|
|
16
|
+
from pygeodesy.cartesianBase import CartesianBase
|
|
17
17
|
from pygeodesy.constants import EPS, EPS0, PI, PI2, PI_2, R_M, \
|
|
18
18
|
_0_0, _0_5, _1_0, _180_0, _360_0, \
|
|
19
19
|
_over, isnear0, isnon0
|
|
@@ -24,9 +24,9 @@ from pygeodesy.fmath import favg, fdot, hypot, sqrt_a
|
|
|
24
24
|
from pygeodesy.interns import _COMMA_, _concentric_, _datum_, _distant_, \
|
|
25
25
|
_exceed_PI_radians_, _name_, _near_, \
|
|
26
26
|
_radius_, _too_
|
|
27
|
-
from pygeodesy.latlonBase import LatLonBase
|
|
27
|
+
from pygeodesy.latlonBase import LatLonBase
|
|
28
28
|
from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS
|
|
29
|
-
# from pygeodesy.namedTuples import Bearing2Tuple #
|
|
29
|
+
# from pygeodesy.namedTuples import Bearing2Tuple # _MODS
|
|
30
30
|
from pygeodesy.nvectorBase import NvectorBase, Fmt
|
|
31
31
|
from pygeodesy.props import deprecated_method, property_doc_, property_RO, \
|
|
32
32
|
_update_all
|
|
@@ -40,7 +40,7 @@ from pygeodesy.utily import acos1, asin1, atan2b, atan2d, degrees90, \
|
|
|
40
40
|
from math import cos, fabs, log, sin, sqrt
|
|
41
41
|
|
|
42
42
|
__all__ = _ALL_LAZY.sphericalBase
|
|
43
|
-
__version__ = '25.
|
|
43
|
+
__version__ = '25.05.12'
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
class CartesianSphericalBase(CartesianBase):
|
|
@@ -157,7 +157,7 @@ class LatLonSphericalBase(LatLonBase):
|
|
|
157
157
|
# .initialBearingTo is inside .-Nvector and .-Trigonometry
|
|
158
158
|
i = self.initialBearingTo(other, wrap=wrap, raiser=raiser) # PYCHOK .initialBearingTo
|
|
159
159
|
f = self.finalBearingTo( other, wrap=wrap, raiser=raiser)
|
|
160
|
-
return Bearing2Tuple(i, f, name=self.name)
|
|
160
|
+
return _MODS.namedTuples.Bearing2Tuple(i, f, name=self.name)
|
|
161
161
|
|
|
162
162
|
@property_doc_(''' this point's datum (L{Datum}).''')
|
|
163
163
|
def datum(self):
|
pygeodesy/sphericalNvector.py
CHANGED
|
@@ -31,7 +31,7 @@ Also note that on a spherical earth model, an n-vector is equivalent
|
|
|
31
31
|
to a normalised version of an (ECEF) cartesian coordinate.
|
|
32
32
|
'''
|
|
33
33
|
# make sure int/int division yields float quosient, see .basics
|
|
34
|
-
from __future__ import division as _; del _ #
|
|
34
|
+
from __future__ import division as _; del _ # noqa: E702 ;
|
|
35
35
|
|
|
36
36
|
from pygeodesy.basics import _isin, _xinstanceof, typename
|
|
37
37
|
from pygeodesy.constants import EPS, EPS0, PI, PI2, PI_2, R_M, \
|
|
@@ -62,7 +62,7 @@ from pygeodesy.utily import atan2, degrees360, sincos2, sincos2_, sincos2d, \
|
|
|
62
62
|
# from math import fabs # from utily
|
|
63
63
|
|
|
64
64
|
__all__ = _ALL_LAZY.sphericalNvector
|
|
65
|
-
__version__ = '25.
|
|
65
|
+
__version__ = '25.05.12'
|
|
66
66
|
|
|
67
67
|
_lines_ = 'lines'
|
|
68
68
|
|
|
@@ -14,7 +14,7 @@ I{(C) Chris Veness 2011-2024} published under the same MIT Licence**, see
|
|
|
14
14
|
U{Latitude/Longitude<https://www.Movable-Type.co.UK/scripts/latlong.html>}.
|
|
15
15
|
'''
|
|
16
16
|
# make sure int/int division yields float quotient, see .basics
|
|
17
|
-
from __future__ import division as _; del _ #
|
|
17
|
+
from __future__ import division as _; del _ # noqa: E702 ;
|
|
18
18
|
|
|
19
19
|
from pygeodesy.basics import copysign0, _isin, map1, signOf, typename
|
|
20
20
|
from pygeodesy.constants import EPS, EPS1, EPS4, PI, PI2, PI_2, PI_4, R_M, \
|
|
@@ -34,8 +34,9 @@ from pygeodesy.interns import _1_, _2_, _coincident_, _composite_, _colinear_, \
|
|
|
34
34
|
_concentric_, _convex_, _end_, _infinite_, \
|
|
35
35
|
_invalid_, _line_, _near_, _null_, _parallel_, \
|
|
36
36
|
_point_, _SPACE_, _too_
|
|
37
|
+
from pygeodesy.latlonBase import _trilaterate5
|
|
37
38
|
from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS, _ALL_OTHER
|
|
38
|
-
# from pygeodesy.nvectorBase import NvectorBase, sumOf #
|
|
39
|
+
# from pygeodesy.nvectorBase import NvectorBase, sumOf # _MODS
|
|
39
40
|
from pygeodesy.namedTuples import LatLon2Tuple, LatLon3Tuple, NearestOn3Tuple, \
|
|
40
41
|
Triangle7Tuple, Triangle8Tuple
|
|
41
42
|
from pygeodesy.points import ispolar, nearestOn5 as _nearestOn5, \
|
|
@@ -43,10 +44,10 @@ from pygeodesy.points import ispolar, nearestOn5 as _nearestOn5, \
|
|
|
43
44
|
from pygeodesy.props import deprecated_function, deprecated_method
|
|
44
45
|
from pygeodesy.sphericalBase import _m2radians, CartesianSphericalBase, \
|
|
45
46
|
_intersecant2, LatLonSphericalBase, \
|
|
46
|
-
_rads3, _radians2m
|
|
47
|
+
_rads3, _radians2m
|
|
47
48
|
# from pygeodesy.streprs import Fmt as _Fmt # from .points XXX shadowed
|
|
48
49
|
from pygeodesy.units import Bearing_, Height, _isDegrees, _isRadius, Lamd, \
|
|
49
|
-
|
|
50
|
+
Phid, Radius_, Scalar
|
|
50
51
|
from pygeodesy.utily import acos1, asin1, atan1d, atan2, atan2d, degrees90, \
|
|
51
52
|
degrees180, degrees2m, m2radians, radiansPI2, \
|
|
52
53
|
sincos2_, tan_2, unrollPI, _unrollon, _unrollon3, \
|
|
@@ -56,7 +57,7 @@ from pygeodesy.vector3d import sumOf, Vector3d
|
|
|
56
57
|
from math import asin, cos, degrees, fabs, radians, sin
|
|
57
58
|
|
|
58
59
|
__all__ = _ALL_LAZY.sphericalTrigonometry
|
|
59
|
-
__version__ = '25.
|
|
60
|
+
__version__ = '25.05.12'
|
|
60
61
|
|
|
61
62
|
_PI_EPS4 = PI - EPS4
|
|
62
63
|
if _PI_EPS4 >= PI:
|
pygeodesy/trf.py
CHANGED
|
@@ -93,7 +93,7 @@ from math import ceil as _ceil, fabs
|
|
|
93
93
|
# import operator as _operator # from .datums
|
|
94
94
|
|
|
95
95
|
__all__ = _ALL_LAZY.trf
|
|
96
|
-
__version__ = '25.
|
|
96
|
+
__version__ = '25.05.12'
|
|
97
97
|
|
|
98
98
|
_EP0CH = Epoch(0, low=0)
|
|
99
99
|
_Es = {_EP0CH: _EP0CH} # L{Epoch}s, deleted below
|
|
@@ -148,7 +148,7 @@ def _E(epoch): # deleted below
|
|
|
148
148
|
'''(INTERNAL) De-dup L{Epochs}s.
|
|
149
149
|
'''
|
|
150
150
|
e = Epoch(_F(epoch))
|
|
151
|
-
return _Es.setdefault(e, e) #
|
|
151
|
+
return _Es.setdefault(e, e) # noqa: F821 del
|
|
152
152
|
|
|
153
153
|
|
|
154
154
|
def _P(ps, name, _Ps): # deleted below
|
|
@@ -1299,11 +1299,11 @@ def _trfX(n1, n2, raiser=True, **epoch_xform_rates):
|
|
|
1299
1299
|
|
|
1300
1300
|
|
|
1301
1301
|
def _X(*ps): # deleted below
|
|
1302
|
-
return _P(ps, _xform_, _Xs) #
|
|
1302
|
+
return _P(ps, _xform_, _Xs) # noqa: F821 del
|
|
1303
1303
|
|
|
1304
1304
|
|
|
1305
1305
|
def _R(*ps): # deleted below
|
|
1306
|
-
return _P(ps, _rates_, _Rs) #
|
|
1306
|
+
return _P(ps, _rates_, _Rs) # noqa: F821 del
|
|
1307
1307
|
|
|
1308
1308
|
|
|
1309
1309
|
_P_0_0s = TRFXform7Tuple(_0_0s(len(_Names7)), name='unity')
|
pygeodesy/triaxials.py
CHANGED
|
@@ -28,7 +28,7 @@ see the U{GeographicLib<https://GeographicLib.SourceForge.io>} documentation.
|
|
|
28
28
|
@var Triaxials.WGS84_35: Triaxial(name='WGS84_35', a=6378172, b=6378102, c=6356752.314245179, e2ab=0.00002195, e2bc=0.006683478, e2ac=0.006705281, volume=1083207319768789942272, area=510065621722018.125, area_p=510065626587483.3125)
|
|
29
29
|
'''
|
|
30
30
|
# make sure int/int division yields float quotient, see .basics
|
|
31
|
-
from __future__ import division as _; del _ #
|
|
31
|
+
from __future__ import division as _; del _ # noqa: E702 ;
|
|
32
32
|
|
|
33
33
|
from pygeodesy.basics import _isin, isLatLon, isscalar
|
|
34
34
|
from pygeodesy.constants import EPS, EPS0, EPS02, EPS4, INT0, PI2, PI_3, PI4, \
|
|
@@ -59,7 +59,7 @@ from pygeodesy.vector3d import _otherV3d, Vector3d, _ALL_LAZY, _MODS
|
|
|
59
59
|
from math import fabs, sqrt
|
|
60
60
|
|
|
61
61
|
__all__ = _ALL_LAZY.triaxials
|
|
62
|
-
__version__ = '25.
|
|
62
|
+
__version__ = '25.05.12'
|
|
63
63
|
|
|
64
64
|
_not_ordered_ = _not_('ordered')
|
|
65
65
|
_omega_ = 'omega'
|
pygeodesy/units.py
CHANGED
|
@@ -7,18 +7,17 @@ L{Feet}, L{Meter}, L{Radians}, etc.
|
|
|
7
7
|
'''
|
|
8
8
|
|
|
9
9
|
from pygeodesy.basics import isscalar, issubclassof, signOf, typename
|
|
10
|
-
from pygeodesy.constants import EPS, EPS1, PI, PI2, PI_2, _umod_360, _0_0,
|
|
11
|
-
_0_001, _0_5, INT0 # PYCHOK for .mgrs, .namedTuples
|
|
10
|
+
from pygeodesy.constants import EPS, EPS1, PI, PI2, PI_2, _umod_360, _0_0, _0_001
|
|
12
11
|
from pygeodesy.dms import F__F, F__F_, S_NUL, S_SEP, parseDMS, parseRad, _toDMS
|
|
13
12
|
from pygeodesy.errors import _AssertionError, TRFError, UnitError, _xattr, _xcallable
|
|
14
13
|
# from pygeodesy.internals import typename # from .basics
|
|
15
14
|
from pygeodesy.interns import NN, _azimuth_, _band_, _bearing_, _COMMASPACE_, \
|
|
16
15
|
_degrees_, _degrees2_, _distance_, _E_, _easting_, \
|
|
17
|
-
_epoch_, _EW_, _feet_, _height_, _lam_, _lat_,
|
|
18
|
-
|
|
16
|
+
_epoch_, _EW_, _feet_, _height_, _lam_, _lat_, _lon_, \
|
|
17
|
+
_meter_, _meter2_, _N_, _negative_, _northing_, _radians_, \
|
|
19
18
|
_NS_, _NSEW_, _number_, _PERCENT_, _phi_, _precision_, \
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
_radians2_, _radius_, _S_, _scalar_, \
|
|
20
|
+
_W_, _zone_, _std_ # PYCHOK used!
|
|
22
21
|
from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS
|
|
23
22
|
# from pygeodesy.named import _name__ # _MODS
|
|
24
23
|
from pygeodesy.props import Property_RO
|
|
@@ -28,7 +27,7 @@ from pygeodesy.unitsBase import Float, Int, _NamedUnit, Radius, Str, Fmt, fstr
|
|
|
28
27
|
from math import degrees, isnan, radians
|
|
29
28
|
|
|
30
29
|
__all__ = _ALL_LAZY.units
|
|
31
|
-
__version__ = '25.
|
|
30
|
+
__version__ = '25.05.12'
|
|
32
31
|
|
|
33
32
|
|
|
34
33
|
class Float_(Float):
|
|
@@ -861,7 +860,7 @@ def _std_repr(*Classes):
|
|
|
861
860
|
'''
|
|
862
861
|
from pygeodesy.internals import _getenv
|
|
863
862
|
for C in Classes:
|
|
864
|
-
if hasattr(C, typename(_std_repr)): #
|
|
863
|
+
if hasattr(C, typename(_std_repr)): # noqa: F821 del
|
|
865
864
|
env = 'PYGEODESY_%s_STD_REPR' % (typename(C).upper(),)
|
|
866
865
|
if _getenv(env, _std_).lower() != _std_:
|
|
867
866
|
C._std_repr = False
|
pygeodesy/utily.py
CHANGED
|
@@ -9,7 +9,7 @@ and U{Vector-based geodesy<https://www.Movable-Type.co.UK/scripts/latlong-vector
|
|
|
9
9
|
and published under the same MIT Licence**.
|
|
10
10
|
'''
|
|
11
11
|
# make sure int/int division yields float quotient, see .basics
|
|
12
|
-
from __future__ import division as _; del _ #
|
|
12
|
+
from __future__ import division as _; del _ # noqa: E702 ;
|
|
13
13
|
|
|
14
14
|
from pygeodesy.basics import _copysign, isinstanceof, isint, isstr
|
|
15
15
|
from pygeodesy.constants import EPS, EPS0, INF, NAN, PI, PI2, PI_2, R_M, \
|
|
@@ -28,7 +28,7 @@ from math import acos, asin, atan2 as _atan2, cos, degrees, fabs, radians, \
|
|
|
28
28
|
sin, tan as _tan # pow
|
|
29
29
|
|
|
30
30
|
__all__ = _ALL_LAZY.utily
|
|
31
|
-
__version__ = '25.
|
|
31
|
+
__version__ = '25.05.12'
|
|
32
32
|
|
|
33
33
|
_G_DEG = _float( 400.0 / _360_0) # grades per degree
|
|
34
34
|
_G_RAD = _float( 400.0 / PI2) # grades per radian
|
pygeodesy/utmupsBase.py
CHANGED
|
@@ -5,7 +5,7 @@ u'''(INTERNAL) Private class C{UtmUpsBase}, functions and constants
|
|
|
5
5
|
for modules L{epsg}, L{etm}, L{mgrs}, L{ups} and L{utm}.
|
|
6
6
|
'''
|
|
7
7
|
# make sure int/int division yields float quotient, see .basics
|
|
8
|
-
from __future__ import division as _; del _ #
|
|
8
|
+
from __future__ import division as _; del _ # noqa: E702 ;
|
|
9
9
|
|
|
10
10
|
from pygeodesy.basics import _copysign, _isin, isint, isscalar, isstr, \
|
|
11
11
|
neg_, _xinstanceof, _xsubclassof
|
|
@@ -32,7 +32,7 @@ from pygeodesy.utily import atan1, _Wrap, wrap360
|
|
|
32
32
|
from math import cos, degrees, fabs, sin, tan # copysign as _copysign
|
|
33
33
|
|
|
34
34
|
__all__ = _ALL_LAZY.utmupsBase
|
|
35
|
-
__version__ = '25.
|
|
35
|
+
__version__ = '25.05.12'
|
|
36
36
|
|
|
37
37
|
_UPS_BANDS = _A_, _B_, _Y_, _Z_ # UPS polar bands SE, SW, NE, NW
|
|
38
38
|
# _UTM_BANDS = _MODS.utm._Bands
|