利用IDL将NDVI异常值进行剔除,NDVI取值范围为0.2~1(植被覆盖区),对反演的地表温度Ts选择5%的置信区间,构建NDVI-Ts特征空间,进行两种反演方法(单通道算法、单窗算法)的干湿边方程的拟合。
其中干湿边方程拟合公式和TVDI计算公式如下:
其中:其中Tsmin是湿边方程,Tsmax是干边方程,TVDI的值域为[0,1]。TVDI越大,土壤湿度越低,TVDI越小,土壤湿度越高。
以NDVI为横坐标,LST为纵坐标,得到NDVI-LST的散点图。根据NDVI-LST的散点图,就能得到每个NDVI值对应的LST的最大最小值,即要求的干边和湿边,最后根据干边和湿边的散点图,就能拟合到干边方程和湿边方程。
// 格式为dat
ENVI,/RESTORE_BASE_SAVE_FILES
;ENVI批处理模式/RESTORE_BASE_SAVE_FILES
ENVI_BATCH_INIT
file_path=dialog_pickfile( get_path = newPath,$
/DIRECTORY,$
title='SELECT A DIRECTORY CONTAINS DAT-FILE')
file_path_list=file_search(file_path,'*.dat')
file_name_list=file_basename(file_path_list)
; print,file_path_list
filecount=N_ELEMENTS(file_path_list)
//************************************** 数据读取*******************************************
ENVI_OPEN_FILE, LSTname, r_fid =fid_LST
;print,LSTname
ENVI_FILE_QUERY, fid_LST, $
nb = nb, $ ;波段数
ns = ns, $ ;列数
nl = nl ,$;行数
dims=dims
map_info=envi_get_map_info(fid=fid_LST)
ENVI_OPEN_FILE, NDVIname, r_fid =fid_NDVI
LST=ENVI_GET_DATA(fid = fid_LST, dims = dims, pos = 0)+273.15 //℃+273.15---K
NDVI=ENVI_GET_DATA(fid = fid_NDVI, dims = dims, pos = 0)
hist=Histogram(LST,min=273.16,Binsize=0.1)
;统计直方图,获取累计像元个数
totalCounts = TOTAL(hist, /CUMULATIVE)
;获取累积百分比
totalPercents = totalCounts/totalCounts[-1]
//*************************************** 设定NDVI统计阈值及间隔*******************************
NDVI_min=0.2 //NDVI>0.2为植被区域
NDVI_max=1
INTERVAL=0.01 ;统计间隔
NUMS=CEIL((NDVI_max-NDVI_min)/INTERVAL) ;NDVI统计区间数目
NDVIs=FINDGEN(NUMS)*INTERVAL+NDVI_MIN ;每个NDVI统计区间的起始值
NDVIe=NDVIs+INTERVAL ;每个NDVI统计区间的终止值
NDVIm=NDVIs+INTERVAL/2.0 ;;每个NDVI统计区间的均值
//********************************* 干湿边曲线拟合 *******************************************
LST_MAX=FLTARR(NUMS)
LST_MIN=FLTARR(NUMS)
FOR i=0,NUMS-1 DO BEGIN
W=WHERE(NDVI1 GT NDVIs[i] AND NDVI1 LT NDVIe[i] ,COUNT)
if count gt 0 then begin
LST_MAX[i]=MAX(LST1[w]) ;当前NDVI区间对应的LST最大值
LST_MIN[i]=MIN(LST1[w]) ;当前NDVI区间对应的LST最小值
endif
ENDFOR
A1=REGRESS(NDVIm,LST_MAX,CONST=B1,CORRELATION=R1) ;干边方程
A2=REGRESS(NDVIm,LST_MIN,CONST=B2,CORRELATION=R2) ;
TVDI=(LST-A2*NDVI-B2)/(((A1*NDVI+B1)-(A2*NDVI+B2)))
FLAG=1
if FLAG EQ 1 THEN BEGIN
;O_FN=DIALOG_PICKFILE(TITLE='干湿边拟合图像保存为:')+'.png'
o_fn=outpath+filename+'SW1.png'
PLOT_FITTING_FIG,o_fn,$
NDVI1,LST1,NDVIm, $
LST_MIN,LST_MAX, $
A1,B1,R1,A2,B2,R2
ENDIF
PRO PLOT_FITTING_FIG,OUT_NAME,NDVI,LST,NDVIm, $
LST_MIN,LST_MAX,A1,B1,R1,A2,B2,R2
xrange=[0.2,1]
y_scale=max(lst_max)-min(lst_min)
yrange=[min(lst_min)-y_scale*0.5,max(lst_max)+y_scale*0.5]
plot_scatter=plot(NDVIm,LST_MAX,LINESTYLE=6,$
XRANGE=xrange,YRANGE=yrange,XTITLE='NDVI',YTITLE='LST(K)',$
/BUFFER,XMINOR=5,YMINOR=5);MARGIN=[0.2,0.2,0.2,0.2],
print,'scatter'
PLOT_PT_DRY=PLOT(NDVIm,LST_MAX,SYMBOL=2,SYM_SIZE=0.8, $
/SYM_FILLED,COLOR='RED',LINESTYLE=6,XTITLE='NDVI',YTITLE='LST(K)',/OVERPLOT,/BUFFER)
PLOT_PT_WET=PLOT(NDVIm,LST_MIN,SYMBOL=2,SYM_SIZE=0.8, $
/SYM_FILLED,COLOR='BLUE',LINESTYLE=6,XTITLE='NDVI',YTITLE='LST(K)',/OVERPLOT,/BUFFER)
X=[MIN(NDVIm),Max(NDVIM)]
PLOT_LINE_DRY=PLOT(X,Y_DRY,COLOR='Black',THICK=1.5,XTITLE='NDVI',YTITLE='LST(K)',/OVERPLOT, $
/BUFFER)
PLOT_LINE_WET=PLOT(X,Y_WET,COLOR='Black',THICK=1.5,XTITLE='NDVI',YTITLE='LST(K)',/OVERPLOT, $
/BUFFER)
EQUATION_DRY='Ts = '+STRING(A1,FORMAT='(F6.2)')+'*NDVI+'+STRING(B1,FORMAT='(F6.2)')
r1_dry='$R^2$='+STRING(R1^2,FORMAT='(F6.2)')
EQUATION_WET='Ts = '+STRING(A2,FORMAT='(F6.2)')+'*NDVI+'+STRING(B2,FORMAT='(F6.2)')
r2_wet='$R^2$='+STRING(R2^2,FORMAT='(F6.2)')
plot_scatter.save,out_name;,border=0
plot_pt_dry.save,out_name,border=0
plot_pt_wet.save,out_name,border=0
plot_line_dry.save,out_name,border=0
plot_line_wet.save,out_name,border=0
END
遥感二次开发语言IDL_徐永明