ArcGIS GP服务问题列表html
在使用GP服务时,从建立模型到发布服务,再到调用服务,整个过程都须要注意输入参数和输出参数的问题。GP服务支持的输入和输出参数可详见服务器
http://help.arcgis.com/zh-cn/arcgisdesktop/10.0/help/index.html#/na/00530000001n000000/异步
若是输入参数类型和GP服务的类型不一致,则会报错。字体
当输入或是输出的参数类型不是GP服务支持的类型,则发布GP服务不会成功。调试
当咱们获取GP服务的执行结果是,须要注意咱们 结果的名称必需要和GP服务输出结果的名称一致!例如:htm
这是发布的GP服务输出参数的信息:对象
这里咱们能够知道输出参数的名称是:SurfaceOutput,那么在咱们请求服务的时候必定要注意参数名一致。blog
_geoprocessorJobTask.GetResultImageLayerAsync(e.JobInfo.JobId, "SurfaceOutput");ci
这段代码是向服务器获取GP执行的结果,结果的名称是:SurfaceOutput,必需要和GP服务的输出参数一致。资源
若是不一致,好比咱们将这里的SurfaceOutput改成ErroSurfaceOutput就会出现以下的错误:
因此咱们也能够知道,当出现如图所示的错误时,咱们能够检查一下获取GP服务结果的参数是否一致!
同理,咱们也须要保持输入参数的一致性。当输入的参数不一致时会出现以下的错误。
例以下图是咱们GP服务输入参数额基本信息:
咱们如今调用GP服务时输入GPFeatureRecordSetLayer类型的参数
Jobgpparameter.Add(newGPFeatureRecordSetLayer("PolutionPoints", featureData));
注意这里PolutionPoints即为GP服务输入参数的名称,这里必需要求和GP服务的Parameter名称相同,若是这里咱们将PolutionPoints改成其余的名称则会出现以下所示的错误:
这里通常是因为在咱们建模时,选择的要素的坐标系统的属性域太小引发的。
例如当咱们输入的参数是点要素时,那么咱们在咱们建立点要素时,须要选择点要素的坐标系统(也能够选择 Unknown).当咱们非选择Unknown时,那么咱们要素的属性域就是固定的(相对选择Unknown时会小不少)。例如当选择的坐标系统是 WGS_1984时,它的属性域范围以下:
当选择的是Unknown时,要素的属性域以下:
因此咱们能够知道选择不一样的坐标系统,那么属性域是不同的。
所以,因为XY属性域范围的限制,当咱们输入的点参数xy坐标超出XY属性域的范围时,调用GP服务就会报错,出现以下所示的错误:
解决的措施就是,将输入的点要素的坐标系统设置成Unknown,就能够了。
咱们在发布GP服务的时候会选择是同步仍是异步。同步调用GP服务其实是在客户端完成工做,结果存储在客户端,异步调用实在服务器端执行,结果存储在服务器端,客户端上服务器端索取。当处理的数据量较小,用户不要要等待太长的时间时,能够采用同步的,当处理数据量较大,须要用户等待一段时间,那么咱们则能够选择异步的方式。
所以,因为GP服务有同步和异步之分,那么咱们在发布和调用GP服务的时候都须要知道采用哪一种方式。
例如咱们发布的GP服务是同步的, 咱们只能用同步的方式调用:
_geoprocessorExecuteTask.ExecuteAsync(ExecuteGPParameter);
同理当GP服务为异步的时候,以下调用:
_geoprocessorJobTask.SubmitJobAsync(JobGPParameter);
而若是咱们咱们发布的是同步方式的GP服务,而采用的却又是异步方式来调用,那么就会出现以下所示的错误:
在我异步请求GP服务,获取GP服务执行的结果时,遇到了这样的错误。报错代码以下:
黄色字体部分即为报错的地方。
如下是获取异步调用结果的完整代码:
voidgeoprocessorTask_GetResultDataCompleted(objectsender, GPParameterEventArgse)
{
GraphicsLayergraphiclayer=Map.Layers["CountorLayer"] asGraphicsLayer;
GPFeatureRecordSetLayerfeature=e.ParameterasGPFeatureRecordSetLayer;
foreach (Graphicgraphicinfeature.FeatureSet.Features)
{
graphic.Symbol=LayoutRoot.Resources["RedLineSymbol"] asESRI.ArcGIS.Client.Symbols.Symbol;
graphiclayer.Graphics.Add(graphic);
}
}
这端代码确实没有错误,可是当本身运行程序的时候就报错,说未将对象引用设置到对象的实例,后来经“菩提老王“的点播,发现原来个人GP服务都没有执行成功(Fialded),换句话说就是e.Parameter中并无结果,所以当给feature赋值的时候其实是不成功的。
GPFeatureRecordSetLayerfeature=e.ParameterasGPFeatureRecordSetLayer;
于是在后面遍历feature中的Features时,则会报错。
而当GP服务执行成功时,则不会出现如上的错误,调试发现此时feature中已经有了多个Features。说明成功了。
有时候咱们在调用GP服务时会出现以下的错误,说远程服务NotFound,而咱们发现GP服务生成了正确的结果,可是SL就是没法显示,并报以下的错误:
这里的缘由是因为Silverlight自身访问服务器资源引发的,在咱们发送GP服务请求以前添加以下代码即可以解决问题;
//添加这段代码很重要,不然会出现远程服务器NOT Found的错误
HttpWebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp);
Jobgpparameter.Add(newGPFeatureRecordSetLayer("PolutionPoints", featureData));
_geoprocessorJobTask.SubmitJobAsync(Jobgpparameter);
这个问题其实是模型的问题,以前本身遇到过,开始的时候百思不得其解,由于本身发布了一个GP服务,在ArcMap中验证成功,调用的时候也成功了,可是就是没法将结果显示在当前的图上,查看Jobs的文件夹,发现确实有结果生成。
以后从新建了模型,并从新设置了环境工做空间,输出的文件夹路径。而后发现问题解决了。固然是否是真的由于这个缘由,这里也只是个人一个猜测,不太重新建模确定是能够解决这个问题的。
转自:http://www.cnblogs.com/potential/archive/2012/05/18/GP.html