最近在發布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名稱,如:
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代碼生成的)
保存模型工具后,使用測試文件執行模型工具。在地圖處理里選擇結果,找到當前成果的工具,右擊進行共享,發布服務。
注意:在發布參數中選擇同步還是異步執行,input和output各類參數都是在模型構建器中調整好的,未展示而已。
由此,GP服務就發布好了,可以使用啦。
注:
GP服務的使用屬於后台,因此盡管在發布服務時選擇了同步或者異步,但是在arcgis api for js調用時,他仍舊需要時間,從而先執行其他代碼。
解決這個問題可以調用dojo的All方法:
dojo / promise / all是一個函數,它接受多個promise並返回一個新的promise,當所有promises都已完成時,它將被履行。意思是說當后台都執行完之后再繼續執行All函數中中的代碼,上面調用時的例子就是這種用法。具體關於js promise()的方法我會之后單獨寫一篇文章來進行講解。