I need to transform ECI to ECEF coordinate. Here, I need the formula in math and algorithm. I have looking for the formula in the internet, but I can find one. I have x, y, z cartesian coord in ECI. And want to transform it to ECEF coord. Anybody knows the formula and algorithm?


2 Answers 2


The Explanatory Supplement to the Astronomical Almanac has all the equations you need. Take a look at chapters 3 and 4.

Keep in mind you need some clear definitions of what you mean by ECEF and ECI. Most people utilize WGS84 for ECEF, but that is not a requirement. Similarly ECI could be J2000 or ICRF

In general you will need 4 steps to convert from ECI to ECEF:

  1. Calculate earth's precession
  2. Calculate earth's nutation
  3. Account for earth's rotation including UTC-UT1 offset
  4. Account for polar motion
  5. Convert to lan/lon if desired

The first two transformations are purely analytical, and can be obtained from books like the Explanatory Supplement. The third and fourth transformation rely on irregularly varying parameters that have to be updated for a specific date.

The help system for the Systems ToolKit (STK) has some excellent descriptions on various frames and transformation process, but not actual equations.

  • $\begingroup$ Thank you, its solved. I just count precesison effect and Account for earth's rotation. $\endgroup$ Nov 1, 2019 at 0:28

The ECI and ECEF frames have approximately the same origin and $z$ axis and only differ by an angular component on the $xy$ plane. This angular difference can be used to rotate a vector from one frame to the other.

The $x_{ECEF}$ axis rotates along the equatorial plane about $z_{ECI}=z_{ECEF}$. The angle that it makes with the $x_{ECI}$ axis is known as the Earth Rotation Angle (ERA) or Greenwich Sidereal Angle. To convert between ECI and ECEF frames, we must first gain the ERA denoted as $\gamma\in[0, 2\pi]$.

We begin at an epoch, say J2000, where the ERA is known to be $280.46$ degrees. Using the elapsed time since epoch, we can propagate the epoch ERA through time to a date of interest. Stated mathematically in the following block equation, the Earth rotation rate is given by $360.985...$ degrees per day, $\Delta T$ is the elapsed time in days since the epoch, and $280.46$ is the ERA at $\Delta T=0$.

\begin{equation}\label{eqERA} \gamma = 360.9856123035484\times\Delta T + 280.46 \end{equation}

To convert a vector between the ECI and ECEF frames requires rotating the vector about the $z$-axis by the Greenwich Sidereal Angle, $\gamma$, using the rotational matrix given in the following block equation. These conversions can be seen in equations the final two equations where $\mu_{C'}^C$ converts coordinates from frame $C$ to frame $C'$.

\begin{equation}\label{eqEz} E_3^\theta = \begin{pmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \\ \end{pmatrix} \end{equation}

\begin{equation}\label{eqECEF2ECI} \vec{V}_{ECI} = \mu_{ECI}^{ECEF}\;\vec{V}_{ECEF} = E_3^\gamma\;\vec{V}_{ECEF} \end{equation} \begin{equation}\label{eqECI2ECEF} \vec{V}_{ECEF} = \mu_{ECEF}^{ECI}\;\vec{V}_{ECI} = E_3^{-\gamma}\;\vec{V}_{ECI} \end{equation}

  • 1
    $\begingroup$ This is a good approximation, but technically not correct. ECI and ECEF do NOT have the Z axis aligned. They differ by the precession and nutation of the earth's axis. If you don't take this into account your transformation will be off by kilometers on the surface of the earth. Certainly not correct if you are going out of the way to establish your ECI frame as J2000. $\endgroup$
    – Carlos N
    Jun 8, 2021 at 18:29
  • $\begingroup$ You make a good point Carlos, although for some applications, such an approximation can still be valid. A team I am a part of are applying this algorithm to a cube satellite mission taking images of ground locations. Validating against the Astropy library, this method has a 100% accuracy with a tolerance of ~13 km. This error is apparently large but is only a 0.2% change in the overall ECEF coordinates. Although, now that you have made me aware off this, I am going to look into incorporating such effects into our approach. Thanks! $\endgroup$ Jun 9, 2021 at 18:07
  • $\begingroup$ I would just recommend using SPICE to do all your heavylifting here! spiceypy.readthedocs.io/en/main naif.jpl.nasa.gov/naif $\endgroup$
    – Shen
    Mar 29, 2022 at 18:34
  • $\begingroup$ I don't think this transformation is correct actually. I think since theta and velocity are changing with respect to time, you have to add a "dTheta * dE3" term. $\endgroup$
    – Brian
    May 11, 2022 at 18:12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.