1、前言
那么,首先,什么是瑞利反射率? 好吧,这是由大气中的瑞利散射引起的反射率(在大气层顶部测量)。 这是大气中气体分子对光的波长依赖性散射——这是光穿过大气时不可避免的结果。
所以,关于如何在 Py6S 中计算它。 不幸的是,底层 6S 模型不提供瑞利反射率作为输出,因此我们必须做更多的工作来计算它。
2、Py6S参数设置
from Py6S import*
s = SixS()# Standard altitude settings for the sensor# and target
s.altitudes.set_sensor_satellite_level()
s.altitudes.set_target_sea_level()# Wavelength of 0.5nm
s.wavelength = Wavelength(0.5)
现在,要计算完全由瑞利散射引起的反射率,我们需要“关闭”所有可能影响反射率的其他因素。 首先,我们通过将地面反射率设置为零来“关闭”地面反射率,这样地面反射率就不会产生任何影响:
s.ground_reflectance = GroundReflectance.HomogeneousLambertian(0)
然后我们关闭气溶胶散射:
s.aero_profile = AeroProfile.PredefinedType(AeroProfile.NoAerosols)
以及气体对大气的吸收:
s.atmos_profile = AtmosProfile.PredefinedType(AtmosProfile.NoGaseousAbsorption)
然后我们可以运行模拟(使用 s.run())并查看输出。 最好的方法是运行:
print(s.outputs.fulltext)
查看 Py6S 提供的文本输出。 我们想要的值是“表观反射率”——这是大气层顶部的反射率。 因为我们已经关闭了其他一切,这将纯粹是由瑞利反射率引起的。
我们可以通过编程方式访问此值作为 s.outputs.apparent_reflectance。
所以,这就是如何获得瑞利反射率——但还有一些更有趣的事情要说……
首先,我们实际上不必将地面反射率设置为零。 如果我们将地面反射率设置为其他值——例如:
s.ground_reflectance = GroundReflectance.HomogeneousLambertian(GroundReflectance.GreenVegetation)
3、运行模拟并进行可视化
运行模拟,然后我们将得到表观辐射率的不同答案——因为现在考虑了地面反射率——但我们将看到我们想要的值作为大气固有反射率。 这是直接来自大气的反射率(在这种情况下仅来自瑞利散射,但在正常情况下,这也包括气溶胶散射)。 这可以作为 s.outputs.atmospheric_intrinsic_reflectance 以编程方式访问。
还有一件事,只是为了表明 Py6S 中的瑞利反射率的行为方式符合我们从物理学知识中所期望的方式……我们可以编写一些代码来提取各种波长的瑞利反射率并绘制图表 – 我们预计曲线呈指数下降,在低波长处显示高瑞利反射率,反之亦然。
下面的代码将执行此操作:
from Py6S import*import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
s = SixS()
s.altitudes.set_sensor_satellite_level()
s.altitudes.set_target_sea_level()
s.aero_profile = AeroProfile.PredefinedType(AeroProfile.NoAerosols)
s.atmos_profile = AtmosProfile.PredefinedType(AtmosProfile.NoGaseousAbsorption)
wavelengths = np.arange(0.3,1.0,0.05)
results =[]for wv in wavelengths:
s.wavelength = Wavelength(wv)
s.run()
results.append({'wavelength': wv,'rayleigh_refl': s.outputs.atmospheric_intrinsic_reflectance})
results = pd.DataFrame(results)
results.plot(x='wavelength', y='rayleigh_refl', style='x-', label='Rayleigh Reflectance', grid=True)
plt.xlabel('Wavelength ($\mu m$)')
plt.ylabel('Rayleigh Reflectance (no units)')
这是输出的下图,它准确地显示了物理学的预测:
我们存储模型结果的方式值得简要说明,因为这是我经常使用的模式。 每次运行模型时,一个新的字典都会附加到列表中——这个字典包含我们感兴趣的各种参数(在本例中只是波长)和我们感兴趣的各种结果(在本例中 只是瑞利反射)。 完成循环后,我们可以简单地将这个字典列表传递给 pd.DataFrame() 并返回一个漂亮的 pandas DataFrame——准备好进一步显示、绘图或分析。