PIE SDK與Python結合說明文檔


 

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 }
View Code

 


免責聲明!

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



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