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支持算法功能的执行,下面对算法的同步调用功能进行介绍. 2. 算法功能实现说明 2. ...
- PIE SDK算法的异步调用
1.算法功能简介 异步方法一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作.异步方法通常会在另外一个线程中,“真实”地执行着.整个过程,不会阻碍调用者的工作. PIE SDK支持算法功能的执 ...
- PIE SDK加载自定义服务数据
1.功能简介 自定义服务数据,将符合要求的矢量数据和栅格数据集等数据以服务的方式发布,将数据存储在某服务器中,在有网络的情况下可以根据URL就可以访问,比较常见的服务数据类型的有ArcGIS Serv ...
- 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 ...
- PIE SDK 监督分类对话框类(SupervisedClassificaitonDialog)使用经验
最近研究遥感,用到分类算法,PIE SDK正好提供了一些方法可供调用,他们的官方博客上也有相应的示例代码(可参考:https://www.cnblogs.com/PIESat/p/10725270.h ...
- PIE SDK矢量自定义渲染
1. 功能简介 PIE SDK中关于矢量渲染提供了多种方案,包括简单渲染.分级渲染.唯一值渲染,这几种渲染方式具有一定的通用性,可以满足用户绝大多数的需求. 当面对复杂的业务,当前渲染方案无法满足用户 ...
- PIE SDK自定义滤波
1.算法功能简介 自定义滤波可以自由设置滤波模板,对数据进行处理,自定义滤波器的一般规则要求: ( 1) 滤波器的大小应该是奇数,这样它才有一个中心,例如 3x3, 5x5 或者 7x7.有中心了,也 ...
- PIE SDK Command、Tool、Control的调用和拓展
1.功能简介 在一个项目中,是通过小组成员共同开发的,难以避免的是当项目功能集成的时候会出现很多兼容性问题,开发讲究高内聚低耦合,利用Command.Tool和Control的使用,可以提升集成的效率 ...
- PIE SDK与Matlab结合说明文档
1.功能简介 Matlab是三大数学软件之一,它在数学类科技应用软件中在数值计算方面首屈一指.Matlab可以进行矩阵运算.绘制函数和数据.实现算法.创建用户界面.连接其他编程语言的程序等,主要应用于 ...
随机推荐
- 详解servlet的url-pattern匹配规则.RP
首先需要明确几容易混淆的规则: servlet容器中的匹配规则既不是简单的通配,也不是正则表达式,而是特定的规则.所以不要用通配符或者正则表达式的匹配规则来看待servlet的url-pattern. ...
- .NET读取服务器或本地文件
//把本地文件信息读入数据流中 FileStream stream = new FileStream(path, FileMode.Open, FileAcces ...
- win7,64bit下的OpenGL着色语言(glsl)开发环境配置(原)
一.环境准备: 系统环境win7,64位,双显卡:集成显卡+gt540m,gt540建议下载最新的驱动,可以支持到opengl4.3标准,一般双显的笔记本,程序默认启用的是集显,我机器的集显驱动有点老 ...
- ComicEnhancerPro 系列教程二十:用“文件比较”看有损、无损
作者:马健邮箱:stronghorse_mj@hotmail.com 主页:http://www.comicer.com/stronghorse/ 发布:2017.07.23 教程二十:用“文件比较” ...
- (一)用C或C ++扩展(翻译)
用C或C ++扩展 如果你知道如何用C语言编程,那么为Python添加新的内置模块是很容易的.这种扩展模块可以做两件不能直接在Python中完成的事情:它们可以实现新的内置对象类型,以及调用C库函数和 ...
- 第五篇 Python内置函数
内置函数 abs() delattr() hash() memoryview() set() all() dict() help() min() setattr() any() dir() ...
- JavaScript随机数组(数组、随机、取整、取值的过程)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...
- selenium面试题
selenium中如何判断元素是否存在? selenium中没有提供原生的方法判断元素是否存在,一般我们可以通过定位元素+异常捕获的方式判断. # 判断元素是否存在 try: dr.find_elem ...
- 【ARC074F】Lotus Leaves 最小割
Description 给你一个n*m网格图,有起点荷叶和终点荷叶,有中转荷叶,其他的格子没东西,一个荷叶可以跳到同一行或者列的另一个荷叶.问最多删掉几个中转荷叶能让起点终点不连通.如果不行输出-1. ...
- Calendar时间类的一些用法
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR.MONTH.DAY_OF_MONTH.HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了 ...