Obtaining the time of closest approach between the satellite and the ground target, but it is not consistent with STK

Hello everyone, I would like to use TLE orbit to determine the time of satellite closest approach to a specified target as the overhead pass time. However, when I compare the results with the simulation results from STK software, there is always a small difference in the time of closest approach. For example, in the case below, it is consistently off by 2 seconds. I would like to know if this is due to an error in my code or the parameters I am using, or if there is a better way to determine the overhead pass time of the satellite with respect to the target. Here is my code:

        String line1 = "1 55256U 23007J   23158.76477304  .00029519  00000+0  88736-3 0  9992";
        String line2 = "2 55256  97.3576 231.9429 0009120 126.9031 233.3049 15.34315251 21957";
        final double equatorialRadius = Constants.WGS84_EARTH_EQUATORIAL_RADIUS;
        final double flattening = Constants.WGS84_EARTH_FLATTENING;
        final OneAxisEllipsoid earth = new OneAxisEllipsoid(equatorialRadius, flattening, FramesFactory.getITRF(IERSConventions.IERS_2010, true));
         final Frame frame = FramesFactory.getEME2000();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        final GeodeticPoint point = new GeodeticPoint(FastMath.toRadians(33.43494), FastMath.toRadians(49.285103), 0.);

        final TopocentricFrame topo = new TopocentricFrame(earth, point, "test");
        final ElevationExtremumDetector raw = new ElevationExtremumDetector(topo);
        final EventSlopeFilter<ElevationExtremumDetector> maxElevationDetector =
                new EventSlopeFilter<ElevationExtremumDetector>(raw, FilterType.TRIGGER_ONLY_DECREASING_EVENTS);
        final AttitudeProvider attitudeProvider = new LofOffset(frame, LOFType.VVLH);
        final TLE tle = new TLE(line1, line2);
        int revolutionNumberAtEpoch = tle.getRevolutionNumberAtEpoch();
        final SGP4 propagator = new SGP4(tle, attitudeProvider, 192, frame);
        EventsLogger logger = new EventsLogger();
        try {
            propagator.propagate(new AbsoluteDate(formatter.parse("2023-06-08 00:00:00"), TimeScalesFactory.getUTC()), new AbsoluteDate(formatter.parse("2023-06-09 00:00:00"), TimeScalesFactory.getUTC()));
        } catch (ParseException e) {
            throw new RuntimeException(e);

        for (EventsLogger.LoggedEvent e : logger.getLoggedEvents()) {
            SpacecraftState state = e.getState();
            Orbit orbit = state.getOrbit();
            Attitude attitude = state.getAttitude();
            // Here, I obtain the time of closest approach for each pass, but there is always a difference.

Thank you for your help.

Hi @toonaiveckuu

Could you replace

final Frame frame = FramesFactory.getEME2000();


final Frame frame = FramesFactory.getTEME();

Indeed, the SGP4 documentation says that the frame shall be TEME

/** Constructor for a unique initial TLE.
 * @param initialTLE the TLE to propagate.
 * @param attitudeProvider provider for attitude computation
 * @param mass spacecraft mass (kg)
 * @param teme the TEME frame to use for propagation.
 * @since 10.1
public SGP4(final TLE initialTLE,
            final AttitudeProvider attitudeProvider,
            final double mass,
            final Frame teme) {
    super(initialTLE, attitudeProvider, mass, teme);

I hope this will solve your issue!

Best regards,

I made the modifications according to your suggestion, and it is effective. Thank you very much.