pygeodesy 24.6.1__py2.py3-none-any.whl → 24.6.9__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.1.dist-info → PyGeodesy-24.6.9.dist-info}/METADATA +2 -2
- {PyGeodesy-24.6.1.dist-info → PyGeodesy-24.6.9.dist-info}/RECORD +43 -43
- pygeodesy/__init__.py +1 -1
- pygeodesy/booleans.py +52 -65
- pygeodesy/cartesianBase.py +138 -147
- pygeodesy/ecef.py +46 -52
- pygeodesy/ellipsoidalBase.py +6 -43
- pygeodesy/ellipsoidalNvector.py +7 -7
- pygeodesy/errors.py +2 -2
- pygeodesy/frechet.py +3 -4
- pygeodesy/fsums.py +2 -2
- pygeodesy/geodsolve.py +23 -25
- pygeodesy/geohash.py +14 -27
- pygeodesy/geoids.py +1 -1
- pygeodesy/hausdorff.py +6 -7
- pygeodesy/heights.py +14 -27
- pygeodesy/internals.py +13 -12
- pygeodesy/interns.py +3 -9
- pygeodesy/iters.py +2 -2
- pygeodesy/latlonBase.py +189 -176
- pygeodesy/lazily.py +90 -54
- pygeodesy/lcc.py +2 -2
- pygeodesy/ltp.py +37 -17
- pygeodesy/ltpTuples.py +124 -115
- pygeodesy/mgrs.py +28 -1
- pygeodesy/named.py +92 -67
- pygeodesy/namedTuples.py +43 -14
- pygeodesy/nvectorBase.py +19 -22
- pygeodesy/points.py +2 -2
- pygeodesy/rhumb/solve.py +8 -61
- pygeodesy/solveBase.py +22 -19
- pygeodesy/sphericalBase.py +17 -11
- pygeodesy/streprs.py +6 -4
- pygeodesy/trf.py +3 -3
- pygeodesy/triaxials.py +70 -49
- pygeodesy/units.py +40 -65
- pygeodesy/unitsBase.py +2 -2
- pygeodesy/utily.py +5 -4
- pygeodesy/utmupsBase.py +2 -2
- pygeodesy/vector3d.py +34 -36
- pygeodesy/vector3dBase.py +12 -9
- {PyGeodesy-24.6.1.dist-info → PyGeodesy-24.6.9.dist-info}/WHEEL +0 -0
- {PyGeodesy-24.6.1.dist-info → PyGeodesy-24.6.9.dist-info}/top_level.txt +0 -0
pygeodesy/ecef.py
CHANGED
|
@@ -86,7 +86,7 @@ from pygeodesy.utily import atan1, atan1d, atan2d, degrees90, degrees180, \
|
|
|
86
86
|
from math import atan2, cos, degrees, fabs, radians, sqrt
|
|
87
87
|
|
|
88
88
|
__all__ = _ALL_LAZY.ecef
|
|
89
|
-
__version__ = '24.
|
|
89
|
+
__version__ = '24.06.09'
|
|
90
90
|
|
|
91
91
|
_Ecef_ = 'Ecef'
|
|
92
92
|
_prolate_ = 'prolate'
|
|
@@ -133,13 +133,13 @@ class _EcefBase(_NamedBase):
|
|
|
133
133
|
elif _isRadius(E) and isscalar(f):
|
|
134
134
|
E = a_f2Tuple(E, f)
|
|
135
135
|
else:
|
|
136
|
-
raise ValueError # _invalid_
|
|
136
|
+
raise ValueError() # _invalid_
|
|
137
137
|
|
|
138
138
|
if E not in (_EWGS84, _WGS84):
|
|
139
139
|
d = _ellipsoidal_datum(E, **name)
|
|
140
140
|
E = d.ellipsoid
|
|
141
141
|
if E.a < EPS or E.f > EPS1:
|
|
142
|
-
raise ValueError # _invalid_
|
|
142
|
+
raise ValueError() # _invalid_
|
|
143
143
|
self._datum = d
|
|
144
144
|
self._E = E
|
|
145
145
|
|
|
@@ -299,14 +299,14 @@ class _EcefBase(_NamedBase):
|
|
|
299
299
|
'''
|
|
300
300
|
return self._xnamed(EcefMatrix(sa, ca, sb, cb))
|
|
301
301
|
|
|
302
|
-
def _polon(self, y, x, R, **
|
|
302
|
+
def _polon(self, y, x, R, **lon00_name):
|
|
303
303
|
'''(INTERNAL) Handle I{"polar"} longitude.
|
|
304
304
|
'''
|
|
305
|
-
return atan2d(y, x) if R else _xkwds_get(
|
|
305
|
+
return atan2d(y, x) if R else _xkwds_get(lon00_name, lon00=self.lon00)
|
|
306
306
|
|
|
307
|
-
def reverse(self, xyz, y=None, z=None, M=False, **
|
|
307
|
+
def reverse(self, xyz, y=None, z=None, M=False, **lon00_name): # PYCHOK no cover
|
|
308
308
|
'''I{Must be overloaded}.'''
|
|
309
|
-
self._notOverloaded(xyz, y=y, z=z, M=M, **
|
|
309
|
+
self._notOverloaded(xyz, y=y, z=z, M=M, **lon00_name)
|
|
310
310
|
|
|
311
311
|
def toStr(self, prec=9, **unused): # PYCHOK signature
|
|
312
312
|
'''Return this C{Ecef*} as a string.
|
|
@@ -324,7 +324,7 @@ class EcefFarrell21(_EcefBase):
|
|
|
324
324
|
books?id=fW4foWASY6wC>}, page 29.
|
|
325
325
|
'''
|
|
326
326
|
|
|
327
|
-
def reverse(self, xyz, y=None, z=None, M=None, **
|
|
327
|
+
def reverse(self, xyz, y=None, z=None, M=None, **lon00_name): # PYCHOK unused M
|
|
328
328
|
'''Convert from geocentric C{(x, y, z)} to geodetic C{(lat, lon, height)} using
|
|
329
329
|
I{Farrell}'s U{Table 2.1<https://Books.Google.com/books?id=fW4foWASY6wC>},
|
|
330
330
|
page 29.
|
|
@@ -334,10 +334,9 @@ class EcefFarrell21(_EcefBase):
|
|
|
334
334
|
@kwarg y: ECEF C{y} coordinate for C{scalar} B{C{xyz}} and B{C{z}} (C{meter}).
|
|
335
335
|
@kwarg z: ECEF C{z} coordinate for C{scalar} B{C{xyz}} and B{C{y}} (C{meter}).
|
|
336
336
|
@kwarg M: I{Ignored}, rotation matrix C{M} not available.
|
|
337
|
-
@kwarg
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
C{B{x}=0} and C{B{y}=0}.
|
|
337
|
+
@kwarg lon00_name: Optional C{B{name}=NN} (C{str}) and optional keyword argument
|
|
338
|
+
C{B{lon00}=INT0} (C{degrees}), an arbitrary I{"polar"} longitude
|
|
339
|
+
returned if C{B{x}=0} and C{B{y}=0}, see property C{lon00}.
|
|
341
340
|
|
|
342
341
|
@return: An L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with
|
|
343
342
|
geodetic coordinates C{(lat, lon, height)} for the given geocentric
|
|
@@ -350,7 +349,7 @@ class EcefFarrell21(_EcefBase):
|
|
|
350
349
|
|
|
351
350
|
@see: L{EcefFarrell22} and L{EcefVeness}.
|
|
352
351
|
'''
|
|
353
|
-
x, y, z, name = _xyzn4(xyz, y, z, self._Geocentrics, **
|
|
352
|
+
x, y, z, name = _xyzn4(xyz, y, z, self._Geocentrics, **lon00_name)
|
|
354
353
|
|
|
355
354
|
E = self.ellipsoid
|
|
356
355
|
a = E.a
|
|
@@ -382,7 +381,7 @@ class EcefFarrell21(_EcefBase):
|
|
|
382
381
|
|
|
383
382
|
h = hypot(r, z) * (_1_0 - v)
|
|
384
383
|
lat = atan1d((e2_ * v + _1_0) * z, p)
|
|
385
|
-
lon = self._polon(y, x, p, **
|
|
384
|
+
lon = self._polon(y, x, p, **lon00_name)
|
|
386
385
|
# note, phi and lam are swapped on page 29
|
|
387
386
|
|
|
388
387
|
except (ValueError, ZeroDivisionError) as e:
|
|
@@ -399,7 +398,7 @@ class EcefFarrell22(_EcefBase):
|
|
|
399
398
|
books?id=fW4foWASY6wC>}, page 30.
|
|
400
399
|
'''
|
|
401
400
|
|
|
402
|
-
def reverse(self, xyz, y=None, z=None, M=None, **
|
|
401
|
+
def reverse(self, xyz, y=None, z=None, M=None, **lon00_name): # PYCHOK unused M
|
|
403
402
|
'''Convert from geocentric C{(x, y, z)} to geodetic C{(lat, lon, height)} using
|
|
404
403
|
I{Farrell}'s U{Table 2.2<https://Books.Google.com/books?id=fW4foWASY6wC>},
|
|
405
404
|
page 30.
|
|
@@ -409,10 +408,9 @@ class EcefFarrell22(_EcefBase):
|
|
|
409
408
|
@kwarg y: ECEF C{y} coordinate for C{scalar} B{C{xyz}} and B{C{z}} (C{meter}).
|
|
410
409
|
@kwarg z: ECEF C{z} coordinate for C{scalar} B{C{xyz}} and B{C{y}} (C{meter}).
|
|
411
410
|
@kwarg M: I{Ignored}, rotation matrix C{M} not available.
|
|
412
|
-
@kwarg
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
C{B{x}=0} and C{B{y}=0}.
|
|
411
|
+
@kwarg lon00_name: Optional C{B{name}=NN} (C{str}) and optional keyword argument
|
|
412
|
+
C{B{lon00}=INT0} (C{degrees}), an arbitrary I{"polar"} longitude
|
|
413
|
+
returned if C{B{x}=0} and C{B{y}=0}, see property C{lon00}.
|
|
416
414
|
|
|
417
415
|
@return: An L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with
|
|
418
416
|
geodetic coordinates C{(lat, lon, height)} for the given geocentric
|
|
@@ -425,7 +423,7 @@ class EcefFarrell22(_EcefBase):
|
|
|
425
423
|
|
|
426
424
|
@see: L{EcefFarrell21} and L{EcefVeness}.
|
|
427
425
|
'''
|
|
428
|
-
x, y, z, name = _xyzn4(xyz, y, z, self._Geocentrics, **
|
|
426
|
+
x, y, z, name = _xyzn4(xyz, y, z, self._Geocentrics, **lon00_name)
|
|
429
427
|
|
|
430
428
|
E = self.ellipsoid
|
|
431
429
|
a = E.a
|
|
@@ -433,7 +431,7 @@ class EcefFarrell22(_EcefBase):
|
|
|
433
431
|
|
|
434
432
|
try: # see EcefVeness.reverse
|
|
435
433
|
p = hypot(x, y)
|
|
436
|
-
lon = self._polon(y, x, p, **
|
|
434
|
+
lon = self._polon(y, x, p, **lon00_name)
|
|
437
435
|
|
|
438
436
|
s, c = sincos2(atan2(z * a, p * b)) # == _norm3
|
|
439
437
|
lat = atan1d(z + s**3 * b * E.e22,
|
|
@@ -473,7 +471,7 @@ class EcefKarney(_EcefBase):
|
|
|
473
471
|
'''
|
|
474
472
|
return self.equatoradius / EPS_2 # self.equatoradius * _2_EPS, 12M lighyears
|
|
475
473
|
|
|
476
|
-
def reverse(self, xyz, y=None, z=None, M=False, **
|
|
474
|
+
def reverse(self, xyz, y=None, z=None, M=False, **lon00_name):
|
|
477
475
|
'''Convert from geocentric C{(x, y, z)} to geodetic C{(lat, lon, height)}.
|
|
478
476
|
|
|
479
477
|
@arg xyz: A geocentric (C{Cartesian}, L{Ecef9Tuple}) or C{scalar} ECEF C{x}
|
|
@@ -481,10 +479,9 @@ class EcefKarney(_EcefBase):
|
|
|
481
479
|
@kwarg y: ECEF C{y} coordinate for C{scalar} B{C{xyz}} and B{C{z}} (C{meter}).
|
|
482
480
|
@kwarg z: ECEF C{z} coordinate for C{scalar} B{C{xyz}} and B{C{y}} (C{meter}).
|
|
483
481
|
@kwarg M: Optionally, return the rotation L{EcefMatrix} (C{bool}).
|
|
484
|
-
@kwarg
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
C{B{x}=0} and C{B{y}=0}.
|
|
482
|
+
@kwarg lon00_name: Optional C{B{name}=NN} (C{str}) and optional keyword argument
|
|
483
|
+
C{B{lon00}=INT0} (C{degrees}), an arbitrary I{"polar"} longitude
|
|
484
|
+
returned if C{B{x}=0} and C{B{y}=0}, see property C{lon00}.
|
|
488
485
|
|
|
489
486
|
@return: An L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with
|
|
490
487
|
geodetic coordinates C{(lat, lon, height)} for the given geocentric
|
|
@@ -508,7 +505,7 @@ class EcefKarney(_EcefBase):
|
|
|
508
505
|
h = hypot(y, x) # EPS0, EPS_2
|
|
509
506
|
return (y / h, x / h, h) if h > 0 else (_0_0, _1_0, h)
|
|
510
507
|
|
|
511
|
-
x, y, z, name = _xyzn4(xyz, y, z, self._Geocentrics, **
|
|
508
|
+
x, y, z, name = _xyzn4(xyz, y, z, self._Geocentrics, **lon00_name)
|
|
512
509
|
|
|
513
510
|
E = self.ellipsoid
|
|
514
511
|
f = E.f
|
|
@@ -603,7 +600,7 @@ class EcefKarney(_EcefBase):
|
|
|
603
600
|
C = 4
|
|
604
601
|
|
|
605
602
|
# lon00 <https://GitHub.com/mrJean1/PyGeodesy/issues/77>
|
|
606
|
-
lon = self._polon(sb, cb, R, **
|
|
603
|
+
lon = self._polon(sb, cb, R, **lon00_name)
|
|
607
604
|
m = self._Matrix(sa, ca, sb, cb) if M else None
|
|
608
605
|
return Ecef9Tuple(x, y, z, atan1d(sa, ca), lon, h,
|
|
609
606
|
C, m, self.datum, name=self._name__(name))
|
|
@@ -615,7 +612,7 @@ class EcefSudano(_EcefBase):
|
|
|
615
612
|
'''
|
|
616
613
|
_tol = EPS2
|
|
617
614
|
|
|
618
|
-
def reverse(self, xyz, y=None, z=None, M=None, **
|
|
615
|
+
def reverse(self, xyz, y=None, z=None, M=None, **lon00_name): # PYCHOK unused M
|
|
619
616
|
'''Convert from geocentric C{(x, y, z)} to geodetic C{(lat, lon, height)} using
|
|
620
617
|
I{Sudano}'s U{iterative method<https://www.ResearchGate.net/publication/3709199>}.
|
|
621
618
|
|
|
@@ -624,10 +621,9 @@ class EcefSudano(_EcefBase):
|
|
|
624
621
|
@kwarg y: ECEF C{y} coordinate for C{scalar} B{C{xyz}} and B{C{z}} (C{meter}).
|
|
625
622
|
@kwarg z: ECEF C{z} coordinate for C{scalar} B{C{xyz}} and B{C{y}} (C{meter}).
|
|
626
623
|
@kwarg M: I{Ignored}, rotation matrix C{M} not available.
|
|
627
|
-
@kwarg
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
C{B{x}=0} and C{B{y}=0}.
|
|
624
|
+
@kwarg lon00_name: Optional C{B{name}=NN} (C{str}) and optional keyword argument
|
|
625
|
+
C{B{lon00}=INT0} (C{degrees}), an arbitrary I{"polar"} longitude
|
|
626
|
+
returned if C{B{x}=0} and C{B{y}=0}, see property C{lon00}.
|
|
631
627
|
|
|
632
628
|
@return: An L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with geodetic
|
|
633
629
|
coordinates C{(lat, lon, height)} for the given geocentric ones C{(x, y, z)},
|
|
@@ -636,7 +632,7 @@ class EcefSudano(_EcefBase):
|
|
|
636
632
|
@raise EcefError: Invalid B{C{xyz}} or C{scalar} C{x} or B{C{y}} and/or B{C{z}}
|
|
637
633
|
not C{scalar} for C{scalar} B{C{xyz}} or no convergence.
|
|
638
634
|
'''
|
|
639
|
-
x, y, z, name = _xyzn4(xyz, y, z, self._Geocentrics, **
|
|
635
|
+
x, y, z, name = _xyzn4(xyz, y, z, self._Geocentrics, **lon00_name)
|
|
640
636
|
|
|
641
637
|
E = self.ellipsoid
|
|
642
638
|
e = E.e2 * E.a
|
|
@@ -678,7 +674,7 @@ class EcefSudano(_EcefBase):
|
|
|
678
674
|
|
|
679
675
|
if lat is None:
|
|
680
676
|
lat = copysign0(atan1d(_a(sa), ca), z)
|
|
681
|
-
lon = self._polon(y, x, R, **
|
|
677
|
+
lon = self._polon(y, x, R, **lon00_name)
|
|
682
678
|
|
|
683
679
|
h = fsumf_(R * ca, _a(z * sa), -E.a * E.e2s(sa)) # use Veness'
|
|
684
680
|
# because Sudano's Eq (7) doesn't produce the correct height
|
|
@@ -712,7 +708,7 @@ class EcefVeness(_EcefBase):
|
|
|
712
708
|
between 3D Cartesian and ellipsoidal latitude, longitude and height coordinates}.
|
|
713
709
|
'''
|
|
714
710
|
|
|
715
|
-
def reverse(self, xyz, y=None, z=None, M=None, **
|
|
711
|
+
def reverse(self, xyz, y=None, z=None, M=None, **lon00_name): # PYCHOK unused M
|
|
716
712
|
'''Conversion from geocentric C{(x, y, z)} to geodetic C{(lat, lon, height)}
|
|
717
713
|
transcoded from I{Chris Veness}' U{JavaScript<https://www.Movable-Type.co.UK/
|
|
718
714
|
scripts/geodesy/docs/latlon-ellipsoidal.js.html>}.
|
|
@@ -726,10 +722,9 @@ class EcefVeness(_EcefBase):
|
|
|
726
722
|
@kwarg y: ECEF C{y} coordinate for C{scalar} B{C{xyz}} and B{C{z}} (C{meter}).
|
|
727
723
|
@kwarg z: ECEF C{z} coordinate for C{scalar} B{C{xyz}} and B{C{y}} (C{meter}).
|
|
728
724
|
@kwarg M: I{Ignored}, rotation matrix C{M} not available.
|
|
729
|
-
@kwarg
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
C{B{x}=0} and C{B{y}=0}.
|
|
725
|
+
@kwarg lon00_name: Optional C{B{name}=NN} (C{str}) and optional keyword argument
|
|
726
|
+
C{B{lon00}=INT0} (C{degrees}), an arbitrary I{"polar"} longitude
|
|
727
|
+
returned if C{B{x}=0} and C{B{y}=0}, see property C{lon00}.
|
|
733
728
|
|
|
734
729
|
@return: An L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with
|
|
735
730
|
geodetic coordinates C{(lat, lon, height)} for the given geocentric
|
|
@@ -747,7 +742,7 @@ class EcefVeness(_EcefBase):
|
|
|
747
742
|
system to latitude longitude and altitude}<https://www.ResearchGate.net/
|
|
748
743
|
publication/3709199>}.
|
|
749
744
|
'''
|
|
750
|
-
x, y, z, name = _xyzn4(xyz, y, z, self._Geocentrics, **
|
|
745
|
+
x, y, z, name = _xyzn4(xyz, y, z, self._Geocentrics, **lon00_name)
|
|
751
746
|
|
|
752
747
|
E = self.ellipsoid
|
|
753
748
|
a = E.a
|
|
@@ -778,7 +773,7 @@ class EcefVeness(_EcefBase):
|
|
|
778
773
|
else: # polar lat, lon arbitrarily lon00
|
|
779
774
|
C, lat, h = 3, (_N_90_0 if z < 0 else _90_0), (fabs(z) - E.b)
|
|
780
775
|
|
|
781
|
-
lon = self._polon(y, x, p, **
|
|
776
|
+
lon = self._polon(y, x, p, **lon00_name)
|
|
782
777
|
return Ecef9Tuple(x, y, z, lat, lon, h,
|
|
783
778
|
C, None, self.datum, # M=None
|
|
784
779
|
name=self._name__(name))
|
|
@@ -795,8 +790,8 @@ class EcefYou(_EcefBase):
|
|
|
795
790
|
pages 1-18 and U{PyMap3D <https://PyPI.org/project/pymap3d>}.
|
|
796
791
|
'''
|
|
797
792
|
|
|
798
|
-
def __init__(self, a_ellipsoid=_EWGS84, f=None, **
|
|
799
|
-
_EcefBase.__init__(self, a_ellipsoid, f=f, **
|
|
793
|
+
def __init__(self, a_ellipsoid=_EWGS84, f=None, **lon00_name): # PYCHOK signature
|
|
794
|
+
_EcefBase.__init__(self, a_ellipsoid, f=f, **lon00_name) # inherited documentation
|
|
800
795
|
self._ee2 = EcefYou._ee2(self.ellipsoid)
|
|
801
796
|
|
|
802
797
|
@staticmethod
|
|
@@ -806,7 +801,7 @@ class EcefYou(_EcefBase):
|
|
|
806
801
|
raise EcefError(ellipsoid=E, txt=_prolate_)
|
|
807
802
|
return sqrt0(e2), e2
|
|
808
803
|
|
|
809
|
-
def reverse(self, xyz, y=None, z=None, M=None, **
|
|
804
|
+
def reverse(self, xyz, y=None, z=None, M=None, **lon00_name): # PYCHOK unused M
|
|
810
805
|
'''Convert geocentric C{(x, y, z)} to geodetic C{(lat, lon, height)}
|
|
811
806
|
using I{Rey-Jer You}'s transformation.
|
|
812
807
|
|
|
@@ -815,10 +810,9 @@ class EcefYou(_EcefBase):
|
|
|
815
810
|
@kwarg y: ECEF C{y} coordinate for C{scalar} B{C{xyz}} and B{C{z}} (C{meter}).
|
|
816
811
|
@kwarg z: ECEF C{z} coordinate for C{scalar} B{C{xyz}} and B{C{y}} (C{meter}).
|
|
817
812
|
@kwarg M: I{Ignored}, rotation matrix C{M} not available.
|
|
818
|
-
@kwarg
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
C{B{x}=0} and C{B{y}=0}.
|
|
813
|
+
@kwarg lon00_name: Optional C{B{name}=NN} (C{str}) and optional keyword argument
|
|
814
|
+
C{B{lon00}=INT0} (C{degrees}), an arbitrary I{"polar"} longitude
|
|
815
|
+
returned if C{B{x}=0} and C{B{y}=0}, see property C{lon00}.
|
|
822
816
|
|
|
823
817
|
@return: An L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with
|
|
824
818
|
geodetic coordinates C{(lat, lon, height)} for the given geocentric
|
|
@@ -829,7 +823,7 @@ class EcefYou(_EcefBase):
|
|
|
829
823
|
B{C{z}} not C{scalar} for C{scalar} B{C{xyz}} or the
|
|
830
824
|
ellipsoid is I{prolate}.
|
|
831
825
|
'''
|
|
832
|
-
x, y, z, name = _xyzn4(xyz, y, z, self._Geocentrics, **
|
|
826
|
+
x, y, z, name = _xyzn4(xyz, y, z, self._Geocentrics, **lon00_name)
|
|
833
827
|
|
|
834
828
|
E = self.ellipsoid
|
|
835
829
|
e, e2 = self._ee2
|
|
@@ -854,7 +848,7 @@ class EcefYou(_EcefBase):
|
|
|
854
848
|
sB, cB = _copysign_1_0(z), _0_0
|
|
855
849
|
|
|
856
850
|
lat = atan1d(E.a * sB, E.b * cB) # atan(E.a_b * tan(B))
|
|
857
|
-
lon = self._polon(y, x, q, **
|
|
851
|
+
lon = self._polon(y, x, q, **lon00_name)
|
|
858
852
|
|
|
859
853
|
h = hypot(z - E.b * sB, q - E.a * cB)
|
|
860
854
|
if hypot2_(x, y, z * E.a_b) < E.a2:
|
|
@@ -898,7 +892,7 @@ class EcefMatrix(_NamedTuple):
|
|
|
898
892
|
t += _more # ... from .multiply
|
|
899
893
|
|
|
900
894
|
elif max(map(fabs, t)) > _1_0:
|
|
901
|
-
raise EcefError(unstr(EcefMatrix
|
|
895
|
+
raise EcefError(unstr(EcefMatrix, *t))
|
|
902
896
|
|
|
903
897
|
else: # build matrix from the following quaternion operations
|
|
904
898
|
# qrot(lam, [0,0,1]) * qrot(phi, [0,-1,0]) * [1,1,1,1]/2
|
pygeodesy/ellipsoidalBase.py
CHANGED
|
@@ -24,9 +24,8 @@ from pygeodesy.errors import _incompatible, _IsnotError, RangeError, _TypeError,
|
|
|
24
24
|
# from pygeodesy.fmath import favg # _MODS
|
|
25
25
|
from pygeodesy.interns import NN, _COMMA_, _ellipsoidal_
|
|
26
26
|
from pygeodesy.latlonBase import LatLonBase, _trilaterate5, fabs, _Wrap
|
|
27
|
-
|
|
27
|
+
from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS
|
|
28
28
|
# from pygeodesy.lcc import toLcc # _MODS
|
|
29
|
-
from pygeodesy.named import _name1__, _ALL_DOCS, _ALL_LAZY, _MODS
|
|
30
29
|
# from pygeodesy.namedTuples import Vector3Tuple # _MODS
|
|
31
30
|
from pygeodesy.props import deprecated_method, deprecated_property_RO, \
|
|
32
31
|
Property_RO, property_doc_, property_RO, _update_all
|
|
@@ -37,7 +36,7 @@ from pygeodesy.units import Epoch, _isDegrees, Radius_, _1mm as _TOL_M
|
|
|
37
36
|
# from math import fabs # from .latlonBase
|
|
38
37
|
|
|
39
38
|
__all__ = _ALL_LAZY.ellipsoidalBase
|
|
40
|
-
__version__ = '24.
|
|
39
|
+
__version__ = '24.06.06'
|
|
41
40
|
|
|
42
41
|
|
|
43
42
|
class CartesianEllipsoidalBase(CartesianBase):
|
|
@@ -291,13 +290,6 @@ class LatLonEllipsoidalBase(LatLonBase):
|
|
|
291
290
|
'''DEPRECATED, use method L{toRefFrame}.'''
|
|
292
291
|
return self.toRefFrame(reframe2)
|
|
293
292
|
|
|
294
|
-
@Property_RO
|
|
295
|
-
def _css(self):
|
|
296
|
-
'''(INTERNAL) Get this C{LatLon} point as a Cassini-Soldner location (L{Css}).
|
|
297
|
-
'''
|
|
298
|
-
css = _MODS.css
|
|
299
|
-
return css.toCss(self, height=self.height, Css=css.Css, name=self.name)
|
|
300
|
-
|
|
301
293
|
@property_doc_(''' this points's datum (L{Datum}).''')
|
|
302
294
|
def datum(self):
|
|
303
295
|
'''Get this point's datum (L{Datum}).
|
|
@@ -644,13 +636,6 @@ class LatLonEllipsoidalBase(LatLonBase):
|
|
|
644
636
|
'''
|
|
645
637
|
return self._iteration
|
|
646
638
|
|
|
647
|
-
@Property_RO
|
|
648
|
-
def _lcc(self):
|
|
649
|
-
'''(INTERNAL) Get this C{LatLon} point as a Lambert location (L{Lcc}).
|
|
650
|
-
'''
|
|
651
|
-
lcc = _MODS.lcc
|
|
652
|
-
return lcc.toLcc(self, height=self.height, Lcc=lcc.Lcc, name=self.name)
|
|
653
|
-
|
|
654
639
|
def midpointTo(self, other, height=None, fraction=_0_5, wrap=False):
|
|
655
640
|
'''Find the midpoint on a geodesic between this and an other point.
|
|
656
641
|
|
|
@@ -722,20 +707,6 @@ class LatLonEllipsoidalBase(LatLonBase):
|
|
|
722
707
|
height=height, wrap=wrap, tol=tol)
|
|
723
708
|
return t.closest
|
|
724
709
|
|
|
725
|
-
@Property_RO
|
|
726
|
-
def _osgr(self):
|
|
727
|
-
'''(INTERNAL) Get this C{LatLon} point as an OSGR coordinate (L{Osgr}),
|
|
728
|
-
based on the OS recommendation.
|
|
729
|
-
'''
|
|
730
|
-
return _MODS.osgr.toOsgr(self, kTM=False, name=self.name) # datum=self.datum
|
|
731
|
-
|
|
732
|
-
@Property_RO
|
|
733
|
-
def _osgrTM(self):
|
|
734
|
-
'''(INTERNAL) Get this C{LatLon} point as an OSGR coordinate (L{Osgr})
|
|
735
|
-
based on I{Karney}'s Krüger implementation.
|
|
736
|
-
'''
|
|
737
|
-
return _MODS.osgr.toOsgr(self, kTM=True, name=self.name) # datum=self.datum
|
|
738
|
-
|
|
739
710
|
def parse(self, strllh, height=0, datum=None, epoch=None, reframe=None,
|
|
740
711
|
sep=_COMMA_, wrap=False, **name):
|
|
741
712
|
'''Parse a string consisting of C{"lat, lon[, height]"},
|
|
@@ -832,8 +803,7 @@ class LatLonEllipsoidalBase(LatLonBase):
|
|
|
832
803
|
|
|
833
804
|
@see: Function L{pygeodesy.toCss}.
|
|
834
805
|
'''
|
|
835
|
-
return
|
|
836
|
-
self, **_name1__(toCss_kwds, _or_nameof=self))
|
|
806
|
+
return _MODS.css.toCss(self, **self._name1__(toCss_kwds))
|
|
837
807
|
|
|
838
808
|
def toDatum(self, datum2, height=None, **name):
|
|
839
809
|
'''Convert this point to an other datum.
|
|
@@ -869,8 +839,7 @@ class LatLonEllipsoidalBase(LatLonBase):
|
|
|
869
839
|
|
|
870
840
|
@see: Function L{pygeodesy.toEtm8}.
|
|
871
841
|
'''
|
|
872
|
-
return self.
|
|
873
|
-
self, **_name1__(toEtm8_kwds, _or_nameof=self))
|
|
842
|
+
return _MODS.etm.toEtm8(self, **self._name1__(toEtm8_kwds)) if toEtm8_kwds else self._etm
|
|
874
843
|
|
|
875
844
|
def toLcc(self, **toLcc_kwds):
|
|
876
845
|
'''Convert this C{LatLon} point to a Lambert location.
|
|
@@ -881,8 +850,7 @@ class LatLonEllipsoidalBase(LatLonBase):
|
|
|
881
850
|
|
|
882
851
|
@see: Function L{pygeodesy.toLcc}.
|
|
883
852
|
'''
|
|
884
|
-
return
|
|
885
|
-
self, **_name1__(toLcc_kwds, _or_nameof=self))
|
|
853
|
+
return _MODS.lcc.toLcc(self, **self._name1__(toLcc_kwds))
|
|
886
854
|
|
|
887
855
|
def toMgrs(self, center=False, pole=NN):
|
|
888
856
|
'''Convert this C{LatLon} point to an MGRS coordinate.
|
|
@@ -911,12 +879,7 @@ class LatLonEllipsoidalBase(LatLonBase):
|
|
|
911
879
|
|
|
912
880
|
@see: Function L{pygeodesy.toOsgr}.
|
|
913
881
|
'''
|
|
914
|
-
|
|
915
|
-
kwds = _name1__(toOsgr_kwds, _or_nameof=self)
|
|
916
|
-
r = _MODS.osgr.toOsgr(self, kTM=kTM, **kwds)
|
|
917
|
-
else:
|
|
918
|
-
r = self._osgrTM if kTM else self._osgr
|
|
919
|
-
return r
|
|
882
|
+
return _MODS.osgr.toOsgr(self, kTM=kTM, **self._name1__(toOsgr_kwds))
|
|
920
883
|
|
|
921
884
|
def toRefFrame(self, reframe2, reframe=None, epoch=None, epoch2=None, height=None, **name):
|
|
922
885
|
'''Convert this point to an other reference frame and epoch.
|
pygeodesy/ellipsoidalNvector.py
CHANGED
|
@@ -25,7 +25,7 @@ from __future__ import division as _; del _ # PYCHOK semicolon
|
|
|
25
25
|
|
|
26
26
|
from pygeodesy.basics import issubclassof, map2, _xinstanceof
|
|
27
27
|
from pygeodesy.datums import _earth_ellipsoid, _ellipsoidal_datum, _WGS84
|
|
28
|
-
# from pygeodesy.dms import toDMS # _MODS
|
|
28
|
+
# from pygeodesy.dms import F_D, toDMS # _MODS
|
|
29
29
|
from pygeodesy.ellipsoidalBase import CartesianEllipsoidalBase, \
|
|
30
30
|
_nearestOn, LatLonEllipsoidalBase, \
|
|
31
31
|
_TOL_M, _Wrap
|
|
@@ -37,8 +37,8 @@ from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS, _ALL_OTHER
|
|
|
37
37
|
from pygeodesy.ltpTuples import Aer as _Aer, Ned as _Ned, Ned4Tuple, \
|
|
38
38
|
sincos2d_, _xnamed
|
|
39
39
|
# from pygeodesy.named import _xnamed # from .ltpTuples
|
|
40
|
-
from pygeodesy.nvectorBase import
|
|
41
|
-
|
|
40
|
+
from pygeodesy.nvectorBase import LatLonNvectorBase, NorthPole, NvectorBase, \
|
|
41
|
+
sumOf as _sumOf, fabs, fdot
|
|
42
42
|
from pygeodesy.props import deprecated_class, deprecated_function, \
|
|
43
43
|
deprecated_method, Property_RO, property_RO
|
|
44
44
|
from pygeodesy.streprs import Fmt, fstr, _xzipairs
|
|
@@ -48,7 +48,7 @@ from pygeodesy.units import Bearing, Distance, Height, Scalar
|
|
|
48
48
|
# from math import fabs # from .nvectorBase
|
|
49
49
|
|
|
50
50
|
__all__ = _ALL_LAZY.ellipsoidalNvector
|
|
51
|
-
__version__ = '24.
|
|
51
|
+
__version__ = '24.06.08'
|
|
52
52
|
|
|
53
53
|
|
|
54
54
|
class Ned(_Ned):
|
|
@@ -70,10 +70,10 @@ class Ned(_Ned):
|
|
|
70
70
|
with length or slantrange C{L}, bearing or azimuth C{B}
|
|
71
71
|
and elevation C{E}.
|
|
72
72
|
'''
|
|
73
|
-
|
|
73
|
+
m = _MODS.dms
|
|
74
74
|
t = (fstr(self.slantrange, prec=prec),
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
m.toDMS(self.azimuth, form=m.F_D, prec=prec, ddd=0),
|
|
76
|
+
m.toDMS(self.elevation, form=m.F_D, prec=prec, ddd=0))
|
|
77
77
|
return _xzipairs('LBE', t, sep=sep, fmt=fmt)
|
|
78
78
|
|
|
79
79
|
|
pygeodesy/errors.py
CHANGED
|
@@ -26,7 +26,7 @@ from pygeodesy.lazily import _ALL_LAZY, _ALL_MODS as _MODS, _getenv, _PYTHON_X_D
|
|
|
26
26
|
from copy import copy as _copy
|
|
27
27
|
|
|
28
28
|
__all__ = _ALL_LAZY.errors # _ALL_DOCS('_InvalidError', '_IsnotError') _under
|
|
29
|
-
__version__ = '24.
|
|
29
|
+
__version__ = '24.06.08'
|
|
30
30
|
|
|
31
31
|
_argument_ = 'argument'
|
|
32
32
|
_box_ = 'box'
|
|
@@ -43,7 +43,7 @@ try:
|
|
|
43
43
|
|
|
44
44
|
if _PYTHON_X_DEV or _getenv('PYGEODESY_EXCEPTION_CHAINING', NN): # == _std_
|
|
45
45
|
_exception_chaining = True # turned on, std
|
|
46
|
-
raise AttributeError # allow exception chaining
|
|
46
|
+
raise AttributeError() # allow exception chaining
|
|
47
47
|
|
|
48
48
|
_exception_chaining = False # turned off
|
|
49
49
|
|
pygeodesy/frechet.py
CHANGED
|
@@ -103,7 +103,7 @@ from collections import defaultdict as _defaultdict
|
|
|
103
103
|
# from math import radians # from .points
|
|
104
104
|
|
|
105
105
|
__all__ = _ALL_LAZY.frechet
|
|
106
|
-
__version__ = '24.
|
|
106
|
+
__version__ = '24.06.10'
|
|
107
107
|
|
|
108
108
|
|
|
109
109
|
def _fraction(fraction, n):
|
|
@@ -842,12 +842,11 @@ class Frechet6Tuple(_NamedTuple):
|
|
|
842
842
|
_Names_ = ('fd', 'fi1', 'fi2', 'r', _n_, _units_)
|
|
843
843
|
_Units_ = (_Pass, FIx, FIx, Number_, Number_, _Pass)
|
|
844
844
|
|
|
845
|
-
def toUnits(self, **
|
|
845
|
+
def toUnits(self, **Error_name): # PYCHOK expected
|
|
846
846
|
'''Overloaded C{_NamedTuple.toUnits} for C{fd} units.
|
|
847
847
|
'''
|
|
848
848
|
U = _xUnit(self.units, Float) # PYCHOK expected
|
|
849
|
-
self.
|
|
850
|
-
return _NamedTuple.toUnits(self, **Error)
|
|
849
|
+
return _NamedTuple.toUnits(self.reUnit(U), **Error_name) # PYCHOK self
|
|
851
850
|
|
|
852
851
|
# def __gt__(self, other):
|
|
853
852
|
# _xinstanceof(Frechet6Tuple, other=other)
|
pygeodesy/fsums.py
CHANGED
|
@@ -47,7 +47,7 @@ from pygeodesy.streprs import Fmt, fstr, unstr
|
|
|
47
47
|
from math import ceil as _ceil, fabs, floor as _floor # PYCHOK used! .ltp
|
|
48
48
|
|
|
49
49
|
__all__ = _ALL_LAZY.fsums
|
|
50
|
-
__version__ = '24.
|
|
50
|
+
__version__ = '24.06.09'
|
|
51
51
|
|
|
52
52
|
_add_op_ = _PLUS_ # in .auxilats.auxAngle
|
|
53
53
|
_eq_op_ = _EQUAL_ * 2 # _DEQUAL_
|
|
@@ -2178,7 +2178,7 @@ try:
|
|
|
2178
2178
|
# float.__getformat__('float')[:4] == 'IEEE'?)
|
|
2179
2179
|
if _fsum((1, 1e101, 1, -1e101)) != 2: # PYCHOK no cover
|
|
2180
2180
|
del _fsum # nope, remove _fsum ...
|
|
2181
|
-
raise ImportError # ... use _fsum below
|
|
2181
|
+
raise ImportError() # ... use _fsum below
|
|
2182
2182
|
|
|
2183
2183
|
Fsum._math_fsum = _sum = _fsum # PYCHOK exported
|
|
2184
2184
|
except ImportError:
|
pygeodesy/geodsolve.py
CHANGED
|
@@ -26,7 +26,7 @@ from pygeodesy.solveBase import _SolveBase, _SolveLineBase
|
|
|
26
26
|
from pygeodesy.utily import _unrollon, _Wrap, wrap360
|
|
27
27
|
|
|
28
28
|
__all__ = _ALL_LAZY.geodsolve
|
|
29
|
-
__version__ = '24.
|
|
29
|
+
__version__ = '24.06.04'
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
class GeodSolve12Tuple(_GTuple):
|
|
@@ -59,11 +59,11 @@ class _GeodesicSolveBase(_SolveBase):
|
|
|
59
59
|
def _cmdBasic(self):
|
|
60
60
|
'''(INTERNAL) Get the basic C{GeodSolve} cmd (C{tuple}).
|
|
61
61
|
'''
|
|
62
|
-
return (self.GeodSolve,) + self._b_option
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
62
|
+
return (self.GeodSolve, '-f') + (self._b_option +
|
|
63
|
+
self._e_option +
|
|
64
|
+
self._E_option +
|
|
65
|
+
self._p_option +
|
|
66
|
+
self._u_option)
|
|
67
67
|
|
|
68
68
|
@Property_RO
|
|
69
69
|
def _E_option(self):
|
|
@@ -362,49 +362,47 @@ if __name__ == '__main__':
|
|
|
362
362
|
p = glS.ArcPosition(49.475527)
|
|
363
363
|
printf('ArcPosition: %s %r', p == r, p)
|
|
364
364
|
|
|
365
|
-
# % python3 -m pygeodesy.geodsolve
|
|
366
365
|
|
|
367
|
-
#
|
|
366
|
+
# % python3 -m pygeodesy.geodsolve
|
|
368
367
|
|
|
369
|
-
# version: /opt/local/bin/GeodSolve: GeographicLib version
|
|
368
|
+
# version: /opt/local/bin/GeodSolve: GeographicLib version 2.2
|
|
370
369
|
|
|
371
|
-
# Direct: GDict(
|
|
370
|
+
# Direct: GDict(a12=49.475527, azi1=51.0, azi2=107.189397, lat1=40.6, lat2=51.884565, lon1=-73.8, lon2=-1.141173, m12=4844148.703101, M12=0.650911, M21=0.651229, s12=5500000.0, S12=39735075134877.09375)
|
|
372
371
|
# Direct3: Destination3Tuple(lat=51.884565, lon=-1.141173, final=107.189397)
|
|
373
372
|
|
|
374
|
-
# Inverse: GDict(
|
|
373
|
+
# Inverse: GDict(a12=49.94131, azi1=51.198883, azi2=107.821777, lat1=40.6, lat2=51.6, lon1=-73.8, lon2=-0.5, m12=4877684.602706, M12=0.64473, M21=0.645046, s12=5551759.400319, S12=40041368848742.53125)
|
|
375
374
|
# Inverse1: 49.94131021789904
|
|
376
375
|
# Inverse3: Distance3Tuple(distance=5551759.400319, initial=51.198883, final=107.821777)
|
|
377
376
|
|
|
378
|
-
# Position: True GDict(
|
|
379
|
-
# ArcPosition: False GDict(
|
|
377
|
+
# Position: True GDict(a12=49.475527, azi1=51.0, azi2=107.189397, lat1=40.6, lat2=51.884565, lon1=-73.8, lon2=-1.141173, m12=4844148.703101, M12=0.650911, M21=0.651229, s12=5500000.0, S12=39735075134877.09375)
|
|
378
|
+
# ArcPosition: False GDict(a12=49.475527, azi1=51.0, azi2=107.189397, lat1=40.6, lat2=51.884565, lon1=-73.8, lon2=-1.141174, m12=4844148.669561, M12=0.650911, M21=0.651229, s12=5499999.948497, S12=39735074737272.734375)
|
|
380
379
|
|
|
381
380
|
|
|
382
381
|
# % python3 -m pygeodesy.geodsolve --verbose
|
|
383
382
|
|
|
384
383
|
# GeodesicSolve 'Test' 1: /opt/local/bin/GeodSolve --version (invoke)
|
|
385
|
-
# GeodesicSolve 'Test' 1: /opt/local/bin/GeodSolve: GeographicLib version
|
|
386
|
-
# version: /opt/local/bin/GeodSolve: GeographicLib version
|
|
387
|
-
# GeodesicSolve 'Test' 2: /opt/local/bin/GeodSolve -E -p 10
|
|
384
|
+
# GeodesicSolve 'Test' 1: /opt/local/bin/GeodSolve: GeographicLib version 2.2 (0)
|
|
385
|
+
# version: /opt/local/bin/GeodSolve: GeographicLib version 2.2
|
|
386
|
+
# GeodesicSolve 'Test' 2: /opt/local/bin/GeodSolve -f -E -p 10 \ 40.600000000000001 -73.799999999999997 51.0 5500000.0 (Direct)
|
|
388
387
|
# GeodesicSolve 'Test' 2: lat1=40.600000000000001, lon1=-73.799999999999997, azi1=51.0, lat2=51.884564505606761, lon2=-1.141172861200829, azi2=107.189397162605886, s12=5500000.0, a12=49.475527463251467, m12=4844148.703101486, M12=0.65091056699808603, M21=0.65122865892196558, S12=39735075134877.094 (0)
|
|
389
388
|
|
|
390
|
-
# Direct: GDict(
|
|
391
|
-
# GeodesicSolve 'Test' 3: /opt/local/bin/GeodSolve -E -p 10
|
|
389
|
+
# Direct: GDict(a12=49.475527, azi1=51.0, azi2=107.189397, lat1=40.6, lat2=51.884565, lon1=-73.8, lon2=-1.141173, m12=4844148.703101, M12=0.650911, M21=0.651229, s12=5500000.0, S12=39735075134877.09375)
|
|
390
|
+
# GeodesicSolve 'Test' 3: /opt/local/bin/GeodSolve -f -E -p 10 \ 40.600000000000001 -73.799999999999997 51.0 5500000.0 (Direct3)
|
|
392
391
|
# GeodesicSolve 'Test' 3: lat1=40.600000000000001, lon1=-73.799999999999997, azi1=51.0, lat2=51.884564505606761, lon2=-1.141172861200829, azi2=107.189397162605886, s12=5500000.0, a12=49.475527463251467, m12=4844148.703101486, M12=0.65091056699808603, M21=0.65122865892196558, S12=39735075134877.094 (0)
|
|
393
392
|
# Direct3: Destination3Tuple(lat=51.884565, lon=-1.141173, final=107.189397)
|
|
394
|
-
# GeodesicSolve 'Test' 4: /opt/local/bin/GeodSolve -E -p 10 -
|
|
393
|
+
# GeodesicSolve 'Test' 4: /opt/local/bin/GeodSolve -f -E -p 10 -i \ 40.600000000000001 -73.799999999999997 51.600000000000001 -0.5 (Inverse)
|
|
395
394
|
# GeodesicSolve 'Test' 4: lat1=40.600000000000001, lon1=-73.799999999999997, azi1=51.198882845579824, lat2=51.600000000000001, lon2=-0.5, azi2=107.821776735514248, s12=5551759.4003186841, a12=49.941310217899037, m12=4877684.6027061976, M12=0.64472969205948238, M21=0.64504567852134398, S12=40041368848742.531 (0)
|
|
396
395
|
|
|
397
|
-
# Inverse: GDict(
|
|
398
|
-
# GeodesicSolve 'Test' 5: /opt/local/bin/GeodSolve -E -p 10 -
|
|
396
|
+
# Inverse: GDict(a12=49.94131, azi1=51.198883, azi2=107.821777, lat1=40.6, lat2=51.6, lon1=-73.8, lon2=-0.5, m12=4877684.602706, M12=0.64473, M21=0.645046, s12=5551759.400319, S12=40041368848742.53125)
|
|
397
|
+
# GeodesicSolve 'Test' 5: /opt/local/bin/GeodSolve -f -E -p 10 -i \ 40.600000000000001 -73.799999999999997 51.600000000000001 -0.5 (Inverse1)
|
|
399
398
|
# GeodesicSolve 'Test' 5: lat1=40.600000000000001, lon1=-73.799999999999997, azi1=51.198882845579824, lat2=51.600000000000001, lon2=-0.5, azi2=107.821776735514248, s12=5551759.4003186841, a12=49.941310217899037, m12=4877684.6027061976, M12=0.64472969205948238, M21=0.64504567852134398, S12=40041368848742.531 (0)
|
|
400
399
|
# Inverse1: 49.94131021789904
|
|
401
|
-
# GeodesicSolve 'Test' 6: /opt/local/bin/GeodSolve -E -p 10 -
|
|
400
|
+
# GeodesicSolve 'Test' 6: /opt/local/bin/GeodSolve -f -E -p 10 -i \ 40.600000000000001 -73.799999999999997 51.600000000000001 -0.5 (Inverse3)
|
|
402
401
|
# GeodesicSolve 'Test' 6: lat1=40.600000000000001, lon1=-73.799999999999997, azi1=51.198882845579824, lat2=51.600000000000001, lon2=-0.5, azi2=107.821776735514248, s12=5551759.4003186841, a12=49.941310217899037, m12=4877684.6027061976, M12=0.64472969205948238, M21=0.64504567852134398, S12=40041368848742.531 (0)
|
|
403
402
|
# Inverse3: Distance3Tuple(distance=5551759.400319, initial=51.198883, final=107.821777)
|
|
404
403
|
|
|
405
|
-
# Position: True GDict(
|
|
406
|
-
# ArcPosition: False GDict(
|
|
407
|
-
|
|
404
|
+
# Position: True GDict(a12=49.475527, azi1=51.0, azi2=107.189397, lat1=40.6, lat2=51.884565, lon1=-73.8, lon2=-1.141173, m12=4844148.703101, M12=0.650911, M21=0.651229, s12=5500000.0, S12=39735075134877.09375)
|
|
405
|
+
# ArcPosition: False GDict(a12=49.475527, azi1=51.0, azi2=107.189397, lat1=40.6, lat2=51.884565, lon1=-73.8, lon2=-1.141174, m12=4844148.669561, M12=0.650911, M21=0.651229, s12=5499999.948497, S12=39735074737272.734375)
|
|
408
406
|
|
|
409
407
|
# **) MIT License
|
|
410
408
|
#
|