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. 示例截圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM