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'");)。

  运行时将文件 BlendWithIDL\Libs\Win32\RasterSubsetViaShapefile.pro 复制到 PIESDK\Bin目录下

  注意:本示例使用的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. 示例截图

 

posted @ 2019-01-09 14:28  PIESAT  阅读(1768)  评论(0编辑  收藏  举报