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


     

    1.功能简介

          IDL是一门简单易用的科学计算和可视化语言,包含大量的图形图像处理函数,尤其是同ENVI结合集成了该软件的大量功能,因此被广泛用于遥感、地信领域。

         本示例程序实现了IDL算法与PIESDK集成功能,使得在PIE中也可以调用IDL写的算法(以IDL图像裁剪算法为例)。     

    2. 功能实现说明

    2.1. IDL算法

           IDL写的算法可以是.pro文件也可以是.sav文件,算法如果使用到ENVI函数,需要安装ENVI,另外还需要调用初始化ENVI批处理方法(详见示例代码)。

    2.2. 实现思路及原理说明

           本示例实现方法主要使用Interop.COM_IDL_connectLib组件,直接添加引用即可(若安装IDL,也可以在添加引用->Com组件中找到它)。需要注意的是.pro和.sav的初始化方法不同,.pro文件使用.complie命令编译后才能使用该函数;而.sav文件需要先restore,再调用(oCom.ExecuteString("restore 'idlfunction.sav'");)。

      运行时将文件 BlendWithIDLLibsWin32RasterSubsetViaShapefile.pro 复制到 PIESDKBin目录下

      注意:本示例使用的IDL版本是IDL82,需安装ENVI5.0+IDL82才能正常执行。如有更高版本的ENVI+IDL,先将项目引用里的Interop.COM_IDL_connectLib、COM_IDL_connectLib、AxInteropIDLDRAWX3Lib三个程序集删除掉,然后右键添加引用,在COM里面找到COM_IDL_connectLib 1.0 type Library 项,选中添加此引用,并将COM_IDL_connectLib引用的嵌入互操作类型属性改为false。

      

    第一步

    添加Interop.COM_IDL_connectLib组件引用

    第二步

    创建COM_IDL_connectClass对象,并用CreateObject()初始化

    第三步

    若输入参数需要使用ENVI函数,则需要初始化ENVI批处理

    第四步

    编译算法,使用.compile/restore命令

    第五步

    构造算法需要的参数

    第六步

    利用ExecuteString()方法执行算法

    2.3 . 核心接口与方法

    接口/类

    方法

    说明

    COM_IDL_connectClass

    CreateObject()

    构造IDL连接对象

    COM_IDL_connectClass

    ExecuteString()

    执行IDL命令行命令

    2.4.  示例代码

    项目路径

    百度云盘地址下/PIE示例程序/14.SDK拓展开发/ 01PIESDK与IDL算法结合/ BlendWithIDL

    数据路径

    百度云盘地址下/PIE示例数据/栅格数据/

    视频路径

    百度云盘地址下/PIE视频教程/14.SDK拓展开发/01PIESDK与IDL算法结合.avi

    示例代码

     1          /// <summary>
     2         /// 图像裁剪
     3         /// </summary>
     4         /// <param name="sender"></param>
     5         /// <param name="e"></param>       
     6         private void button_run_Click (object sender, EventArgs e)
     7         {
     8             string inFile = textBox_srcImg.Text;
     9             string extFile = textBox_ext.Text;
    10             string outFile = textBox_dst.Text;
    11 
    12             COM_IDL_connectClass oCom = new COM_IDL_connectClass();
    13             oCom.CreateObject(0, 0, 0);
    14 
    15             //若依赖envi,先初始化ENVI批处理
    16             oCom.ExecuteString("COMPILE_OPT idl2");
    17             oCom.ExecuteString("ENVI, /RESTORE_BASE_SAVE_FILES");
    18             oCom.ExecuteString("ENVI_BATCH_INIT");
    19 
    20             //编译算法
    21             oCom.ExecuteString(@".compile '"+System.IO.Path.Combine(Application.StartupPath,"RasterSubsetViaShapefile.pro") +"'");
    22             oCom.ExecuteString(@"file='"+inFile+"'");
    23             //获取文件fid(算法需要)
    24             oCom.ExecuteString("envi_open_file,file,r_fid=fid");
    25             oCom.ExecuteString(@"shpFile = '"+extFile+"'");
    26             //调用算法
    27             oCom.ExecuteString(@"RasterSubsetViaShapefile, Fid, 
    28                          shpFile=shpFile,     outFile='"+outFile+"', r_fid=r_fid");
    29 
    30             if (m_OutLayer != null) mapControl_dst.FocusMap.DeleteLayer(m_OutLayer);
    31             m_OutLayer = LayerFactory.CreateDefaultLayer(outFile);
    32             if (m_OutLayer == null) { MessageBox.Show("执行失败"); return; }
    33 
    34             mapControl_dst.FocusMap.AddLayer(m_OutLayer);           mapControl_dst.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
    35          }
    View Code

    2.5. 示例截图

  • 相关阅读:
    115今天太给力了~
    使用jQuery顺序显示元素
    温习浏览器渲染模式
    去除浏览器a标签链接时,烦人的虚线框
    设计可以是一种垄断
    如何获取鼠标选中的文字
    积极参与到FuckIE6的队伍中...
    google今儿发现页面又变好看了
    20101207google 今天出新功能了
    火狐ff下margintop太给力
  • 原文地址:https://www.cnblogs.com/PIESat/p/10244166.html
Copyright © 2020-2023  润新知