五 IDL考前复习IDL联动ENVI辐射定标

前言
千呼万唤始出来,一直运行不成功原来是图像的问题,打不开第二波段的图像,人都给你整傻咯,IDL是真心的不好用而且还要和ENVI联动,就更蠢了,ENVI自有的辐射定标功能它不香吗,可是老师上课写了考试还考,只能含泪写完了它,流下了技术人debug一天的眼泪 。
需求分析
虽然流程看起来比较简单,但是中间的文本的操作真的是复杂到哭,真的是含泪写完了博客 。
1.打开txt文件利用hash表存储所要的信息
【五IDL考前复习IDL联动ENVI辐射定标】何是h a s h,h a s h hash,hash hash,hash 表就是一个键对于一个值,在下面的部分我们用h s m e t a [ l i n e k e y ] = l i n e v a l u e []= []=来表示 。由于读取中有很多的复杂的操作,我尽量也讲清楚一些,用读取出的一行显示的截图来说明一些问题 。
functiongetmetadata,filenameopenr,lun,filename,/get_lun;line=''hsmeta=hash()while(~eof(lun)) do beginreadf,lun,lineif(line.indexof('=')ge 0) then beginlinearray=line.SPLIT('=')linekey=linearray[0].trim()linevalue=http://www.kingceram.com/post/linearray[1].trim()hsmeta[linekey]=linevalueendifendwhilereturn,hsmetaend
要得到所需要的键和值的对应关系,打开文件读文本的操作我也就不解释了,看过以前的blog应该就明白,然后l i n e line line是我定义好的文本变量,接收我逐行读取的文本,h s m e t a是一个hash表,后面开始循环逐行读文本,r e a d f , l u n , l i n e readf,lun,line readf,lun,line应该都很熟悉了 。这个函数输入参数为文件名,输出的是一个大的h a s h hash hash表
if(line.(’=’)ge 0) then begin
为什么要设置这个循环呢,是因为那个MTL.TXT文件里最后一行是以 end 结尾的,如果读到那里会导致一些错误,即我希望我的hash表里都是下面这样的对应关系
R E F L E C T A N C E _ A D D _ B A N D _ 1 = ? 0. \_ADD\_BAND\_1 = -0. _1=?0.
而如果不加入,hash表中最后会出现一个end,会出现键和值不对应的问题 。
end
循环是个整体框架,循环中带有一些文本的操作,即:
=line.SPLIT(’=’)
=[0].trim()
=[1].trim()
我怕解释不清楚就以截图来说明,首先用split函数把line切割开来,把l i n e a r r a y切割成2个字符串部分,看图片很清晰,而后面l i n e k e y = l i n e a r r a y [ 0 ] . t r i m= [0].trim =[0].trim首先我取出了第一个元素,而这个元素会有很多空格,我需要用t r i m trim trim函数把空格全部删掉,同理l i n e v a l u e也是一样的 。
下面来最麻烦的东西了就是h a s h hash hash, h a s h hash hash 一个键对应一个值,例如下面
h a s h [ l i n e k e y ] hash[] hash[] 是一个键,而对应的是l i n e v a l u e这么一个值,我们可以通过一个键对应一个值,所以后续其实就是无数次循环,把整个存成一个大的h a s h hash hash以便后续的操作 。最后这个函数返回了h s m e t a以便后续的函数调用 。
2.联动ENVI进行相关的操作
其实本来是很简单的一件事情,只不过正好在学IDL和ENVI混合编程,所以老师一定要用ENVI进行操作也没办法,那就肝呗,其实核心就是
r a d D N = D N ? g a i n + b a i s rad_{DN} = DN * gain +bais radDN?=DN?gain+bais罢了,有点废话了干活 。
functiongetcalculated,band,hashmeta,folderbandstr=string(band)bandstr=bandstr.trim()gainkey='REFLECTANCE_MULT_BAND_'+bandstrbiaskey='REFLECTANCE_ADD_BAND_'+bandstrfilename='FILE_NAME_BAND_'+bandstrgains=float(hashmeta[gainkey])bias=float(hashmeta[biaskey])fn=hashmeta[filename]fn=folder+fn.replace('"','')envi_open_data_file,fn,r_fid=fid,/tiffenvi_file_query,fid,dims=dims,map_info=mapinfo,nl=nl,ns=ns,nb=nb,bnames=bnames,interleave=interleave,offset=offsetmapinfo=envi_get_map_info(fid=fid)lsdata=http://www.kingceram.com/post/envi_get_data(fid=fid,dims=dims,pos=0)result=lsdata*gains+biasenvi_write_envi_file,result,out_name='E:/radcalib.img',map_info=mapinfo,data_type=4,nl=nl,ns=ns,nb=nb,bnames=bnames,interleave=interleave,offset=offsetreturn,'ok'end