全国高分辨率土地利用数据服务 土地利用数据服务 土地覆盖数据服务 坡度数据服务 土壤侵蚀数据服务 全国各省市DEM数据服务 耕地资源空间分布数据服务 草地资源空间分布数据服务 林地资源空间分布数据服务 水域资源空间分布数据服务 建设用地空间分布数据服务 地形、地貌、土壤数据服务 分坡度耕地数据服务 全国大宗农作物种植范围空间分布数据服务
多种卫星遥感数据反演植被覆盖度数据服务 地表反照率数据服务 比辐射率数据服务 地表温度数据服务 地表蒸腾与蒸散数据服务 归一化植被指数数据服务 叶面积指数数据服务 净初级生产力数据服务 净生态系统生产力数据服务 生态系统总初级生产力数据服务 生态系统类型分布数据服务 土壤类型质地养分数据服务 生态系统空间分布数据服务 增强型植被指数数据服务
多年平均气温空间分布数据服务 多年平均降水量空间分布数据服务 湿润指数数据服务 大于0℃积温空间分布数据服务 光合有效辐射分量数据服务 显热/潜热信息数据服务 波文比信息数据服务 地表净辐射通量数据服务 光合有效辐射数据服务 温度带分区数据服务 山区小气候因子精细数据服务
全国夜间灯光指数数据服务 全国GDP公里格网数据服务 全国建筑物总面积公里格网数据服务 全国人口密度数据服务 全国县级医院分布数据服务 人口调查空间分布数据服务 收入统计空间分布数据服务 矿山面积统计及分布数据服务 载畜量及空间分布数据服务 农作物种植面积统计数据服务 农田分类面积统计数据服务 农作物长势遥感监测数据服务 医疗资源统计数据服务 教育资源统计数据服务 行政辖区信息数据服务
Landsat 8 高分二号 高分一号 SPOT-6卫星影像 法国Pleiades高分卫星 资源三号卫星 风云3号 中巴资源卫星 NOAA/AVHRR MODIS Landsat TM 环境小卫星 Landsat MSS 天绘一号卫星影像
之前的文章有提到ArcGIS Server93提供了两种AJAX模式,一种是client callback模式,一种是partial postback模式。本篇将主要介绍ArcGIS Server的script. callback解决方案,对应client callback模式。
Client Callback模式,我们称之为客户端回调。使用这种AJAX模式时,处理客户端请求的服务器控件必须实现ICallbackEventHandler接口。该接口提供了两个方法,GetCallbackResult和RaiseCallbackEvent。通过这两个方法所实现的功能主要是:从客户端接收一个数据参数,在服务器端获取这个参数,并执行一个实现所需功能的事件,最后返回客户端所需结果数据。通俗点说,RaiseCallbackEvent就是接收客户端的指令,然后对其进行处理,最后通过GetcallbackResult返回给客户端。这就是客户端回调的机理。
另外有几点需要特别说明。一,客户端在请求时实际上调用了WebForm_DoCallback函数,这个函数被包含在ASP.NET System.Web.dll中,是ASP.NET为实现客户端回调提供的一个底层函数,它封装了一些AJAX实现的细节,可以方便开发人员实现快速开发。二,任何服务器端控件,只要实现了ICallbackEventHandler接口都可以实现对客户端请求的相应,并返回客户端,Page也是一种服务器控件,它也实现了这一接口。所有的Web ADF控件其实也都实现了这一接口,因此很多情况下我们不需要明确的对ADF控件的内容进行更新,因为它可以自动更新。
下面来看看客户端回调使用的几种情景:
(一)仅由Web ADF控件处理客户端请求
这种情景的流程如下图所示,服务器端的Web ADF控件处理客户端发来的请求,生成一个或多个CallBackResults,以序列化的JSON字符串传回客户端,交由客户端Web ADF JavaScript的函数processCallbackResult处理。这个函数位于aspnet_client文件夹下的ESRI.ADF.System.debug.js文件中,是Web ADF JavaScript库用来解析JSON字符串,修改客户端内容的函数。
这种方案其实经常出现在自定义ToolBarItem实现一些功能的情境下。由于所有的Web ADF控件都实现了ICallbackEventHandler接口,也就意味着这些控件实现了GetCallbackResult和RaiseCallbackEvent方法。当通过Toolbar与Map进行交互时,会自动调用Map的以上两种方法,实现地图的自动刷新。如下图所示:
NOTE:这张图是EDN的解释图,但是这张图是92版本的,93版本的processCallbackResult函数位于aspnet_client文件夹下的ESRI.ADF.System.debug.js文件中。
另外,有时候也需要更新页面上其他非ADF控件的内容,这可以通过定制CallbackResult实现。
(二)由非Web ADF控件处理客户端请求,Web ADF JavaScript处理服务器响应
下面这两张图描述了和第一种情形类似的过程,只不过将客户端的Web ADF换成了页面上的其他非Web ADF控件。这直接导致服务器端处理客户端请求的控件由Map变成了Page。
这张情况使用的范围更广,因为不可能所有的功能都放到Toolbar上去实现。
(三)由非Web ADF控件处理客户端请求,在客户端自定义JavaScript函数处理服务器响应
这也是三种情景中最难的一种情况,因为所有的服务器逻辑以及客户端的相应代码都需要设计人员自己定制。下面这段代码中的 customFunction就是我们需要在客户端自己定义的相应函数,它负责处理服务器发来的原始callback字符串。要知道如何解析callback字符串,就必须知道其构造模式,之前提到的processCallbackResult函数就是这样一个解析函数,我们可以参照它编写我们的定制函数。
[C#]
string m_ADFCallbackFunctionString =
Page.ClientScript.GetCallbackEventReference(this, "message", "customFunction", "context", "handleError", true);
总结:
总体上说来,第一种情景比较适合基于Toolbar的应用,第二种情景则应用很广,应该是Server开发人员用得最多的方案,第三种情景则比较适合于对Server的整个AJAX架构非常清楚,对Callback字符串解析比较了解,并且希望可以定制一些Server所不具有功能的高级开发人员所用。