Source code for pygeoid.coordinates.position

"""This module contains Position3D class."""

import astropy.units as u

from pygeoid.coordinates import transform


[docs] class Position3D: """Class represents a 3D positioning vector. The main purpose of the class is to store 3D positioning of the points in cartesian coordinates, so they can be easily transformed to curvilinear coordinates: geodetic, spherical, elliposidal-harmonic. Parameters ---------- x, y, z : float or array_like of floats Cartesian coordinates, in metres. """ @u.quantity_input def __init__(self, x: u.m, y: u.m, z: u.m): self._x = x self._y = y self._z = z
[docs] @classmethod @u.quantity_input def from_geodetic(cls, lat: u.deg, lon: u.deg, height: u.m, ell): """Position, initialized from geodetic coordinates. Parameters ---------- lat : ~astropy.units.Quantity Geodetic latitude. lon : ~astropy.units.Quantity Geodetic longitude. height : ~astropy.units.Quantity Geodetic height. ell : instance of the `pygeoid.coordinates.ellipsoid.Ellipsoid` Reference ellipsoid to which geodetic coordinates are referenced to. """ x, y, z = transform.geodetic_to_cartesian(lat, lon, height, ell=ell) return cls(x, y, z)
[docs] @classmethod @u.quantity_input def from_spherical(cls, lat: u.deg, lon: u.deg, radius: u.m): """Position, initialized from spherical coordinates. Parameters ---------- lat : ~astropy.units.Quantity Spherical latitude. lon : ~astropy.units.Quantity Spherical longitude. r : ~astropy.units.Quantity Radius. """ x, y, z = transform.spherical_to_cartesian(lat, lon, radius) return cls(x, y, z)
[docs] @classmethod @u.quantity_input def from_ellipsoidal(cls, rlat: u.deg, lon: u.deg, u_ax: u.m, ell): """Position, initialized from ellipsoidal coordinates. Parameters ---------- rlat : ~astropy.units.Quantity Reduced latitude. lon : ~astropy.units.Quantity Longitude. u_ax : ~astropy.units.Quantity Polar axis of the ellipsoid passing through the given point. ell : instance of the `pygeoid.coordinates.ellipsoid.Ellipsoid` Reference ellipsoid to which geodetic coordinates are referenced to. """ x, y, z = transform.ellipsoidal_to_cartesian(rlat, lon, u_ax, ell=ell) return cls(x, y, z)
@property def cartesian(self): """Return 3D cartesian coordinates""" return self._x, self._y, self._z @property def x(self): """Return x coordinate""" return self._x @property def y(self): """Return y coordinate""" return self._y @property def z(self): """Return z coordinate""" return self._z
[docs] def geodetic(self, ell): """Return geodetic coordinates. Parameters ---------- ell : instance of the `pygeoid.coordinates.ellipsoid.Ellipsoid` Reference ellipsoid to which geodetic coordinates are referenced to. Returns ------- lat : ~astropy.units.Quantity Geodetic latitude. lon : ~astropy.units.Quantity Geodetic longitude. height : ~astropy.units.Quantity Geodetic height. """ lat, lon, height = transform.cartesian_to_geodetic( self._x, self._y, self._z, ell=ell ) return lat, lon, height
[docs] def spherical(self): """Return spherical (geocentric) coordinates. Returns ------- lat : ~astropy.units.Quantity Spherical latitude. lon : ~astropy.units.Quantity Spherical longitude. r : ~astropy.units.Quantity Radius. """ lat, lon, radius = transform.cartesian_to_spherical(self._x, self._y, self._z) return lat, lon, radius
[docs] def ellipsoidal(self, ell): """Return ellipsoidal-harmonic coordinates. Parameters ---------- ell : instance of the `pygeoid.coordinates.ellipsoid.Ellipsoid` Reference ellipsoid to which ellipsoidal coordinates are referenced to. Returns ------- rlat : ~astropy.units.Quantity Reduced latitude. lon : ~astropy.units.Quantity Longitude. u_ax : ~astropy.units.Quantity Polar axis of the ellipsoid passing through the given point. """ rlat, lon, u_ax = transform.cartesian_to_ellipsoidal( self._x, self._y, self._z, ell=ell ) return rlat, lon, u_ax
[docs] @u.quantity_input def enu(self, origin: tuple[u.deg, u.deg, u.m], ell=None): """Return local east-north-up cartesian coordinates. Parameters ---------- origin : tuple of ~astropy.units.Quantity Ggeocentric (spherical) or geodetic coordinates of the origin (`lat0`, `lon0`, `r0`) or (`lat0`, `lon0`, `h0`). ell : instance of the `pygeoid.coordinates.ellipsoid.Ellipsoid` Reference ellipsoid to which geodetic coordinates are referenced to. Default is None, meaning spherical coordinates instead of geodetic. Returns ------- east, north, up : ~astropy.units.Quantity Local east-north-up cartesian coordinates. """ east, north, up = transform.ecef_to_enu( self._x, self._y, self._z, origin, ell=ell ) return east, north, up