1. 程式人生 > 其它 >【IDL程式碼庫】基於6S模型生成MODIS氣溶膠反演查詢表

【IDL程式碼庫】基於6S模型生成MODIS氣溶膠反演查詢表

;+

; :Author: Hanzt

; :Email: [email protected],歡迎討論交流

; 更新日誌

;   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