【IDL代码库】基于6S模型生成MODIS气溶胶反演查找表

+
; :Author: Hanzt
; :Email: hanzt@esrichina.com.cn,欢迎讨论交流
; 更新日志
;   2017-04-27 添加元信息描述
; :Description
;   基于6S模型,构建MODIS气溶胶反演查找表,返回结果为8列n行的浮点型数组
;   第一列 太阳天顶角
;   第二列 太阳方位角
;   第三列 卫星天顶角
;   第四列 卫星方位角
;   第五列 T   大气总透过率
;   第六列 S   半球反照率
;   第七列 RouA  大气中气溶胶反射率
;   第八列 AOD 550nm气溶胶光学厚度
;
;   根据个人需求,可对输出文件形式进行改写,如输出为文本文件,ENVI标准格式,csv文件等
;
;   total  sca         :大气整层透过率,   用T表示
;   spherical albedo   :大气半球反照率,   用S表示
;   reflectance        :大气中气溶胶反射率,用Pa表示
;
;   参数设置
;   exe_directory--6s.exe所在目录,如'D:\6sWinExec'
;   研究对比发现,不同文献、不同区域气溶胶、太阳天顶角、方位角等信息设置有所不同,
;
;   详细6s参数设置参见6S用户手册 http://6s.ltdri.org/
;   6s.exe及源码下载https://pan.baidu.com/s/1os3r0PyGgUKvowAJBBP1bA
;
;   调用方法--编译后在命令行输入以下命令:
;    Build_Modis_Aerosol_Lookup_Table,ExePrograme='D:\RSdata',ThetaSs=[30],PhiRes=[60],ThetaVs=[30],PhiVs=[30]
;   其中:
;   输入顺序为 太阳天顶角,太阳方位角,卫星天顶角,卫星方位角
;   ThetaSs :太阳天顶角
;   PhiRes  :太阳方位角
;   ThetaVs :卫星天顶角
;   PhiVs   :卫星方位角
pro Build_Modis_Aerosol_Lookup_Table,$
 AODs  = AODs,       $
  ThetaSs = ThetaSs,  $
  PhiRes = PhiRes,    $
  ThetaVs = ThetaVs,  $
  Month = Month,      $
 Day   = Day,        $
  IDATM = IDATM,      $
 IAER  = IAER,       $
 XPS   = XPS,        $
  IWAVE = IWAVE,      $
  IGROUN= IGROUN,     $
 output_lutFileName = output_lutFileName
 ;编译规则优化
  COMPILE_OPT idl2
  e = envi(/current)
  if ~KEYWORD_SET(IDATM)  then IDATM  = 'No Absorption'
  if ~KEYWORD_SET(IAER)   then IAER   = 'No Aerosol'
  if ~KEYWORD_SET(IWAVE)  then IWAVE  = 'Red'
  if ~KEYWORD_SET(IGROUN) then IGROUN = 'VEGETA'
  if ~KEYWORD_SET(XPS)    then XPS    = 0.0
  if ~KEYWORD_SET(output_lutFileName) then output_lutFileName  = e.GetTemporaryFilename()
  
 ;MODIS波段代号
 ;42  MODIS   band 1           ( 0.6100-0.6850)
 ;43  MODIS   band 2           ( 0.8200-0.9025)
 ;44  MODIS   band 3           ( 0.4500-0.4825)
 ;45  MODIS   band 4           ( 0.5400-0.5700)
 ;46  MODIS   band 5           ( 1.2150-1.2700)
 ;47  MODIS   band 6           ( 1.6000-1.6650)
 ;48  MODIS   band 7           ( 2.0575-2.1825)
  
  INFO_IDATM = IDATM
  INFO_IAER = IAER
  INFO_IWAVE = IWAVE
  INFO_IGROUN = IGROUN
  INFO_XPS = XPS
  INFO_ThetaSs = ThetaSs
  INFO_ThetaVs = ThetaVs
  INFO_PhiRes = PhiRes
  INFO_AODs = AODs
  
  case IDATM of
   'No Absorption':IDATM = 0
   "Tropical":IDATM = 1
   "Midlatitude Summer":IDATM = 2
   "Midlatitude Winter":IDATM = 3
   "Subartic Summer":IDATM = 4
   "Subartic Winter":IDATM = 5
   "US62":IDATM = 6
 endcase
  case IAER of
   "No Aerosol":IAER = 0
   "Continental":IAER = 1
   "Maritime":IAER = 2
   "Urban":IAER = 3
   "Desert":IAER = 5
   "Biomass":IAER = 6
   "Stratospheric":IAER = 7
 endcase
  case IWAVE of
   'Red':IWAVE = 42
   'Blue':IWAVE = 44
 endcase
  case IGROUN of
   "VEGETA":IGROUN = 1
   "CLEARW":IGROUN = 2
   "SAND":IGROUN = 3
   "LAKEW":IGROUN = 4
 endcase
  XPS = 0-XPS
  IGEOM = 0
  Month = 9
 Day   = 1
  h = orderedHash($
   'IDATM',IDATM,$
   'IAER',IAER,$
   'IWAVE',IWAVE,$
   'IGROUN',IGROUN,$
   'XPS',XPS)
 print,h
 tic
  
  ExePrograme=filepath('6s.exe',root_dir=e.root_dir,subdirectory=['extensions','BuildModisAerosolLookupTable'])
 ;切换到6s.exe所在路径
  exe_directory = FILE_DIRNAME(ExePrograme)
 cd,exe_directory
  XPP = -1000   ;星测
  INHOMO = 0    ;地表反射率均一地表
  IDIRECT = 0   ;无方向效应
  RAPP = -2     ;无大气校正
  V = 0
  PhiV = 0
  
  IGEOM =   strtrim(IGEOM,1)      ;卫星,自定义
  MONTH =   strtrim(MONTH,1)      ;月份
  DAY =     strtrim(DAY,1)        ;日期
  IDATM =   strtrim(IDATM,1)      ;大气模式中纬度夏季
  IAER =    strtrim(IAER,1)       ;气溶胶模式大陆型
  V =       strtrim(V,1)          ;能见度
  XPS =     strtrim(XPS,1)        ;目标物高度
  XPP =     strtrim(XPP,1)        ;星测
  IWAVE =   strtrim(IWAVE,1)      ;自定义1输入波段范围和反射相函数42为MODIS的RED
  INHOMO =  strtrim(INHOMO,1)     ;地表反射率均一地表
  IDIRECT = strtrim(IDIRECT,1)    ;无方向效应
  IGROUN =  strtrim(IGROUN,1)     ;绿色植被
  RAPP =    strtrim(RAPP,1)       ;无大气校正
  AODs =    strtrim(AODs,1)
  ThetaSs = strtrim(ThetaSs,1)
  PhiRes =  strtrim(PhiRes,1)
  ThetaVs = strtrim(ThetaVs,1)
  PhiV =    strtrim(PhiV,1)
  info =    strarr(1,13)
  in_6s = '6sIn.txt'
  Nlines = ulong64(AODs.length)*$
  ThetaSs.length*PhiRes.length*ThetaVs.length
   
 openw,lut_lun,output_lutFileName,/GET_LUN

  count = 0ULL
  foreach AOD, AODs do $
   foreach ThetaS, ThetaSs do $
   foreach PhiRe, PhiRes do $
   foreach ThetaV, ThetaVs do begin

   info[0] = IGEOM
   info[1] = [ThetaS+' '+PhiRe+' '+ThetaV+' '+PhiV+'  '+month+' '+day]
   info[2] = idatm
   info[3] = IAER
   info[4] = v
   info[5] = AOD
   info[6] = xps
   info[7] = xpp
   info[8] = iwave
   info[9] = inhomo
   info[10] = idirect
   info[11] = igroun
   info[12] = rapp
   openw, lun_in,in_6s,/get_lun
   printf, lun_in, info
   free_lun,lun_in
   SPAWN,'6s.exe <6sIn.txt> 6sout.txt',/hide
   ;获取6sout文件行数,初始化一个Str用于存储文件内容
   fileLines = file_lines('6sout.txt')
   Str = strarr(1,fileLines)
   ;打开6sout文件
  openr,lun_out,'6sout.txt',/get_lun
   ;将文件内容赋值给Str
   readf,lun_out,Str
   ;获取T 大气透过率
   ;StartsWith仅支持IDL8.4及以后版本
   !null = max(Str.StartsWith('*      total  sca.'),T_idx)
   T = strmid(Str[T_idx],17,8,/reverse_offset)
   ;获取S 大气半球反照率
   !null = max(Str.StartsWith('*      spherical  albedo'),S_idx)
   S = strmid(Str[S_idx],17,8,/reverse_offset)
   ;获取Pa 大气气溶胶反射率
   !null = max(Str.StartsWith('*      reflectance'),Pa_idx)
   RouA = strmid(Str[Pa_idx],17,8,/reverse_offset)
   free_lun,lun_out
  writeu,lut_lun,float([ThetaS,ThetaV,PhiRe,T,S,RouA,AOD])
   count++
 endforeach

 free_lun,lut_lun
;  Descripe = 'Powered by Esri-China(Beijing) Modis Aerosol  Lookup Table '+string(13b)+$
;    'Using AODs of [['+AODs.join('-')+']] at  550nm'+STRING(13b)+$
;    ' IDATM of ['+STR_IDATM+']'+string(13b)+$
;    ' IAER of ['+STR_IAER+']'+string(13b)+$
;    ' IWAVE of ['+STR_IWAVE+']'+string(13b)+$
;    ' IGROUN of ['+STR_IGROUN+'] base on 6s'
  Descripe = 'Modis Aerosol Lookup Table Powered by  Esri-China(Beijing)'
  ns = (float([ThetaS,ThetaV,PhiRe,T,S,RouA,AOD])).length
  
 ENVI_SETUP_HEAD,fname = output_lutFileName,$
   ns = ns,nl = count,nb = 1,interleave = 0,data_type = 4,$
   DESCRIP = Descripe,Bnames =  'Modis Aerosol Lookup  Table',$
   /write
  
  raster = e.OpenRaster(output_lutFileName)
  metaData = raster.metaData
  
 metaData.addItem,'Target Altitude (Km)', INFO_XPS
 metaData.addItem,'IDATM', INFO_IDATM
 metaData.addItem,'IAER',  INFO_IAER
 metaData.addItem,'IWAVE', INFO_IWAVE
 metaData.addItem,'IGROUN',INFO_IGROUN
  
 metaData.addItem,'Solar Zenith', INFO_ThetaSs
 metaData.addItem,'Satellite Zenith', INFO_ThetaVs
 metaData.addItem,'Azimuthal Angle Difference', INFO_PhiRes
 metaData.addItem,'AODS at 550nm',INFO_AODS
  
 raster.WriteMetadata
 raster.close
 toc
end

 

posted @ 2022-05-27 17:55  ENVI-IDL技术殿堂  阅读(1029)  评论(0编辑  收藏  举报