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 } |
2.5. 示例截图