For Landsat 7 (Landsat 5 too), code will look something like this:
[QUOTE]Code example
PRO LANDSAT_CALIBRATION_BATCHMODE
COMPILE_OPT IDL2
ENVI_BATCH_INIT
InputPath = 'c:\LANDSAT\'
ListFiles = FILE_SEARCH(InputPath, COUNT = ProductCount, '*MTL.txt', /FOLD_CASE, /TEST_READ, /FULLY_QUALIFY_PATH)
IF(ProductCount LE 0) THEN BEGIN
Print, 'There are no valid landsat metadata to be processed.'
RETURN
ENVI_BATCH_EXIT
ENDIF
FOR i=0, ProductCount-1 DO BEGIN
InputFile = ListFiles[i]
Filename = FILE_BASENAME(InputFile, '_MTL.txt', /FOLD_CASE)
Envi_open_data_file, InputFile, /landsat_metadata
fids = envi_get_file_ids()
IF (fids[0] EQ -1) THEN BEGIN
Print, 'There are no valid landsat metadata to be processed.'
RETURN
ENVI_BATCH_EXIT
ENDIF
FOR j = 0, n_elements(fids)-1 DO BEGIN
envi_file_query, fids[j], fname = fname, nb=nb
IF (nb EQ 6) OR (nb EQ 4) THEN BEGIN
image_fid=fids[j]
envi_file_query, image_fid, fname = fname_image, dims=dims_image, nb=nb_image
print, fname_image , ' nb: ', nb_image, ' fid: ', image_fid
ENDIF
ENDFOR
pos=lindgen(nb_image)
; Metadata parser
n = FILE_LINES(InputFile)
metadata = STRARR(1,n)
OPENR, unit, InputFile, /GET_LUN
READF, unit, metadata
FREE_LUN, unit
; Find position of sun_angle in metadata and read value
ind=WHERE(STRPOS(metadata,'SUN_ELEVATION') ge 0)
IF (ind NE [-1]) THEN BEGIN
searching_line = metadata[ind]
searching_line_data=strsplit(strcompress(searching_line, /remove_all),'=', /extract)
sun_elevation=float(searching_line_data[1])
sun_angel=90.0-sun_elevation
ENDIF
; Find position of date in metadata and read value
ind=WHERE(STRPOS(metadata,'ACQUISITION_DATE') ge 0)
IF (ind NE [-1]) THEN BEGIN
searching_line = metadata[ind]
searching_line_data=strsplit(strcompress(searching_line, /remove_all),'=', /extract)
date_line=searching_line_data[1]
date_array=fix(strsplit(strcompress(date_line, /remove_all),'-', /extract))
date=intarr(3)
date[0]=date_array[1]
date[1]=date_array[2]
date[2]=date_array[0]
print, date
ENDIF
; Determine Satellite
IF ((STRPOS(Filename,'L7')) NE -1) THEN BEGIN
sat=0
bands_present=[0,1,2,3,4,7]
ENDIF
IF ((STRPOS(Filename,'L5')) NE -1) THEN BEGIN
sat=1
bands_present=[0,1,2,3,4,6]
ENDIF
PRINT, 'sun elevation=', sun_elevation
PRINT, 'sat_ind=', sat
gain=fltarr(nb_image)
bias=fltarr(nb_image)
min_max_rad=WHERE(STRPOS(metadata,'MIN_MAX_RADIANCE') ge 0)
lmax_min=fltarr(min_max_rad[1]-min_max_rad[0]-1)
searching_line = metadata[min_max_rad[1]+ 2]
searching_line_data=strsplit(strcompress(searching_line, /remove_all),'=', /extract)
qcalmax=fix(searching_line_data[1])
searching_line = metadata[min_max_rad[1]+ 3]
searching_line_data=strsplit(strcompress(searching_line, /remove_all),'=', /extract)
qcalmin=fix(searching_line_data[1])
FOR b=0, n_elements(lmax_min)-1 DO BEGIN
searching_line = metadata[min_max_rad[0]+b+1]
searching_line_data=strsplit(strcompress(searching_line, /remove_all),'=', /extract)
lmax_min[b]=float(searching_line_data[1])
ENDFOR
IF (sat EQ 0) OR (sat EQ 1) THEN BEGIN
lmax_min=reform(lmax_min, 2, n_elements(lmax_min)/2, /overwrite)
gain[0]=(lmax_min[0,0]-lmax_min[1,0])/(qcalmax-qcalmin)
bias[0]=lmax_min[1,0]-((lmax_min[0,0]-lmax_min[1,0])/(qcalmax-qcalmin))*qcalmin
gain[1]=(lmax_min[0,1]-lmax_min[1,1])/(qcalmax-qcalmin)
bias[1]=lmax_min[1,1]-((lmax_min[0,1]-lmax_min[1,1])/(qcalmax-qcalmin))*qcalmin
gain[2]=(lmax_min[0,2]-lmax_min[1,2])/(qcalmax-qcalmin)
bias[2]=lmax_min[1,2]-((lmax_min[0,2]-lmax_min[1,2])/(qcalmax-qcalmin))*qcalmin
gain[3]=(lmax_min[0,3]-lmax_min[1,3])/(qcalmax-qcalmin)
bias[3]=lmax_min[1,3]-((lmax_min[0,3]-lmax_min[1,3])/(qcalmax-qcalmin))*qcalmin
gain[4]=(lmax_min[0,4]-lmax_min[1,4])/(qcalmax-qcalmin)
bias[4]=lmax_min[1,4]-((lmax_min[0,4]-lmax_min[1,4])/(qcalmax-qcalmin))*qcalmin
gain[5]=(lmax_min[0,6]-lmax_min[1,6])/(qcalmax-qcalmin)
bias[5]=lmax_min[1,6]-((lmax_min[0,6]-lmax_min[1,6])/(qcalmax-qcalmin))*qcalmin
ENDIF
print, qcalmax
print, gain
print, bias
ENVI_DOIT, 'TMCAL_DOIT', fid=image_fid, bands_present=bands_present, pos=pos, dims=dims_image, sat=sat, $
cal_type=1, sun_angle=sun_angel, out_name=InputPath+Filename, r_fid=r_fid, date=date, $
gain=gain, bias=bias
FOR index=0, n_elements(fids)-1 DO BEGIN
envi_file_mng, /remove, id=fids[index]
ENDFOR
ENDFOR
envi_batch_exit
END
[/QUOTE]
I'm not sure how well TMCAL_DOIT works, but the description in the help causes serious though .
[QUOTE]ENVI help
result=Input * GAIN + BIAS
gain = (lmax - lmin) / 255
bias = lmin[/QUOTE]
This is correct only for QCALMAX=0.
Alex
|