FLEX调用带结果地图服务的GP服务
来源:互联网 发布:卖家怎么在淘宝客推广 编辑:程序博客网 时间:2024/05/01 19:45
这两周都在做一个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 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,因此,此代码还没有调试通过,在测试中发现,提交任务(submitjob)并没真正提交到服务器,服务是没有问题的,通过Rest目录页面提交任务,使用默认值可以获得图片。因此,贴出代码希望有FLEX高手能指点一二。
- FLEX调用带结果地图服务的GP服务
- ArcGIS Server Flex API调用GP服务的一般步骤
- 解决GP服务产生的结果无法自动发布为地图服务的问题
- Flex调用GP服务实现按划选范围切割地图(一)
- Flex调用GP服务实现按划选范围切割地图(二)
- 调用GP服务
- ArcGISServer Flex API 调用GP服务实现服务区分析
- gp 服务的发布与javascript调用
- JavaScript 调用发布的GP服务
- ArcGIS Engine调用GP服务
- Flex调用GP及地图编辑示例
- 【技术类】GP(Geoprocessing)服务的发布与调用
- 使用ArcGIS GP服务之五 JavaScript的调用
- 使用ArcGIS GP服务之五 JavaScript的调用
- 利用Python分析GP服务运行结果的输出路径 & 实现服务输出路径的本地化
- ArcGISServer Flex API 调用GP服务实现服务区分析(转帖)
- ArcGIS Server Flex API 调用GP服务
- (九)ArcGIS API For Javascript调用结果地图服务
- VS2008下fstream操作文件时的中文路径
- c++中的引用的使用原理以及使用实例
- QT中解决QSocketNotifier: socket notifiers cannot be enabled from another thread错误
- 几种软件缺陷的可能利用方法
- 获取所有已安装的程序信息
- FLEX调用带结果地图服务的GP服务
- java面试题--程序查错
- 菜鸟入门:Java语言学习
- AsyncTask中执行完doInBackground不执行onPostExecute
- Object C 初识
- 光盘刻录编程
- Android中Popupwindow的用法
- HTML之实现下拉式菜单
- 【insigma】IO文件和文件夹的复制、删除、剪切