大话IDL编程之函数功能调用(envi_doit、ENVIRaster、ENVITask)
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
如有错误,还请指摘。