Skip to main content

Position

Struct Position 

Source
pub struct Position<C: ReferenceCenter, F: ReferenceFrame, U: LengthUnit = Meter> {
    pub lon: Degrees,
    pub lat: Degrees,
    pub height: Quantity<U>,
    /* private fields */
}
Expand description

An ellipsoidal position (center + frame + height above ellipsoid).

This is the fundamental ellipsoidal (geodetic) coordinate type, analogous to spherical::Position for spherical coordinates.

§Type Parameters

  • C: The reference center (e.g., Geocentric)
  • F: The reference frame; determines the ellipsoid via HasEllipsoid
  • U: The length unit for the height (defaults to Meter)

§Field conventions

FieldMeaning
lonGeodetic longitude, positive eastward
latGeodetic latitude, positive northward
heightHeight above the reference ellipsoid

§Correctness note

Do not convert this value using spherical-to-Cartesian formulas. Always use the ellipsoid-aware to_cartesian method.

Fields§

§lon: Degrees

Geodetic longitude (positive eastward), in degrees.

§lat: Degrees

Geodetic latitude (positive northward), in degrees.

§height: Quantity<U>

Height above the reference ellipsoid.

Implementations§

Source§

impl<C, F, U> Position<C, F, U>

Source

pub const fn new_raw_with_params( center_params: C::Params, lon: Degrees, lat: Degrees, height: Quantity<U>, ) -> Self

Const-fn constructor with explicit center parameters.

Longitude and latitude are stored as-is (no normalisation). Use new_with_params if you want automatic normalisation.

Source

pub fn new_with_params( center_params: C::Params, lon: Degrees, lat: Degrees, height: Quantity<U>, ) -> Self

Constructor with explicit center parameters and lon/lat normalisation.

Longitude is normalised to [-180°, +180°) and latitude to [-90°, +90°] (pole-crossing is reflected into longitude).

Source

pub fn center_params(&self) -> &C::Params

Returns a reference to the center parameters.

Source§

impl<C, F, U> Position<C, F, U>
where C: ReferenceCenter<Params = ()>, F: ReferenceFrame, U: LengthUnit,

Source

pub const ORIGIN: Self

The geodetic origin: (0°E, 0°N, 0 height-units).

Source

pub const fn new_raw(lon: Degrees, lat: Degrees, height: Quantity<U>) -> Self

Const-fn constructor (no normalisation) for centers with Params = ().

Source

pub fn new(lon: Degrees, lat: Degrees, height: Quantity<U>) -> Self

Normalising constructor for centers with Params = ().

Source

pub fn try_new( lon: Degrees, lat: Degrees, height: Quantity<U>, ) -> Result<Self, Infallible>

Normalising constructor (infallible Result wrapper kept for API compat).

Source§

impl<C, F, U> Position<C, F, U>

Source

pub fn to_cartesian<TargetU: LengthUnit>(&self) -> Position<C, F, TargetU>
where C::Params: Clone,

Converts to a Cartesian ECEF position using the ellipsoid of frame F.

The ellipsoid constants are obtained from F::Ellipsoid at compile time.

§Type Parameter
  • TargetU: length unit for the output Position
§Example
use affn::ellipsoidal::Position;
use affn::centers::ReferenceCenter;
use qtty::*;

#[derive(Debug, Copy, Clone)]
struct Geocentric;
impl ReferenceCenter for Geocentric {
    type Params = ();
    fn center_name() -> &'static str { "Geocentric" }
}

{
    let obs = Position::<Geocentric, affn::frames::ECEF, Meter>::new(
        -17.89 * DEG, 28.76 * DEG, 2200.0 * M,
    );
    let cart: affn::cartesian::Position<Geocentric, affn::frames::ECEF, Meter> =
        obs.to_cartesian();
    // X ≈ 5 390 km, Y ≈ −1 730 km, Z ≈ 3 050 km (approx. La Palma)
}
Source

pub fn from_cartesian<SourceU: LengthUnit>( pos: &Position<C, F, SourceU>, ) -> Self
where C::Params: Clone,

Constructs an ellipsoidal position from a Cartesian ECEF position using the ellipsoid of frame F.

Uses the iterative Bowring algorithm (typically 2–3 iterations for sub-millimetre accuracy).

§Type Parameter
  • SourceU: length unit of the input Position
§Example
use affn::ellipsoidal::Position;
use affn::centers::ReferenceCenter;
use qtty::*;

#[derive(Debug, Copy, Clone)]
struct Geocentric;
impl ReferenceCenter for Geocentric {
    type Params = ();
    fn center_name() -> &'static str { "Geocentric" }
}

{
    let obs = Position::<Geocentric, affn::frames::ECEF, Meter>::new(
        -17.89 * DEG, 28.76 * DEG, 2200.0 * M,
    );
    let cart = obs.to_cartesian::<Meter>();
    let back = Position::<Geocentric, affn::frames::ECEF, Meter>::from_cartesian(&cart);
    assert!((back.lat.value() - obs.lat.value()).abs() < 1e-10);
}

Trait Implementations§

Source§

impl<C: Clone + ReferenceCenter, F: Clone + ReferenceFrame, U: Clone + LengthUnit> Clone for Position<C, F, U>
where C::Params: Clone,

Source§

fn clone(&self) -> Position<C, F, U>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<C: Debug + ReferenceCenter, F: Debug + ReferenceFrame, U: Debug + LengthUnit> Debug for Position<C, F, U>
where C::Params: Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<C, F> Default for Position<C, F, Meter>
where C: ReferenceCenter<Params = ()>, F: ReferenceFrame,

Source§

fn default() -> Self

Returns the geodetic origin: (0°E, 0°N, 0 m).

Source§

impl<C, F, U> Display for Position<C, F, U>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<C, F, U> PartialEq for Position<C, F, U>

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<C: Copy + ReferenceCenter, F: Copy + ReferenceFrame, U: Copy + LengthUnit> Copy for Position<C, F, U>
where C::Params: Copy,

Auto Trait Implementations§

§

impl<C, F, U> Freeze for Position<C, F, U>
where <C as ReferenceCenter>::Params: Freeze,

§

impl<C, F, U> RefUnwindSafe for Position<C, F, U>

§

impl<C, F, U> Send for Position<C, F, U>
where <C as ReferenceCenter>::Params: Send, F: Send, U: Send,

§

impl<C, F, U> Sync for Position<C, F, U>
where <C as ReferenceCenter>::Params: Sync, F: Sync, U: Sync,

§

impl<C, F, U> Unpin for Position<C, F, U>
where <C as ReferenceCenter>::Params: Unpin, F: Unpin, U: Unpin,

§

impl<C, F, U> UnsafeUnpin for Position<C, F, U>

§

impl<C, F, U> UnwindSafe for Position<C, F, U>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Scalar for T
where T: 'static + Clone + PartialEq + Debug,