PIE SDK与Python结合说明文档

 

1.功能简介

   Python是一种跨平台语言。不管是在Windows、Linux、Unix仍是Mac Os系统,咱们均可以使用Python。甚至在Linux、Unix及Mac OS系统内已经集成了Python。语法简洁优美, 简单,易学。拥有强大的标准库及第三方库。本示例程序实现了Python算法与PIESDK集成功能,使得在PIE中也能够调用Python写的算法(以Python图像裁剪算法为例,使用了ArcGIS的arcpy库)。python

2. 功能实现说明

2.1. Python算法

2.2. 实现思路及原理说明

       Python写的算法是一个*.py文件,咱们能够经过直接给Main函数传参来调用,也能够使用IronPython库使Python与C#结合,达到直接调用Python函数的目的。本示例实现方法主要使用第一种(第二种方法IronPython库,直接添加引用便可,详见示例程序)。算法

      Python算法每每使用了不少第三方库,在调用时须要先把三方库的路径添加到sys.path中,须要注意的是,若使用IronPython,有些非Python语言写的文件如(*.pyd)没法被识别,import时会报错(如本示例第二种方法,arcgisscripting.pyd加载报错),这时只能使用Main函数方法。ide

方法一:经过Main传参函数

第一步spa

New一个进程对象code

第二步orm

设置进程执行程序为python.exe视频

第三步对象

构造参数,将算法文件(.py)和算法参数一并传入,以空格间隔。blog

第四步

启动进程

 

方法二:使用IronPython

第一步

建立脚本引擎对象ScriptEngine

第二步

添加python搜索路径(若须要)

第三步

建立scope并导入python脚本文件

第四步

构造算法须要的参数

第五步

执行算法

 

2.3 核心接口与方法

接口/类

方法

说明

ScriptEngine

CreateScriptSourceFromFile

导入Python脚本

ScriptScope

GetVariable ()

获取脚本中的方法

ScriptEngine

SetSearchPaths()

设置python搜索路径

 

2.4. 示例代码

项目路径

百度云盘地址下/PIE示例程序/14.SDK拓展开发/ 03PIESDK与Python结合/ BlendWithPython

数据路径

百度云盘地址下/PIE示例数据/栅格数据/

视频路径

百度云盘地址下/PIE视频教程/14.SDK拓展开发/ 03PIESDK与Python结合.avi

示例代码

 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
相关文章
相关标签/搜索