全国高分辨率土地利用数据服务 土地利用数据服务 土地覆盖数据服务 坡度数据服务 土壤侵蚀数据服务 全国各省市DEM数据服务 耕地资源空间分布数据服务 草地资源空间分布数据服务 林地资源空间分布数据服务 水域资源空间分布数据服务 建设用地空间分布数据服务 地形、地貌、土壤数据服务 分坡度耕地数据服务 全国大宗农作物种植范围空间分布数据服务
多种卫星遥感数据反演植被覆盖度数据服务 地表反照率数据服务 比辐射率数据服务 地表温度数据服务 地表蒸腾与蒸散数据服务 归一化植被指数数据服务 叶面积指数数据服务 净初级生产力数据服务 净生态系统生产力数据服务 生态系统总初级生产力数据服务 生态系统类型分布数据服务 土壤类型质地养分数据服务 生态系统空间分布数据服务 增强型植被指数数据服务
多年平均气温空间分布数据服务 多年平均降水量空间分布数据服务 湿润指数数据服务 大于0℃积温空间分布数据服务 光合有效辐射分量数据服务 显热/潜热信息数据服务 波文比信息数据服务 地表净辐射通量数据服务 光合有效辐射数据服务 温度带分区数据服务 山区小气候因子精细数据服务
全国夜间灯光指数数据服务 全国GDP公里格网数据服务 全国建筑物总面积公里格网数据服务 全国人口密度数据服务 全国县级医院分布数据服务 人口调查空间分布数据服务 收入统计空间分布数据服务 矿山面积统计及分布数据服务 载畜量及空间分布数据服务 农作物种植面积统计数据服务 农田分类面积统计数据服务 农作物长势遥感监测数据服务 医疗资源统计数据服务 教育资源统计数据服务 行政辖区信息数据服务
Landsat 8 高分二号 高分一号 SPOT-6卫星影像 法国Pleiades高分卫星 资源三号卫星 风云3号 中巴资源卫星 NOAA/AVHRR MODIS Landsat TM 环境小卫星 Landsat MSS 天绘一号卫星影像
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,后者可以去看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();
}
参数为"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.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定位到结果所在的窗口范围。