Coverage for pygeodesy/cartesianBase.py : 90%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
# -*- coding: utf-8 -*-
C{Cartesian}s.
After I{(C) Chris Veness 2011-2015} published under the same MIT Licence**, see U{https://www.Movable-Type.co.UK/scripts/latlong.html}, U{https://www.Movable-Type.co.UK/scripts/latlong-vectors.html} and U{https://www.Movable-Type.co.UK/scripts/geodesy/docs/latlon-ellipsoidal.js.html}.. '''
_ValueError, _xkwds _1_0, _2_0, _4_0, _6_0 # from pygeodesy.named import _xnamed # from namedTuples
'''(INTERNAL) Base class for ellipsoidal and spherical C{Cartesian}. '''
'''New C{Cartesian...}.
@arg xyz: An L{Ecef9Tuple}, L{Vector3Tuple}, L{Vector4Tuple} or the C{X} coordinate (C{scalar}). @arg y: The C{Y} coordinate (C{scalar}) if B{C{xyz}} C{scalar}. @arg z: The C{Z} coordinate (C{scalar}) if B{C{xyz}} C{scalar}. @kwarg datum: Optional datum (L{Datum}, L{Ellipsoid}, L{Ellipsoid2} or L{a_f2Tuple}). @kwarg ll: Optional, original latlon (C{LatLon}). @kwarg name: Optional name (C{str}).
@raise TypeError: Non-scalar B{C{xyz}}, B{C{y}} or B{C{z}} coordinate or B{C{xyz}} not an L{Ecef9Tuple}, L{Vector3Tuple} or L{Vector4Tuple}. '''
'''(INTERNAL) Return a new cartesian by applying a Helmert transform to this cartesian.
@arg transform: Transform to apply (L{Transform}). @kwarg inverse: Apply the inverse of the Helmert transform (C{bool}). @kwarg datum: Datum for the transformed point (L{Datum}), overriding this point's datum.
@return: The transformed point (C{Cartesian}).
@raise Valuerror: If C{B{inverse}=True} and B{C{datum}} is not L{Datums}C{.WGS84}. ''' raise _ValueError(inverse=inverse, datum=d, txt=_not_(_WGS84.name))
'''Get this cartesian's datum (L{Datum}). '''
'''Set this cartesian's C{datum} I{without conversion}.
@arg datum: New datum (L{Datum}), ellipsoidal or spherical.
@raise TypeError: The B{C{datum}} is not a L{Datum}. ''' raise _IsnotError(_ellipsoidal_, datum=datum) raise _IsnotError(_spherical_, datum=datum)
'''Calculate the destination using a I{local} delta from this cartesian.
@arg delta: Local delta to the destination (L{XyzLocal}, L{Enu}, L{Ned} or L{Local9Tuple}). @kwarg Cartesian: Optional (geocentric) class to return the destination or C{None}. @kwarg Cartesian_kwds: Optional, additional B{C{Cartesian}} keyword arguments, ignored if C{B{Cartesian}=None}.
@return: Destination as a C{B{Cartesian}(x, y, z, **B{Cartesian_kwds})} instance or if C{B{Cartesian}=None}, an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with C{M=None} always.
@raise TypeError: Invalid B{C{delta}}, B{C{Cartesian}} or B{C{Cartesian_kwds}}. ''' if Cartesian is None: r = self._ltp._local2ecef(delta, nine=True) else: r = self._ltp._local2ecef(delta, nine=False) r = Cartesian(*r, **_xkwds(Cartesian_kwds, datum=self.datum)) return _xnamed(r, self.name)
'''Get the ECEF I{class} (L{EcefKarney}), I{lazily}. '''
'''(INTERNAL) Helper for L{toEcef}, L{toLocal} and L{toLtp} (L{Ecef9Tuple}). '''
'''Get the height (C{meter}). '''
'''Set the height.
@arg height: New height (C{meter}).
@raise TypeError: Invalid B{C{height}} C{type}.
@raise ValueError: Invalid B{C{height}}. ''' h = Height(height) self._update(h != self.height) self._height = h
'''Check whether this cartesian is ellipsoidal (C{bool} or C{None} if unknown). '''
'''Check whether this cartesian is spherical (C{bool} or C{None} if unknown). '''
'''Get this cartesian's (geodetic) lat- and longitude in C{degrees} (L{LatLon2Tuple}C{(lat, lon)}). '''
'''Get this cartesian's (geodetic) lat-, longitude in C{degrees} with height (L{LatLon3Tuple}C{(lat, lon, height)}). '''
'''Get this cartesian's (geodetic) lat-, longitude in C{degrees} with height and datum (L{LatLon4Tuple}C{(lat, lon, height, datum)}). '''
'''(INTERNAL) Cache for L{toLtp}. ''' from pygeodesy.ltp import Ltp return Ltp(self._ecef9, ecef=self.Ecef(self.datum), name=self.name)
'''(INTERNAL) Get the (C{nvectorBase._N_vector_}). '''
'''(INTERNAL) Get the n-vector components as L{Vector4Tuple}. ''' # <https://www.Movable-Type.co.UK/scripts/geodesy/docs/ # latlon-nvector-ellipsoidal.js.html#line309>
# Kenneth Gade eqn 23 raise _ValueError(origin=self, txt=Fmt.EPS0(t))
raise _ValueError(origin=self, txt=Fmt.EPS0(t))
raise _ValueError(origin=self, txt=Fmt.EPS0(k)) raise _ValueError(origin=self, txt=Fmt.EPS0(t)) # d = e * hypot(x, y)
# tmp = 1 / hypot(d, z) == 1 / hypot(e * hypot(x, y), z) raise _ValueError(origin=self, txt=Fmt.EPS0(t))
'''Get this cartesian's (geodetic) lat- and longitude in C{radians} (L{PhiLam2Tuple}C{(phi, lam)}). '''
'''Get this cartesian's (geodetic) lat-, longitude in C{radians} with height (L{PhiLam3Tuple}C{(phi, lam, height)}). '''
'''Get this cartesian's (geodetic) lat-, longitude in C{radians} with height and datum (L{PhiLam4Tuple}C{(phi, lam, height, datum)}). '''
def to3llh(self, datum=None): # PYCHOK no cover '''DEPRECATED, use property L{latlonheightdatum} or L{latlonheight}.
@return: A L{LatLon4Tuple}C{(lat, lon, height, datum)}.
@note: This method returns a B{C{-4Tuple}} I{and not a} C{-3Tuple} as its name may suggest. ''' t = self.toLatLon(datum=datum, LatLon=None) return LatLon4Tuple(t.lat, t.lon, t.height, t.datum, name=self.name)
# def _to3LLh(self, datum, LL, **pairs): # OBSOLETE # '''(INTERNAL) Helper for C{subclass.toLatLon} and C{.to3llh}. # ''' # r = self.to3llh(datum) # LatLon3Tuple # if LL is not None: # r = LL(r.lat, r.lon, height=r.height, datum=datum, name=self.name) # for n, v in pairs.items(): # setattr(r, n, v) # return r
'''Convert this cartesian from one datum to an other.
@arg datum2: Datum to convert I{to} (L{Datum}). @kwarg datum: Datum to convert I{from} (L{Datum}).
@return: The converted point (C{Cartesian}).
@raise TypeError: B{C{datum2}} or B{C{datum}} invalid. '''
self.toDatum(datum)
return c.copy() if c is self else c
else: # neither datum2 nor c.datum is WGS84, invert to WGS84 first
'''Convert this cartesian to I{geodetic} (lat-/longitude) coordinates.
@return: An L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with C{C} and C{M} if available.
@raise EcefError: A C{.datum} or an ECEF issue. '''
'''Convert this cartesian to a geodetic (lat-/longitude) point.
@kwarg datum: Optional datum (L{Datum}, L{Ellipsoid}, L{Ellipsoid2} or L{a_f2Tuple}). @kwarg height: Optional height, overriding the converted height (C{meter}), iff B{C{LatLon}} is not C{None}. @kwarg LatLon: Optional class to return the geodetic point (C{LatLon}) or C{None}. @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword arguments, ignored if C{B{LatLon}=None}.
@return: The geodetic point (B{C{LatLon}}) or if B{C{LatLon}} is C{None}, an L{Ecef9Tuple}C{(x, y, z, lat, lon, height, C, M, datum)} with C{C} and C{M} if available.
@raise TypeError: Invalid B{C{datum}} or B{C{LatLon_kwds}}. ''' else:
datum=r.datum, height=h, name=r.name))
'''Convert this I{geocentric} cartesian to I{local} C{X}, C{Y} and C{Z}.
@kwarg Xyz: Optional class to return C{X}, C{Y} and C{Z} (L{XyzLocal}, L{Enu}, L{Ned}) or C{None}. @kwarg ltp: The I{local tangent plane} (LTP) to use, overriding this cartesian's LTP (L{Ltp}). @kwarg Xyz_kwds: Optional, additional B{C{Xyz}} keyword arguments, ignored if C{B{Xyz}=None}.
@return: An B{C{Xyz}} instance or if C{B{Xyz}=None}, a L{Local9Tuple}C{(x, y, z, lat, lon, height, ltp, ecef, M)} with C{M=None} always.
@raise TypeError: Invalid B{C{ltp}}. '''
'''Return the I{local tangent plane} (LTP) for this cartesian.
@kwarg Ecef: Optional ECEF I{class} (L{EcefKarney}, ... L{EcefYou}), overriding this cartesian's C{Ecef}. ''' if Ecef in (None, self.Ecef): r = self._ltp else: from pygeodesy.ltp import Ltp r = Ltp(self._ecef9, ecef=Ecef(self.datum), name=self.name) return r
'''Convert this cartesian to C{n-vector} components.
@kwarg Nvector: Optional class to return the C{n-vector} components (C{Nvector}) or C{None}. @kwarg datum: Optional datum (L{Datum}, L{Ellipsoid}, L{Ellipsoid2} or L{a_f2Tuple}) overriding this cartesian's datum. @kwarg Nvector_kwds: Optional, additional B{C{Nvector}} keyword arguments, ignored if C{B{Nvector}=None}.
@return: The C{unit, n-vector} components (B{C{Nvector}}) or a L{Vector4Tuple}C{(x, y, z, h)} if B{C{Nvector}} is C{None}.
@raise TypeError: Invalid B{C{datum}}.
@raise ValueError: The B{C{Cartesian}} at origin.
@example:
>>> c = Cartesian(3980581, 97, 4966825) >>> n = c.toNvector() # (x=0.622818, y=0.00002, z=0.782367, h=0.242887) '''
'''Return the string representation of this cartesian.
@kwarg prec: Optional number of decimals, unstripped (C{int}). @kwarg fmt: Optional enclosing backets format (string). @kwarg sep: Optional separator to join (string).
@return: Cartesian represented as "[x, y, z]" (string). '''
'''Return this cartesian's components as vector.
@kwarg Vector: Optional class to return the C{n-vector} components (L{Vector3d}) or C{None}. @kwarg Vector_kwds: Optional, additional B{C{Vector}} keyword arguments, ignored if C{B{Vector}=None}.
@return: A B{C{Vector}} or an L{Vector3Tuple}C{(x, y, z)} if B{C{Vector}} is C{None}.
@raise TypeError: Invalid B{C{Vector}} or B{C{Vector_kwds}}. ''' return self.xyz if Vector is None else self._xnamed( Vector(self.x, self.y, self.z, **Vector_kwds))
'''(INTERNAL) Import and cache function C{ltp._xLtp}. '''
# **) MIT License # # Copyright (C) 2016-2021 -- mrJean1 at Gmail -- All Rights Reserved. # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), # to deal in the Software without restriction, including without limitation # the rights to use, copy, modify, merge, publish, distribute, sublicense, # and/or sell copies of the Software, and to permit persons to whom the # Software is furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # OTHER DEALINGS IN THE SOFTWARE. |