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

    如有错误,还请指摘。

原文地址:https://www.cnblogs.com/ljwgis/p/12249504.html

时间: 2024-10-12 07:00:05

大话IDL编程之函数功能调用(envi_doit、ENVIRaster、ENVITask)的相关文章

Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)

原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之--找出Matlab内置函数中,已经大概的介绍了matlab内置函数在混合编程中的优点,并通过程序找出了matlab中的大部分内置函数,当然更多人关心是如何像我所说得那样,不用直接编译,就直接在C#中调用这些内置函数.本文就带你揭开这些谜团. 声明,这篇文章是需要一点点混合编程基础的,基本概念和过程要懂一点,如果能简单成功混编一个简单的计算或者绘图例子

函数的调用

把那些在脚本中重复出现并且没有任何改变的代码,封装起来,在适当的场景中调用执行:程序员将这种被封装起来的代码称为功能体,或者叫模块:function -- 函数 在shell脚本编程中,函数是由若干条shell命令组成的语句块:通常用于代码重用和模块化封装: 函数里面的内容和shell程序形式上是一致的:不同之处就是,shell代码可以直接被执行:而函数中的内容,不能独立执行,只有被调用的时候才执行: 函数是在shell程序的当前shell中运行的:bash bash script_file f

编程规范 --- 函数 过程

1:对所调用函数的错误返回码要仔细.全面地处理. 2:明确函数功能,精确(而不是近似)地实现函数设计. 3:编写可重入函数时,应注意局部变量的使用(如编写C/C++语言的可重入函数时,应使用auto即缺省态局部变量或寄存器变量). 说明:编写C/C++语言的可重入函数时,不应使用static局部变量,否则必须经过特殊处理,才能使函数具有可重入性. 4:编写可重入函数时,若使用全局变量,则应通过关中断.信号量(即P.V操作)等手段对其加以保护. 说明:若对所使用的全局变量不加以保护,则此函数就不具

C&C++——C函数与C++函数相互调用问题

C C++相互调用 在项目中融合C和C++有时是不可避免的,在调用对方的功能函数的时候,或许会出现这样那样的问题,但只要我的C代码和我的C++代码分别都能成功编译,那其他就不是问题.近来在主程序是C语言,而调用C++功能函数的时候,C++的*.h头文件都能找到,功能函数也都定义了,最重要的是,单独编译C++的时候,完全没有问题,但当用主程序的C调用C++的功能函数时,总是提示该函数未定义(undefined),这里分析问题的出处便是混合调用出现的问题了.关键点在这里:我们就靠在C++的*.h和*

linux脚本编程之函数和select循环

一.select循环 select 循环主要用于创建菜单,以数字显示菜单的选项,用户输入被保存在内置变量REPLY 中.select通常和case一起用,并且是一个死循环,注意要设置退出循环的选项. 与for 循环类似,可以省略in list ,此时使用位置参量 语法: select 变量name  in 变量列表 do     action done [[email protected] blog2]# bash select.sh 1) begin 2) stop 3) continue #

bash编程之函数

function:功能,库,代码重用,易于集中管理,代码重用的目的在于完成结构化编程.函数定义语句不会被执行,但会被载入内存,可以在同一个shell进程中被多次调用,可以在被调用时接受传递参数,在调用时会被执行. 定义函数的两种方式 function_name (){ -NaNd -cmd } function fuction_name{ -cmd -cmd } ***函数可以互相嵌套调用,并且可以自己调用自己! ***函数的位置参数 调用函数的格式 function_name  arg1 ar

12月7号 函数功能

函数 1.什么是函数  为什么要用函数 函数是一个代码段   将功能模块化 稳定性  可复用 2.函数如何定义 两种定义方式:1.先声明 后声明(函数的实现部分比较长) 2.声明和实现放在一起(逻辑简单  注意:必须放在main函数的前面) 原因是程序的执行按照从上至下 函数命名规则:首字母小写 函数的格式(void类型不需要return值) 返回值类型 名字(参数,参数,参数){ //函数体 //代码 return; } int add(int a, int b){ int result =

Shell编程基础-function: 功能

脚本编程之函数:function: 功能结构化编程,不能独立运行,需要调用时执行,可以被多次调用定义一个函数:function FUNCNAME {  command}FUNCNAME() {  command}自定义执行状态返回值:return #0-255接受参数的函数:./a.sh m n $1: m$2: nTWOINT 5 6$1: 5$2: 6练习:写一个脚本,判定192.168.0.200-192.168.0.254之间的主机哪些在线.要求:1.使用函数来实现一台主机的判定过程:2

C#函数式编程中的递归调用之尾递归详解

关于递归相信大家已经熟悉的不能再熟悉了,所以笔者在这里就不多费口舌,不懂的读者们可以在博客园中找到很多与之相关的博客.下面我们直接切入正题,开始介绍尾递归. 尾递归 普通递归和尾递归如果仅仅只是从代码的角度出发来看,我们可能发现不了他的特点,所以笔者利用两张堆栈上的图来展示具体的差距在哪,首先我们来看看普通的递归调用的情况,如下图1.1所示: 假设这里执行的函数是Func1,并且Func1中通过递归调用了自己,那么我们可以看到栈上在每次调用Func1的时候都会重新将函数返回地址等其他参数放入栈中