Coverage for pygeodesy/cartesianBase.py : 96%

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}..
@newfield example: Example, Examples '''
_xinstanceof, _xkwds _spherical_, _SQUARE_, _1_0 # PYCHOK used!
'''(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) Zap cached attributes if updated. '''
'''(INTERNAL) Return a new cartesian by applying a Helmert transform to this cartesian.
@arg transform: Transform to apply (L{Transform}). @kwarg inverse: Optionally, apply the inverse Helmert transform (C{bool}). @kwarg datum: Optional datum of the returned point, (C{B{datum}=}L{Datum}).
@return: The transformed point (C{Cartesian}).
@note: For C{B{inverse}=True} keyword B{C{datum}} must be C{B{datum}=}L{Datums.WGS84}. '''
'''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. '''
c = self.convertDatum(datum) else:
return c.copy() if c is self else c
else: # neither datum2 nor c.datum is WGS84, invert to WGS84 first
'''Get this cartesian's datum (L{Datum}). '''
'''Set this cartesian's C{datum} I{without conversion}.
@arg datum: New datum (L{Datum}).
@raise TypeError: The B{C{datum}} is not a L{Datum}. ''' raise _IsnotError(_ellipsoidal_, datum=datum) raise _IsnotError(_spherical_, datum=datum)
'''Get the height (C{meter}). '''
'''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 the ECEF I{class} (L{EcefKarney} or L{EcefVeness}). '''
'''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) Get the (C{nvectorBase._N_vector_}). ''' from pygeodesy.nvectorBase import _N_vector_ r = self._v4t or self.toNvector() return _N_vector_(r.x, r.y, r.z, h=r.h)
'''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 C{latlonheightdatum} or property C{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 suggests. ''' t = self.toLatLon(datum=datum, LatLon=None) r = LatLon4Tuple(t.lat, t.lon, t.height, t.datum) return self._xnamed(r)
# 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) # for n, v in pairs.items(): # setattr(r, n, v) # r = self._xnamed(r) # return r
'''Convert this cartesian to 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 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:
'''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 B{C{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) ''' # <https://www.Movable-Type.co.UK/scripts/geodesy/docs/ # latlon-nvector-ellipsoidal.js.html#line309>
# Kenneth Gade eqn 23
raise _ValueError(origin=self) # d = e * hypot(x, y)
# tmp = 1 / hypot(d, z) == 1 / hypot(e * hypot(x, y), z) raise _ValueError(origin=self)
'''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))
# xyz = Vector3d.xyz # '''Get this cartesian's X, Y and Z components (L{Vector3Tuple}C{(x, y, z)}). # '''
# **) MIT License # # Copyright (C) 2016-2020 -- 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. |