liuwenliang的个人博客分享 http://blog.sciencenet.cn/u/liuwenliang

博文

[转载]ENVI Tasks

已有 1628 次阅读 2023-4-15 17:16 |个人分类:IDL|系统分类:科研笔记|文章来源:转载

(1)python 调用ENVI Task

from envipyengine import Engine

from pprint import pprint

envi_engine = Engine('ENVI')

tasks = envi_engine.tasks()

pprint(tasks)


task = envi_engine.task('RPCOrthorectification')

input_raster = dict(url='D:\GF6_PMS_E116.7_N39.5_20220908_L1A1120247083-PAN.tiff',factory='URLRaster')

parameters = task.parameters

pprint(parameters)


dem_raster = dict(url='D:\Program Files\Harris\ENVI56\data\GMTED2010.jp2',factory='URLRaster')

outputuri = 'D:\GF6_PMS_E116.7_N39.5_20220908_L1A1120247083-PAN_geo_py.tiff'

parameters = dict(INPUT_RASTER=input_raster,DEM_RASTER=dem_raster,DEM_IS_HEIGHT_ABOVE_ELLIPSOID=0,OUTPUT_PIXEL_SIZE=[2,2],OUTPUT_RASTER_URI=outputuri)

result = task.execute(parameters)

(2)   IDL 调用ENVI Task   请参考以下原文,此处只做备份

转自:https://blog.csdn.net/qq_37970770/article/details/107932714

转载-ENVI 5.1二次开发之——全新图像批处理模式(ENVITask)


声明

本文内容转载自ENVI-IDL技术殿堂博客,点此进入文章链接

正文

之前做过ENVI二次开发的都知道,ENVI提供了一些列的DOIT函数,几乎包含了ENVI的所有图像处理功能,可以方便地被用户调用从而实现批处理,这些DOIT函数都是面向过程的。从ENVI 5.1版本开始,开始提供一种全新的图像处理API模式(ENVITask),即面向对象。本文就带大家来认识一下这些API。

从5.1版本开始,我们可以使用ENVITask和ENVITaskParameter两个对象组合使用进行各种各样的图像处理操作,ENVI 5.1目前只提供了四个ENVITask,如下表所示:

表:ENVI 5.1版本提供的ENVITask
这些Tasks与ENVI界面中对应工具支持的参数是一样的。所以想要快速调用这些Tasks,最好首先熟悉ENVI对应工具的使用与参数设定。

1.ENVITask与ENVITaskParameter对象
先来学习下这两个基础对象。简单来说,ENVITask就是用来新建Task的,而ENVITaskParameter可以返回当前Task的属性列表。

1.1 ENVITask
调用格式:

Result = ENVITask(‘TaskName’ [, ERROR=variable])

ENVI> Task = ENVITask(‘QUAC’)

ENVI> Task.DESCRIPTION

This task performs the QUick Atmospheric Correction workflow on an image

ENVI> Task.NAME

QUAC

ENVI> Task.IGNORE_VALIDATE

0

在这里插入图片描述
在这里插入图片描述

1.2 ENVITaskParameter
每一个ENVITask都有自己的参数设定。使用此方法可以返回查看每一个参数的所有属性,如下表所示。ENVITaskParameter的调用非常简单(查看上文示例代码),格式如下:

Result = ENVITask.Parameter(‘TaskProperty’ [, ERROR=variable])

其中,‘TaskProperty’为要查看的参数名,如上文的’input_raster’。
在这里插入图片描述

2.调用方法示例
以ENVIRPCOrthorectificationTask为例,介绍如何使用ENVITask进行图像处理。ENVIRPCOrthorectificationTask具有很多属性,属性列表如下所示。

在这里插入图片描述

下面的示例代码:

PRO Example_RPCOrthorectification  ; 启动ENVI5.1
  e = ENVI()
  ; 选择输入文件
  ImageFile = DIALOG_PICKFILE(TITLE='Select an input image')
  Raster = e.OpenRaster(ImageFile)
  ; 选择DEM文件,这里使用ENVI5.1自带的DEM数据
  DEMFile = 'C:\Program Files\Exelis\ENVI51\data\GMTED2010.jp2'
  DEM = e.OpenRaster(DEMFile)
  ; 新建RPCOrthorectification ENVITask
  Task = ENVITask('RPCOrthorectification')
  ; 设置Task的输入输出参数
 Task.INPUT_RASTER = Raster
  Task.DEM_RASTER = DEM
 Task.DEM_IS_HEIGHT_ABOVE_ELLIPSOID = 0
 Task.OUTPUT_RASTER_URI = e.GetTemporaryFilename()
  ; 执行Task
 Task.Execute, Error=error ; 将输出结果添加到Data Manager中
  DataColl = e.DATA 
 DataColl.Add, Task.OUTPUT_RASTER  ; 显示结果
  View1 = e.GetView()
  Layer1 = View1.CreateLayer(Task.OUTPUT_RASTER)END12345678910111213141516171819202122232425

在这里插入图片描述

部分内容没有转载,完整内容请查看原文链接

(3)ENVI task 封装 请参考以下原文,此处只做备份

IDL学习——外部方法调用IDL.pro文件

转自:https://blog.csdn.net/weixin_42176976/article/details/125100221

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

最近在研究不通过GSF(5.5以后叫这个名)/ENVI Server Engine(5.3以前叫这个)进行IDL代码的调用,找到两种方法进行调用,做以下记录:


python调用.pro文件

python调用主要是通过envipyengine这个库包进行相关调用。


envipyengine安装

pip install envipyengine

1

这里需要python3.6以上以及ENVI5.4以上才能进行相关调用。

其中一些参数说明可参考:

https://envi-py-engine.readthedocs.io/en/latest/envipyengine_api.html#


IDL编译文件准备

创建.sav文件——针对pro文件

创建sav文件也有两种方法,第一种方法直接在控制台编写以下代码,filename参数后面输入的为.sav输出文件路径。


save,filename='D:\lizijia.sav',/routines

1

第二种方法为使用 publish_ese_task.pro 这个文件进行.sav文件创建。使用方法为编译需要生成sav的pro文件和publish_ese_task.pro文件,之后在控制台贴上以下代码,后面一段为需要生成sav的pro文件的绝对路径。如下图所示


Publish_ESE_Task,'C:\Users\Admin\IDLWorkspace\Default\test_modis_flaash.pro'

1


之后就会在ENVI的安装路径custom_code文件夹下生成.sav文件,比如我这里就为D:\Harris\ENVI56\custom_code\Default\test_modis_flaash.sav


创建.task文件

先贴上IDL代码开头吧,这样更加清晰一点


pro test_modis_flaash,radiance_file=radiance_file,Path=Path,out_filename=out_filename


  COMPILE_OPT idl2

  

  e=envi(/headless)

1

2

3

4

5

先新建一个txt文件,在txt里面添加以下内容:


{

    "name": "test_modis_flaash",                                         ;test_modis_flaash为你pro的名字

    "base_class": "ENVITaskFromProcedure",              ;默认不变

    "routine": "test_modis_flaash",      ;和name保持一致

    "display_name": "Flaash procedure",                                  ;procedure显示名字,

    "description": "This task preform atomospheric correction.",         ;对procedure进行描述

    "schema": "envitask_3.2",

    "parameters": [

        {

            "name": "radiance_file",

            "display_name": "Input Raster",

            "datatype": "ENVIURI",

            "direction": "INPUT",

            "required": true,

            "description": "Specify a raster on which to perform masking."

        },

{

"name":"Path",

"display_name":"Output Raster",

    "datatype":"ENVIURI",

    "direction":"input",

"required":false,

"description":"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.",

"fold_case":true,

"auto_extension":".dat",

"is_temporary":true

},

{

            "name": "OUTPUT_RASTER_URI",

            "keyword": "OUT_FILENAME",

            "display_name": "Output Raster URI",

            "datatype": "ENVIURI",

            "direction": "INPUT",

            "required": false,

            "description": "Specify a string with the fully qualified filename and path to export the associated OUTPUT_RASTER. If you set this property to an asterisk symbol (*), the output raster will be virtual and not written to disk. If you do not specify this property, or set it to an exclamation symbol (!), a temporary file will be created.",

            "auto_extension": ".dat",

            "fold_case": true,

            "is_temporary": true

        },

        {

            "name": "OUTPUT_RASTER",

            "keyword": "OUT_FILENAME",

            "display_name": "Output Raster",

            "datatype": "ENVIRaster",

            "direction": "OUTPUT",

            "required": true,

            "description": "This is a reference to the output raster of filetype ENVI.",

            "uri_param": "OUTPUT_RASTER_URI"

        }

    ]

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

创建完成后,将该txt命名为****.task。****为.pro文件的名称,如我这里是test_modis_flaash.pro,创建完成后就命名为test_modis_flaash.task。

这里需要注意以下几点


“base_class”: “ENVITaskFromProcedure”, 这里如果是ENVI自带的pro,则为

‘ENVITaskFromProcess’,如果是自己编写pro,一般都写为"ENVITaskFromProcedure"

pro里面要传入3个参数,radiance_file,path,out_filename,以下对该参数中使用到的关键字进行说明:


name:参数变量名称

display_name:如果制作成扩展文件,拥有可视化界面时就是这个参数在可视化界面展示的名字。

datatype:参数类型

direction:指定该参数是输入参数还是输出参数;input:输入、output:输出

required:该参数是否为必须输入参数;true:必须输入、false:选择输入

description:参数描述;

fold_case:是否为文件夹;true:选择文件夹;false:选择文件

auto_extention:指定文件后缀

is_temporary:是否

2.从官方文档里可以看到还有choice_list,min,max等参数,对这些参数以及我用到过的参数进行简要说明:



说明

choice_list:当参数datatype为string类型时,可指定供用户选择的列表,如大气校正时需选择的卫星类型。

min/max:指定该参数的最小值以及最大值。如归一化时的百分比。

dimensions:当参数type为array类型时(ENVIRasterArray(栅格数组)\ENVIVectorArray(矢量数组)\ENVIStringArray(字符串数组))需指定数组维度,写法是:dimension:"[1]"这里1就是指定输入数组为1维,如果是[*]就是不指定维数,可以为任意维数。

defaultValue:指定参数默认值。

3.额外注意一点是如果pro文件是输出一景栅格数据,即存在OUTPUT_RASTER_URI该参数,则需再指定output_raster该参数,就如上所示,其中uri_param关键字和output_raster_uri对应,关键字direction为output。

完成以上配置后,将.pro、.sav文件和.task文件另存到ENVI安装目录—harris\ENVI56\custom_code目录下即可。


python进行调用

直接上代码


from envipyengine import Engine

envi_engine = Engine('ENVI')   

task = envi_engine.task('test_modis_flaash')      # 填写IDL pro文件名

parameters = dict(radiance_file='F:\\04_DailyTemp\\L8_Radio.dat', Path='D:\\output',

                  OUTPUT_RASTER_URI='F:\\04_DailyTemp\\flaash63.dat')

result = task.execute(parameters)

print(result)

1

2

3

4

5

6

7

主要是parameters该参数,该参数将IDL中使用到的参数打包成一个dict进行调用。这里还需注意一点,如果输入存在参数中有关键字为ENVIRaster,则需该参数进行打包(ENVIVector同理),如下所示:


input_raster = dict(url='F:\\04_DailyTemp\\all_layer_stack10.dat',

                     factory='URLRaster')

# 调用时:

parameters = dict(INPUT_RASTER=input_raster,……)

1

2

3

4

CMD调用IDL代码

这里可参考ENVI-IDL官方技术博客:https://www.cnblogs.com/enviidl/p/16657878.html,这里还存在一下问题,还未找到问题所在。



将IDL.pro文件封装为ENVI扩展工具

前几步和python中调用.pro文件都是一样的,所以就不再展开赘述。这里不是针对pro文件构建sav文件,而是对构建的项目创建sav文件。


创建.task文件

创建为扩展工具

点击IDL界面左上角File-ENVI扩展,工程名称和IDL程序名字最好保持一致,不要有特殊字符。文件保存位置在IDL工作空间下即可。



创建完成之后,在该工程文件夹下会自动生产一个.pro文件。如下图所示:



task = envitask('cal_rsei')             ;.pro文件名称。

ui = e.ui

r = ui.SelectTaskParameters(task)

IF r EQ 'Cancel' THEN RETURN

task.execute

1

2

3

4

5

在上图红框部分插入ENVI制作可视化界面的代码,这一部分不用手动去敲代码进行界面搭建,很方便。


将pro和task文件挪至刚才创建的工程文件夹下,即上图中CalRSEI文件夹下。


对该工程文件创建sav文件。右击该工程文件,即CalRSEI——属性——工程构建属性,修改创建save文件路径为extensions路径下。再次右击该工程文件,点击创建项目/build project。



最后将.task文件复制到 \Harris\ENVI56\custom_code 文件夹下即完成扩展工具制作。重启ENVI,就可使用自己制作的扩展工具。


注意以下两种情形


若程序中调用了其他pro文件,则需将该pro文件创建sav文件,将该sav文件添加到ENVI扩展文件夹下——:\Harris\ENVI56\extensions

若程序中调用了自己编写的函数,在扩展工具中进行调用有两种方法:

将pro中所有用到的函数全部添加到pro代码里面。

将pro中所有用到的函数添加至新创建的pro文件,放置在工程文件下,对该工程文件重新构建sav文件。如下图所示,rsei_pre里存储cal_rsei.pro程序用到的所有函数,将rsei_pro.pro放到CalRSEI工程下,重新编译CalRSEI工程即可。


后续有何发现,继续更新。

————————————————

版权声明:本文为CSDN博主「三十二号星期八」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_42176976/article/details/125100221




https://blog.sciencenet.cn/blog-3409972-1384343.html

上一篇:thinkpad x1 carbon 重装win10 系统记录
下一篇:[转载]Python glob
收藏 IP: 210.72.26.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-7-17 21:39

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部