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

    如有错误,还请指摘。

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

  1. 【C语言C++编程入门】程序的可读性和函数的调用!

    一个简单程序的结构 你已经看过一个具体的例子,下面可以了解一些 C程序的基本规则了. 程序由一个或多个函数组成,其中一定有一个名为 main()的函数.函数的描述由函数头和函数体组成.函数头包括预处理 ...

  2. 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...

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

    原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...

  4. 转: ES6异步编程:Generator 函数的含义与用法

    转: ES6异步编程:Generator 函数的含义与用法 异步编程对 JavaScript 语言太重要.JavaScript 只有一根线程,如果没有异步编程,根本没法用,非卡死不可. 以前,异步编程 ...

  5. C语言博客作业—函数嵌套调用

    一.实验作业 1.1 PTA题目:递归法对任意10个数据按降序排序 1.1.1设计思路 void sort(int a[],int n) { 定义整型循环变量i,中间变量temp,最小值min: 令m ...

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

    C C++相互调用 在项目中融合C和C++有时是不可避免的,在调用对方的功能函数的时候,或许会出现这样那样的问题,但只要我的C代码和我的C++代码分别都能成功编译,那其他就不是问题.近来在主程序是C语 ...

  7. [Python3] 034 函数式编程 匿名函数

    目录 函数式编程 Functional Programming 1. 简介 2. 函数 3. 匿名函数 3.1 lambda 表达式也称"匿名函数" 3.2 lambda 表达式的 ...

  8. 栈编程和函数控制流: 从 continuation 与 CPS 讲到 call/cc 与协程

    原标题:尾递归优化 快速排序优化 CPS 变换 call/cc setjmp/longjmp coroutine 协程 栈编程和控制流 讲解 本文为部分函数式编程的扩展及最近接触编程语言控制流的学习和 ...

  9. 【混合编程】C/C++调用Fortran的DLL

    [混合编程]C/C++调用Fortran的DLL 以一个简单的加法器为例,介绍C/C++调用Fortran语言DLL的操作过程 一.Fortran操作 1.1 Fortran代码 首先是加法功能的实现 ...

随机推荐

  1. SpringBoot系列之集成Dubbo的方式

    SpringBoot系列之集成Dubbo的方式 本博客介绍Springboot框架集成Dubbo实现微服务的3种常用方式,对于Dubbo知识不是很熟悉的,请先学习我上一篇博客:SpringBoot系列 ...

  2. 【转】Java Web Services面试问题集锦

    Q. 应用集成方式有哪些? A. 应用可以采用以下方式集成: 1. 共享数据库 2. 批量文件传输 3. 远程过程调用(RPC) 4. 通过消息中间件来交换异步信息(MOM) Q. 应用集成可以采用的 ...

  3. SQL Server2012高可用之日志传送测试

    (一)日志传送架构 (1.1)相关服务器 主服务器   :用于生产的服务器,上面运行这生产SQL Server数据库: 辅助服务器:用于存放主服务器上数据库的一个“镜像”数据库: 监控服务器:用来监控 ...

  4. Spring中的beanPostProcess的作用

    BeanPostProcessor是Spring框架中非常重要的bean之一.贯穿在Spring容器中bean的初始化的整个过程. Spring中的beanpostProcess体系结构如下: 可以看 ...

  5. C#实现DataTable转TXT文件

    实现DataTable转TXT文件代码如下: public ExecutionResult DataTableToTxt(DataTable vContent, string vOutputFileP ...

  6. 容器环境的JVM内存设置最佳实践

    Docker和K8S的兴起,很多服务已经运行在容器环境,对于java程序,JVM设置是一个重要的环节.这里总结下我们项目里的最佳实践. Java Heap基础知识 默认情况下,jvm自动分配的heap ...

  7. vs推送git失败,修改git下config的Log

    一开始写完程序套推送到Git中,然后就来了一下,下面的异常: 异常1 发布到远程存储库时遇到错误: Git failed with a fatal error. fatal: HttpRequestE ...

  8. vue学习笔记1:el 与 data

    一.vue介绍 vue是目前三大主流框架之一(React.Angular.Vue) vue特点: 易用 灵活 高效 vue官网:官网链接 二,知识点 vue实例选项: el 注:不能 让el直接管理h ...

  9. Redis(二):redis命令构建及关键属性解析

    上一篇文章,我们从框架层面,主要介绍了redis的启动过程,以及主要的命令处理流程逻辑.这些更多的都是些差不多的道理,而要细了解redis,则需要更细节的东西. 今天我们稍微内围的角度,来看看几个命令 ...

  10. 01.flask pycharm开启debug模式

    代码照旧