IDL是一門簡單易用的科學計算和可視化語言,包含大量的圖形圖像處理函數,尤爲是同ENVI結合集成了該軟件的大量功能,所以被普遍用於遙感、地信領域。算法
本示例程序實現了IDL算法與PIESDK集成功能,使得在PIE中也能夠調用IDL寫的算法(以IDL圖像裁剪算法爲例)。 ide
IDL寫的算法能夠是.pro文件也能夠是.sav文件,算法若是使用到ENVI函數,須要安裝ENVI,另外還須要調用初始化ENVI批處理方法(詳見示例代碼)。函數
本示例實現方法主要使用Interop.COM_IDL_connectLib組件,直接添加引用便可(若安裝IDL,也能夠在添加引用->Com組件中找到它)。須要注意的是.pro和.sav的初始化方法不一樣,.pro文件使用.complie命令編譯後才能使用該函數;而.sav文件須要先restore,再調用(oCom.ExecuteString("restore 'idlfunction.sav'");)。spa
運行時將文件 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。3d
第一步rest |
添加Interop.COM_IDL_connectLib組件引用code |
第二步視頻 |
建立COM_IDL_connectClass對象,並用CreateObject()初始化對象 |
第三步 |
若輸入參數須要使用ENVI函數,則須要初始化ENVI批處理 |
第四步 |
編譯算法,使用.compile/restore命令 |
第五步 |
構造算法須要的參數 |
第六步 |
利用ExecuteString()方法執行算法 |
接口/類 |
方法 |
說明 |
COM_IDL_connectClass |
CreateObject() |
構造IDL鏈接對象 |
COM_IDL_connectClass |
ExecuteString() |
執行IDL命令行命令 |
項目路徑 |
百度雲盤地址下/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 } |