Skip to main content

pure Python coordinate conversions, following convention of several popular Matlab routines.

Project description

image image image image image image image image Maintainability PyPi Download stats

Python / Matlab / Fortran 3-D coordinate conversions

3-D geographic coordinate conversions, with API similar to popular $1000 Matlab Mapping Toolbox routines for:

  • Python
  • Matlab, GNU Octave
  • modern Fortran 2008 standard ("elemental" functions and subroutines for massively parallel computation)

PyMap3D is intended for non-interactive use on massively parallel (HPC) and embedded systems. Includes some relevant Vallado's algorithms.

API docs

Why not 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.


  • Python PyMap3D: Python >= 3.6
    • AstroPy (optional): If not present, ECI coordinate conversions are not available.
  • Matlab / GNU Octave: under matlab/
  • Fortran MapTran: under fortran/: Fortran 2018 compliant compiler. Tested with gfortran, ifort, PGI and flang, where the latter two use Fortran 2003 fallback code.


The three separate packages are independent, they don't rely on each other.

  • Python PyMap3D:

    pip install pymap3d

    or for the latest development code:

    git clone
    pip install -e .

    One can verify Python functionality after installation by:

    pip install -e .[tests]
    pytest -v
  • Fortran MapTran:

    cd bin
    cmake ..
    cmake --build .

    verify Fortran (as well as Python and Matlab/Octave) functionality after compiling by:

    ctest -V
  • Matlab/Octave: from within Matlab/Octave:


    One can verify Matlab code functionality by running:



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)

Python argument unpacking can 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 tuple lla is comprised of scalar or N-D arrays (lat,lon,alt).

Matlab / GNU Octave

The syntax is reasonably compatible with the $1000 Matlab Mapping Toolbox. Under the matlab/ directory:

x,y,z = geodetic2ecef([],lat,lon,alt)

az,el,range = geodetic2aer(lat, lon, alt, observer_lat, observer_lon, observer_alt)


The Fortran API under fortran/ directory is simple like PyMap3D. Modern Fortran "elemental" procedures throughout enable seamless support of scalar or array coordinate inputs. Default precision is real64, set at the top of fortran/maptran.f90.

use maptran

call geodetic2ecef(lat,lon,alt, x,y,z)
call geodetic2aer(lat,lon,alt, observer_lat, observer_lon, observer_alt)


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
enu2aer  enu2ecef   enu2geodetic
geodetic2aer  geodetic2ecef  geodetic2enu  geodetic2ned
ned2aer  ned2ecef   ned2geodetic
azel2radec radec2azel
vreckon vdist



  • 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.

Matlab / Octave

The matlab/ directory contains a subset of the Python conversion functions, usable from Matlab or GNU Octave. Mathworks currently charges $1000 for the Matlab Mapping Toolbox that provides these functions.

  • The full set of Python conversions are accessed from Matlab ≥ R2014b by commands like:

    lla = py.pymap3d.geodetic2ecef(x,y,z)
  • Matlab documentation generated by m2html.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for pymap3d, version 1.7.4
Filename, size File type Python version Upload date Hashes
Filename, size pymap3d-1.7.4.tar.gz (19.3 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page