Package: pymap3d
Python 3-D coordinate conversionsPure Python (no prerequistes beyond Python itself) 3-D geographic coordinate conversions and geodesy.
Function syntax is roughly similar to Matlab Mapping Toolbox.
PyMap3D is intended for non-interactive use on massively parallel (HPC) and embedded systems.API docsThanks to ourcontributors.Similar toolboxes in other code languagesMatlab, GNU OctaveFortranRustC++PrerequisitesNumpy and AstroPy are optional.
Algorithms from Vallado and Meeus are used if AstroPy is not present.Installpython3-mpipinstallpymap3dor for the latest development code:gitclonehttps://github.com/geospace-code/pymap3d

pipinstall-epymap3dOne can verify Python functionality after installation by:pytestpymap3dUsageWhere consistent with the definition of the functions, all arguments may
be arbitrarily shaped (scalar, N-D array).importpymap3daspmx,y,z=pm.geodetic2ecef(lat,lon,alt)az,el,range=pm.geodetic2aer(lat,lon,alt,observer_lat,observer_lon,0)Pythonargument unpackingcan be used for compact function arguments with scalars or arbitrarily
shaped N-D arrays:aer=(az,el,slantrange)obslla=(obs_lat,obs_lon,obs_alt)lla=pm.aer2geodetic(*aer,*obslla)where tuplellais comprised of scalar or N-D arrays(lat,lon,alt).Example scripts are in theexamplesdirectory.Native Python float is typically64 bit.
Numpy can select real precision bits: 32, 64, 128, etc.FunctionsPopular 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 geodetic2eci eci2geodetic
enu2aer  enu2ecef   enu2geodetic
geodetic2aer  geodetic2ecef  geodetic2enu  geodetic2ned
ned2aer  ned2ecef   ned2geodetic
azel2radec radec2azel
lookAtSpheroid
track2 departure meanm
rcurve rsphere
geod2geoc geoc2geod
geodetic2spherical spherical2geodeticVincenty functions "vincenty.vreckon" and "vincenty.vdist" are accessed like:importpymap3d.vincentyaspmvlat2,lon2=pmv.vreckon(lat1,lon1,ground_range_m,azimuth_deg)dist_m,azimuth_deg=pmv.vdist(lat1,lon1,lat2,lon2)Additional functions:loxodrome_inverse: rhumb line distance and azimuth between ellipsoid points (lat,lon)  akin to Matlabdistance('rh', ...)andazimuth('rh', ...)loxodrome_directgeodetic latitude transforms to/from: parametric, authalic, isometric, and more in pymap3d.latitudeAbbreviations:AER: Azimuth, Elevation, RangeECEF: Earth-centered, Earth-fixedECI: Earth-centered Inertial using IERSviaastropyENU: East North UpNED: North East Downradec: right ascension, declinationEllipsoidNumerous functions in pymap3d use an ellipsoid model.
The default is WGS84 Ellipsoid.
Numerous other ellipsoids are available in pymap3d.Ellipsoid.Print available ellipsoid models:importpymap3daspmprint(pm.Ellipsoid.models)Specify GRS80 ellipsoid:importpymap3daspmell=pm.Ellipsoid.from_name('grs80')array vs scalarUse of pymap3d on embedded systems or other streaming data applications often deal with scalar position data.
These data are handled efficiently with the Python math stdlib module.
Vector data can be handled via list comprehension.Those needing multidimensional data with SIMD and other Numpy and/or PyPy accelerated performance can do so automatically by installing Numpy.
pymap3d seamlessly falls back to Python's math module if Numpy isn't present.
To keep the code clean, only scalar data can be used without Numpy.
As noted above, use list comprehension if you need vector data without Numpy.CaveatsAtmospheric 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.Compare to Matlab Mapping and Aerospace ToolboxThe tests in files tests/test_matlab*.py selected bypytest-kmatlab# run from pymap3d/ top-level directoryuseMatlab Engine for Pythonto compare Python PyMap3D output with Matlab output using Matlab functions.NotesAs compared toPyProj:PyMap3D does not require anything beyond pure Python for most transformsAstronomical conversions are done using (optional) AstroPy for established accuracyPyMap3D API is similar to Matlab Mapping Toolbox, while PyProj's interface is quite distinctPyMap3D intrinsically handles local coordinate systems such as ENU,
while PyProj ENU requires someadditional 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.AstroPy.Units.QuantityAt this time,AstroPy.Units.Quantityis not supported.
Let us know if this is of interest.
Impacts on performance would have to be considered before making Quantity a first-class citizen.
For now, you can workaround by passing in the.valueof the variable.