pygeodesy 25.5.25__py2.py3-none-any.whl → 25.5.28__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 +1 -1
- pygeodesy/__main__.py +2 -1
- pygeodesy/booleans.py +10 -10
- pygeodesy/constants.py +6 -6
- pygeodesy/css.py +1 -1
- pygeodesy/ellipsoidalExact.py +22 -27
- pygeodesy/ellipsoidalGeodSolve.py +19 -19
- pygeodesy/ellipsoidalKarney.py +22 -27
- pygeodesy/ellipsoidalVincenty.py +12 -11
- pygeodesy/elliptic.py +15 -10
- pygeodesy/frechet.py +2 -2
- pygeodesy/geodesicw.py +27 -8
- pygeodesy/geodesicx/gx.py +51 -47
- pygeodesy/geodesicx/gxarea.py +53 -64
- pygeodesy/geodesicx/gxbases.py +12 -2
- pygeodesy/geodesicx/gxline.py +9 -6
- pygeodesy/geoids.py +1 -1
- pygeodesy/hausdorff.py +2 -2
- pygeodesy/heights.py +4 -4
- pygeodesy/internals.py +2 -2
- pygeodesy/interns.py +5 -5
- pygeodesy/karney.py +27 -11
- pygeodesy/lcc.py +2 -2
- pygeodesy/props.py +3 -3
- pygeodesy/sphericalBase.py +3 -3
- pygeodesy/sphericalNvector.py +18 -15
- pygeodesy/sphericalTrigonometry.py +19 -20
- pygeodesy/vector2d.py +2 -2
- {pygeodesy-25.5.25.dist-info → pygeodesy-25.5.28.dist-info}/METADATA +2 -2
- {pygeodesy-25.5.25.dist-info → pygeodesy-25.5.28.dist-info}/RECORD +32 -32
- {pygeodesy-25.5.25.dist-info → pygeodesy-25.5.28.dist-info}/WHEEL +0 -0
- {pygeodesy-25.5.25.dist-info → pygeodesy-25.5.28.dist-info}/top_level.txt +0 -0
pygeodesy/internals.py
CHANGED
|
@@ -132,7 +132,7 @@ class _MODS_Base(object):
|
|
|
132
132
|
def name(self):
|
|
133
133
|
'''Get this name (C{str}).
|
|
134
134
|
'''
|
|
135
|
-
return typename(self
|
|
135
|
+
return typename(type(self))
|
|
136
136
|
|
|
137
137
|
@_Property_RO
|
|
138
138
|
def nix2(self): # PYCHOK no cover
|
|
@@ -686,7 +686,7 @@ def _versions(sep=_SPACE_):
|
|
|
686
686
|
|
|
687
687
|
|
|
688
688
|
__all__ = tuple(map(typename, (machine, print_, printf, typename)))
|
|
689
|
-
__version__ = '25.
|
|
689
|
+
__version__ = '25.05.26'
|
|
690
690
|
|
|
691
691
|
if __name__ == _DMAIN_:
|
|
692
692
|
|
pygeodesy/interns.py
CHANGED
|
@@ -443,15 +443,15 @@ _LR_PAIRS = {_LANGLE_: _RANGLE_,
|
|
|
443
443
|
|
|
444
444
|
__all__ = (_NN_, # NOT MISSING!
|
|
445
445
|
Str_.__name__) # classes
|
|
446
|
-
__version__ = '25.
|
|
446
|
+
__version__ = '25.05.26'
|
|
447
447
|
|
|
448
448
|
if __name__ == _DMAIN_:
|
|
449
449
|
|
|
450
|
-
def _main():
|
|
450
|
+
def _main(globalocals):
|
|
451
451
|
from pygeodesy import itemsorted, printf
|
|
452
452
|
|
|
453
453
|
t = b = 0
|
|
454
|
-
for n, v in itemsorted(
|
|
454
|
+
for n, v in itemsorted(globalocals, asorted=False, reverse=True):
|
|
455
455
|
if n.endswith(_UNDER_) and n.startswith(_UNDER_) and \
|
|
456
456
|
not n.startswith(_DUNDER_):
|
|
457
457
|
t += 1
|
|
@@ -459,10 +459,10 @@ if __name__ == _DMAIN_:
|
|
|
459
459
|
m = n[1:-1]
|
|
460
460
|
if m != v and m.replace(_UNDER_, _SPACE_) != v:
|
|
461
461
|
printf('%4d: %s = %r', t, n, v)
|
|
462
|
-
n = len(
|
|
462
|
+
n = len(globalocals)
|
|
463
463
|
printf('%4d (%d) names, %s chars total, %.2f chars avg', t, n, b, float(b) / t, nl=1)
|
|
464
464
|
|
|
465
|
-
_main()
|
|
465
|
+
_main(globals()) # or locals()
|
|
466
466
|
|
|
467
467
|
# **) MIT License
|
|
468
468
|
#
|
pygeodesy/karney.py
CHANGED
|
@@ -166,7 +166,7 @@ from pygeodesy.utily import atan2d, sincos2d, tand, _unrollon, fabs
|
|
|
166
166
|
# from math import fabs # from .utily
|
|
167
167
|
|
|
168
168
|
__all__ = _ALL_LAZY.karney
|
|
169
|
-
__version__ = '25.05.
|
|
169
|
+
__version__ = '25.05.28'
|
|
170
170
|
|
|
171
171
|
_2_4_ = '2.4'
|
|
172
172
|
_K_2_0 = _getenv(_PYGEODESY_ENV(typename(_xgeographiclib)[2:]), _2_)
|
|
@@ -240,6 +240,8 @@ class Caps(object):
|
|
|
240
240
|
|
|
241
241
|
C{LONG_UNROLL} - unroll C{lon2} in method C{.Direct},
|
|
242
242
|
|
|
243
|
+
C{NONFINITONAN} - set all C{GDict} items to C{NAN} iff any argument is C{non-finite}.
|
|
244
|
+
|
|
243
245
|
C{REDUCEDLENGTH} - compute the reduced length C{m12},
|
|
244
246
|
|
|
245
247
|
C{REVERSE2} - reverse azimuth C{azi2} by 180 degrees,
|
|
@@ -274,7 +276,7 @@ class Caps(object):
|
|
|
274
276
|
|
|
275
277
|
LINE_CAPS = STANDARD_LINE | REDUCEDLENGTH | GEODESICSCALE # .geodesici only
|
|
276
278
|
LONG_UNROLL = 1 << 15 # unroll C{lon2} in .Direct and .Position
|
|
277
|
-
|
|
279
|
+
NONFINITONAN = 1 << 16 # see method GDict._toNAN
|
|
278
280
|
LINE_OFF = 1 << 17 # Line without updates from parent geodesic or rhumb
|
|
279
281
|
REVERSE2 = 1 << 18 # reverse C{azi2}
|
|
280
282
|
ALL = 0x7F80 | _CAP_ALL # without LONG_UNROLL, LINE_OFF, REVERSE2 and _DEBUG_*
|
|
@@ -327,9 +329,12 @@ if _FOR_DOCS: # PYCHOK force ...
|
|
|
327
329
|
else:
|
|
328
330
|
Caps = Caps() # PYCHOK singleton
|
|
329
331
|
|
|
330
|
-
_key2Caps = dict(a12 =Caps.DISTANCE, # in GDict._unCaps
|
|
332
|
+
_key2Caps = dict(a12 =Caps.DISTANCE, # in GDict._toNAN, -._unCaps
|
|
333
|
+
azi1=Caps.AZIMUTH,
|
|
331
334
|
azi2=Caps.AZIMUTH,
|
|
335
|
+
lat1=Caps.LATITUDE,
|
|
332
336
|
lat2=Caps.LATITUDE,
|
|
337
|
+
lon1=Caps.LONGITUDE,
|
|
333
338
|
lon2=Caps.LONGITUDE,
|
|
334
339
|
m12 =Caps.REDUCEDLENGTH,
|
|
335
340
|
M12 =Caps.GEODESICSCALE,
|
|
@@ -353,6 +358,7 @@ class _CapsBase(_NamedBase): # in .auxilats, .geodesicx.gxbases
|
|
|
353
358
|
LINE_OFF = Caps.LINE_OFF
|
|
354
359
|
LONGITUDE = Caps.LONGITUDE
|
|
355
360
|
LONG_UNROLL = Caps.LONG_UNROLL
|
|
361
|
+
NONFINITONAN = Caps.NONFINITONAN
|
|
356
362
|
REDUCEDLENGTH = Caps.REDUCEDLENGTH
|
|
357
363
|
STANDARD = Caps.STANDARD
|
|
358
364
|
STANDARD_LINE = Caps.STANDARD_LINE # for geodesici
|
|
@@ -449,11 +455,14 @@ class GDict(ADict): # XXX _NamedDict
|
|
|
449
455
|
'''
|
|
450
456
|
return self._toTuple(Inverse10Tuple, dflt)
|
|
451
457
|
|
|
452
|
-
def _toNAN(self, outmask): # .GeodesicLineExact._GenPosition
|
|
458
|
+
def _toNAN(self, outmask): # .GeodesicExact._GDistInverse, .GeodesicLineExact._GenPosition
|
|
453
459
|
'''(INTERNAL) Convert this C{GDict} to all C{NAN}s.
|
|
454
460
|
'''
|
|
455
|
-
|
|
456
|
-
|
|
461
|
+
if (outmask & Caps.NONFINITONAN):
|
|
462
|
+
d = dict((k, NAN) for k, C in _key2Caps.items()
|
|
463
|
+
if (outmask & C) == C)
|
|
464
|
+
self.set_(**d)
|
|
465
|
+
return self
|
|
457
466
|
|
|
458
467
|
@deprecated_method
|
|
459
468
|
def toRhumb7Tuple(self, dflt=NAN): # PYCHOK no cover
|
|
@@ -543,7 +552,7 @@ class Inverse10Tuple(_GTuple):
|
|
|
543
552
|
**updates) # PYCHOK indent
|
|
544
553
|
|
|
545
554
|
|
|
546
|
-
class _kWrapped(
|
|
555
|
+
class _kWrapped(_CapsBase): # in .geodesicw
|
|
547
556
|
'''(INTERNAL) Wrapper for some of I{Karney}'s U{geographiclib
|
|
548
557
|
<https://PyPI.org/project/geographiclib>} classes.
|
|
549
558
|
'''
|
|
@@ -554,13 +563,15 @@ class _kWrapped(object): # in .geodesicw
|
|
|
554
563
|
<https://PyPI.org/project/geographiclib>} package is installed,
|
|
555
564
|
otherwise raise a C{LazyImportError}.
|
|
556
565
|
'''
|
|
557
|
-
g = _xgeographiclib(type(self)
|
|
566
|
+
g = _xgeographiclib(type(self), 1, 49)
|
|
558
567
|
from geographiclib.geodesic import Geodesic
|
|
559
568
|
g.Geodesic = Geodesic
|
|
560
569
|
from geographiclib.geodesicline import GeodesicLine
|
|
561
570
|
g.GeodesicLine = GeodesicLine
|
|
562
571
|
from geographiclib.geomath import Math
|
|
563
572
|
g.Math = Math
|
|
573
|
+
# from geographiclib.polygonarea import PolygonArea
|
|
574
|
+
# g.PolygonArea = PolygonArea # see below
|
|
564
575
|
return g
|
|
565
576
|
|
|
566
577
|
@property_ROnce
|
|
@@ -586,6 +597,11 @@ class _kWrapped(object): # in .geodesicw
|
|
|
586
597
|
return (_2_4_ if _K_2_4 else
|
|
587
598
|
(_2_ if _K_2_0 else _1_)) if self.Math else NN
|
|
588
599
|
|
|
600
|
+
@property_ROnce
|
|
601
|
+
def _PolygonArea(self): # lazy import
|
|
602
|
+
from geographiclib.polygonarea import PolygonArea
|
|
603
|
+
return PolygonArea
|
|
604
|
+
|
|
589
605
|
_wrapped = _kWrapped() # PYCHOK singleton, .datum, .test/base.py
|
|
590
606
|
|
|
591
607
|
|
|
@@ -830,7 +846,7 @@ def _norm180(deg): # mimick geomath.Math.AngNormalize
|
|
|
830
846
|
return d
|
|
831
847
|
|
|
832
848
|
|
|
833
|
-
def _polygon(geodesic, points, closed, line, wrap):
|
|
849
|
+
def _polygon(geodesic, points, closed, line, wrap, polar):
|
|
834
850
|
'''(INTERNAL) Compute the area or perimeter of a polygon,
|
|
835
851
|
using a L{GeodesicExact}, L{GeodesicSolve} or (if the
|
|
836
852
|
C{geographiclib} package is installed) a C{Geodesic}
|
|
@@ -848,7 +864,7 @@ def _polygon(geodesic, points, closed, line, wrap):
|
|
|
848
864
|
if not closed: # closed only
|
|
849
865
|
raise _ValueError(closed=closed, points=_composite_)
|
|
850
866
|
|
|
851
|
-
return points._sum1(_a_p, closed, line, wrap)
|
|
867
|
+
return points._sum1(_a_p, closed, line, wrap, polar)
|
|
852
868
|
|
|
853
869
|
gP = geodesic.Polygon(line)
|
|
854
870
|
_A = gP.AddPoint
|
|
@@ -867,7 +883,7 @@ def _polygon(geodesic, points, closed, line, wrap):
|
|
|
867
883
|
_A(p0.lat, p0.lon)
|
|
868
884
|
|
|
869
885
|
# gP.Compute returns (number_of_points, perimeter, signed area)
|
|
870
|
-
return gP.Compute(False, True)[1 if line else 2]
|
|
886
|
+
return gP.Compute(reverse=False, sign=True, polar=polar)[1 if line else 2]
|
|
871
887
|
|
|
872
888
|
|
|
873
889
|
try:
|
pygeodesy/lcc.py
CHANGED
|
@@ -50,7 +50,7 @@ from pygeodesy.utily import atan1, degrees90, degrees180, sincos2, tanPI_2_2
|
|
|
50
50
|
from math import atan, fabs, log, radians, sin, sqrt
|
|
51
51
|
|
|
52
52
|
__all__ = _ALL_LAZY.lcc
|
|
53
|
-
__version__ = '25.05.
|
|
53
|
+
__version__ = '25.05.26'
|
|
54
54
|
|
|
55
55
|
_E0_ = 'E0'
|
|
56
56
|
_N0_ = 'N0'
|
|
@@ -457,7 +457,7 @@ class Lcc(_NamedBase):
|
|
|
457
457
|
# h=self.height, conic=self.conic,
|
|
458
458
|
# name=self._name__(name))
|
|
459
459
|
# args, kwds = _args_kwds(**kwds)
|
|
460
|
-
# return self
|
|
460
|
+
# return type(self)(*args, **kwds) # .classof
|
|
461
461
|
|
|
462
462
|
@Property_RO
|
|
463
463
|
def easting(self):
|
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.05.
|
|
29
|
+
__version__ = '25.05.26'
|
|
30
30
|
|
|
31
31
|
_class_ = 'class'
|
|
32
32
|
_DNL_ = _NL_ * 2 # PYCHOK used!
|
|
@@ -347,7 +347,7 @@ class property_RO(_PropertyBase):
|
|
|
347
347
|
if Clas: # overrides inst.__class__
|
|
348
348
|
d = Clas[0].__dict__.get(uname, MISSING)
|
|
349
349
|
else:
|
|
350
|
-
d = getattr(inst
|
|
350
|
+
d = getattr(type(inst), uname, MISSING)
|
|
351
351
|
# if d is MISSING: # XXX superfluous
|
|
352
352
|
# for c in type(inst).__mro__[:-1]:
|
|
353
353
|
# if uname in c.__dict__:
|
|
@@ -403,7 +403,7 @@ class property_ROver(_property_RO___):
|
|
|
403
403
|
'''
|
|
404
404
|
v = self.method(inst)
|
|
405
405
|
n = self.name
|
|
406
|
-
C = inst
|
|
406
|
+
C = type(inst)
|
|
407
407
|
for c in C.__mro__: # [:-1]
|
|
408
408
|
if getattr(c, n, None) is self:
|
|
409
409
|
setattr(c, n, v) # overwrite property_ROver
|
pygeodesy/sphericalBase.py
CHANGED
|
@@ -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.05.
|
|
43
|
+
__version__ = '25.05.26'
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
class CartesianSphericalBase(CartesianBase):
|
|
@@ -592,7 +592,7 @@ def _intersecant2(c, r, p, b, radius=R_M, exact=False, height=None, wrap=False):
|
|
|
592
592
|
p = _unrollon(c, p, wrap=wrap)
|
|
593
593
|
nonexact = exact is None
|
|
594
594
|
|
|
595
|
-
if not isinstanceof(r, c
|
|
595
|
+
if not isinstanceof(r, type(c), type(p)):
|
|
596
596
|
r = Radius_(circle=r)
|
|
597
597
|
elif nonexact:
|
|
598
598
|
r = c.distanceTo(r, radius=radius, wrap=wrap)
|
|
@@ -601,7 +601,7 @@ def _intersecant2(c, r, p, b, radius=R_M, exact=False, height=None, wrap=False):
|
|
|
601
601
|
else:
|
|
602
602
|
raise _ValueError(exact=exact)
|
|
603
603
|
|
|
604
|
-
if not isinstanceof(b, c
|
|
604
|
+
if not isinstanceof(b, type(c), type(p)):
|
|
605
605
|
b = Bearing(b)
|
|
606
606
|
elif nonexact:
|
|
607
607
|
b = p.initialBearingTo(b, wrap=wrap)
|
pygeodesy/sphericalNvector.py
CHANGED
|
@@ -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.05.
|
|
65
|
+
__version__ = '25.05.27'
|
|
66
66
|
|
|
67
67
|
_lines_ = 'lines'
|
|
68
68
|
|
|
@@ -782,18 +782,19 @@ class Nvector(NvectorBase):
|
|
|
782
782
|
_Nv00 = LatLon(_0_0, _0_0, name=_Nv00_) # reference instance (L{LatLon})
|
|
783
783
|
|
|
784
784
|
|
|
785
|
-
def areaOf(points, radius=R_M, wrap=False):
|
|
785
|
+
def areaOf(points, radius=R_M, wrap=False, polar=False):
|
|
786
786
|
'''Calculate the area of a (spherical) polygon or composite (with
|
|
787
787
|
great circle arcs joining consecutive points).
|
|
788
788
|
|
|
789
|
-
@arg points: The polygon points or clips (C{LatLon}[],
|
|
790
|
-
|
|
789
|
+
@arg points: The polygon points or clips (C{LatLon}[], L{BooleanFHP}
|
|
790
|
+
or L{BooleanGH}).
|
|
791
791
|
@kwarg radius: Mean earth radius (C{meter}) or C{None}.
|
|
792
|
-
@kwarg wrap: If C{True}, wrap or I{normalize} and unroll the
|
|
793
|
-
|
|
792
|
+
@kwarg wrap: If C{True}, wrap or I{normalize} and unroll the B{C{points}}
|
|
793
|
+
(C{bool}).
|
|
794
|
+
@kwarg polar: Use of C{B{polar}=True} not implemented (C{bool}).
|
|
794
795
|
|
|
795
|
-
@return: Polygon area (C{meter} I{squared}, same units as
|
|
796
|
-
|
|
796
|
+
@return: Polygon area (C{meter} I{squared}, same units as B{C{radius}},
|
|
797
|
+
or C{radians} if C{B{radius} is None}).
|
|
797
798
|
|
|
798
799
|
@raise PointsError: Insufficient number of B{C{points}}.
|
|
799
800
|
|
|
@@ -802,6 +803,9 @@ def areaOf(points, radius=R_M, wrap=False):
|
|
|
802
803
|
@see: Functions L{pygeodesy.areaOf}, L{sphericalTrigonometry.areaOf}
|
|
803
804
|
and L{ellipsoidalKarney.areaOf}.
|
|
804
805
|
'''
|
|
806
|
+
if polar:
|
|
807
|
+
notImplemented(None, polar=polar, up=2)
|
|
808
|
+
|
|
805
809
|
def _interangles(ps, w): # like .karney._polygon
|
|
806
810
|
Ps = _Nv00.PointsIter(ps, loop=2, wrap=w)
|
|
807
811
|
# use vector to 1st point as plane normal for sign of α
|
|
@@ -824,15 +828,14 @@ def areaOf(points, radius=R_M, wrap=False):
|
|
|
824
828
|
if _MODS.booleans.isBoolean(points):
|
|
825
829
|
r = points._sum2(LatLon, areaOf, radius=None, wrap=wrap)
|
|
826
830
|
else:
|
|
827
|
-
# sum interior angles: depending on whether polygon is cw or
|
|
828
|
-
# angle between edges is π−α or π+α, where α is angle
|
|
829
|
-
# great-circle vectors; so sum α, then take n·π − |Σα|
|
|
830
|
-
# use Σ(π−|α|) as concave polygons would fail)
|
|
831
|
+
# sum interior angles: depending on whether polygon is cw or
|
|
832
|
+
# ccw, angle between edges is π−α or π+α, where α is angle
|
|
833
|
+
# between great-circle vectors; so sum α, then take n·π − |Σα|
|
|
834
|
+
# (cannot use Σ(π−|α|) as concave polygons would fail)
|
|
831
835
|
s = fsum(_interangles(points, wrap))
|
|
832
836
|
# using Girard’s theorem: A = [Σθᵢ − (n−2)·π]·R²
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
return r if radius is None else (r * Radius(radius)**2)
|
|
837
|
+
r = fabs(PI2 - fabs(s)) # == n*PI - abs(s) - (n-2)*PI
|
|
838
|
+
return r if radius is None else (Radius(radius)**2 * r)
|
|
836
839
|
|
|
837
840
|
|
|
838
841
|
def intersecant2(center, circle, point, other, **radius_exact_height_wrap):
|
|
@@ -57,7 +57,7 @@ from pygeodesy.vector3d import sumOf, Vector3d
|
|
|
57
57
|
from math import asin, cos, degrees, fabs, radians, sin
|
|
58
58
|
|
|
59
59
|
__all__ = _ALL_LAZY.sphericalTrigonometry
|
|
60
|
-
__version__ = '25.05.
|
|
60
|
+
__version__ = '25.05.28'
|
|
61
61
|
|
|
62
62
|
_PI_EPS4 = PI - EPS4
|
|
63
63
|
if _PI_EPS4 >= PI:
|
|
@@ -758,20 +758,21 @@ class LatLon(LatLonSphericalBase):
|
|
|
758
758
|
_T00 = LatLon(0, 0, name='T00') # reference instance (L{LatLon})
|
|
759
759
|
|
|
760
760
|
|
|
761
|
-
def areaOf(points, radius=R_M, wrap=False): # was=True
|
|
762
|
-
'''Calculate the area of a (spherical) polygon or composite (with the
|
|
763
|
-
|
|
761
|
+
def areaOf(points, radius=R_M, wrap=False, polar=False): # was wrap=True
|
|
762
|
+
'''Calculate the area of a (spherical) polygon or composite (with the points joined by
|
|
763
|
+
great circle arcs).
|
|
764
764
|
|
|
765
|
-
@arg points: The polygon points or clips (L{LatLon}[], L{BooleanFHP}
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
765
|
+
@arg points: The polygon points or clips (L{LatLon}[], L{BooleanFHP} or L{BooleanGH}).
|
|
766
|
+
@kwarg radius: Mean earth radius, ellipsoid or datum (C{meter}, L{Ellipsoid},
|
|
767
|
+
L{Ellipsoid2}, L{Datum} or L{a_f2Tuple}) or C{None}.
|
|
768
|
+
@kwarg wrap: If C{True}, wrap or I{normalize} and unroll the B{C{points}} (C{bool}).
|
|
769
|
+
@kwarg polar: Use C{B{polar}=True} if the polygon encloses a pole (C{bool}), see
|
|
770
|
+
function L{ispolar<pygeodesy.points.ispolar>} and U{area of a polygon
|
|
771
|
+
enclosing a pole<https://GeographicLib.SourceForge.io/C++/doc/
|
|
772
|
+
classGeographicLib_1_1GeodesicExact.html#a3d7a9155e838a09a48dc14d0c3fac525>}.
|
|
772
773
|
|
|
773
|
-
@return: Polygon area (C{meter} I{quared}, same units as B{C{radius}}
|
|
774
|
-
|
|
774
|
+
@return: Polygon area (C{meter} I{quared}, same units as B{C{radius}} or C{radians} if
|
|
775
|
+
C{B{radius} is None}).
|
|
775
776
|
|
|
776
777
|
@raise PointsError: Insufficient number of B{C{points}}.
|
|
777
778
|
|
|
@@ -779,13 +780,11 @@ def areaOf(points, radius=R_M, wrap=False): # was=True
|
|
|
779
780
|
|
|
780
781
|
@raise ValueError: Invalid B{C{radius}} or semi-circular polygon edge.
|
|
781
782
|
|
|
782
|
-
@note: The area is based on I{Karney}'s U{'Area of a spherical
|
|
783
|
-
|
|
784
|
-
the-area-of-spherical-polygons>}, 3rd Answer.
|
|
783
|
+
@note: The area is based on I{Karney}'s U{'Area of a spherical polygon'
|
|
784
|
+
<https://MathOverflow.net/questions/97711/ the-area-of-spherical-polygons>}, 3rd Answer.
|
|
785
785
|
|
|
786
|
-
@see: Functions L{pygeodesy.areaOf}, L{sphericalNvector.areaOf},
|
|
787
|
-
L{
|
|
788
|
-
L{ellipsoidalKarney.areaOf}.
|
|
786
|
+
@see: Functions L{pygeodesy.areaOf}, L{sphericalNvector.areaOf}, L{pygeodesy.excessKarney},
|
|
787
|
+
L{ellipsoidalExact.areaOf} and L{ellipsoidalKarney.areaOf}.
|
|
789
788
|
'''
|
|
790
789
|
if _MODS.booleans.isBoolean(points):
|
|
791
790
|
return points._sum2(LatLon, areaOf, radius=radius, wrap=wrap)
|
|
@@ -822,7 +821,7 @@ def areaOf(points, radius=R_M, wrap=False): # was=True
|
|
|
822
821
|
p1, z1 = p2, z2
|
|
823
822
|
|
|
824
823
|
R = abs(R * _2_0)
|
|
825
|
-
if abs(D) < _90_0: # ispolar(points)
|
|
824
|
+
if abs(D) < _90_0 or polar: # ispolar(points)
|
|
826
825
|
R = abs(R - PI2)
|
|
827
826
|
if radius:
|
|
828
827
|
a = degrees(A.fover(len(A))) # mean lat
|
pygeodesy/vector2d.py
CHANGED
|
@@ -36,7 +36,7 @@ from contextlib import contextmanager
|
|
|
36
36
|
# from math import fabs, sqrt # from .fmath
|
|
37
37
|
|
|
38
38
|
__all__ = _ALL_LAZY.vector2d
|
|
39
|
-
__version__ = '25.05.
|
|
39
|
+
__version__ = '25.05.26'
|
|
40
40
|
|
|
41
41
|
_cA_ = 'cA'
|
|
42
42
|
_cB_ = 'cB'
|
|
@@ -437,7 +437,7 @@ class _numpy(object): # see also .formy._idllmn6, .geodesicw._wargs, .latlonBas
|
|
|
437
437
|
def np(self):
|
|
438
438
|
'''Import numpy 1.10+ once.
|
|
439
439
|
'''
|
|
440
|
-
return _xnumpy(self
|
|
440
|
+
return _xnumpy(type(self), 1, 10)
|
|
441
441
|
|
|
442
442
|
def null_space2(self, A, rcond=None):
|
|
443
443
|
'''Return the C{null_space} and C{rank} of matrix B{C{A}}.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pygeodesy
|
|
3
|
-
Version: 25.5.
|
|
3
|
+
Version: 25.5.28
|
|
4
4
|
Summary: Pure Python geodesy tools
|
|
5
5
|
Home-page: https://GitHub.com/mrJean1/PyGeodesy
|
|
6
6
|
Author: Jean M. Brouwers
|
|
@@ -164,7 +164,7 @@ PyCodeStyle_ (formerly Pep8) and McCabe_ using Python 2.7.18, both in 64-bit on
|
|
|
164
164
|
|
|
165
165
|
For a summary of all *Karney*-based functionality in ``pygeodesy``, see module karney_.
|
|
166
166
|
|
|
167
|
-
*Last updated: May
|
|
167
|
+
*Last updated: May 28, 2025.*
|
|
168
168
|
|
|
169
169
|
License
|
|
170
170
|
=======
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
pygeodesy/LICENSE,sha256=YfgAiyxOwY6P9Kkb1_5XN81nueTLrpb3Ffkv3EuPgFU,1144
|
|
2
|
-
pygeodesy/__init__.py,sha256=
|
|
3
|
-
pygeodesy/__main__.py,sha256=
|
|
2
|
+
pygeodesy/__init__.py,sha256=C2E8VxEx5MOANjeIZ12lgXtsJSbJdYh1Ee05IkobA1w,42290
|
|
3
|
+
pygeodesy/__main__.py,sha256=HpOBmuhI7yVP1FIAEugvd9Lb54kzew-nM78be0r4SC4,5597
|
|
4
4
|
pygeodesy/albers.py,sha256=mb3YbVvoBq8a7AytT0HeVxe8DGEvx1KFN2Usl2ksKwk,30908
|
|
5
5
|
pygeodesy/azimuthal.py,sha256=acwIA1B7jmg1oDpJBuFitnOVHUWRUk7Y73yI8zqIGrc,49854
|
|
6
6
|
pygeodesy/basics.py,sha256=ErpbLgHNerGPKiOIlWKdKzq6lO0dhoZjaywTnCn8PyE,32905
|
|
7
|
-
pygeodesy/booleans.py,sha256=
|
|
7
|
+
pygeodesy/booleans.py,sha256=njAJlAoVZEcQ5jp8wwyuVo8-jFPE3PFpAF3k3dQihBM,73683
|
|
8
8
|
pygeodesy/cartesianBase.py,sha256=tvb1pGUTvSkIAInNhrnHXjBCwnQrVn6a-H2fipoapKE,45365
|
|
9
9
|
pygeodesy/clipy.py,sha256=a0azaK7YDmGDU8mVVKe2MvUiPEhqZ9XJ-9u0T1iHKbo,27779
|
|
10
|
-
pygeodesy/constants.py,sha256=
|
|
11
|
-
pygeodesy/css.py,sha256=
|
|
10
|
+
pygeodesy/constants.py,sha256=usdHWtYiy8iaPXxXau2vsViL9zC8I4Jp2fziiEmp2g4,19947
|
|
11
|
+
pygeodesy/css.py,sha256=vdQax5m7BMSpr7PUyqedCSvx73ilWuhXQTp39i8FOfA,25793
|
|
12
12
|
pygeodesy/datums.py,sha256=Vp1fP7sSV1EuRbuO2scnZ3qiTZD1CvL4O12KSRlf1SU,34068
|
|
13
13
|
pygeodesy/dms.py,sha256=CKXt2EOYFBluQV5q6cFYppJl3dCvvEB_0E84J0ki6ws,42202
|
|
14
14
|
pygeodesy/ecef.py,sha256=DcWNhnOZC7-Olns9c1XI9p4MmuC00KN5rZ5W1UQVUxw,59009
|
|
@@ -16,37 +16,37 @@ pygeodesy/ecefLocals.py,sha256=zoxGUJeYX2UXzR9r0jaByrvfrrpmrvAhjyQsz433RjA,7794
|
|
|
16
16
|
pygeodesy/elevations.py,sha256=WrWPZNgkZX9Ys_1ij_gyE4jzdIv85JYAaR2cK3vc4gQ,10879
|
|
17
17
|
pygeodesy/ellipsoidalBase.py,sha256=n6VHIaRZ6UvC1H36qolKxwlHJX5BZysvgE3iir-PunE,55743
|
|
18
18
|
pygeodesy/ellipsoidalBaseDI.py,sha256=PbSJkUUHpRGYgnnciMD-sWqTCReZv_FAc8SUonF3ZbI,38544
|
|
19
|
-
pygeodesy/ellipsoidalExact.py,sha256=
|
|
20
|
-
pygeodesy/ellipsoidalGeodSolve.py,sha256=
|
|
21
|
-
pygeodesy/ellipsoidalKarney.py,sha256=
|
|
19
|
+
pygeodesy/ellipsoidalExact.py,sha256=kKnQV3gz293dPowsRx5aI0CJ05a2TWGpEcWoJCxut30,17111
|
|
20
|
+
pygeodesy/ellipsoidalGeodSolve.py,sha256=w5TubUdqYwvrtxfIwP2Scr1FzISq2szx1HX88TUa42E,17107
|
|
21
|
+
pygeodesy/ellipsoidalKarney.py,sha256=W_Liw5MxTqJJGsxMi50ui8grRSPKwkG2HH-Mv_mXQYk,18839
|
|
22
22
|
pygeodesy/ellipsoidalNvector.py,sha256=HLFjX6o26q2fzVCjLSL0PdEh96xhGtjfzo2V_k54j4A,30146
|
|
23
|
-
pygeodesy/ellipsoidalVincenty.py,sha256=
|
|
23
|
+
pygeodesy/ellipsoidalVincenty.py,sha256=zeTvid09NGuYJ1WJ__a3ApCBGSzX0A-Rhs8-sQXMNQQ,26273
|
|
24
24
|
pygeodesy/ellipsoids.py,sha256=v964yZIL2nCc8MJgt3nzV6pczaQsQubXmX_sAh_nrBw,107765
|
|
25
|
-
pygeodesy/elliptic.py,sha256=
|
|
25
|
+
pygeodesy/elliptic.py,sha256=nob5Iby3RIj1tnsZJ1AzzxDLwPJm48M9Cf_kIAwU6l8,45035
|
|
26
26
|
pygeodesy/epsg.py,sha256=VIBidzAEuoBF4LdlJ4r3WtpL0Ymhru8kf4fAgfFr5ok,8220
|
|
27
27
|
pygeodesy/errors.py,sha256=OUEJ51M3c-JH1n0BBbRtPTCDX0I00rH_BQPYSRoKrqo,32043
|
|
28
28
|
pygeodesy/etm.py,sha256=NDtpmbQmbGieV64iJ-EDIAvD9ryjrW0hiD3wBBtxULk,46744
|
|
29
29
|
pygeodesy/fmath.py,sha256=sIN7mW2KOiK0yU93mvmHo1OOTkGxKvwRinvyr_Qdf6I,37689
|
|
30
30
|
pygeodesy/formy.py,sha256=7-CdPiagdVrbDMjWieX_guN4RvFVCYKOM3yDKSFPRWU,69777
|
|
31
|
-
pygeodesy/frechet.py,sha256=
|
|
31
|
+
pygeodesy/frechet.py,sha256=dBnQ5ePuaUdKv62-e9RfovFDxELsZPQEKMLww9NOf7Q,35588
|
|
32
32
|
pygeodesy/fstats.py,sha256=M6UOrwmeGp6kjYuYfc6Iq9ibMJAFNm6D4C5GnvlJeuM,28348
|
|
33
33
|
pygeodesy/fsums.py,sha256=3pXl8rfDPeKzXHEhtf9qNzBtUme4ckskDx3HWfJbfyg,103988
|
|
34
34
|
pygeodesy/gars.py,sha256=AXioT4Lh1cwrd7fF6dHcVJw-9vu2oAnZrzo_ka2Y3Ts,11761
|
|
35
35
|
pygeodesy/geodesici.py,sha256=wPUDlRPOcj3MvvWA0CtnZvC30t1onKyZYvR51iCjgks,74891
|
|
36
|
-
pygeodesy/geodesicw.py,sha256=
|
|
36
|
+
pygeodesy/geodesicw.py,sha256=xDxxxr4HOT-8Mh85zD6QZzyO-mfqUavfwQMStYrsF8c,30029
|
|
37
37
|
pygeodesy/geodsolve.py,sha256=fFlyNlkEOpkJaeddEuKwfhtqaZjmVs0egNGM5cwFFoc,29101
|
|
38
38
|
pygeodesy/geohash.py,sha256=1P9-k9sMN-ZVFr2iWbQpFi1lg3uNmChHFCIfETkgFJU,40153
|
|
39
|
-
pygeodesy/geoids.py,sha256=
|
|
40
|
-
pygeodesy/hausdorff.py,sha256=
|
|
41
|
-
pygeodesy/heights.py,sha256=
|
|
42
|
-
pygeodesy/internals.py,sha256=
|
|
43
|
-
pygeodesy/interns.py,sha256=
|
|
39
|
+
pygeodesy/geoids.py,sha256=OQvOVutr8R1CalStgxmNu2Mk3oMl4zpCY_OKh0KHpI8,86125
|
|
40
|
+
pygeodesy/hausdorff.py,sha256=KGB0CIeNkBqR0sXIbRJvcgXPrM-4Mpi2aBOqDeZjqZ0,32269
|
|
41
|
+
pygeodesy/heights.py,sha256=_Pn-6w4gGzdXCoA6m72rJm4hb-Fe2vxc8RiRRjq5iTI,41002
|
|
42
|
+
pygeodesy/internals.py,sha256=y3qT-ZbNDc-7md_T87qtVk1x2rDVtJbP5G0P-HgBlVA,24024
|
|
43
|
+
pygeodesy/interns.py,sha256=QTP_6rStQ283DE-rL7rCAcfEffuiAXustBGkCY_DHJ0,23508
|
|
44
44
|
pygeodesy/iters.py,sha256=nKVp_LUQyTqOz_OLzY25g6-_xlKG7lmAnjKKMXESmiM,20345
|
|
45
|
-
pygeodesy/karney.py,sha256=
|
|
45
|
+
pygeodesy/karney.py,sha256=IzWyGwX0kRpwrVFBpCzogd2Q8PLvCdCwHheE-zbCQZE,41629
|
|
46
46
|
pygeodesy/ktm.py,sha256=3CLwbRvk-sr4qs8R9fdJ_ejokgZEjKHULV7wzzuonHU,27259
|
|
47
47
|
pygeodesy/latlonBase.py,sha256=B7wNE-IJf-Sm3NKhCXdrgwRbH_4dBGluZlQdxTJqp8s,75320
|
|
48
48
|
pygeodesy/lazily.py,sha256=2FzJkIQK7LftAXXYxMbqTQUAWth7T3syIhqm8Z9bhuo,47609
|
|
49
|
-
pygeodesy/lcc.py,sha256=
|
|
49
|
+
pygeodesy/lcc.py,sha256=7Di2Y5VIDL5drdSce4ABWGT3MtZSosaLKd68US6788s,25786
|
|
50
50
|
pygeodesy/ltp.py,sha256=N3TMipTWKUOeZYzn3UeJJqe5J4Yk788390ohQM1ykAE,50893
|
|
51
51
|
pygeodesy/ltpTuples.py,sha256=t-n7p9A3JCVasv8LKCV4PkOTmXJZi91BkBFm8pBZM5o,59101
|
|
52
52
|
pygeodesy/mgrs.py,sha256=ZgCBH_M_YFxuFu5ukVOVetk-uftv-4GJP-QJrtoqtcU,29842
|
|
@@ -55,13 +55,13 @@ pygeodesy/namedTuples.py,sha256=JlO8uWmR65RkT7Rdgc9knfI0-bqJeA-tm2ZKsesztVU,3059
|
|
|
55
55
|
pygeodesy/nvectorBase.py,sha256=XnA_DlqbgYPpF7y_BQHQVmntpI3M5fe0q8h3zX-PKbs,29930
|
|
56
56
|
pygeodesy/osgr.py,sha256=4mFUcn1vMOju3PK1rKohPtIlJZrBGPJrcRjFl-CoxqE,30852
|
|
57
57
|
pygeodesy/points.py,sha256=2vQpgqxJiC7Cgn03pqiezTM4I-CTquv9tQZi4uYWjpw,64497
|
|
58
|
-
pygeodesy/props.py,sha256=
|
|
58
|
+
pygeodesy/props.py,sha256=GCBqrkMfpbHuca2Sh68WSGDplIeZLvCDDXUewyvEiqI,24600
|
|
59
59
|
pygeodesy/resections.py,sha256=vCbnEyNghGkblrPA58-MspaxkZcInnvRgS-oSBIe1hM,43796
|
|
60
60
|
pygeodesy/simplify.py,sha256=O04NSb0ezXM8z3lCcajXbetZuum6PURAOPYTsJ27gxI,22068
|
|
61
61
|
pygeodesy/solveBase.py,sha256=I2oW7zaPoVUkD7IB9Ro0paU-T1vie1lomg83f71twDY,18468
|
|
62
|
-
pygeodesy/sphericalBase.py,sha256=
|
|
63
|
-
pygeodesy/sphericalNvector.py,sha256=
|
|
64
|
-
pygeodesy/sphericalTrigonometry.py,sha256=
|
|
62
|
+
pygeodesy/sphericalBase.py,sha256=hq6dyeeIHBy_T0Q6PIwSvmo1U70Ir5KBeMTwQplzqHQ,32071
|
|
63
|
+
pygeodesy/sphericalNvector.py,sha256=bu0yB4PEq1cs6BS8QFqtljWpVEw7ESwq2yILOzGDuAc,54948
|
|
64
|
+
pygeodesy/sphericalTrigonometry.py,sha256=8q3sevqdeJ-mOukkXLsXKAg06hDxaBhiPHhrdQn3UHY,64411
|
|
65
65
|
pygeodesy/streprs.py,sha256=-4LErmfPLtGt1tLDBHhJam-zYq8p2Z2C5wDCMELEml4,23599
|
|
66
66
|
pygeodesy/trf.py,sha256=gpsOJVER1KhITOtyiENQ4EnRONinLkzbujsfzzxHVv8,119209
|
|
67
67
|
pygeodesy/triaxials.py,sha256=V0MSYJxRgYDhZcF7HXnu7oFzRyWJkhwc6scuNjc6VVg,64046
|
|
@@ -72,7 +72,7 @@ pygeodesy/utily.py,sha256=ZJKuwoo97K7GE56-cA8bGrvyz9mN9OoOMnSOEOw0mj0,40025
|
|
|
72
72
|
pygeodesy/utm.py,sha256=kcXliftP9q0nTxviIOixVyvResK2Jydj-G52CXJiSuQ,31123
|
|
73
73
|
pygeodesy/utmups.py,sha256=31RD8l7M-vcRXU9_wnkb_PNUcKjOr1HAmwjOndjkgXE,13176
|
|
74
74
|
pygeodesy/utmupsBase.py,sha256=PptZ4Mm8BaDUCA8v1sK54o8idw_24kq6loAuYv0bejE,22730
|
|
75
|
-
pygeodesy/vector2d.py,sha256=
|
|
75
|
+
pygeodesy/vector2d.py,sha256=7R5ciPxXEX98LmMWNqwbds8Y6vpsHKEeCzcBVDRiq6g,40305
|
|
76
76
|
pygeodesy/vector3d.py,sha256=sC7u9tgFFWoWHFxqtO-dvKVuiEzraw50TDU_QpdDbYw,43045
|
|
77
77
|
pygeodesy/vector3dBase.py,sha256=BHenp3NGpfhVbJ6JMgdNLx6vAcwDWDJIxl9hAdp-AVw,36301
|
|
78
78
|
pygeodesy/webmercator.py,sha256=z3Ft5TeHc9FoLA8zQhzTrSuShHSz0aHjanbvj53ohmo,15016
|
|
@@ -104,16 +104,16 @@ pygeodesy/geodesicx/_C4_27.py,sha256=grqtju94Nu9V_eQPqe_7aRbLCYflxRuK127pPOPwuDA
|
|
|
104
104
|
pygeodesy/geodesicx/_C4_30.py,sha256=I4ZuTy64yOq1IVgRtc_kqOL0HnKzXeTea7kTFSolcJs,201921
|
|
105
105
|
pygeodesy/geodesicx/__init__.py,sha256=KXnzEGNtOtOke01y72dkIgT6sAwOP3zd6wgXho1F3T4,2468
|
|
106
106
|
pygeodesy/geodesicx/__main__.py,sha256=ugi6c-4y91WOMJIL0N-wgXhoGhV90QJIFji2MaIGLiA,4329
|
|
107
|
-
pygeodesy/geodesicx/gx.py,sha256=
|
|
108
|
-
pygeodesy/geodesicx/gxarea.py,sha256=
|
|
109
|
-
pygeodesy/geodesicx/gxbases.py,sha256=
|
|
110
|
-
pygeodesy/geodesicx/gxline.py,sha256=
|
|
107
|
+
pygeodesy/geodesicx/gx.py,sha256=MdnQat0Q4b6h9jlsOCsJLpmpiDSU84vgip7Gny9nBlw,60971
|
|
108
|
+
pygeodesy/geodesicx/gxarea.py,sha256=1z-CQzi3vEls9Rs-okn003cdR9o_fWtO3lORbk_jpu8,19506
|
|
109
|
+
pygeodesy/geodesicx/gxbases.py,sha256=R9IQXwCK6KOPPcxI6qvdDbVcyuqfYJiZy5jcmrfkJ5A,6390
|
|
110
|
+
pygeodesy/geodesicx/gxline.py,sha256=JbFzLraITpW4xoOx8qCEzkF_5z8AgDSywZj0tcSexsg,27873
|
|
111
111
|
pygeodesy/rhumb/__init__.py,sha256=DsE5a16CUYWE5YTuo1U8mnDCtykuWw7VeGx23Yny_VU,2207
|
|
112
112
|
pygeodesy/rhumb/aux_.py,sha256=NeHkNLS2ULh3sTb3eBTtmRih9SZNyVJKMtJj7imKkuI,16117
|
|
113
113
|
pygeodesy/rhumb/bases.py,sha256=P5AQyL-MTbJaO4oKH_Y7qcusQxaHoAii0hJVQ9mT7hU,54250
|
|
114
114
|
pygeodesy/rhumb/ekx.py,sha256=GMY6ik4fgiRrjek-42cpZxU3U2bdoAcY6ZcbZRckpII,24026
|
|
115
115
|
pygeodesy/rhumb/solve.py,sha256=z8z_XYObTgz7w1skNLNcLBpe-EO_r0H4sVcZGlBcWnc,24005
|
|
116
|
-
pygeodesy-25.5.
|
|
117
|
-
pygeodesy-25.5.
|
|
118
|
-
pygeodesy-25.5.
|
|
119
|
-
pygeodesy-25.5.
|
|
116
|
+
pygeodesy-25.5.28.dist-info/METADATA,sha256=fowmWp0l0feRG1MkGeJGcJxfcyDdvoKZu6TrePRyaNY,20102
|
|
117
|
+
pygeodesy-25.5.28.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
|
|
118
|
+
pygeodesy-25.5.28.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
|
|
119
|
+
pygeodesy-25.5.28.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|