Python 3-D coordinate conversions
3-D geographic coordinate conversions, with API similar to popular $1000 Matlab Mapping Toolbox routines for:
PyMap3D is intended for non-interactive use on massively parallel (HPC) and embedded systems. Includes some relevant Vallado algorithms.
- Python ≥ 3.5 or PyPy3
References to AstroPy are optional, algorithms from Vallado and Meeus are used if AstroPy is not present.
pip install pymap3d
or for the latest development code:
git clone https://github.com/scivision/pymap3d cd pymap3d pip install -e .
One can verify Python functionality after installation by:
pip install -e .[tests] pytest -rsv
Where consistent with the definition of the functions, all arguments may be arbitrarily shaped (scalar, N-D array).
import pymap3d as pm x,y,z = pm.geodetic2ecef(lat,lon,alt) az,el,range = pm.geodetic2aer(lat, lon, alt, observer_lat, observer_lon, 0)
aer = (az,el,slantrange) obslla = (obs_lat,obs_lon,obs_alt) lla = pm.aer2geodetic(*aer,*obslla)
lla is comprised of scalar or N-D arrays
Popular mapping toolbox functions ported to Python include the following, where the source coordinate system (before the "2") is converted to the desired coordinate system:
aer2ecef aer2enu aer2geodetic aer2ned ecef2aer ecef2enu ecef2enuv ecef2geodetic ecef2ned ecef2nedv ecef2eci eci2ecef eci2aer aer2eci enu2aer enu2ecef enu2geodetic geodetic2aer geodetic2ecef geodetic2enu geodetic2ned ned2aer ned2ecef ned2geodetic azel2radec radec2azel vreckon vdist lookAtSpheroid track2
loxodrome_inverse: rhumb line distance and azimuth between ellipsoid points (lat,lon) akin to Matlab
distance('rh', ...) and
- AER: Azimuth, Elevation, Range
- ECEF: Earth-centered, Earth-fixed
- ECI: Earth-centered Inertial
- ENU: East North Up
- NED: North East Down
- radec: right ascension, declination
- Atmospheric effects neglected in all functions not invoking AstroPy. Would need to update code to add these input parameters (just start a GitHub Issue to request).
- Planetary perturbations and nutation etc. not fully considered.
As compared to PyProj:
- PyMap3D does not require anything beyond pure Python + Numpy.
- PyMap3D API is similar to Matlab Mapping Toolbox, while PyProj's interface is quite distinct
- PyMap3D intrinsically handles local coordinate systems such as ENU, while for PyProj ENU requires some additional effort.
- PyProj is oriented towards points on the planet surface, while PyMap3D handles points on or above the planet surface equally well, particularly important for airborne vehicles and remote sensing.