FLEX调用带结果地图服务的GP服务
2012-07-31 17:40
309 查看
这两周都在做一个IDW插值分析的GP服务,于是从数据,到模型制作,到服务发布再到调用,是好一番折腾,遇到许多问题,有的解决了,有的还没有解决。
插值的数据源是数据库的视图,并且会随着时间变化,是动态实时降水数据,因此数据必须在插值前与空间点矢量Join,由于决定技术思路必须是还源地图文档的GP服务。
由于插值的结果还需要在FLEX中调用,并且与其它数据服务mash up,所以,综合考虑,发布带结果地图服务的GP服务,使用结果地图服务完成展示。
模型制作过程中,须要注意的就是路径,输入、输出参数,空间范围,这些从ESRI在线帮助中都可以查到。一般情况下,使用源地图文档的图层数据的输入参数在发布服务时都会自动转换为GP string,所以 发布模型时若有无值可选要素类参数,则模型是不能直接发布的,需要通过ModelBuilder再封装,封装的办法很简单,就是将不需要的可选参数不做为输入参数,本模型就是如此处理的。
另在Unix/linux下模型的输出的名称不支持大写,因此模型默认的输出数据名称是不行的,须改成小写。
发布以后就是调用了,调用真是费尽周折。在调用代码之前,先说下本人对于结果地图服务和GP服务配合调用的理解。
GP服务与其结果地图服务交互展示原理如上图,不同调用者输入不同的参数,提交异步请求后,在服务器完成模型运算后会生成不同的调用结果,此时结果存储在服务器,客户端尚不能看到处理后结果。
如果要通过结果地图服务查看结果,则需要在客户端添加异步处理侦听事件,添加和映射异步处理完成后的回调函数。在回调函数中根据本次调用作业ID调用获取图层接口,图层接口将调用结果地图服务,读取其作业ID下的数据,生成客户端需要的图片传回到客户端,客户端可将此图片图层添加到Map控件中。
由于不同调用者拥有不用的作业ID,相应地结果地图服务所用的也是不同的数据源,客户端最终显示的结果图层也是不同的,实现了同一个结果地图服务,在不同的图层引用中同时展示两套甚至多套数据源。不能不说,这是一种先进和大胆的设计,只是FLEX调用GP服务在参数等方面还有一定难度,可以说稍落后于当前主流的FLEX组件调用的简洁性,因此在一定程度上制约了GP服务+结果地图服务的这种应用方式。
参考了网上GP服务FLEX异步调用的代码,根据自己的服务制作情况,调用如下:
由于本人刚接触FLEX,因此,此代码还没有调试通过,在测试中发现,提交任务(submitjob)并没真正提交到服务器,服务是没有问题的,通过Rest目录页面提交任务,使用默认值可以获得图片。因此,贴出代码希望有FLEX高手能指点一二。
插值的数据源是数据库的视图,并且会随着时间变化,是动态实时降水数据,因此数据必须在插值前与空间点矢量Join,由于决定技术思路必须是还源地图文档的GP服务。
由于插值的结果还需要在FLEX中调用,并且与其它数据服务mash up,所以,综合考虑,发布带结果地图服务的GP服务,使用结果地图服务完成展示。
模型制作过程中,须要注意的就是路径,输入、输出参数,空间范围,这些从ESRI在线帮助中都可以查到。一般情况下,使用源地图文档的图层数据的输入参数在发布服务时都会自动转换为GP string,所以 发布模型时若有无值可选要素类参数,则模型是不能直接发布的,需要通过ModelBuilder再封装,封装的办法很简单,就是将不需要的可选参数不做为输入参数,本模型就是如此处理的。
另在Unix/linux下模型的输出的名称不支持大写,因此模型默认的输出数据名称是不行的,须改成小写。
发布以后就是调用了,调用真是费尽周折。在调用代码之前,先说下本人对于结果地图服务和GP服务配合调用的理解。
GP服务与其结果地图服务交互展示原理如上图,不同调用者输入不同的参数,提交异步请求后,在服务器完成模型运算后会生成不同的调用结果,此时结果存储在服务器,客户端尚不能看到处理后结果。
如果要通过结果地图服务查看结果,则需要在客户端添加异步处理侦听事件,添加和映射异步处理完成后的回调函数。在回调函数中根据本次调用作业ID调用获取图层接口,图层接口将调用结果地图服务,读取其作业ID下的数据,生成客户端需要的图片传回到客户端,客户端可将此图片图层添加到Map控件中。
由于不同调用者拥有不用的作业ID,相应地结果地图服务所用的也是不同的数据源,客户端最终显示的结果图层也是不同的,实现了同一个结果地图服务,在不同的图层引用中同时展示两套甚至多套数据源。不能不说,这是一种先进和大胆的设计,只是FLEX调用GP服务在参数等方面还有一定难度,可以说稍落后于当前主流的FLEX组件调用的简洁性,因此在一定程度上制约了GP服务+结果地图服务的这种应用方式。
参考了网上GP服务FLEX异步调用的代码,根据自己的服务制作情况,调用如下:
<?xml version="1.0"encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:esri="http://www.esri.com/2008/ags" xmlns:s="library://ns.adobe.com/flex/spark" pageTitle="GP testwith resultMapService"> <fx:Script> <![CDATA[ importcom.esri.ags.Graphic; importcom.esri.ags.events.GeoprocessorEvent; importcom.esri.ags.events.MapMouseEvent; importcom.esri.ags.geometry.MapPoint; import com.esri.ags.layers.GPResultImageLayer; importcom.esri.ags.layers.GraphicsLayer; importcom.esri.ags.layers.supportClasses.ImageParameters; importcom.esri.ags.tasks.Geoprocessor; importcom.esri.ags.events.GeoprocessorEvent; importcom.esri.ags.tasks.supportClasses.ExecuteResult; importcom.esri.ags.tasks.supportClasses.ParameterValue; importcom.esri.ags.tasks.supportClasses.JobInfo; importmx.containers.TitleWindow; import mx.containers.VBox; import mx.controls.Alert; importmx.managers.PopUpManager; importmx.messaging.channels.StreamingAMFChannel; importmx.rpc.AsyncResponder; importmx.rpc.events.FaultEvent; private var jobid:String=""; private functioncomputeServiceArea(mapPoint:MapPoint):void { var params:Object = { "Input_Points": "rain", "Power": 3.0, "Z_value_field": "G09ZT_SDE.S11V13019DT52.V13019", "Search_radius": "VARIABLE12" }; 参数视模型而不同 gp.addEventListener(GeoprocessorEvent.JOB_COMPLETE,completeCallback); gp.addEventListener(FaultEvent.FAULT,onFault); gp.submitJob(params); } private functiononFault(event:FaultEvent):void { if (event.type == "fault" &&event.fault.name == 'Error' &&event.fault.faultCode == '500' &&event.fault.faultString == 'Error ExecutingTask') { Alert.show("Oops - no results. Try clicking in an ocean..."); } else { Alert.show("Unexpected fault:\n" + event.toString()); } } private functioncompleteCallback(event: GeoprocessorEvent) : void { jobid=event.jobInfo.jobId; varimageParameters:ImageParameters = new ImageParameters(); imageParameters.format="png32"; imageParameters.width=900; imageParameters.height=700; gp.getResultImage(event.jobInfo.jobId,"outputMap",imageParameters,newAsyncResponder(onimgok, onimgno)); } private function onimgok(info:Object,token:Object = null):void { varobj:Object=gp.getResultImageLastResult; varimageParameters:ImageParameters = new ImageParameters(); imageParameters.format="png32"; imageParameters.width=900; imageParameters.height=700; var myImageLayer:GPResultImageLayer=gp.getResultImageLayer(jobid,"outputMap",imageParameters); myMap.addLayer(myImageLayer); /* vargpWin:GPContainer=PopUpManager.createPopUp(this,GPContainer,false) as GPContainer; gpWin.ShowResultLayer(myImageLayer); gpWin.title="降雨等值面"; PopUpManager.centerPopUp(gpWin);*/ } private function onimgno(info:Object,token:Object = null):void { } private functionmapClickHandler(event:MapMouseEvent):void { computeServiceArea(event.mapPoint); } ]]> </fx:Script> <fx:Declarations> <esri:Geoprocessor id="gp" showBusyCursor="true" url="http://59.255.50.10:8399/arcgis/rest/services/RainInter/GPServer"/> </fx:Declarations> <esri:Map id="myMap" mapClick="mapClickHandler(event)" width="100%" height="100%" > <!-- <esri:extent> <esri:Extentxmin="-95.41" ymin="38.86" xmax="-95.1"ymax="39.06"> <esri:SpatialReferencewkid="4326"/> </esri:Extent> </esri:extent>--> <esri:ArcGISTiledMapServiceLayer url="http://59.255.50.10:8399/arcgis/rest/services/xxk_china_basemap/MapServer"/> </esri:Map> </s:Application> |
相关文章推荐
- Flex调用GP服务实现按划选范围切割地图(一)
- Flex调用GP服务实现按划选范围切割地图(二)
- ArcGIS Flex API 调用天地图和Google地图服务
- Arcgis server发布电子地图(5):影像服务/网络分析服务/GP服务/结果地图服务/打卡
- ArcGISServer Flex API 调用GP服务实现服务区分析
- ArcGIS Server Flex API 调用GP服务
- 解决GP服务产生的结果无法自动发布为地图服务的问题
- flex 调用gp服务
- 解决GP服务产生的结果无法自动发布为地图服务的问题
- Flex调用GP及地图编辑示例
- ArcGISServer Flex API 调用GP服务实现服务区分析(转帖)
- (九)ArcGIS API For Javascript调用结果地图服务
- flex调用arcgis地图服务发布地图遇到安全沙箱问题
- ArcGIS API for Flex 调用天地图和Google地图服务
- ArcGIS Flex API 调用天地图和Google地图服务
- ArcServer +Flex 发布GP服务生成等值面(三) ---前端调用
- ArcGIS Server Flex API调用GP服务的一般步骤
- 调用地图路径规划服务提示000002 调用服务发生异常
- arcgis 本地地图服务 silverlight 调用报错
- (三)ArcGIS API For Javascript之调用动态地图服务