Hi,
I’m using a TLEPropagator to track satellite events. At a certain time I have PVCoordinates of satellite and Sun and a topocentric frame relative to observer location: I’d like to calculate latitude e longitude of place on Earth where in that moment satellite is transiting in front of Sun center. Can anyone help me?
Thanks!
You don’t need a TopocentricFrame
as this would imply you already know the result.
I would suggest something along these lines (beware, it is written using Orekit 11 API, as this version will be published very soon now).
final TimeScale utc = TimeScalesFactory.getUTC();
final CelestialBody sun = CelestialBodyFactory.getSun();
final Frame itrf = FramesFactory.getITRF(IERSConventions.IERS_2010, true);
final OneAxisEllipsoid earth = new OneAxisEllipsoid(Constants.WGS84_EARTH_EQUATORIAL_RADIUS,
Constants.WGS84_EARTH_FLATTENING,
itrf);
propagator.getMultiplexer().add(60.0, state -> {
AbsoluteDate date = state.getDate();
Frame frame = state.getFrame();
Vector3D pSun = sun.getPVCoordinates(date, frame).getPosition();
Vector3D pSat = state.getPVCoordinates(frame).getPosition();
Line sunSatLine = new Line(pSun, pSat, 1.0e-9);
GeodeticPoint gp = earth.getIntersectionPoint(sunSatLine, pSat, frame, date);
System.out.format(Locale.US, "%s %11.6f %11.6f%n",
date.toStringRfc3339(utc),
gp.getLatitude(), gp.getLongitude());
});
Note that the answer above does not take into account topography, so it may be way off on mountains regions. It assumes you compute that point at altitude zero with respect to the ellipsoid.
If you need a more accurate computation taking into account topography, you have to use the sister library Rugged that computes intersections taking into account a Digital Elevation Model. Computation is simple, but loading the Digital Elevation Model may involve a lot of work.
Hi Luc,
thank for your answer, I haven’t had a chance to try your solution before, sorry. It works!
Thanks again!