1.算法功能简介

算法的自定义扩展允许用户自主开发新的算法。自定义的算法必须实现PIE.SystemAlgo.BaseSystemAlgo基础类,这样才能被PIE的算法管理器调用起来。

2.算法功能实现说明

2.1. 示例简介

本算法用于实现栅格影像的拷贝。参数类“AlgoParams.cs”用于存放要拷贝的路径和拷贝到的路径,算法类“Algo.cs”用于执行算法,窗体类“FormTest.cs”用于接收用户输入的要拷贝的路径和拷贝到的路径,Command类“AlgoCommand.cs”用于实现算法调用。

算法类“Algo.cs”继承自BaseSystemAlgo,该类实现了ISystemAlgo, ISystemAlgoEvents两个接口。以下对BaseSystemAlgo类的属性,方法和事件进行介绍:

属性介绍

Description

String

描述

Name

String

名称

Params

String

参数

方法介绍

Execute()

Bool

执行算法,返回结果:是否执行成功

GetErrorInfo(ref int errCode, ref string errMsg)

Void

获取错误信息,参数: errCode:错误信息编号,errMsg:错误信息描述

事件介绍

OnExecuteCompleted

OnExecuteCompletedEventHandler

执行完成事件

OnProgressChanged

OnProgressChangedEventHandler

进度变化事件

2.2. 实现步骤

第一步

编写参数类“AlgoParams.cs”

第二步

构造算法类“Algo.cs”

第三步

新建窗体类“FormTest.cs”

第四步

写Command类实现算法调用

2.3. 示例代码

项目路径

百度云盘地址下/PIE示例程序/10.算法调用/算法的调用方式/Algo.AlgoTest

数据路径

百度云盘地址下/PIE示例数据/栅格数据/04.World/ World.tif

视频路径

百度云盘地址下/PIE视频教程/10.算法调用/算法的调用方式/算法的自定义扩展.avi

示例代码

         //(一)编写参数类“AlgoParams.cs”
public class AlgoParams
{
/// <summary>
/// 要拷贝的路径
/// </summary>
public string OpenFilePath; /// <summary>
/// 拷贝到的路径
/// </summary>
public string SaveFilePath;
}
//(二)构造算法类“Algo.cs”
public class Algo : PIE.SystemAlgo.BaseSystemAlgo
{
/// <summary>
/// 构造函数
/// </summary>
public Algo()
{ } /// <summary>
/// 执行算法
/// </summary>
/// <returns>是否执行成功</returns>
public override bool Execute()
{
AlgoParams m_AlgoParams = (AlgoParams)this.Params;
if (string.IsNullOrEmpty(m_AlgoParams.OpenFilePath) || string.IsNullOrEmpty(m_AlgoParams.SaveFilePath)) return false;
File.Copy(m_AlgoParams.OpenFilePath, m_AlgoParams.SaveFilePath, true);
return true;
}
}
//(三)新建窗体类“FormTest.cs”
public partial class FormTest : Form
{
/// <summary>
/// 算法参数
/// </summary>
private AlgoTest.AlgoParams m_Parm = new AlgoParams(); /// <summary>
/// 构造函数
/// </summary>
public FormTest()
{
InitializeComponent();
} /// <summary>
/// 算法参数
/// </summary>
public AlgoParams Params
{
get { return m_Parm; }
set { this.m_Parm = value; }
} private void buttonEdit_save_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
{
SaveFileDialog save = new SaveFileDialog();
save.Title = "另存为";
save.Filter = "Raster Files|*.tif";
save.FileName = "";
if (save.ShowDialog() == DialogResult.OK)
{
this.buttonEdit_save.Text = save.FileName;
}
} private void simpleButton_ok_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(this.buttonEdit_tif.Text) || string.IsNullOrEmpty(this.buttonEdit_save.Text))
{
MessageBox.Show("请输入路径!");
return;
}
m_Parm.OpenFilePath = this.buttonEdit_tif.Text;
m_Parm.SaveFilePath = this.buttonEdit_save.Text;
this.DialogResult = DialogResult.OK;
} private void simpleButton_cancel_Click(object sender, EventArgs e)
{
this.Close();
} private void buttonEdit_tif_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
{
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Raster Files|*.tif";
open.Title = "选择栅格文件";
open.Multiselect = false;
if (open.ShowDialog() != DialogResult.OK) return;
string filePath = open.FileName; IRasterDataset dataSet = DatasetFactory.OpenRasterDataset(filePath, OpenMode.ReadOnly);
if (dataSet == null)
{
MessageBox.Show("文件打开失败!");
return;
}
if (!dataSet.Open(filePath, OpenMode.ReadOnly))
{
MessageBox.Show("文件打开失败!");
return;
}
this.buttonEdit_tif.Text = filePath;
}
}
//(四)写Command类实现算法调用
public class AlgoCommand: DesktopCommand
{
/// <summary>
/// 构造函数
/// </summary>
public AlgoCommand()
{
this.Caption = "测试算法";
this.Name = "AlgoCommand";
this.ToolTip = "测试算法";
this.Checked = false;
this.Enabled = false;
} /// <summary>
/// 单击方法
/// </summary>
public override void OnClick()
{
#region 1、参数设置
if (!this.Enabled) return;
FormTest frmTest = new FormTest();
if (frmTest.ShowDialog() != System.Windows.Forms.DialogResult.OK) return; AlgoParams info = frmTest.Params;
PIE.SystemAlgo.ISystemAlgo algo = PIE.SystemAlgo.AlgoFactory.Instance().CreateAlgo("AlgoTest.dll", "AlgoTest.Algo");
if (algo == null) return; PIE.SystemAlgo.ISystemAlgoEvents algoEvents = algo as PIE.SystemAlgo.ISystemAlgoEvents;
algo.Name = "测试算法";
algo.Params = info;
algoEvents.OnExecuteCompleted += OnAlgoExcuteCompleted;
algoEvents.OnProgressChanged += OnAlgoProgressChanged;
#endregion //2、算法执行
PIE.AxControls.IStatusBar statusBar = m_Application.StatusBar;
statusBar.ShowProgress(, , "");
PIE.SystemAlgo.AlgoFactory.Instance().AsynExecuteAlgo(algo);
} /// <summary>
/// 算法执行完成事件
/// </summary>
/// <param name="algo">算法</param>
private void OnAlgoExcuteCompleted(PIE.SystemAlgo.ISystemAlgo algo)
{
PIE.AxControls.IStatusBar statusBar = m_Application.StatusBar;
statusBar.UpdateProgress(, "");
statusBar.HideProgress(); //3、结果显示
AlgoParams info = (AlgoParams)algo.Params;
PIE.Carto.ILayer layer = PIE.Carto.LayerFactory.CreateDefaultLayer(info.SaveFilePath);
m_HookHelper.FocusMap.AddLayer(layer);
m_HookHelper.ActiveView.PartialRefresh(PIE.Carto.ViewDrawPhaseType.ViewAll); PIE.SystemAlgo.ISystemAlgoEvents algoEvents = algo as PIE.SystemAlgo.ISystemAlgoEvents;
algoEvents.OnExecuteCompleted -= OnAlgoExcuteCompleted;
algoEvents.OnProgressChanged -= OnAlgoProgressChanged;
} /// <summary>
/// 算法进度变化事件
/// </summary>
/// <param name="complete">进度</param>
/// <param name="msg">进度信息</param>
/// <param name="algo">算法</param>
/// <returns>int</returns>
private int OnAlgoProgressChanged(double complete, string msg, PIE.SystemAlgo.ISystemAlgo algo)
{
PIE.AxControls.IStatusBar statusBar = m_Application.StatusBar;
statusBar.UpdateProgress((int)complete, msg);
return ;
}
}

2.4. 示例截图

PIE SDK算法的自定义扩展的更多相关文章

  1. PIE SDK算法的同步调用

    1.    算法功能简介 同步调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为. PIE SDK支持算法功能的执行,下面对算法的同步调用功能进行介绍. 2.    算法功能实现说明 2. ...

  2. PIE SDK算法的异步调用

    1.算法功能简介 异步方法一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作.异步方法通常会在另外一个线程中,“真实”地执行着.整个过程,不会阻碍调用者的工作. PIE SDK支持算法功能的执 ...

  3. PIE SDK加载自定义服务数据

    1.功能简介 自定义服务数据,将符合要求的矢量数据和栅格数据集等数据以服务的方式发布,将数据存储在某服务器中,在有网络的情况下可以根据URL就可以访问,比较常见的服务数据类型的有ArcGIS Serv ...

  4. PIE SDK 文章目录索引

    1.PIE SDK介绍 1.1.  PIE软件介绍 1.2.  PIE SDK介绍 1.3.  PIE支持项目介绍 1.4.  PIE.NET-SDK插件式二次开发介绍 1.5.  PIE.NET-S ...

  5. PIE SDK 监督分类对话框类(SupervisedClassificaitonDialog)使用经验

    最近研究遥感,用到分类算法,PIE SDK正好提供了一些方法可供调用,他们的官方博客上也有相应的示例代码(可参考:https://www.cnblogs.com/PIESat/p/10725270.h ...

  6. PIE SDK矢量自定义渲染

    1. 功能简介 PIE SDK中关于矢量渲染提供了多种方案,包括简单渲染.分级渲染.唯一值渲染,这几种渲染方式具有一定的通用性,可以满足用户绝大多数的需求. 当面对复杂的业务,当前渲染方案无法满足用户 ...

  7. PIE SDK自定义滤波

    1.算法功能简介 自定义滤波可以自由设置滤波模板,对数据进行处理,自定义滤波器的一般规则要求: ( 1) 滤波器的大小应该是奇数,这样它才有一个中心,例如 3x3, 5x5 或者 7x7.有中心了,也 ...

  8. PIE SDK Command、Tool、Control的调用和拓展

    1.功能简介 在一个项目中,是通过小组成员共同开发的,难以避免的是当项目功能集成的时候会出现很多兼容性问题,开发讲究高内聚低耦合,利用Command.Tool和Control的使用,可以提升集成的效率 ...

  9. PIE SDK与Matlab结合说明文档

    1.功能简介 Matlab是三大数学软件之一,它在数学类科技应用软件中在数值计算方面首屈一指.Matlab可以进行矩阵运算.绘制函数和数据.实现算法.创建用户界面.连接其他编程语言的程序等,主要应用于 ...

随机推荐

  1. 一、office web apps 部署

    原文出处:http://www.cnblogs.com/yanweidie/p/4516164.html 原文出处:https://www.cnblogs.com/poissonnotes/p/323 ...

  2. Java IO输入输出流 字符数组流 ByteArrayOutputStream/ByteArrayInputStream

    private static void StringWriterAndReader() throws Exception { //字符串流(字符串的内存流) //字符串输入流 StringWriter ...

  3. css属性position的运用

    随着web标准的规范化,网页的布局也随之千变万化.各种复杂漂亮有创意的页面布局冲 击这人们的视野,相比以前的table布局那就不是一等级的事儿.这个很大一部分功劳是css 样式的引入.而这个多样性布局 ...

  4. 编写高质量代码改善C#程序的157个建议——建议16:元素数量可变的情况下不应使用数组

    建议16:元素数量可变的情况下不应使用数组 在C#中,数组一旦被创建,长度就不能改变.如果我们需要一个动态且可变长度的集合,就应该使用ArrayList或List<T>来创建. 而数组本身 ...

  5. 解决chrome浏览器无法得到window.showModalDialog返回值的问题

    父页面处理: function ProductList() {   var TypeID = window.document.getElementById("Type").valu ...

  6. 积分之谜——第六届蓝桥杯C语言B组(国赛)第一题

    原创 标题:积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C. 为了促销,每件商品都会返固定的积分. 小明开业第一天收到了三笔订单: 第一笔:3个A + 7个B + 1个C,共返积分:3 ...

  7. TypedValue.applyDimension的使用

    TypedValue.applyDimension是一个将各种单位的值转换为像素的方法 用法TypedValue.applyDimension(int unit, float value,Displa ...

  8. JMeter的使用——ApacheJMeterTemporaryRootCA.crt的用法

    在使用JMeter的时候,启动HTTP代理服务器弹出的那个提示框一直不知道是什么意思,刚刚弄明白了,在JMeter2.1之后,通过JMeter的代理服务器来访问https安全连接的网页的时候,浏览器会 ...

  9. The server of Apache (一)——apache服务的基本安装过程

    一.为了避免端口冲突,需要卸载linux系统中以RPM方式安装的httpd ~] # rpm -qa | grep httpd ~] # rpm -e httpd --nodeps (此处nodeps ...

  10. ThinkPHP U方法

    方法1: {:U('User/Booking/bookingdetails')} 方法2: {:U('User/Booking/bookingdetails')}"+"&a ...