ArcGIS Server 开发系列(六)--自定义 Tasks
作者:Flyingis
本文严禁擅自转载或用于商业目的,如有需要请事先联系作者:dev.vip#gmail.com
Tasks由一组相互关联的组件、动作组成,并可以展现最后的结果,如QueryAttributeTask执行空间数据属性查询,结果返回到Results控件中,开发中我们既可以使用.Net Web ADF已有的Tasks控件,也可以自定义Tasks,构建一些通用的GIS功能。使用已有的Tasks控件比较容易,所有的Tasks均有TaskManager管理,编辑TaskManager可以找到当前应用中所有的Tasks,因此,一个基本页面中只需包含TaskManager、TaskResults、及一个或多个Task控件就可以实现Task功能。而实际开发中,我们更多需要的是自定义各种Task,包括功能、外观,现在我们就一起来设计一个custom task。
动工之前,先来一图——Task Runtime Workflow,描述了整个Task的工作机制。
目标:
自定义一个功能,对指定的图层进行属性查询,返回查询的地图信息,将该功能封装成一个Task,添加到TaskManager中。
准备工作:
1.熟悉Web ADF Task已有控件的使用
2.了解Task Runtime Workflow
3.了解ESRI.ArcGIS.ADF.Web.UI.WebControls.ITask接口
4.了解ASP.Net 2.0 Callback framework
5.更改MapResourceManager属性,添加一个Resource:MapResourceItem0,类型是ArcGIS Server Internet
开发分为两部分,一是功能实现,二是封装Task,发布整个Web应用。
首先,创建一个ClassLibrary模板的工程DefQuery,生成的DefQuery类实现抽象类FloatingPanelTask,后者继承了FloatingPanel,实现了ITask接口,因此DefQuery必须实现FloatingPanelTask中的抽象方法。编码过程需要根据Task的运行流程进行。
1.事件触发Task
事件触发有多种方式,例如点击button、textbox回车等等,事件触发后需要调用display_task.js里的executeTask函数,通常我们这样写:
里面包含两部分,一是传入的参数,一是WebForm_DoCallback,后者可以去看ASP.Net2.0异步调用相关资料。executeTask函数在display_task.js中,它完成两件事情,分配一个job id来跟踪异步请求,和初始化一个回调并触发TaskResults控件中的指示器(指示Task程序正在运行中)。
2.调用startJob函数
startJob提供了一系列的参数,通过键值对方式传送用户请求:
然后通过参数_callbackArg传入RaiseCallbackEvent方法。
3.服务器端处理
客户端的请求传入服务器端在GetCallbackResult方法中进行处理,这里分为两个步骤,一是startTaskActivityIndicator,它会在TaskResults控件中指示Task任务正在执行,二是executeTask,即处理真正的核心业务:
参数为"executeTask"时,会执行ExecuteTask重写方法,里面可以处理业务逻辑,将结果保存为一种Results,可以是SimpleTaskResult、DataSet或TaskResultNode。
4.DisplayResults显示结果
Task处理完之后,最终会交给DisplayResults将结果显示出来,看看DisplayResults代码:
5.processCallbackResult
最后所有回调的结果均返回到回调响应函数——processCallbackResult,它专门处理客户端Web ADF控件的回调响应,并触发一系列后续动作,更新客户端显示,这样整个Task就执行完成了。
Build整个工程,生成DefQuery的DLL文件,用模板新建一个ArcGIS Server应用,展开工具栏右键空白处,选择之前生成的dll,此时就可以像QueryAttributeTask等原有的Task一样来使用DefQuery了,添加到TaskManager中,发布整个Web应用,这样自定义的Task就完成了,可以看看效果,下图做了一个简单的查询Task,根据用户写的属性查询条件,在地图上返回所查询的地图。
Task查询之前
Task查询之后
进一步完善应用:
1.以上自定义Task的UI基于FloatingPanel,我们可以更改它的现实样式,比如透明度、颜色、布局等等。
2.可以将显示出来的结果存为一个Graphic图层,保留原始图层。
3.根据属性查空间信息,考虑查询到结果时,同时将Map定位到结果所在的窗口范围。
本文严禁擅自转载或用于商业目的,如有需要请事先联系作者:dev.vip#gmail.com
Tasks由一组相互关联的组件、动作组成,并可以展现最后的结果,如QueryAttributeTask执行空间数据属性查询,结果返回到Results控件中,开发中我们既可以使用.Net Web ADF已有的Tasks控件,也可以自定义Tasks,构建一些通用的GIS功能。使用已有的Tasks控件比较容易,所有的Tasks均有TaskManager管理,编辑TaskManager可以找到当前应用中所有的Tasks,因此,一个基本页面中只需包含TaskManager、TaskResults、及一个或多个Task控件就可以实现Task功能。而实际开发中,我们更多需要的是自定义各种Task,包括功能、外观,现在我们就一起来设计一个custom task。
动工之前,先来一图——Task Runtime Workflow,描述了整个Task的工作机制。
目标:
自定义一个功能,对指定的图层进行属性查询,返回查询的地图信息,将该功能封装成一个Task,添加到TaskManager中。
准备工作:
1.熟悉Web ADF Task已有控件的使用
2.了解Task Runtime Workflow
3.了解ESRI.ArcGIS.ADF.Web.UI.WebControls.ITask接口
4.了解ASP.Net 2.0 Callback framework
5.更改MapResourceManager属性,添加一个Resource:MapResourceItem0,类型是ArcGIS Server Internet
开发分为两部分,一是功能实现,二是封装Task,发布整个Web应用。
首先,创建一个ClassLibrary模板的工程DefQuery,生成的DefQuery类实现抽象类FloatingPanelTask,后者继承了FloatingPanel,实现了ITask接口,因此DefQuery必须实现FloatingPanelTask中的抽象方法。编码过程需要根据Task的运行流程进行。
1.事件触发Task
事件触发有多种方式,例如点击button、textbox回车等等,事件触发后需要调用display_task.js里的executeTask函数,通常我们这样写:
executeTask('args=' + document.getElementById('TaskManager1_DefQuery1_sellayer').value + ':' + document.getElementById('TaskManager1_DefQuery1_textBox').value,
"WebForm_DoCallback('TaskManager1$DefQuery1',argument,processCallbackResult,context,postBackError,true)");
"WebForm_DoCallback('TaskManager1$DefQuery1',argument,processCallbackResult,context,postBackError,true)");
里面包含两部分,一是传入的参数,一是WebForm_DoCallback,后者可以去看ASP.Net2.0异步调用相关资料。executeTask函数在display_task.js中,它完成两件事情,分配一个job id来跟踪异步请求,和初始化一个回调并触发TaskResults控件中的指示器(指示Task程序正在运行中)。
2.调用startJob函数
startJob提供了一系列的参数,通过键值对方式传送用户请求:
EventArg=startTaskActivityIndicator&taskJobID=1&args=0:TYPE='St'
然后通过参数_callbackArg传入RaiseCallbackEvent方法。
3.服务器端处理
客户端的请求传入服务器端在GetCallbackResult方法中进行处理,这里分为两个步骤,一是startTaskActivityIndicator,它会在TaskResults控件中指示Task任务正在执行,二是executeTask,即处理真正的核心业务:
public override string GetCallbackResult()
{
NameValueCollection keyValColl = CallbackUtility.ParseStringIntoNameValueCollection(_callbackArg);
if (keyValColl["EventArg"] == "executeTask")
{
string sInArgs = keyValColl["args"];
string delim = ":";
char[] delchar = delim.ToCharArray();
string[] args = sInArgs.Split(delchar);
object[] inputs = new object[2];
inputs[0] = args[0];
inputs[1] = args[1];
Input = inputs;
}
else if (keyValColl["EventArg"] == "startTaskActivityIndicator")
{
}
else if (keyValColl["EventArg"] == "hidden")
{
}
return base.GetCallbackResult();
}
{
NameValueCollection keyValColl = CallbackUtility.ParseStringIntoNameValueCollection(_callbackArg);
if (keyValColl["EventArg"] == "executeTask")
{
string sInArgs = keyValColl["args"];
string delim = ":";
char[] delchar = delim.ToCharArray();
string[] args = sInArgs.Split(delchar);
object[] inputs = new object[2];
inputs[0] = args[0];
inputs[1] = args[1];
Input = inputs;
}
else if (keyValColl["EventArg"] == "startTaskActivityIndicator")
{
}
else if (keyValColl["EventArg"] == "hidden")
{
}
return base.GetCallbackResult();
}
参数为"executeTask"时,会执行ExecuteTask重写方法,里面可以处理业务逻辑,将结果保存为一种Results,可以是SimpleTaskResult、DataSet或TaskResultNode。
4.DisplayResults显示结果
Task处理完之后,最终会交给DisplayResults将结果显示出来,看看DisplayResults代码:
protected virtual void DisplayResults(string jobID, object taskInput, object taskResults)
{
ITaskResultsContainer resultsContainer = null;
for (int i = 0; i < TaskResultsContainers.Count; i++)
{
resultsContainer = Utility.FindControl(TaskResultsContainers[i].Name, Page) as ITaskResultsContainer;
if (resultsContainer != null)
{
resultsContainer.DisplayResults(this, jobID, taskInput, taskResults);
CallbackResults.CopyFrom(resultsContainer.CallbackResults);
}
}
}
{
ITaskResultsContainer resultsContainer = null;
for (int i = 0; i < TaskResultsContainers.Count; i++)
{
resultsContainer = Utility.FindControl(TaskResultsContainers[i].Name, Page) as ITaskResultsContainer;
if (resultsContainer != null)
{
resultsContainer.DisplayResults(this, jobID, taskInput, taskResults);
CallbackResults.CopyFrom(resultsContainer.CallbackResults);
}
}
}
5.processCallbackResult
最后所有回调的结果均返回到回调响应函数——processCallbackResult,它专门处理客户端Web ADF控件的回调响应,并触发一系列后续动作,更新客户端显示,这样整个Task就执行完成了。
Build整个工程,生成DefQuery的DLL文件,用模板新建一个ArcGIS Server应用,展开工具栏右键空白处,选择之前生成的dll,此时就可以像QueryAttributeTask等原有的Task一样来使用DefQuery了,添加到TaskManager中,发布整个Web应用,这样自定义的Task就完成了,可以看看效果,下图做了一个简单的查询Task,根据用户写的属性查询条件,在地图上返回所查询的地图。
Task查询之前
Task查询之后
进一步完善应用:
1.以上自定义Task的UI基于FloatingPanel,我们可以更改它的现实样式,比如透明度、颜色、布局等等。
2.可以将显示出来的结果存为一个Graphic图层,保留原始图层。
3.根据属性查空间信息,考虑查询到结果时,同时将Map定位到结果所在的窗口范围。
Flyingis @ China
email: dev.vip#gmail.com
blog: http://flyingis.cnblogs.com/
posted on 2007-12-11 15:17 Flyingis 阅读(7433) 评论(107) 编辑 收藏 举报