感谢二位前辈提供的高分影像6S+python大气校正思路:
https://zhuanlan.zhihu.com/p/364889134
https://github.com/Zhaoguanhua/AtmosphericCorrection/blob/master/AtmosphericCorrection_GF.py
在用Py6S进行高分六号的大气校正参数获取时,水汽、臭氧、海拔等参数获取都非常顺利,唯独到了最后一步,要设置传感器光谱响应函数时,python一直报错:
b’invalid number: incomprehensible list input\r\napparent state: unit 5 (unnamed)\r\nlast format: list io\r\nlately reading direct formatted external IO\r\n\r\nabnormal program termination\r\n’
我印象里跑大佬的代码是没问题的,虽然他是针对高分一号进行处理,于是仔细排查发现了问题所在:
Py6S要求对自定义的波谱响应函数重采样到2.5 nm光谱分辨率,并且在调用响应函数时,定义起止波长:
# 设置波长
# 校正波段(根据波段名称)
if BandId == 1:
SRFband = config["Parameter"]["GF1D"]["PMS"]["SRF"]["1"]
s.wavelength = Wavelength(0.450,0.520,SRFband)
elif BandId == 2:
SRFband = config["Parameter"]["GF1D"]["PMS"]["SRF"]["2"]
s.wavelength = Wavelength(0.520,0.590,SRFband)
elif BandId == 3:
SRFband = config["Parameter"]["GF1D"]["PMS"]["SRF"]["3"]
s.wavelength = Wavelength(0.630,0.690,SRFband)
elif BandId == 4:
SRFband = config["Parameter"]["GF1D"]["PMS"]["SRF"]["4"]
s.wavelength = Wavelength(0.760,0.890,SRFband)
# 运行模型
s.run()
因此,以NIR波段(第四波段)为例,设置了760 - 890 nm的区间范围,模型又确定了2.5 nm的采样间隔,那么相当于你的wavelength行数和响应值的行数就对应了,而我自作主张把源代码中的0.760 - 0.890改成了0.770 - 0.890,响应值的行数未变,这就造成了输入数据维数不一致,6S无法正确运行。
解决方法:把自己手里的高分六号(或者任意你需要的卫星的光谱响应函数)重采样(以2.5 nm为间隔),再更新源代码中s.wavelength后面跟着的起止波长,就可以正常运行了。
总结,在每个波段的s.wavelength定义中,(终止波长nm-起始波长nm)/2.5 nm应该等于该波段光谱响应函数的总行数-1。
即
s.wavelength = Wavelength(0.520,0.590,SRFband)
对应的SRFband输入为:
共29行。