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/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.05.31'
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, **name_lon00):
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(name_lon00, lon00=self.lon00)
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, **name_lon00): # PYCHOK no cover
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, **name_lon00)
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, **name_lon00): # PYCHOK unused M
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 name_lon00: Optional keyword arguments C{B{name}=NN} (C{str}) and
338
- I{"polar"} longitude C{B{lon00}=INT0} (C{degrees}), overriding
339
- the default and property C{lon00} setting and returned if
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, **name_lon00)
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, **name_lon00)
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, **name_lon00): # PYCHOK unused M
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 name_lon00: Optional keyword arguments C{B{name}=NN} (C{str}) and
413
- I{"polar"} longitude C{B{lon00}=INT0} (C{degrees}), overriding
414
- the default and property C{lon00} setting and returned in case
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, **name_lon00)
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, **name_lon00)
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, **name_lon00):
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 name_lon00: Optional keyword arguments C{B{name}=NN} (C{str}) and
485
- I{"polar"} longitude C{B{lon00}=INT0} (C{degrees}), overriding
486
- the default and property C{lon00} setting and returned in case
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, **name_lon00)
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, **name_lon00)
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, **name_lon00): # PYCHOK unused M
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 name_lon00: Optional keyword arguments C{B{name}=NN} (C{str}) and
628
- I{"polar"} longitude C{B{lon00}=INT0} (C{degrees}), overriding
629
- the default and property C{lon00} setting and returned in case
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, **name_lon00)
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, **name_lon00)
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, **name_lon00): # PYCHOK unused M
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 name_lon00: Optional keyword arguments C{B{name}=NN} (C{str}) and
730
- I{"polar"} longitude C{B{lon00}=INT0} (C{degrees}), overriding
731
- the default and property C{lon00} setting and returned in case
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, **name_lon00)
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, **name_lon00)
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, **name_lon00): # PYCHOK signature
799
- _EcefBase.__init__(self, a_ellipsoid, f=f, **name_lon00) # inherited documentation
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, **name_lon00): # PYCHOK unused M
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 name_lon00: Optional keyword arguments C{B{name}=NN} (C{str}) and
819
- I{"polar"} longitude C{B{lon00}=INT0} (C{degrees}), overriding
820
- the default and property C{lon00} setting and returned in case
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, **name_lon00)
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, **name_lon00)
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.__name__, *t))
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
@@ -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
- # from pygeodesy.lazily import _ALL_DOCS, _ALL_LAZY, _ALL_MODS as _MODS # from .named
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.05.31'
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 self._css if not toCss_kwds else _MODS.css.toCss(
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._etm if not toEtm8_kwds else _MODS.etm.toEtm8(
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 self._lcc if not toLcc_kwds else _MODS.lcc.toLcc(
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
- if toOsgr_kwds:
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.
@@ -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 fabs, fdot, NorthPole, LatLonNvectorBase, \
41
- NvectorBase, sumOf as _sumOf
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.05.19'
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
- dms = _MODS.dms
73
+ m = _MODS.dms
74
74
  t = (fstr(self.slantrange, prec=prec),
75
- dms.toDMS(self.azimuth, form=dms.F_D, prec=prec, ddd=0),
76
- dms.toDMS(self.elevation, form=dms.F_D, prec=prec, ddd=0))
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.05.29'
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.05.26'
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, **Error): # PYCHOK expected
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._Units_ = (U,) + Frechet6Tuple._Units_[1:]
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.05.29'
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.05.31'
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
- + self._e_option \
64
- + self._E_option \
65
- + self._p_option \
66
- + self._u_option + ('-f',)
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
- # version: /opt/local/bin/GeodSolve: GeographicLib version 1.51
366
+ # % python3 -m pygeodesy.geodsolve
368
367
 
369
- # version: /opt/local/bin/GeodSolve: GeographicLib version 1.51
368
+ # version: /opt/local/bin/GeodSolve: GeographicLib version 2.2
370
369
 
371
- # Direct: GDict(M12=0.650911, M21=0.651229, S12=39735075134877.09375, a12=49.475527, azi1=51.0, azi2=107.189397, lat1=40.6, lat2=51.884565, lon1=-73.8, lon2=-1.141173, m12=4844148.703101, s12=5500000.0)
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(M12=0.64473, M21=0.645046, S12=40041368848742.53125, a12=49.94131, azi1=51.198883, azi2=107.821777, lat1=40.6, lat2=51.6, lon1=-73.8, lon2=-0.5, m12=4877684.602706, s12=5551759.400319)
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(M12=0.650911, M21=0.651229, S12=39735075134877.09375, a12=49.475527, azi1=51.0, azi2=107.189397, lat1=40.6, lat2=51.884565, lon1=-73.8, lon2=-1.141173, m12=4844148.703101, s12=5500000.0)
379
- # ArcPosition: False GDict(M12=0.650911, M21=0.651229, S12=39735074737272.734375, a12=49.475527, azi1=51.0, azi2=107.189397, lat1=40.6, lat2=51.884565, lon1=-73.8, lon2=-1.141174, m12=4844148.669561, s12=5499999.948497)
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 1.51 (0)
386
- # version: /opt/local/bin/GeodSolve: GeographicLib version 1.51
387
- # GeodesicSolve 'Test' 2: /opt/local/bin/GeodSolve -E -p 10 -f \ 40.600000000000001 -73.799999999999997 51.0 5500000.0 (Direct)
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(M12=0.650911, M21=0.651229, S12=39735075134877.09375, a12=49.475527, azi1=51.0, azi2=107.189397, lat1=40.6, lat2=51.884565, lon1=-73.8, lon2=-1.141173, m12=4844148.703101, s12=5500000.0)
391
- # GeodesicSolve 'Test' 3: /opt/local/bin/GeodSolve -E -p 10 -f \ 40.600000000000001 -73.799999999999997 51.0 5500000.0 (Direct3)
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 -f -i \ 40.600000000000001 -73.799999999999997 51.600000000000001 -0.5 (Inverse)
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(M12=0.64473, M21=0.645046, S12=40041368848742.53125, a12=49.94131, azi1=51.198883, azi2=107.821777, lat1=40.6, lat2=51.6, lon1=-73.8, lon2=-0.5, m12=4877684.602706, s12=5551759.400319)
398
- # GeodesicSolve 'Test' 5: /opt/local/bin/GeodSolve -E -p 10 -f -i \ 40.600000000000001 -73.799999999999997 51.600000000000001 -0.5 (Inverse1)
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 -f -i \ 40.600000000000001 -73.799999999999997 51.600000000000001 -0.5 (Inverse3)
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(M12=0.650911, M21=0.651229, S12=39735075134877.09375, a12=49.475527, azi1=51.0, azi2=107.189397, lat1=40.6, lat2=51.884565, lon1=-73.8, lon2=-1.141173, m12=4844148.703101, s12=5500000.0)
406
- # ArcPosition: False GDict(M12=0.650911, M21=0.651229, S12=39735074737272.734375, a12=49.475527, azi1=51.0, azi2=107.189397, lat1=40.6, lat2=51.884565, lon1=-73.8, lon2=-1.141174, m12=4844148.669561, s12=5499999.948497)
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
  #