;====================================================================
; lst_gui_tool.pro
;
; 功能:地表温度遥感反演可视化系统
; 包含:
; - 单通道算法 (SC)
; - 单窗算法 (MW)
; - GUI 界面
; - ENVI DOIT 调用接口
;====================================================================
;-----------------------------------------
; 主函数入口
;-----------------------------------------
PRO lst_gui_tool__define
; 结构定义用于封装 GUI 状态
END
PRO lst_gui_tool
base = WIDGET_BASE(TITLE='Land surface temperature remote sensing retrieval system', /COLUMN)
file_pick = WIDGET_BUTTON(base, VALUE='Select the image file')
sc_btn = WIDGET_BUTTON(base, VALUE='Single-channel algorithm')
mw_btn = WIDGET_BUTTON(base, VALUE='Single-window algorithm')
exit_btn = WIDGET_BUTTON(base, VALUE='quit')
WIDGET_CONTROL, base, /REALIZE
; 存储当前状态
state = {filename: '', work_dir: ''}
WHILE 1 DO BEGIN
event = WIDGET_EVENT()
CASE event.id OF
file_pick: BEGIN
filename = DIALOG_PICKFILE(GET_PATH=work_dir)
IF N_ELEMENTS(filename) GT 0 THEN BEGIN
state.filename = filename
state.work_dir = work_dir
PRINT, 'Input files selected:', filename
ENDIF
END
sc_btn: BEGIN
IF state.filename NE '' THEN BEGIN
out_name = DIALOG_PICKFILE(/WRITE, TITLE='Save single-channel results')
result_file = do_lst_sc(state.filename, state.work_dir, OUT_NAME=out_name)
PRINT, 'Single-channel results have been saved to:', result_file
ENDIF ELSE BEGIN
PRINT, 'Please select the input file first'
ENDELSE
END
mw_btn: BEGIN
IF state.filename NE '' THEN BEGIN
out_name = DIALOG_PICKFILE(/WRITE, TITLE='Save the results of a single window')
result_file = do_lst_mw(state.filename, state.work_dir, OUT_NAME=out_name)
PRINT, 'Single-window results have been saved to:', result_file
ENDIF ELSE BEGIN
PRINT, 'Please select the input file first'
ENDELSE
END
exit_btn: BREAK
ENDCASE
ENDWHILE
WIDGET_CONTROL, base, /DESTROY
END
;====================================================================
; FUNCTION: DO_LST_SC
;
; PURPOSE: 执行单通道算法的地表温度反演,并保存结果
;====================================================================
FUNCTION do_lst_sc, fn, work_dir, OUT_NAME=out_name
COMPILE_OPT idl2
envi_open_file, fn, r_fid=fid
envi_file_query, fid, ns=ns, nl=nl, nb=nb, dims=dims, $
data_type=data_type, interleave=interleave, offset=offset
map_info = envi_get_map_info(fid=fid)
b6 = envi_get_data(fid=fid, dims=dims, pos=5)
b3 = envi_get_data(fid=fid, dims=dims, pos=2)
b4 = envi_get_data(fid=fid, dims=dims, pos=3)
b2 = envi_get_data(fid=fid, dims=dims, pos=1)
b5 = envi_get_data(fid=fid, dims=dims, pos=4)
L = 0.055158 * b6 + 1.2378
Tb = 1260.56 / alog(1 + 607.76 / L)
NDVI = (float(b4) - b3) / (float(b4) + b3)
MNDWI = (float(b2) - b5) / (float(b2) + b5)
emiss = cal_Emiss(NDVI, MNDWI)
b2 = !null & b3 = !null & b4 = !null & b5 = !null
NDVI = !null & MNDWI = !null
w = 2.49
T0 = 21 + 273.15
LST_result = cal_LST_sc(Tb, L, w, emiss)
IF N_ELEMENTS(out_name) EQ 0 THEN out_name = DIALOG_PICKFILE(/WRITE, TITLE='Save the results of the single-channel algorithm')
envi_write_envi_file, LST_result, OUT_NAME=out_name, $
NS=ns, NL=nl, NB=1, DATA_TYPE=4, INTERLEAVE=interleave, $
MAP_INFO=map_info
RETURN, out_name
END
;====================================================================
; FUNCTION: DO_LST_MW
;
; PURPOSE: 执行单窗算法的地表温度反演,并保存结果
;====================================================================
FUNCTION do_lst_mw, fn, work_dir, OUT_NAME=out_name
COMPILE_OPT idl2
envi_open_file, fn, r_fid=fid
envi_file_query, fid, ns=ns, nl=nl, nb=nb, dims=dims, $
data_type=data_type, interleave=interleave, offset=offset
map_info = envi_get_map_info(fid=fid)
b6 = envi_get_data(fid=fid, dims=dims, pos=5)
b3 = envi_get_data(fid=fid, dims=dims, pos=2)
b4 = envi_get_data(fid=fid, dims=dims, pos=3)
b2 = envi_get_data(fid=fid, dims=dims, pos=1)
b5 = envi_get_data(fid=fid, dims=dims, pos=4)
L = 0.055158 * b6 + 1.2378
Tb = 1260.56 / alog(1 + 607.76 / L)
NDVI = (float(b4) - b3) / (float(b4) + b3)
MNDWI = (float(b2) - b5) / (float(b2) + b5)
emiss = cal_Emiss(NDVI, MNDWI)
b2 = !null & b3 = !null & b4 = !null & b5 = !null
NDVI = !null & MNDWI = !null
w = 2.49
T0 = 21 + 273.15
LST_result = cal_LST_mw(Tb, T0, w, emiss)
IF N_ELEMENTS(out_name) EQ 0 THEN out_name = DIALOG_PICKFILE(/WRITE, TITLE='Save the results of the single-window algorithm')
envi_write_envi_file, LST_result, OUT_NAME=out_name, $
NS=ns, NL=nl, NB=1, DATA_TYPE=4, INTERLEAVE=interleave, $
MAP_INFO=map_info
RETURN, out_name
END
;====================================================================
; FUNCTION: CAL_EMISS
;
; PURPOSE: 计算比辐射率
;====================================================================
FUNCTION cal_Emiss, NDVI, MNDWI
result = 1.0094 + 0.047 * ALOG(NDVI)
w = WHERE(NDVI LT 0.157, count)
IF count GT 0 THEN result[w] = 0.923
w = WHERE(NDVI GT 0.727, count)
IF count GT 0 THEN result[w] = 0.994
w = WHERE(MNDWI GT 0, count)
IF count GT 0 THEN result[w] = 0.995
RETURN, result
END
;====================================================================
; FUNCTION: CAL_LST_SC
;
; PURPOSE: 单通道算法计算地表温度
;====================================================================
FUNCTION cal_LST_sc, Tb, L, w, Emiss
c1 = 1.19104E8
c2 = 14387.7
x1 = 0.14714D * w^2 - 0.15583 * w + 1.1234
x2 = -1.1836D * w^2 - 0.37607 * w - 0.52894
x3 = -0.04554D * w^2 + 1.8719 * w - 0.39071
Y = (Tb^2) / (c2 * L * (11.457^4 * L / c1 + 1 / 11.457))
Z = -Y * L + Tb
Result = Y * ((x1 * L + x2) / Emiss + x3) + Z
RETURN, FLOAT(result)
END
;====================================================================
; FUNCTION: CAL_LST_MW
;
; PURPOSE: 单窗算法计算地表温度
;====================================================================
FUNCTION cal_LST_mw, Tb, T0, w, Emiss
a = -67.35535
b = 0.458608
Trans = 1.031412 - 0.11536D * w
Ta = 16.011 + 0.91118 * T0
C = Trans * Emiss
D = (1 - Trans) * (1 + Trans * (1 - Emiss))
result = (a * (1 - C - D) + (b * (1 - C - D) + C + D) * Tb - D * Ta) / C
RETURN, FLOAT(result)
END
;====================================================================
; PRO: LST_SC_DOIT
;
; PURPOSE: ENVI_DOIT 兼容接口 - 单通道算法
;====================================================================
PRO lst_sc_doit, input_raster, output_raster
COMPILE_OPT idl2
input_fn = input_raster[0].input_filename
work_dir = FILE_DIRNAME(input_fn)
result_file = do_lst_sc(input_fn, work_dir, OUT_NAME=output_raster)
envi_open_file, result_file, /NO_REALIZE
envi_add_files_to_view, result_file
END
;====================================================================
; PRO: LST_MW_DOIT
;
; PURPOSE: ENVI_DOIT 兼容接口 - 单窗算法
;====================================================================
PRO lst_mw_doit, input_raster, output_raster
COMPILE_OPT idl2
input_fn = input_raster[0].input_filename
work_dir = FILE_DIRNAME(input_fn)
result_file = do_lst_mw(input_fn, work_dir, OUT_NAME=output_raster)
envi_open_file, result_file, /NO_REALIZE
envi_add_files_to_view, result_file
END运行该代码出现以下结果% Compiled module: LST_GUI_TOOL__DEFINE.
result_file = do_lst_sc(state.filename, state.work_dir, OUT_NAME=out_name)
^
% Syntax error.
At: C:\Users\李家成\Desktop\lst_gui_tool.pro, Line 47
result_file = do_lst_mw(state.filename, state.work_dir, OUT_NAME=out_name)
^
% Syntax error.
At: C:\Users\李家成\Desktop\lst_gui_tool.pro, Line 57