1

The script I'm wanting to develop uses the cartesian coordinates (XYZ) from a satellite, and in conjunction with the range, elevation and azimuth from a location, I then take a satellite’s orbital information and get the ground longitude/latitude under that satellite at a given time.

One step further from this: imagne the signal from a satellite piercing the atmosphere at exactly 300km above sea level. At this particular point when altitude is 300km, I need to calculate the ground longitude/latitude.

In the pyemph module there appears to be already a method (ephem.readtle) that can achieve this, but for TLE (two line element) data only. I'd like to use a satellite's cartesian coordinates to develop this. Is there such a method already out there? Or perhaps somebody with experience in this domain can point me in the right direction.

A similar question already exists referring to ECEF from Azimuth, Elevation, Range and Observer Lat,Lon,Alt, but it's not the same problem.

Here's what I have developed already: - satellite cartesian coordinates, XYZ - azimuth, elevation and range of satellite from ground station - ground station coordinates in lat, long, height above sea level

Here's what I need: - ground longitude/latitude under a satellite at a specific epoch, and in particular where the piercing point in the atmosphere (the point which the signal from the satellite pierces the atmosphere) is 300km altitude.

Community
  • 1
  • 1
pymat
  • 1,090
  • 1
  • 23
  • 45
  • Satellite's (sv) coordinates are given in XYZ, and radius from Earth roughly 26000 km. Ground tracks are calculated from the XYZ of the satellite. Now imagine a line from the sv to the ground. Instead of the sv being roughly 20000 (26000 minus earth radius) km away upon this line, let's assume that the sv is on the same line, but 300 km altitude (we'll call this the atmosphere piercing point). This means the sv has a range of (300 / sin e) km away, where 'e' is the elevation angle. What I'd like to know is the ground track of this satellite located at this range (300 km above Earth). – pymat Aug 31 '16 at 20:03

1 Answers1

0

I found what I was looking for via this:

def ionospheric_pierce_point(self, dphi, dlambda, ele, azi):
    Re = 6378136.3 # Earth ellipsoid in meters
    h = cs.SHELL_HEIGHT * 10**3 # Height of pierce point meters, and where maximum electron density is assumed
    coeff = Re / (Re + h)
    lat_rx = dphi
    long_rx = dlambda

# Degrees to radians conversions
ele_rad = np.deg2rad(ele)
azi_rad = np.deg2rad(azi)
lat_rx_rad = np.deg2rad(lat_rx)
long_rx_rad = np.deg2rad(long_rx)

psi_pp = (np.pi / 2) - ele_rad - np.arcsin(coeff * np.cos(ele_rad)) # Earth central angle between user and the Eart projection of the pierce point, in radians
psi_pp_deg = np.rad2deg(psi_pp)
lat_pp = np.arcsin(np.sin(lat_rx_rad)*np.cos(psi_pp) +
np.cos(lat_rx_rad)*np.sin(psi_pp)*np.cos(azi_rad)) # in radians

if (lat_rx > 70 and ((np.tan(psi_pp)*np.cos(azi_rad)) > np.tan((np.pi/2) - lat_rx_rad))) or (lat_rx < -70 and ((np.tan(psi_pp)*np.cos(azi_rad + np.pi)) > np.tan((np.pi/2) + lat_rx_rad))):
    long_pp = long_rx_rad + np.pi - np.arcsin((np.sin(psi_pp)*np.sin(azi_rad)) / np.cos(lat_pp))
else:
    long_pp = long_rx_rad + np.arcsin((np.sin(psi_pp)*np.sin(azi_rad)) / np.cos(lat_pp))

lat_pp_deg = np.rad2deg(lat_pp)
long_pp_deg = np.rad2deg(long_pp)

return lat_pp_deg, long_pp_deg
pymat
  • 1,090
  • 1
  • 23
  • 45