spatial

  • Spatial transformation routines

  • Gravitational and ellipsoidal parameters [7, 12]

Source code

General Methods

FirnCorr.spatial.data_type(x: ndarray, y: ndarray, t: ndarray) str[source]

Determines input data type based on variable dimensions

Parameters:
x: np.ndarray

x-dimension coordinates

y: np.ndarray

y-dimension coordinates

t: np.ndarray

Time coordinates

Returns:
String denoting input data type
  • 'time series'

  • 'drift'

  • 'grid'

class FirnCorr.spatial.datum(**kwargs)[source]

Class for gravitational and ellipsoidal parameters [7, 15]

Parameters:
ellipsoid: str, default ‘WGS84’

Reference ellipsoid name

  • 'CLK66': Clarke 1866

  • 'CLK80': Clarke 1880

  • 'GRS67': Geodetic Reference System 1967

  • 'GRS80': Geodetic Reference System 1980

  • 'HGH80': Hughes 1980 Ellipsoid

  • 'WGS60': World Geodetic System 1960

  • 'WGS66': World Geodetic System 1966

  • 'WGS72': World Geodetic System 1972

  • 'WGS84': World Geodetic System 1984

  • 'ATS77': Quasi-earth centred ellipsoid for ATS77

  • 'NAD27': North American Datum 1927

  • 'NAD83': North American Datum 1983

  • 'INTER': International

  • 'KRASS': Krassovsky (USSR)

  • 'SGS90': Soviet Geodetic System 1990

  • 'HLMRT': Helmert 1906 Ellipsoid

  • 'HOUGH': Hough 1960 Ellipsoid

  • 'AIRY': Airy (1830)

  • 'MAIRY': Modified Airy (1849)

  • 'MERIT': MERIT 1983 ellipsoid

  • 'TOPEX': TOPEX/POSEIDON ellipsoid

  • 'EGM96': EGM 1996 gravity model

  • 'IAG75': International Association of Geodesy (1975)

  • 'IAU64': International Astronomical Union (1964)

  • 'IAU76': International Astronomical Union (1976)

  • 'IERS89': IERS Numerical Standards (1989)

  • 'IERS': IERS Numerical Standards (2010)

units: str, default `MKS`

Output units

  • 'MKS': meters, kilograms, seconds

  • 'CGS': centimeters, grams, seconds

Attributes:
a_axis: float

Semi-major axis of the ellipsoid

flat: float

Flattening of the ellipsoid

omega: float

Angular velocity of the Earth

GM: float

Geocentric gravitational constant

property rad_e: float

Average radius of the Earth with same volume as ellipsoid

property b_axis: float

Semi-minor axis of the ellipsoid

property ratio: float

Ratio between ellipsoidal axes

property rad_p: float

Polar radius of curvature

property ecc: float

Linear eccentricity

property ecc1: float

First numerical eccentricity

property ecc2: float

Second numerical eccentricity

property m: float

\(m\) Parameter

property f2: float

\(f_2\) component

property f4: float

\(f_4\) component

property q: float

\(q\) Parameter

property q0: float

\(q_0\) Parameter

property J2: float

Oblateness \(J_2\) coefficient

property C20: float

Normalized \(C_{20}\) harmonic

property gamma_a: float

Normal gravity at the equator

property gamma_b: float

Normal gravity at the pole

gamma_0(theta: float | ndarray) float[source]

Normal gravity at colatitudes

Parameters:
theta: float

Colatitudes (radians)

gamma_h(theta: float | ndarray, height: float | ndarray) float[source]

Normal gravity at colatitudes and heights

Parameters:
theta: float

Colatitudes (radians)

height: float

Height above ellipsoid (same as units)

property dk: float

Ratio between gravity at pole versus gravity at equator

property U0: float

Normal potential at the ellipsoid

property area: float

Surface area of the ellipsoid

property volume: float

Volume of the ellipsoid

property rho_e: float

Average density

FirnCorr.spatial.convert_ellipsoid(lat1: ndarray, h1: ndarray, a1: float, f1: float, a2: float, f2: float, eps: float = 1e-12, itmax: int = 10)[source]

Convert latitudes and heights to a different ellipsoid using Newton-Raphson [9]

Parameters:
lat1: np.ndarray

Latitude of input ellipsoid (degrees)

h1: np.ndarray

Height above input ellipsoid (meters)

a1: float

Semi-major axis of input ellipsoid

f1: float

Flattening of input ellipsoid

a2: float

Semi-major axis of output ellipsoid

f2: float

Flattening of output ellipsoid

eps: float, default 1e-12

Tolerance to prevent division by small numbers and to determine convergence

itmax: int, default 10

Maximum number of iterations to use in Newton-Raphson

Returns:
lat2: np.ndarray

Latitude of output ellipsoid (degrees)

h2: np.ndarray

Height above output ellipsoid (meters)

FirnCorr.spatial.compute_delta_h(lat: ndarray, a1: float, f1: float, a2: float, f2: float)[source]

Compute difference in elevation for two ellipsoids at a given latitude using a simplified empirical relation [9]

Parameters:
lat: np.ndarray

Latitudes (degrees north)

a1: float

Semi-major axis of input ellipsoid

f1: float

Flattening of input ellipsoid

a2: float

Semi-major axis of output ellipsoid

f2: float

Flattening of output ellipsoid

Returns:
delta_h: np.ndarray

Difference in elevation for two ellipsoids

FirnCorr.spatial.wrap_longitudes(lon: float | ndarray)[source]

Wraps longitudes to range from -180 to +180

Parameters:
lon: float or np.ndarray

Longitude (degrees east)

FirnCorr.spatial.to_cartesian(lon: ndarray, lat: ndarray, h: float | ndarray = 0.0, a_axis: float = 6378137.0, flat: float = 0.0033528106647474805)[source]

Converts geodetic coordinates to Cartesian coordinates

Parameters:
lon: np.ndarray

Longitude (degrees east)

lat: np.ndarray

Latitude (degrees north)

h: float or np.ndarray, default 0.0

Height above ellipsoid (or sphere)

a_axis: float, default 6378137.0

Semi-major axis of the ellipsoid

For spherical coordinates set to radius of the Earth

flat: float, default 1.0/298.257223563

Ellipsoidal flattening

For spherical coordinates set to 0

Returns:
x: np.ndarray

Cartesian x-coordinates (meters)

y: np.ndarray

Cartesian y-coordinates (meters)

z: np.ndarray

Cartesian z-coordinates (meters)

FirnCorr.spatial.to_sphere(x: ndarray, y: ndarray, z: ndarray)[source]

Convert from cartesian coordinates to spherical coordinates

Parameters:
x, np.ndarray

Cartesian x-coordinates (meters)

y, np.ndarray

Cartesian y-coordinates (meters)

z, np.ndarray

Cartesian z-coordinates (meters)

Returns:
lon: np.ndarray

Longitude (degrees east)

lat: np.ndarray

Latitude (degrees north)

rad: np.ndarray

Radius (meters)

FirnCorr.spatial.to_geodetic(x: ndarray, y: ndarray, z: ndarray, a_axis: float = 6378137.0, flat: float = 0.0033528106647474805, method: str = 'bowring', eps: float = np.float64(2.220446049250313e-16), iterations: int = 10)[source]

Convert from cartesian coordinates to geodetic coordinates using either iterative or closed-form methods

Parameters:
x, np.ndarray

Cartesian x-coordinates (meters)

y, np.ndarray

Cartesian y-coordinates (meters)

z, np.ndarray

Cartesian z-coordinates (meters)

a_axis: float, default 6378137.0

Semi-major axis of the ellipsoid

flat: float, default 1.0/298.257223563

Ellipsoidal flattening

method: str, default ‘bowring’

Method to use for conversion

  • 'moritz': iterative solution

  • 'bowring': iterative solution

  • 'zhu': closed-form solution

eps: float, default np.finfo(np.float64).eps

Tolerance for iterative methods

iterations: int, default 10

Maximum number of iterations

Returns:
lon: np.ndarray

Longitude (degrees east)

lat: np.ndarray

Latitude (degrees north)

h: np.ndarray

Height above ellipsoid (meters)

FirnCorr.spatial._moritz_iterative(x: ndarray, y: ndarray, z: ndarray, a_axis: float = 6378137.0, flat: float = 0.0033528106647474805, eps: float = np.float64(2.220446049250313e-16), iterations: int = 10)[source]

Convert from cartesian coordinates to geodetic coordinates using the iterative solution of Hofmann-Wellenhof and Moritz [7]

Parameters:
x, np.ndarray

Cartesian x-coordinates (meters)

y, np.ndarray

Cartesian y-coordinates (meters)

z, np.ndarray

Cartesian z-coordinates (meters)

a_axis: float, default 6378137.0

Semi-major axis of the ellipsoid

flat: float, default 1.0/298.257223563

Ellipsoidal flattening

eps: float, default np.finfo(np.float64).eps

Tolerance for iterative method

iterations: int, default 10

Maximum number of iterations

FirnCorr.spatial._bowring_iterative(x: ndarray, y: ndarray, z: ndarray, a_axis: float = 6378137.0, flat: float = 0.0033528106647474805, eps: float = np.float64(2.220446049250313e-16), iterations: int = 10)[source]

Convert from cartesian coordinates to geodetic coordinates using the iterative solution of Bowring [1], Bowring [2]

Parameters:
x, np.ndarray

Cartesian x-coordinates (meters)

y, np.ndarray

Cartesian y-coordinates (meters)

z, np.ndarray

Cartesian z-coordinates (meters)

a_axis: float, default 6378137.0

Semi-major axis of the ellipsoid

flat: float, default 1.0/298.257223563

Ellipsoidal flattening

eps: float, default np.finfo(np.float64).eps

Tolerance for iterative method

iterations: int, default 10

Maximum number of iterations

FirnCorr.spatial._zhu_closed_form(x: ndarray, y: ndarray, z: ndarray, a_axis: float = 6378137.0, flat: float = 0.0033528106647474805)[source]

Convert from cartesian coordinates to geodetic coordinates using the closed-form solution of Zhu [18]

Parameters:
x, np.ndarray

Cartesian x-coordinates (meters)

y, np.ndarray

Cartesian y-coordinates (meters)

z, np.ndarray

Cartesian z-coordinates (meters)

a_axis: float, default 6378137.0

Semi-major axis of the ellipsoid

flat: float, default 1.0/298.257223563

Ellipsoidal flattening

FirnCorr.spatial.geocentric_latitude(lat: ndarray, flat: float = 0.0033528106647474805)[source]

Compute the geocentric latitude from a geodetic latitude using a simplified empirical relation [13]

Parameters:
lat: np.ndarray

Geodetic latitudes (degrees north)

flat: float, default 1.0/298.257223563

Ellipsoidal flattening

Returns:
geolat: np.ndarray

Geocentric latitude (degrees)

FirnCorr.spatial.scale_factors(lat: ndarray, flat: float = 0.0033528106647474805, reference_latitude: float = 70.0, metric: str = 'area')[source]

Calculates scaling factors to account for polar stereographic distortion including special case of at the exact pole [13]

Parameters:
lat: np.ndarray

Latitude (degrees north)

flat: float, default 1.0/298.257223563

Ellipsoidal flattening

reference_latitude: float, default 70.0

Reference latitude (true scale latitude)

metric: str, default ‘area’

Metric to calculate scaling factors

  • 'distance': scale factors for distance

  • 'area': scale factors for area

Returns:
scale: np.ndarray

Scaling factors at input latitudes