您的位置:首页 > 移动开发 > Objective-C

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异步调用的代码,根据自己的服务制作情况,调用如下:

<?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
function
computeServiceArea(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
function
onFault(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
function
completeCallback(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
function
mapClickHandler(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,因此,此代码还没有调试通过,在测试中发现,提交任务(submitjob)并没真正提交到服务器,服务是没有问题的,通过Rest目录页面提交任务,使用默认值可以获得图片。因此,贴出代码希望有FLEX高手能指点一二。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息