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
|
@@ -44,8 +44,8 @@ from pygeodesy.sphericalBase import _m2radians, CartesianSphericalBase, \
|
|
|
44
44
|
_intersecant2, LatLonSphericalBase, \
|
|
45
45
|
_rads3, _radians2m, _trilaterate5
|
|
46
46
|
# from pygeodesy.streprs import Fmt as _Fmt # from .points XXX shadowed
|
|
47
|
-
from pygeodesy.units import Bearing_, Height, _isDegrees, _isRadius,
|
|
48
|
-
|
|
47
|
+
from pygeodesy.units import Bearing_, Height, _isDegrees, _isRadius, Lamd, \
|
|
48
|
+
Phid, Radius_, Scalar
|
|
49
49
|
from pygeodesy.utily import acos1, asin1, atan1d, atan2d, degrees90, degrees180, \
|
|
50
50
|
degrees2m, m2radians, radiansPI2, sincos2_, tan_2, \
|
|
51
51
|
unrollPI, _unrollon, _unrollon3, _Wrap, wrap180, wrapPI
|
|
@@ -54,7 +54,7 @@ from pygeodesy.vector3d import sumOf, Vector3d
|
|
|
54
54
|
from math import asin, atan2, cos, degrees, fabs, radians, sin
|
|
55
55
|
|
|
56
56
|
__all__ = _ALL_LAZY.sphericalTrigonometry
|
|
57
|
-
__version__ = '24.
|
|
57
|
+
__version__ = '24.06.21'
|
|
58
58
|
|
|
59
59
|
_PI_EPS4 = PI - EPS4
|
|
60
60
|
if _PI_EPS4 >= PI:
|
|
@@ -73,7 +73,7 @@ class Cartesian(CartesianSphericalBase):
|
|
|
73
73
|
arguments. Use C{B{LatLon}=...} to override
|
|
74
74
|
this L{LatLon} class or specify C{B{LatLon}=None}.
|
|
75
75
|
|
|
76
|
-
@return: The geodetic point (L{LatLon}) or if B{
|
|
76
|
+
@return: The geodetic point (L{LatLon}) or if C{B{LatLon} is None},
|
|
77
77
|
an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)}
|
|
78
78
|
with C{C} and C{M} if available.
|
|
79
79
|
|
|
@@ -236,7 +236,7 @@ class LatLon(LatLonSphericalBase):
|
|
|
236
236
|
|
|
237
237
|
@return: Distance between this and the B{C{other}} point
|
|
238
238
|
(C{meter}, same units as B{C{radius}} or
|
|
239
|
-
C{radians} if B{
|
|
239
|
+
C{radians} if C{B{radius} is None}).
|
|
240
240
|
|
|
241
241
|
@raise TypeError: The B{C{other}} point is not L{LatLon}.
|
|
242
242
|
|
|
@@ -288,9 +288,9 @@ class LatLon(LatLonSphericalBase):
|
|
|
288
288
|
|
|
289
289
|
@return: Initial bearing (compass C{degrees360}).
|
|
290
290
|
|
|
291
|
-
@raise CrossError: If this and the B{C{other}} point coincide
|
|
292
|
-
|
|
293
|
-
|
|
291
|
+
@raise CrossError: If this and the B{C{other}} point coincide
|
|
292
|
+
and if B{C{raiser}} and L{crosserrors
|
|
293
|
+
<pygeodesy.crosserrors>} are both C{True}.
|
|
294
294
|
|
|
295
295
|
@raise TypeError: The B{C{other}} point is not L{LatLon}.
|
|
296
296
|
'''
|
|
@@ -638,19 +638,16 @@ class LatLon(LatLonSphericalBase):
|
|
|
638
638
|
LatLon=self.classof, **wrap_adjust_limit)
|
|
639
639
|
|
|
640
640
|
def toCartesian(self, **Cartesian_datum_kwds): # PYCHOK Cartesian=Cartesian, datum=None
|
|
641
|
-
'''Convert this point to C{Karney}-based cartesian (ECEF)
|
|
642
|
-
coordinates.
|
|
641
|
+
'''Convert this point to C{Karney}-based cartesian (ECEF) coordinates.
|
|
643
642
|
|
|
644
|
-
@kwarg Cartesian_datum_kwds: Optional L{Cartesian}, B{C{datum}}
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
C{B{Cartesian}
|
|
648
|
-
this L{Cartesian} class or specify
|
|
649
|
-
C{B{Cartesian}=None}.
|
|
643
|
+
@kwarg Cartesian_datum_kwds: Optional L{Cartesian}, B{C{datum}} and other
|
|
644
|
+
keyword arguments, ignored if C{B{Cartesian} is
|
|
645
|
+
None}. Use C{B{Cartesian}=...} to override this
|
|
646
|
+
L{Cartesian} class or specify C{B{Cartesian}=None}.
|
|
650
647
|
|
|
651
|
-
@return: The cartesian point (L{Cartesian}) or if B{
|
|
652
|
-
|
|
653
|
-
|
|
648
|
+
@return: The cartesian point (L{Cartesian}) or if C{B{Cartesian} is None},
|
|
649
|
+
an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with C{C}
|
|
650
|
+
and C{M} if available.
|
|
654
651
|
|
|
655
652
|
@raise TypeError: Invalid B{C{Cartesian_datum_kwds}} argument.
|
|
656
653
|
'''
|
|
@@ -662,15 +659,13 @@ class LatLon(LatLonSphericalBase):
|
|
|
662
659
|
|
|
663
660
|
@arg otherB: Second triangle point (C{LatLon}).
|
|
664
661
|
@arg otherC: Third triangle point (C{LatLon}).
|
|
665
|
-
@kwarg radius: Mean earth radius, ellipsoid or datum
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
B{C{otherB}} and B{C{otherC}} points (C{bool}).
|
|
662
|
+
@kwarg radius: Mean earth radius, ellipsoid or datum (C{meter}, L{Ellipsoid},
|
|
663
|
+
L{Ellipsoid2}, L{Datum} or L{a_f2Tuple}) or C{None}.
|
|
664
|
+
@kwarg wrap: If C{True}, wrap or I{normalize} and unroll points B{C{otherB}}
|
|
665
|
+
and B{C{otherC}} (C{bool}).
|
|
670
666
|
|
|
671
|
-
@return: L{Triangle7Tuple}C{(A, a, B, b, C, c, area)} or if
|
|
672
|
-
|
|
673
|
-
a, B, b, C, c, D, E)}.
|
|
667
|
+
@return: L{Triangle7Tuple}C{(A, a, B, b, C, c, area)} or if B{C{radius} is
|
|
668
|
+
None}, a L{Triangle8Tuple}C{(A, a, B, b, C, c, D, E)}.
|
|
674
669
|
|
|
675
670
|
@see: Function L{triangle7} and U{Spherical trigonometry
|
|
676
671
|
<https://WikiPedia.org/wiki/Spherical_trigonometry>}.
|
|
@@ -703,49 +698,45 @@ class LatLon(LatLonSphericalBase):
|
|
|
703
698
|
|
|
704
699
|
def trilaterate5(self, distance1, point2, distance2, point3, distance3,
|
|
705
700
|
area=True, eps=EPS1, radius=R_M, wrap=False):
|
|
706
|
-
'''Trilaterate three points by I{area overlap} or I{perimeter
|
|
707
|
-
|
|
701
|
+
'''Trilaterate three points by I{area overlap} or I{perimeter intersection}
|
|
702
|
+
of three corresponding circles.
|
|
708
703
|
|
|
709
|
-
@arg distance1: Distance to this point (C{meter}, same units
|
|
710
|
-
as B{C{radius}}).
|
|
704
|
+
@arg distance1: Distance to this point (C{meter}, same units as B{C{radius}}).
|
|
711
705
|
@arg point2: Second center point (C{LatLon}).
|
|
712
|
-
@arg distance2: Distance to point2 (C{meter}, same units as
|
|
713
|
-
B{C{radius}}).
|
|
706
|
+
@arg distance2: Distance to point2 (C{meter}, same units as B{C{radius}}).
|
|
714
707
|
@arg point3: Third center point (C{LatLon}).
|
|
715
|
-
@arg distance3: Distance to point3 (C{meter}, same units as
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
(C{meter}, same units as B{C{radius}}).
|
|
708
|
+
@arg distance3: Distance to point3 (C{meter}, same units as B{C{radius}}).
|
|
709
|
+
@kwarg area: If C{True} compute the area overlap, otherwise the perimeter
|
|
710
|
+
intersection of the circles (C{bool}).
|
|
711
|
+
@kwarg eps: The required I{minimal overlap} for C{B{area}=True} or the
|
|
712
|
+
I{intersection margin} if C{B{area}=False} (C{meter}, same
|
|
713
|
+
units as B{C{radius}}).
|
|
722
714
|
@kwarg radius: Mean earth radius (C{meter}, conventionally).
|
|
723
|
-
@kwarg wrap: If C{True}, wrap or I{normalize} and unroll
|
|
724
|
-
B{C{
|
|
715
|
+
@kwarg wrap: If C{True}, wrap or I{normalize} and unroll B{C{point2}} and
|
|
716
|
+
B{C{point3}} (C{bool}).
|
|
725
717
|
|
|
726
|
-
@return: A L{Trilaterate5Tuple}C{(min, minPoint, max, maxPoint, n)}
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
718
|
+
@return: A L{Trilaterate5Tuple}C{(min, minPoint, max, maxPoint, n)} with
|
|
719
|
+
C{min} and C{max} in C{meter}, same units as B{C{eps}}, the
|
|
720
|
+
corresponding trilaterated points C{minPoint} and C{maxPoint}
|
|
721
|
+
as I{spherical} C{LatLon} and C{n}, the number of trilatered
|
|
722
|
+
points found for the given B{C{eps}}.
|
|
731
723
|
|
|
732
|
-
If only a single trilaterated point is found, C{min I{is}
|
|
733
|
-
|
|
724
|
+
If only a single trilaterated point is found, C{min I{is} max},
|
|
725
|
+
C{minPoint I{is} maxPoint} and C{n = 1}.
|
|
734
726
|
|
|
735
|
-
For C{B{area}=True}, C{min} and C{max} are the smallest
|
|
736
|
-
|
|
727
|
+
For C{B{area}=True}, C{min} and C{max} are the smallest respectively
|
|
728
|
+
largest I{radial} overlap found.
|
|
737
729
|
|
|
738
|
-
For C{B{area}=False}, C{min} and C{max} represent the
|
|
739
|
-
|
|
730
|
+
For C{B{area}=False}, C{min} and C{max} represent the nearest
|
|
731
|
+
respectively farthest intersection margin.
|
|
740
732
|
|
|
741
|
-
If C{B{area}=True} and all 3 circles are concentric, C{n
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
largest B{C{distance#}}.
|
|
733
|
+
If C{B{area}=True} and all 3 circles are concentric, C{n=0} and
|
|
734
|
+
C{minPoint} and C{maxPoint} are both the B{C{point#}} with the
|
|
735
|
+
smallest B{C{distance#}} C{min} and C{max} the largest B{C{distance#}}.
|
|
745
736
|
|
|
746
737
|
@raise IntersectionError: Trilateration failed for the given B{C{eps}},
|
|
747
738
|
insufficient overlap for C{B{area}=True} or
|
|
748
|
-
no intersection or all (near-)concentric
|
|
739
|
+
no intersection or all (near-)concentric if
|
|
749
740
|
C{B{area}=False}.
|
|
750
741
|
|
|
751
742
|
@raise TypeError: Invalid B{C{point2}} or B{C{point3}}.
|
|
@@ -776,7 +767,7 @@ def areaOf(points, radius=R_M, wrap=False): # was=True
|
|
|
776
767
|
(C{bool}).
|
|
777
768
|
|
|
778
769
|
@return: Polygon area (C{meter} I{quared}, same units as B{C{radius}}
|
|
779
|
-
or C{radians} if B{
|
|
770
|
+
or C{radians} if C{B{radius} is None}).
|
|
780
771
|
|
|
781
772
|
@raise PointsError: Insufficient number of B{C{points}}.
|
|
782
773
|
|
|
@@ -1173,18 +1164,15 @@ def meanOf(points, height=None, wrap=False, LatLon=LatLon, **LatLon_kwds):
|
|
|
1173
1164
|
'''Compute the I{geographic} mean of several points.
|
|
1174
1165
|
|
|
1175
1166
|
@arg points: Points to be averaged (L{LatLon}[]).
|
|
1176
|
-
@kwarg height: Optional height at mean point, overriding the mean
|
|
1177
|
-
|
|
1178
|
-
@kwarg wrap: If C{True}, wrap or I{normalize} the B{C{points}}
|
|
1179
|
-
|
|
1180
|
-
@kwarg
|
|
1181
|
-
|
|
1182
|
-
@kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword
|
|
1183
|
-
arguments, ignored if C{B{LatLon} is None}.
|
|
1167
|
+
@kwarg height: Optional height at mean point, overriding the mean height
|
|
1168
|
+
(C{meter}).
|
|
1169
|
+
@kwarg wrap: If C{True}, wrap or I{normalize} the B{C{points}} (C{bool}).
|
|
1170
|
+
@kwarg LatLon: Optional class to return the mean point (L{LatLon}) or C{None}.
|
|
1171
|
+
@kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword arguments,
|
|
1172
|
+
ignored if C{B{LatLon} is None}.
|
|
1184
1173
|
|
|
1185
|
-
@return: The geographic mean and height (B{C{LatLon}}) or
|
|
1186
|
-
L{LatLon3Tuple}C{(lat, lon, height)}
|
|
1187
|
-
is C{None}.
|
|
1174
|
+
@return: The geographic mean and height (B{C{LatLon}}) or if C{B{LatLon}
|
|
1175
|
+
is None}, a L{LatLon3Tuple}C{(lat, lon, height)}.
|
|
1188
1176
|
|
|
1189
1177
|
@raise TypeError: Some B{C{points}} are not L{LatLon}.
|
|
1190
1178
|
|
|
@@ -1210,7 +1198,7 @@ def nearestOn2(point, points, **closed_radius_LatLon_options): # PYCHOK no cove
|
|
|
1210
1198
|
point (L{LatLon}) on the polygon and the C{distance}
|
|
1211
1199
|
between the C{closest} and the given B{C{point}}. The
|
|
1212
1200
|
C{closest} is a B{C{LatLon}} or a L{LatLon2Tuple}C{(lat,
|
|
1213
|
-
lon)} if B{
|
|
1201
|
+
lon)} if C{B{LatLon} is None} ...
|
|
1214
1202
|
'''
|
|
1215
1203
|
ll, d, _ = nearestOn3(point, points, **closed_radius_LatLon_options) # PYCHOK 3-tuple
|
|
1216
1204
|
if _xkwds_get(closed_radius_LatLon_options, LatLon=LatLon) is None:
|
|
@@ -1222,8 +1210,8 @@ def nearestOn3(point, points, closed=False, radius=R_M, wrap=False, adjust=True,
|
|
|
1222
1210
|
limit=9, **LatLon_and_kwds):
|
|
1223
1211
|
'''Locate the point on a path or polygon closest to a reference point.
|
|
1224
1212
|
|
|
1225
|
-
Distances are I{approximated} using function L{
|
|
1226
|
-
subject to the supplied B{C{options}}.
|
|
1213
|
+
Distances are I{approximated} using function L{equirectangular4
|
|
1214
|
+
<pygeodesy.equirectangular4>}, subject to the supplied B{C{options}}.
|
|
1227
1215
|
|
|
1228
1216
|
@arg point: The reference point (L{LatLon}).
|
|
1229
1217
|
@arg points: The path or polygon points (L{LatLon}[]).
|
|
@@ -1231,27 +1219,27 @@ def nearestOn3(point, points, closed=False, radius=R_M, wrap=False, adjust=True,
|
|
|
1231
1219
|
@kwarg radius: Mean earth radius (C{meter}).
|
|
1232
1220
|
@kwarg wrap: If C{True}, wrap or I{normalize} and unroll the
|
|
1233
1221
|
B{C{points}} (C{bool}).
|
|
1234
|
-
@kwarg adjust: See function L{pygeodesy.equirectangular4}
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1222
|
+
@kwarg adjust: See function L{equirectangular4<pygeodesy.equirectangular4>}
|
|
1223
|
+
(C{bool}).
|
|
1224
|
+
@kwarg limit: See function L{equirectangular4<pygeodesy.equirectangular4>}
|
|
1225
|
+
(C{degrees}), default C{9 degrees} is about C{1,000 Km} (for
|
|
1226
|
+
(mean spherical earth radius L{R_KM}).
|
|
1227
|
+
@kwarg LatLon_and_kwds: Optional class C{B{LatLon}=L{LatLon}} to return the
|
|
1228
|
+
closest point and optional, additional C{B{LatLon}} keyword
|
|
1229
|
+
arguments or specify C{B{LatLon}=None}.
|
|
1242
1230
|
|
|
1243
1231
|
@return: A L{NearestOn3Tuple}C{(closest, distance, angle)} with the
|
|
1244
1232
|
C{closest} point as B{C{LatLon}} or L{LatLon3Tuple}C{(lat,
|
|
1245
|
-
lon, height)} if B{
|
|
1246
|
-
|
|
1247
|
-
C{closest} and the given B{C{point}} converted to
|
|
1248
|
-
same units as B{C{radius}}. The C{angle} from the
|
|
1249
|
-
B{C{point}} to the C{closest} is in compass C{degrees360},
|
|
1250
|
-
like function L{pygeodesy.compassAngle}. The
|
|
1251
|
-
the (interpolated) height at the C{closest} point.
|
|
1233
|
+
lon, height)} if C{B{LatLon} is None}. The C{distance} is
|
|
1234
|
+
the L{equirectangular4<pygeodesy.equirectangular4>} distance
|
|
1235
|
+
between the C{closest} and the given B{C{point}} converted to
|
|
1236
|
+
C{meter}, same units as B{C{radius}}. The C{angle} from the
|
|
1237
|
+
given B{C{point}} to the C{closest} is in compass C{degrees360},
|
|
1238
|
+
like function L{compassAngle<pygeodesy.compassAngle>}. The
|
|
1239
|
+
C{height} is the (interpolated) height at the C{closest} point.
|
|
1252
1240
|
|
|
1253
1241
|
@raise LimitError: Lat- and/or longitudinal delta exceeds the B{C{limit}},
|
|
1254
|
-
see function L{pygeodesy.equirectangular4}.
|
|
1242
|
+
see function L{equirectangular4<pygeodesy.equirectangular4>}.
|
|
1255
1243
|
|
|
1256
1244
|
@raise PointsError: Insufficient number of B{C{points}}.
|
|
1257
1245
|
|
|
@@ -1259,7 +1247,8 @@ def nearestOn3(point, points, closed=False, radius=R_M, wrap=False, adjust=True,
|
|
|
1259
1247
|
|
|
1260
1248
|
@raise ValueError: Invalid B{C{radius}}.
|
|
1261
1249
|
|
|
1262
|
-
@see: Functions L{pygeodesy.equirectangular4} and
|
|
1250
|
+
@see: Functions L{equirectangular4<pygeodesy.equirectangular4>} and
|
|
1251
|
+
L{nearestOn5<pygeodesy.nearestOn5>}.
|
|
1263
1252
|
'''
|
|
1264
1253
|
t = _nearestOn5(point, points, closed=closed, wrap=wrap,
|
|
1265
1254
|
adjust=adjust, limit=limit)
|
|
@@ -1285,7 +1274,7 @@ def perimeterOf(points, closed=False, radius=R_M, wrap=True):
|
|
|
1285
1274
|
B{C{points}} (C{bool}).
|
|
1286
1275
|
|
|
1287
1276
|
@return: Polygon perimeter (C{meter}, same units as B{C{radius}}
|
|
1288
|
-
or C{radians} if B{
|
|
1277
|
+
or C{radians} if C{B{radius} is None}).
|
|
1289
1278
|
|
|
1290
1279
|
@raise PointsError: Insufficient number of B{C{points}}.
|
|
1291
1280
|
|
|
@@ -1294,7 +1283,7 @@ def perimeterOf(points, closed=False, radius=R_M, wrap=True):
|
|
|
1294
1283
|
@raise ValueError: Invalid B{C{radius}} or C{B{closed}=False} with
|
|
1295
1284
|
C{B{points}} a composite.
|
|
1296
1285
|
|
|
1297
|
-
@note: Distances are based on function L{pygeodesy.vincentys_}.
|
|
1286
|
+
@note: Distances are based on function L{vincentys_<pygeodesy.vincentys_>}.
|
|
1298
1287
|
|
|
1299
1288
|
@see: Functions L{perimeterOf<pygeodesy.perimeterOf>},
|
|
1300
1289
|
L{sphericalNvector.perimeterOf} and L{ellipsoidalKarney.perimeterOf}.
|
|
@@ -1333,7 +1322,7 @@ def triangle7(latA, lonA, latB, lonB, latC, lonC, radius=R_M,
|
|
|
1333
1322
|
or C{None}.
|
|
1334
1323
|
@kwarg excess: I{Spherical excess} callable (L{excessAbc_},
|
|
1335
1324
|
L{excessGirard_} or L{excessLHuilier_}).
|
|
1336
|
-
@kwarg wrap: If C{True}, wrap and L{pygeodesy.unroll180}
|
|
1325
|
+
@kwarg wrap: If C{True}, wrap and L{unroll180<pygeodesy.unroll180>}
|
|
1337
1326
|
longitudes (C{bool}).
|
|
1338
1327
|
|
|
1339
1328
|
@return: A L{Triangle7Tuple}C{(A, a, B, b, C, c, area)} with
|
|
@@ -1345,9 +1334,9 @@ def triangle7(latA, lonA, latB, lonB, latC, lonC, radius=R_M,
|
|
|
1345
1334
|
C{radians} with the I{spherical excess} C{E} as the
|
|
1346
1335
|
C{unit area} in C{radians}.
|
|
1347
1336
|
'''
|
|
1348
|
-
t = triangle8_(
|
|
1349
|
-
|
|
1350
|
-
|
|
1337
|
+
t = triangle8_(Phid(latA=latA), Lamd(lonA=lonA),
|
|
1338
|
+
Phid(latB=latB), Lamd(lonB=lonB),
|
|
1339
|
+
Phid(latC=latC), Lamd(lonC=lonC),
|
|
1351
1340
|
excess=excess, wrap=wrap)
|
|
1352
1341
|
return _t7Tuple(t, radius)
|
|
1353
1342
|
|
|
@@ -1365,7 +1354,7 @@ def triangle8_(phiA, lamA, phiB, lamB, phiC, lamC, excess=excessAbc_,
|
|
|
1365
1354
|
@arg lamC: Third corner longitude (C{radians}).
|
|
1366
1355
|
@kwarg excess: I{Spherical excess} callable (L{excessAbc_},
|
|
1367
1356
|
L{excessGirard_} or L{excessLHuilier_}).
|
|
1368
|
-
@kwarg wrap: If C{True}, L{pygeodesy.unrollPI} the
|
|
1357
|
+
@kwarg wrap: If C{True}, L{unrollPI<pygeodesy.unrollPI>} the
|
|
1369
1358
|
longitudinal deltas (C{bool}).
|
|
1370
1359
|
|
|
1371
1360
|
@return: A L{Triangle8Tuple}C{(A, a, B, b, C, c, D, E)} with
|
pygeodesy/streprs.py
CHANGED
|
@@ -7,8 +7,8 @@ u'''Floating point and other formatting utilities.
|
|
|
7
7
|
from pygeodesy.basics import isint, islistuple, isscalar, isstr, itemsorted, \
|
|
8
8
|
_zip, _0_0
|
|
9
9
|
# from pygeodesy.constants import _0_0
|
|
10
|
-
from pygeodesy.errors import _or,
|
|
11
|
-
|
|
10
|
+
from pygeodesy.errors import _or, _IsnotError, _TypeError, _ValueError, \
|
|
11
|
+
_xkwds_get, _xkwds_item2
|
|
12
12
|
# from pygeodesy.internals import _dunder_nameof # from .lazily
|
|
13
13
|
from pygeodesy.interns import NN, _0_, _0to9_, MISSING, _BAR_, _COMMASPACE_, \
|
|
14
14
|
_DOT_, _E_, _ELLIPSIS_, _EQUAL_, _H_, _LR_PAIRS, \
|
|
@@ -22,7 +22,7 @@ from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS, _dunder_nameof
|
|
|
22
22
|
from math import fabs, log10 as _log10
|
|
23
23
|
|
|
24
24
|
__all__ = _ALL_LAZY.streprs
|
|
25
|
-
__version__ = '24.06.
|
|
25
|
+
__version__ = '24.06.15'
|
|
26
26
|
|
|
27
27
|
_at_ = 'at' # PYCHOK used!
|
|
28
28
|
_EN_PREC = 6 # max MGRS/OSGR precision, 1 micrometer
|
|
@@ -141,7 +141,6 @@ class Fmt(object):
|
|
|
141
141
|
ROPEN = _Fmt('[%s)') # right-open range [L, R)
|
|
142
142
|
# SPACE = _Fmt(' %s') # == _SPACE_(n, v)
|
|
143
143
|
SQUARE = _Fmt('[%s]') # BRACKETS
|
|
144
|
-
sub_class = _Sub('%s (sub-)class')
|
|
145
144
|
TAG = ANGLE
|
|
146
145
|
TAGEND = _Fmt('</%s>')
|
|
147
146
|
tolerance = _Fmt(_tolerance_(_PAREN_g))
|
|
@@ -447,7 +446,7 @@ def pairs(items, prec=6, fmt=Fmt.F, ints=False, sep=_EQUAL_):
|
|
|
447
446
|
# can't unzip empty items tuple, list, etc.
|
|
448
447
|
n, v = _zip(*items) if items else ((), ()) # strict=True
|
|
449
448
|
except (TypeError, ValueError):
|
|
450
|
-
raise _IsnotError(dict
|
|
449
|
+
raise _IsnotError(dict, '2-tuples', items=items)
|
|
451
450
|
v = _streprs(prec, v, fmt, ints, False, repr)
|
|
452
451
|
return tuple(sep.join(t) for t in _zip(map(str, n), v)) # strict=True
|
|
453
452
|
|
|
@@ -580,35 +579,6 @@ def _0wpF(*w_p_f): # in .dms, .osgr
|
|
|
580
579
|
return '%0*.*f' % w_p_f # XXX was F
|
|
581
580
|
|
|
582
581
|
|
|
583
|
-
def _xattrs(insto, other, *attrs): # see .errors._xattr
|
|
584
|
-
'''(INTERNAL) Copy attribute values from B{C{other}} to B{C{insto}}.
|
|
585
|
-
|
|
586
|
-
@arg insto: Object to copy attribute values to (any C{type}).
|
|
587
|
-
@arg other: Object to copy attribute values from (any C{type}).
|
|
588
|
-
@arg attrs: One or more attribute names (C{str}s).
|
|
589
|
-
|
|
590
|
-
@return: Object B{C{insto}}, updated.
|
|
591
|
-
|
|
592
|
-
@raise AttributeError: An B{C{attrs}} doesn't exist
|
|
593
|
-
or is not settable.
|
|
594
|
-
'''
|
|
595
|
-
def _getattr(o, a):
|
|
596
|
-
if hasattr(o, a):
|
|
597
|
-
return getattr(o, a)
|
|
598
|
-
try:
|
|
599
|
-
n = o._DOT_(a)
|
|
600
|
-
except AttributeError:
|
|
601
|
-
n = Fmt.DOT(a)
|
|
602
|
-
raise _AttributeError(o, name=n)
|
|
603
|
-
|
|
604
|
-
for a in attrs:
|
|
605
|
-
s = _getattr(other, a)
|
|
606
|
-
g = _getattr(insto, a)
|
|
607
|
-
if (g is None and s is not None) or g != s:
|
|
608
|
-
setattr(insto, a, s) # not settable?
|
|
609
|
-
return insto
|
|
610
|
-
|
|
611
|
-
|
|
612
582
|
def _xzipairs(names, values, sep=_COMMASPACE_, fmt=NN, pair_fmt=Fmt.COLON):
|
|
613
583
|
'''(INTERNAL) Zip C{names} and C{values} into a C{str}, joined and bracketed.
|
|
614
584
|
'''
|