GP服务是个非常有用的工具,几乎所有的桌面版的地处理工具都可以发布称GP服务。笔者从自己的一个项目中用到一个简单的GP服务入手,介绍下GP服务的发布和调用过程。
这里以intersect相交为例,在客户端的geometryServices也提供intersect方法,但是这个方法有个致命的缺陷,就是仅针对几何类型,没法获取属性信息,所以我们可以采用地处理的intersect服务。
1.模型构建
在Catolog中,选择Geoprocessing-ModelBuilder,然后选择菜单的Insert,选择Add Data or Tool,在系统工具里找到Intersect工具。如下图:
加进来的效果是这样的,这个时候没有设置任何功能参数,背景色都是白色的。
我们知道,相交是必须要两个要素数据集的,因此我们要加两个参数,作为输入的要素数据集。我们在菜单栏上继续Insert,选择Create Varial,创建参数。我们分别重命名为Intersect1和Intersect2.
然后我们分别在Intersect1和Intersect2上面右击,选择属性,数据类型选择Feature Set,如果数据类型选择不正确,调用服务时会报错。这里一定要注意。
之后我们分别新建两个个shap文件,作为两个要素相交的模板。Import schema and symbology from:选择你刚才新建的模板。这时候这两个参数背景就会变成蓝色。
接下来,我们知道这里的两个要素是作为参数参与GP服务计算的,也就是在程序中是动态给予的,而不是死的,所以我们还需要右击,选择Model Parameter,这样我们会发现,在Intersect1和Intersect2旁边会出现一个P,这个就是动态参数的意思。
然后我们用连接工具将Intersect1和Intersect2连接到Intersect工具上,作为参数,连接后有一个提示,我们选择Input feature.之后我们重命名输出参数为Output,同样,输出参数也是动态参数,我们也要选择Model Parameter,让P显示出来。
然后我们几点Run,来验证模型的正确。如果没有报错,等于模型通过了验证,这个时候我们保存模型。保存好之后,我们在模型上右击选择Debug,来测试模型,两个输入参数我们可以选择事先画好的两个面,并且给予相应属性,测试成功后,我们在Geoprocessing里面的result中右击选择共享到服务。
最后我们在客户端调用服务,这里以flex为例:这里注意输入的参数要保持和模型中参数的名字一样:Intersect1和Intersect2
var params:Object = {"Intersect1":featureSet,"Intersect1":drawFS};//参数
gp.addEventListener(GeoprocessorEvent.JOB_COMPLETE, completeCallback);
gp.addEventListener(FaultEvent.FAULT,onFault);
gp.submitJob(params);
function completeCallback(event: GeoprocessorEvent) : void
{
var result:ArrayCollection = new ArrayCollection();
if (event.jobInfo.jobStatus == JobInfo.STATUS_SUCCEEDED)
{
gp.getResultData(event.jobInfo.jobId,"output",new AsyncResponder(onResult,onFault));
function onResult(pv:ParameterValue, token:Object = null):void
{
pv.value 就是你的结果集featureset
}