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可以进行矩阵运算.绘制函数和数据.实现算法.创建用户界面.连接其他编程语言的程序等,主要应用于 ...
随机推荐
- Python基础-3
目录 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 知识插入:嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 一.函数基本语法 函数是什么? 函数一词 ...
- Zynq 在Ubuntu上搭建编译环境
http://bbs.elecfans.com/jishu_487981_1_1.html 以下操作均在root用户下完成1,下载交叉编译器在ubuntu里下载arm-2010.09-62-arm-x ...
- Socket编程(c语言示例)
转自:http://blog.csdn.net/dxpqxb/article/details/8166423 前言 Socket可以看成在两个程序进行通讯连接中的一个端点,是连接应用程序和网络驱动程序 ...
- python -Tkinter 实现一个小计算器功能
文章来源:http://www.cnblogs.com/Skyyj/p/6618739.html 本代码是基于python 2.7的 如果是对于python3.X 则需要将 tkinter 改为Tk ...
- 选择性的使用 serialize() 进行序列化
serialize 非常方便的帮我们创建 URL 编码文本字符串 输出的字符串格式为 a=1&b=2&c=3 直接可用于Url传参 下面介绍一下选择性的序列化某些标签的使用方法 将 ...
- go-spew golang最强大的调试助手,没有之一
go内置的fmt.sprintf已经很强大了,但是和spew比起来还是相形见绌,这里来一个例子. import ( "fmt" "github.com/davecgh/g ...
- ajaxfileupload 跨域 (二级域名) 可行办法
ajaxfileupload 跨二级域名 如 aa.fei.com 到 bb.fei.com 是可行的. 1.首先在html页面 ajaxfileupload上方加入 document.domain= ...
- 第二篇 Python运算符
1.算术运算符 运算符 描述 + 两个值相加 - 两个值相减 * 两个值相乘 / 两个值相除 % 得到两个数相除的余数 ** x**y得到x的y次幂 // 返回两个数相除商 ...
- flink学习笔记-数据源(DataSource)
说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...
- C# 注册Dll文件
有时会遇到dll在系统中不存在,需要程序自己去注册所需的dll文件. 注册dll 需要用到regsvr32命令,其用法为:"regsvr32 [/s] [/n] [/u] [/i[:cmdl ...