1.功能簡介
Python是一種跨平台語言。無論是在Windows、Linux、Unix還是Mac Os系統,我們都可以使用Python。甚至在Linux、Unix及Mac OS系統內已經集成了Python。語法簡潔優美, 簡單,易學。擁有強大的標准庫及第三方庫。本示例程序實現了Python算法與PIESDK集成功能,使得在PIE中也可以調用Python寫的算法(以Python圖像裁剪算法為例,使用了ArcGIS的arcpy庫)。
2. 功能實現說明
2.1. Python算法
2.2. 實現思路及原理說明
Python寫的算法是一個*.py文件,我們可以通過直接給Main函數傳參來調用,也可以使用IronPython庫使Python與C#結合,達到直接調用Python函數的目的。本示例實現方法主要使用第一種(第二種方法IronPython庫,直接添加引用即可,詳見示例程序)。
Python算法往往使用了很多第三方庫,在調用時需要先把三方庫的路徑添加到sys.path中,需要注意的是,若使用IronPython,有些非Python語言寫的文件如(*.pyd)無法被識別,import時會報錯(如本示例第二種方法,arcgisscripting.pyd加載報錯),這時只能使用Main函數方法。
方法一:通過Main傳參
第一步 |
New一個進程對象 |
第二步 |
設置進程執行程序為python.exe |
第三步 |
構造參數,將算法文件(.py)和算法參數一並傳入,以空格間隔。 |
第四步 |
啟動進程 |
方法二:使用IronPython
第一步 |
創建腳本引擎對象ScriptEngine |
第二步 |
添加python搜索路徑(若需要) |
第三步 |
創建scope並導入python腳本文件 |
第四步 |
構造算法需要的參數 |
第五步 |
執行算法 |
2.3 核心接口與方法
接口/類 |
方法 |
說明 |
ScriptEngine |
CreateScriptSourceFromFile |
導入Python腳本 |
ScriptScope |
GetVariable () |
獲取腳本中的方法 |
ScriptEngine |
SetSearchPaths() |
設置python搜索路徑 |
2.4. 示例代碼
項目路徑 |
百度雲盤地址下/PIE示例程序/14.SDK拓展開發/ 03PIESDK與Python結合/ BlendWithPython |
數據路徑 |
百度雲盤地址下/PIE示例數據/柵格數據/ |
示例代碼 |
|
![]() 1 /// Python圖像裁剪 2 /// </summary> 3 /// <param name="sender"></param> 4 /// <param name="e"></param> 5 private void ImgClip_ToolStripMenuItem_Click (object sender, EventArgs e) 6 { 7 ImageClipForm form = new ImageClipForm(); 8 if (form.ShowDialog() != DialogResult.OK) return; 9 //啟動一個進程 10 System.Diagnostics.Process p = new System.Diagnostics.Process(); 11 p.Exited += p_Exited; 12 p.StartInfo.UseShellExecute = false; 13 p.StartInfo.RedirectStandardOutput = true;//重定向輸出 14 p.StartInfo.RedirectStandardError = true; 15 //啟動python.exe 16 p.StartInfo.FileName = System.IO.Path.Combine(Application.StartupPath, 17 "../../../../../Python/python.exe"); 18 p.StartInfo.CreateNoWindow = true; 19 20 /*-------------*/ 21 //此算法依賴ArcGIS,需先安裝ArcGIS 22 /*-------------*/ 23 p.StartInfo.Arguments = System.IO.Path.Combine(Application.StartupPath , "test.py") +" "+ form.InputFileName + " " + form.ExtentFileName + " " + form.OutputFileName; ;//參數以空格分隔,如果某個參數為空,可以傳入”” 24 p.EnableRaisingEvents = true; 25 p.Start(); 26 } 27 28 //***********************************// 29 // 此方法不需要python.exe,只需要 30 // 引用IronPython庫,相對上面方法更方便。 31 // 但是某些情況下import時找不到moudle(如*.pyd) 32 //**********************************// 33 private void ImgClip_ToolStripMenuItem_Click2(object sender, EventArgs e) 34 { 35 //裁剪窗體 36 FormImageClip form = new FormImageClip(); 37 if (form.ShowDialog() != DialogResult.OK) return; 38 39 //(方法1)創建腳本運行時 40 //ScriptRuntime pyRuntime = Python.CreateRuntime(); 41 //if (pyRuntime == null) return; 42 //dynamic py = pyRuntime.UseFile(System.IO.Path.Combine( Application.StartupPath , "test.py")); 43 //object a = py.ImageClip(input,ext,output);//ImageClip()為腳本中的一個函數 44 45 //(方法2)創建腳本引擎 46 ScriptEngine pyEngine = Python.CreateEngine(); 47 pyEngine.Runtime.IO.RedirectToConsole();//重定向 48 49 //添加搜索路徑 50 var paths = pyEngine.GetSearchPaths(); 51 paths.Add(@"D:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy"); 52 paths.Add(@"D:\Program Files (x86)\ArcGIS\Desktop10.2\bin"); 53 pyEngine.SetSearchPaths(paths); 54 55 //創建一個scope 56 var scope = pyEngine.CreateScope(); 57 //從文件創建腳本源碼 58 var source = pyEngine.CreateScriptSourceFromFile( 59 System.IO.Path.Combine(Application.StartupPath, "test.py")); 60 //執行代碼 61 source.Execute(scope); 62 63 //獲得代碼中的函數 64 var ImageClip = scope.GetVariable<Func<object, object, object, object>>("ImageClip"); 65 //調用ImageClip函數 66 object a = ImageClip(form.InputFileName, form.ExtentFileName, 67 form.OutputFileName); 68 MessageBox.Show(a.ToString()); 69 } |