• 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)ArcGISDesktop10.2arcpy");
    52             paths.Add(@"D:Program Files (x86)ArcGISDesktop10.2in");
    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
  • 相关阅读:
    twisted 初体验
    移动互联网实战--wifi定位和架构
    SpringCloud之Eureka集群
    com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
    SpringCloud服务注册与服务发现之Eureka
    SpringCloud简介
    Java实时监控类库Metrics
    InfluxDB Java入门
    InfluxDB配置文件详解
    InfluxDB概念和基本操作
  • 原文地址:https://www.cnblogs.com/PIESat/p/10244229.html
Copyright © 2020-2023  润新知