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可以进行矩阵运算.绘制函数和数据.实现算法.创建用户界面.连接其他编程语言的程序等,主要应用于 ...
随机推荐
- SpringMVC——RequestMapping
一.@RequestMapping 映射请求 Spring MVC 通过@RequestMapping注解可以定义不同的处理器映射规则. @RequestMapping放在类名上边,设置请求前缀 方法 ...
- 使用Sqlserver事务发布实现数据同步(转)
出处:http://www.cnblogs.com/daizhj/archive/2009/11/18/1605293.html 事务的功能在sqlserver中由来已久,因为最近在做一个数据同步方案 ...
- [GO]数组做函数参数
package main import "fmt" //数组为函数参数,实际上是值传递//实参数据里的每个元素,给形参数组拷贝一份//这里形参的数组其实就是实参的复制品 func ...
- URAL 1748. The Most Complex Number(反素数)
题目链接 题意 :给你一个n,让你找出小于等于n的数中因子个数最多的那个数,并且输出因子个数,如果有多个答案,输出数最小的那个 思路 : 官方题解 : (1)此题最容易想到的是穷举,但是肯定超时. ( ...
- ajax 跨域名调用
在ajax 中要跨域名 请求的时候要注意 1. dataType: 'jsonp', 2. jsonp: 'callback', <script type="text/javascri ...
- GitHub小技巧-定义项目语言
GitHub是根据项目里文件数目最多的文件类型,识别项目类型.后端项目难免会包含前端的资源,有时候就会被标记成前端语言,因为项目里 css 等文件比较多, 被误识别成css项目. GitHub不提供指 ...
- javascript js函数重名后面的覆盖前面的
js 函数重名后面的覆盖前面的 var x = 1; var y = 0; var z = 0; function add(n) { return n = n + 1; } ...
- 1221: Fibonacci数列 [数学]
1221: Fibonacci数列 [数学] 时间限制: 1 Sec 内存限制: 128 MB 提交: 116 解决: 36 统计 题目描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn- ...
- windows如何通过端口查看对应程序
今天打开SSR报错,说端口被占用. 打开的软件有点多,又不想重启.就需要找到占用的软件,关闭了即可. 打开cmd,输入netstat -aon能看到所有的使用端口 其中1080端口是预留给SSR使用的 ...
- 5. 常见C语言字符串库函数的使用及实现
1. strncat 函数: [函数原型]#include <string.h> char *strncat( char *str1, const char *str2, size_t c ...