[GIS] Convert measurement geometry from ground reference frame to satellite reference frame

pythonsatellitewgs84

I need to convert solar_zenith_angle, solar_azimuth_angle, platform_zenith_angle, and platform_azimuth_angle from a reference frame at the WGS84 surface to a reference frame at the satellite observer, in 817km altitude.

Using lat/lon of the ground reference frame, and using the platform_azimuth_angle and platform_zenith_angle, the first step would be to calculate lat/lon coordinates of the satellite ground point.

Next, the four angles can be converted from the ground-based reference frame to the satellite-based reference frame.

Question (a): Is there am existing script/library to do these kind of conversions, preferably in Python?

Question (b): If there isn't, how do I consider the WGS84 ellipsoid in my trigonometric calculations (instead of simply assuming a spherical Earth)?

EDIT 1: Why am I doing this? I want to use a radiative transfer model to simulate spectral measurements from the S-5P satellite. The scenarios I want to simulate
are defined by geometry at the surface. However, the radiative
transfer model I'm using expects the geometry at the observation
platform
.

Best Answer

If you do tackle this from end-to-end, make sure you have a reference like:

http://www.amazon.com/Fundamentals-Astrodynamics-Applications-David-Vallado/dp/1881883140

for any from-scratch-by-trig implementations.

You can actually use proj4 / pyproj to go from WGS84 lat, long, altitude to ECEFcoordinate, but the pyproj conversion is only accurate for near earth points in my experience.

To go from earth to satellite reference frame is usually more:

LLA to ECEF (earth centered earth fixed) ECEF to ECI (earth centered earth fixed to earth centered inertial) - you'll need time information, e.g. a J2000GPS based conversion. ECI to satellite reference.

The Vallado implementations are relatively simple to convert to Python code. One note, though - be a little smart about the trig, sometimes you can do the same thing with Sin, Cos and you'll have to check inputs around the poles for 0's to make sure you don't end up with a divide by 0.

Related Question