2020年2月1日。好長時間沒更新博客,還真有點不習慣。受新型冠性病毒的影響,平時街上熙熙攘攘的人流了無蹤影,2020的春節竟然來的如此冷清。為響應“呆在家里就是做貢獻的號召”,在家一宅就是十多天。閑來無事,就總結一下ENVI-IDL二次開發的學習經驗吧。
ENVI二次開發主要有兩種編程方式:IDL二次開發、ENVI-IDL交互式開發。
其中,IDL二次開發方式較為繁瑣,但是也的確算是基本功,需要熟練掌握。而ENVI-IDL交互開發的方式簡潔高效,是現在的主流開發方式。
其中,對於某些功能函數,ENVI已經給出了新的調用方法。即envi_doit、ENVIRaster虛擬柵格、ENVITask這三種方法。其中虛擬柵格的方法將數據在內存中運行,運行完
之后釋放。而ENVITASK也同樣簡潔高效、易懂。
- 首先講ENVITask的實現方式(這里以ENVIRadiometricCalibration為例)
e = ENVI() file = 'a.dat' raster = e.OpenRaster(file) Task = ENVITask('RadiometricCalibration') Task.INPUT_RASTER = raster Task.OUTPUT_TYPE = 'Double' Task.OUTPUT_RASTER_UI = 'C:/a.dat' ;第一種保存方法,設置輸出路徑,保存數據 Task.Execute
;第二種ENVITask的文件保存方式
outputRaster = TASK.OUTPUT_RASTER
outputRaster.export, 'C:/a.dat', 'envi'一般來說,ENVITask方法只要設置好該方法的輸入輸出,就可以得到結果,較為方便。此外,對於自定義task, 在有.pro文件后,可以編寫.task文件用來調用。
-
ui = e.UI r = ui.SelectTaskParameters,添加該代碼顯示參數窗口。
-
- 其次講ENVIRaster的實現方式,即虛擬柵格(ENVIRadiometricCalibrationTask)
e = ENVI() file = 'LC80410302013213LGN00_MTL.txt' raster = e.OpenRaster(file) OLIBands = raster[0] ;Landsat8數據被存儲在5-element數組中,第一個數組陣列是波段數據 refRaster = ENVICalibrateRaster(OLIBands,CALIBRATION = 'Top-of-Atmophere Reflectance')
refRaster.export,'c://new.dat' ;data.export輸出文件並保存 e.DATA.add, refRaster ;數據添加到交互界面 view = e.getview() ;創建視圖 layer = view.createlayer(refRaster) ;添加圖層 - 最后是 envi_doit方法/IDL方法
fn = 'a.dat' envi_open_file, fn, r_fid=fid envi_file_query, fid, ns=ns, nl=nl, nb=nb, dims=dims,pos=pos map_info = envi_get_map_info(fid=fid) ;接下來有兩種方法, envi_doit和普通的IDL方法 pos=[0,1,2] envi_doit,'envi_avhrr_calibrate_doit',dims=dims,fid=fid,pos=pos,out_name='b.dat' ;普通的IDL方法 fn_calib = dialog_pickfile(filter='*.txt', title='calibrate') openr,lun,fn,fn_calib,/get_lun ;openr 打開txt文件 data=fltarr(2,6) readf,lun,data ;readf 讀取到data free_lun, lun gain = data[0,*] bais = data[1,*] L = fltarr(ns,nl,nb) for i=0,nb-1 do begin data_band=envi_get_data(fid=fid,dims=dims,pos=i) ;envi_get_data 讀取數據 L[*,*,i]=gain[i]*data_band+bias[i] endfor outfile='new.dat' envi_write_envi_file,L,out_name=outfile,ns=ns,nl=nl,nb=nb,$ data_type=4,interleave=interleave,offset=offset,bnames=bnames,map_info=map_info #保存文件 envi_write_envi_file
如有錯誤,還請指摘。