def length(self): '''Get the length (norm, magnitude) of this vector (C{float}). @see: Properties C{length2} and C{euclid}. ''' if self._length is None: self._length = hypot_(self.x, self.y, self.z) return self._length
def toCartesian(self, h=None, Cartesian=None, datum=None, **Cartesian_kwds): '''Convert this n-vector to C{Nvector}-based cartesian (ECEF) coordinates. @kwarg h: Optional height, overriding this n-vector's height (C{meter}). @kwarg Cartesian: Optional class to return the (ECEF) coordinates (L{Cartesian}). @kwarg datum: Optional, spherical datum (C{Datum}). @kwarg Cartesian_kwds: Optional, additional B{C{Cartesian}} keyword arguments, ignored if B{C{Cartesian=None}}. @return: The cartesian (ECEF) coordinates (B{C{Cartesian}}) or if B{C{Cartesian}} 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{Cartesian}}. @raise ValueError: Invalid B{C{h}}. @example: >>> v = Nvector(0.5, 0.5, 0.7071) >>> c = v.toCartesian() # [3194434, 3194434, 4487327] >>> p = c.toLatLon() # 45.0°N, 45.0°E ''' x, y, z = self.x, self.y, self.z h = self.h if h is None else Height(h=h) d = datum or self.datum E = d.ellipsoid # Kenneth Gade eqn (22) n = E.b / hypot_(x * E.a_b, y * E.a_b, z) r = h + n * E.a_b**2 c = self.Ecef(d).reverse(x * r, y * r, z * (n + h), M=True) if Cartesian is not None: # class or .classof c = Cartesian(c, **Cartesian_kwds) return self._xnamed(c)
def toCartesian(self, Cartesian=Cartesian): '''Convert this n-vector to a cartesian point. @keyword Cartesian: Optional, cartesion (sub-)class to return the point (L{Cartesian}). @return: Cartesian equivalent to this n-vector (B{C{Cartesian}}). @example: >>> v = Nvector(0.5, 0.5, 0.7071) >>> c = v.toCartesian() # [3194434, 3194434, 4487327] >>> p = c.toLatLon() # 45.0°N, 45.0°E ''' E = self.datum.ellipsoid x, y, z, h = self.to4xyzh() # Kenneth Gade eqn (22) n = E.b / hypot_(x * E.a_b, y * E.a_b, z) r = h + n * E.a_b**2 c = Cartesian(x * r, y * r, z * (n + h)) return self._xnamed(c)
def toCartesian(self, h=None, Cartesian=None, datum=None, **kwds): '''Convert this n-vector to C{Nvector}-based cartesian (ECEF) coordinates. @keyword height: Optional height, overriding this n-vector's height (C{meter}). @keyword Cartesian: Optional (sub-)class to return the (ECEF)coordinates (L{Cartesian}). @keyword datum: Optional, spherical datum (C{Datum}). @keyword kwds: Optional, additional C{name=value} pairs for B{C{Cartesian}} instance, provided B{C{Cartesian}} is not C{None}. @return: Cartesian (ECEF) coordinates (B{C{Cartesian}}). @raise TypeError: Invalid B{C{Cartesian}}. @example: >>> v = Nvector(0.5, 0.5, 0.7071) >>> c = v.toCartesian() # [3194434, 3194434, 4487327] >>> p = c.toLatLon() # 45.0°N, 45.0°E ''' x, y, z = self.x, self.y, self.z if h is None: h = self.h d = datum or self.datum E = d.ellipsoid # Kenneth Gade eqn (22) n = E.b / hypot_(x * E.a_b, y * E.a_b, z) r = h + n * E.a_b**2 c = self.Ecef(d).reverse(x * r, y * r, z * (n + h), M=True) if Cartesian is not None: # class or .classof c = Cartesian(c, **kwds) return self._xnamed(c)
def hypot3(x, y, z): '''DEPRECATED, use function L{hypot_}. ''' from pygeodesy.fmath import hypot_ return hypot_(x, y, z)
def length(self): '''Get the length (norm, magnitude) of this vector (C{float}). ''' if self._length is None: self._length = hypot_(self.x, self.y, self.z) return self._length
def length(self): '''Gets the length of this NED vector (C{meter}). ''' if self._length is None: self._length = hypot_(self.north, self.east, self.down) return self._length
def toNvector(self, Nvector=None, datum=None, **Nvector_kwds): # PYCHOK Datums.WGS84 '''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) ''' d = _ellipsoidal_datum(datum or self.datum, name=self.name) r = self._v4t if r is None or d != self.datum: # <https://www.Movable-Type.co.UK/scripts/geodesy/docs/ # latlon-nvector-ellipsoidal.js.html#line309> E = d.ellipsoid x, y, z = self.xyz # Kenneth Gade eqn 23 p = hypot2(x, y) * E.a2_ q = (z**2 * E.e12) * E.a2_ r = fsum_(p, q, -E.e4) / 6 s = (p * q * E.e4) / (4 * r**3) t = cbrt(fsum_(1, s, sqrt(s * (2 + s)))) u = r * fsum_(_1_0, t, _1_0 / t) v = sqrt(u**2 + E.e4 * q) w = E.e2 * fsum_(u, v, -q) / (2 * v) k = sqrt(fsum_(u, v, w**2)) - w if abs(k) < EPS: raise _ValueError(origin=self) e = k / (k + E.e2) # d = e * hypot(x, y) # tmp = 1 / hypot(d, z) == 1 / hypot(e * hypot(x, y), z) t = hypot_(e * x, e * y, z) # == 1 / tmp if t < EPS: raise _ValueError(origin=self) h = fsum_(k, E.e2, -_1_0) / k * t s = e / t # == e * tmp r = Vector4Tuple(x * s, y * s, z / t, h) self._v4t = r if d == self.datum else None if Nvector is not None: r = Nvector(r.x, r.y, r.z, h=r.h, datum=d, **Nvector_kwds) return self._xnamed(r)