ArcGIS Pro建立、釋出、呼叫GP服務全過程示例(等高線分析)

孤草之魂發表於2023-05-05

在之前的文章介紹過使用ArcMap釋出GP分析服務,由於ArcGIS後續不在更新ArcMap,改用ArcGIS Pro,本文對ArcGIS Pro釋出GP分析服務進行說明。

本文以等高線分析為例,使用ArcGIS Pro軟體,從GP分析服務的建立、釋出、呼叫全過程進行演示。

使用ArcMap釋出GP服務請跳轉:

本文示例使用(因為本人portal的授權的版本只有10.5的,故使用10.5進行示例):

軟體:ArcGIS Pro3.0.1(破解版),

  ArcGIS JS API4.16

注:閱讀本文前需要對ArcGIS GP服務,模型構建器等有一定了解,本文不會詳細描述GP工具的構建過程。

需求:透過在前端繪製或匯入多邊形範圍,設定等高距,生成繪製區域的等高線。

1、資料準備

(1)準備一個地形檔案,可以是tif或者img等格式

(2)準備一個shp面要素檔案,用來指定分析範圍

2、建立GP模型

建立等高線分析GP模型:

(1)使用Extract by Mask工具,裁剪出輸入要素的多邊形範圍的柵格資料

(2)根據第一步裁剪的柵格結果,執行等高線分析,生成線要素

注:藍色橢圓中的為輸入引數,綠色橢圓中的是輸出引數,黃色矩形為ArcGIS工具箱中的分析工具。

引數說明: 

InputFeature:等高線分析範圍資料,shp格式,可自行建立個shp檔案。在地形範圍內繪製一個範圍(使用第一步準備的shp資料),

InputRaster:地形dem資料,可以使用tif格式,支援經緯度座標或投影座標,根據實際情況選擇需要的地形路徑(第一步準備的地形資料)

CoutourInterval:等高線間距,預設單位米

OutputFeature:輸出的等高線線要素

由於在ArcGIS10.3中已經建立過GP模型,ArcGIS之間的產品是相容的,可以用ArcGIS Pro開啟,故不再新建GP模型,直接使用舊版已經建立好的進行編輯:

更改輸入引數和輸出引數的檔案路徑(輸入引數選擇第一步準備好的資料,需要真實的資料,輸出引數只要設定好路徑和檔名稱即可,保證資料夾存在,檔案不需要真實存在):

 修改完引數路徑後,對模型進行儲存。

注:在ArcMap10.3版本建立的GP工具可以在ArcGIS Pro開啟,但在ArcGIS Pro開啟後,就無法在ArcMap中開啟了,不同的ArcGIS版本也一樣,低版本GP工具在高版本開啟後,就無法再原來的版本中開啟,所以注意備份不同版本的工具。

3、執行併發布GP服務

(1)雙擊執行GP服務

  (2)釋出服務,選擇共享->Web工具,共享Web工具:

 選擇剛剛執行的GP工具:

設定釋出服務引數:

 切換配置頁,選擇同步非同步等配置:

 切換Content,編輯輸入輸出引數:

 輸入工具名稱,備註,輸入引數,輸出引數等:

 設定好後,點選分析,分析如果沒有錯誤,使用Publish釋出GP服務

4、訪問並驗證GP服務

5、呼叫GP服務

 先透過繪製得到繪製的多邊形graphic,然後設定引數,利用Geoprocessor來執行GP服務得到結果,再將結果的等高線繪製到地圖上。

 

    startExcute (graphic) {
      const featureSet = new FeatureSet()
      featureSet.features = [graphic]
      const inputRaster = {
        'url': this.demDatas[this.value].url,
        'format': this.demDatas[this.value].format || 'tif'
      }
      let params = {
        "inputFeature": featureSet,
        "contourInterval": this.contourInterval,
        "inputRaster": inputRaster
      }
      
      const geop = new this.Geoprocessor(this.contourUrl)
      geop.outSpatialReference = {
        wkid: this.map.spatialReference.wkid
      }
      if (this.isAsync) { //釋出的服務是非同步時的處理方式
        this.loading = true
        geop.submitJob(params).then(data => {
          var options = {
            interval: 1500,
            statusCallback: function (j) {
              // console.log("Job Status: ", j.jobStatus);
            }
          }
          geop.waitForJobCompletion(data.jobId, options).then(res => {
            geop.getResultData(res.jobId, 'OutputFeature').then(item => {
              this.drawLine(item.value.features)
              this.loading = false
            })
          }, error => {
            this.loading = false
            this.$message.error('分析出錯,請聯絡管理員!')
            console.error('等高線分析出錯:' + error)
          }).catch(error => {
            this.loading = false
            this.$message.error('分析出錯,請聯絡管理員!')
            console.error('等高線分析出錯:' + error)
          })
        })
      } else { //釋出的服務是同步時的處理方式
        this.loading = true
        console.log('params2', params)
        geop.execute(params).then(data => {
          this.loading = false
          this.drawLine(data.results[0].value.features)
          console.log('datas', data)
        }, error => {
          this.loading = false
          this.$message.error('分析出錯,請聯絡管理員!')
          console.error('等高線分析出錯:' + error)
        })
      }
    }

注:程式碼只是擷取的一部分程式碼,參考使用,具體呼叫根據自己的開發的實際情況來寫。

<全文完>

相關文章