code: def get_lonlatalt(self, utc_time):
          
          (pos_x, pos_y, pos_z), (vel_x, vel_y, vel_z) = self.get_position(
              utc_time, normalize=True)
  
          lon = ((np.arctan2(pos_y * XKMPER, pos_x * XKMPER) - astronomy.gmst(utc_time))
                 % (2 * np.pi))
  
          lon = np.where(lon > np.pi, lon - np.pi * 2, lon)
          lon = np.where(lon <= -np.pi, lon + np.pi * 2, lon)
  
          r = np.sqrt(pos_x ** 2 + pos_y ** 2)
          lat = np.arctan2(pos_z, r)
          e2 = F * (2 - F)
          while True:
              lat2 = lat
              c = 1 / (np.sqrt(1 - e2 * (np.sin(lat2) ** 2)))
              lat = np.arctan2(pos_z + c * e2 * np.sin(lat2), r)
              if np.all(abs(lat - lat2) < 1e-10):
                  break
          alt = r / np.cos(lat) - c
          alt *= A
          return np.rad2deg(lon), np.rad2deg(lat), alt
docs: Calculate sublon, sublat and altitude of satellite.
          http://celestrak.com/columns/v02n03/