arcgis服务之GP服务的几点问题(附GP服务发布步骤)

时光毁灭记忆、已成空白 提交于 2020-05-07 01:48:48

最近在发布GP服务时遇到了一些以前没有遇到问题,所以对GP服务进行一下总结。

一、什么是GP服务

GP服务,即Geoprocessing Service,意为地理处理服务,是将Arctoolbox中的工具或ModelBuilder中创建的工具发布为服务,以供Arcgis API For Javascript调用工具服务,辅助分析处理功能进行开发。

二、GP服务的分类

GP服务包括两类,一类是Execute task,即同步执行任务;另外一类是Submit job,即异步提交作业。

这两种GP服务是可以在发布GP服务时设置参数来选择的。

异步和同步定义客户端(使用任务的应用程序)如何与服务器交互并从任务获取结果。当服务设置为同步时,客户端等待任务完成。通常,同步任务快速执行 - 五秒或更短时间。异步任务通常需要更长的时间来执行,并且客户端必须定期询问服务器任务是否已完成,如果已完成,则获取结果。使用异步任务的Web应用程序必须具有实现的逻辑,以检查任务的状态并在执行完成后处理结果。ArcGIS Desktop客户端本机处理两种执行类型。

三、GP服务的调用

GP服务调用同地图服务影像服务那样,也是通过URL进行调用,url在调用时要使用到GPServer之后的Task名称,如:

http://192.168.5.7:6080/arcgis/rest/services/ExplodePolygon12/GPServer/ExplodePolygon
GP服务在调用时要输入参数,他的值必须是 html或 JSON格式。
例:
var boudingGraphic = new Graphic();
boudingGraphic.geometry = boundingGeom;

var boudingFeature = new FeatureSet();
boudingFeature.features = [boudingGraphic];

var queryFeatures = new FeatureSet();
queryFeatures.features = features;

var bufferDist = selectSite.bufferDistance[layerIndex];

var gpUrl = selectSite.dataConfig.GeoprocessingService.SelectSite_Buffer;
var gp = new Geoprocessor(gpUrl);

var linearUnit = new LinearUnit({
       "distance": bufferDist,
       "units": "meters"
});

var gpParams = {
       "BoudingFeature": boudingFeature,
       "QueryFeatures": queryFeatures,
       "BufferDistance": linearUnit
}

var selectSitePromiseArr = [];
selectSitePromiseArr.push(gp.execute(gpParams));
All(selectSitePromiseArr).then(function (diffResults) {
      console.log(diffResults);
})
 

这样就可以在arcgis api for js中使用GP服务了。

四、GP服务的制作与发布

1、创建模型构建器

点击下图图标

打开之后创建模型。可打开ArcToolbox,将需要的工具拖入模型构建器后,调整各参数,从而制作模型(模型构建器是使用arcpy代码生成的)

创建模型

保存模型工具后,使用测试文件执行模型工具。在地图处理里选择结果,找到当前成果的工具,右击进行共享,发布服务。

发布GP工具

注意:在发布参数中选择同步还是异步执行,input和output各类参数都是在模型构建器中调整好的,未展示而已。

由此,GP服务就发布好了,可以使用啦。

注:

GP服务的使用属于后台,因此尽管在发布服务时选择了同步或者异步,但是在arcgis api for js调用时,他仍旧需要时间,从而先执行其他代码。

解决这个问题可以调用dojo的All方法:

dojo / promise / all是一个函数,它接受多个promise并返回一个新的promise,当所有promises都已完成时,它将被履行。意思是说当后台都执行完之后再继续执行All函数中中的代码,上面调用时的例子就是这种用法。具体关于js promise()的方法我会之后单独写一篇文章来进行讲解。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!