大话IDL编程之函数功能调用(envi_doitENVIRasterENVITask)

Posted ljwgis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大话IDL编程之函数功能调用(envi_doitENVIRasterENVITask)相关的知识,希望对你有一定的参考价值。

  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方法只要设置好该方法的输入输出,就可以得到结果,较为方便。此外,对于自定义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

     如有错误,还请指摘。

以上是关于大话IDL编程之函数功能调用(envi_doitENVIRasterENVITask)的主要内容,如果未能解决你的问题,请参考以下文章

在客户端和服务器端编程语言相同时,IDL 在 RPC 中的作用?

PIE SDK与IDL算法结合说明文档

大话处理器-编写高效代码

java 之 状态模式(大话设计模式)

大话设计模式之依赖倒转原则

shell编程之函数和case多条件分支语句