This is my attempt at solving a problem posed by Jonas Hamberg...
import numpy as np
z = 25 # cross-track look angle from nadir, degrees (determines swath width)
r = 6371 # average earth radius, km
#req = 6378 # equatorial radius, km
#rpol = 6357 # polar radius, km
h = 400 # orbit height, km (for ISS 400 +/- 25 km)
ifov = 96.0e-6 # instantaneous field of view of individual pixel (along-track), radians
Use law of sines to solve for angles y, x, and length l
# solving for angle y
y = np.degrees( -1*np.arcsin( (r+h)*np.sin(np.radians(z))/r) + np.pi )
print(y)
153.31070120292634
# now solve for angle x
x = 180 - z - y
print(x)
1.6892987970736613
# distance between satellite and Earth surface at edge of swath, km
l = (r + h) * np.sin(np.radians(x)) / (np.sin(np.radians(y)))
print(l)
444.4063568375799
Pixel size in along-track dimenion for nadir view, m
a = np.tan(ifov)*h # ifov at distance h in km
alongtrack_nadir_pixel_m = 1000*a # km to m
print(alongtrack_nadir_pixel_m)
38.4000001179648
Pixel size in along-track dimension for off-nadir view, m
a = np.tan(ifov)*l # ifov at distance l in km
alongtrack_off_nadir_pixel_m = 1000*a # km to m
print(alongtrack_off_nadir_pixel_m)
42.66301038746844
Pixel size in cross-track dimenion for nadir view, m
I think the cross-track ifov is swept over 1.8 times the along-track ifov?
a = np.tan(ifov*1.8)*h # ifov at distance h in km
b = np.sin(np.radians(90)) # projected onto Earth surface with local incidence angle (b = 90 for nadir)
crosstrack_nadir_pixel_m = 1000*a/b # km to m
print(crosstrack_nadir_pixel_m)
69.12000068797072
Pixel size in cross-track dimension for off-nadir view, m (given original size of 69 m at nadir)
I think the cross-track ifov is swept over 1.8 times the along-track ifov?
a = np.tan(ifov*1.8)*h # ifov at distance h in km
b = np.sin(np.radians(y-90)) # projected onto Earth surface with local incidence angle (b = 90-y for off-nadir)
crosstrack_off_nadir_pixel_m = 1000*a/b # km to m
print(crosstrack_off_nadir_pixel_m)
77.36257343826082
Double check that the arc length subtended by angle "x*2" matches the published swath width (384 km) (But this varies with earth radius, orbit height)
estimated_swath_width = r*np.radians(x*2)
# our estimated swath width, km
print(estimated_swath_width)
375.6829116426942
Please someone check my math!