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


    版权声明:本文为博主原创文章,遵循 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。
    这里需要注意以下几点

    1. “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工程即可。
      在这里插入图片描述

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

  • 相关阅读:
    01OpenCV 加载图片并显示图片
    【栈和队列面试题】用栈实现队列(动图解析更清晰)
    修炼k8s+flink+hdfs+dlink(六:学习k8s-pod)
    【QT】day4
    油/水溶性/CdSe/CdSe/CdS/CdSe-ZnS/InP-ZnS量子点的制备
    Java网络编程套接字
    Python图像处理笔记
    沃尔玛、阿里国际该如何做测评自养号?
    基于布朗运动的文本生成方法-LANGUAGE MODELING VIA STOCHASTIC PROCESSES
    PowerEdge RAID Controller (PERC) types for Dell EMC systems PERC11
  • 原文地址:https://blog.csdn.net/weixin_42176976/article/details/125100221