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可以进行矩阵运算.绘制函数和数据.实现算法.创建用户界面.连接其他编程语言的程序等,主要应用于 ...
随机推荐
- 使用EasyUI,关于日期格式的文本框按照正常方式获取不到值的问题
这是个小菜在实际工作中遇到的问题,相信很多EasyUI新手很可能也遇到这样的问题,因此小菜觉得有必要拿出来分享一下. 这个问题要从EasyUI的datebox组件说起,小菜用这个组件的时候,发现用$( ...
- WCF把书读薄(4)——事务编程与可靠会话
WCF把书读薄(3)——数据契约.消息契约与错误契约 真不愧是老A的书,例子多,而且也讲了不少原理方面的内容,不过越读越觉得压力山大……这次来稍微整理整理事务和可靠会话的内容. 十八.事务编程 WCF ...
- LightOJ 1284 Lights inside 3D Grid (数学期望)
题意:在一个三维的空间,每个点都有一盏灯,开始全是关的.现在每次随机选两个点,把两个点之间的全部点,开关都按一遍,问k次过后开着的灯的期望数量: 析:很容易知道,如果一盏灯被按了奇数次,那么它肯定是开 ...
- QT开发环境
代码实现界面和槽 代码实现界面和槽 在上述工程的dialog.h中添加如下加黑代码: 加入头文件: #include <QLabel> #include <QLineEdit> ...
- Xcode更新至IOS 9 后错误处理
1.obtain an updated library from the vendor, or disable bitcode for this target. for architecture ar ...
- C#中如何向数组中动态添加元素
转自:https://blog.csdn.net/qq_35938548/article/details/78325558 背景:现需要向数组中循环插入字符串,但C#中的数组是不支持动态添加元素的,只 ...
- C#构造函数用法
1.实例构造函数 2.静态构造函数 3.私有构造函数 例: 创建一个类 using System; using System.Collections.Generic; using System.Lin ...
- WebStrom背景色设置
Ctrl Alt S快速打开setting:
- VIN-Fusion config with Realsense D435i
### First shot Copy the .launch file in package VINS-Fusion to the directory of realsense2_cameara/l ...
- 在libuv中使用openssl建立ssl连接
在libuv中使用openssl建立ssl连接 @(blogs) 使用openssl进行加密通信时,通常是先建立socket连接,然后使用SSL_XXX系列函数在普通socket之上建立安全连接,然后 ...