使用ArcGIS Restful API 生成token和上傳shp壓縮包獲取features

本篇博客簡要介紹瞭如何在使用ArcGIS Restful API生成token, 並使用該token上傳shp壓縮包

生成Token

  上傳shp壓縮包需要使用的是Portal的Token, 那麼需要使用Portal的Restful API

  API文檔地址 https://<root-url>/arcgis/portalhelp/apidocs/rest/index.html

  1.   參考文檔說明, 打開自己的生成token頁面:

             https://simpleportal.esricd.local/arcgis/sharing/rest/generateToken

             

  ​​​ 2.  填寫用戶名, 密碼後查看network, 拿到請求token的格式

         

           

   3.   編寫ajax請求生成token

function genToken() {
  const url = "https://simpleportal.esricd.local/arcgis/sharing/rest/generateToken"
  const data = { username: 'esri_chen', password: '12345678', client: 'requestip',f:'json', expiration: 60}
  $.post(url, data).done((d) => {
    token = d.token
  })
}

上傳Shp壓縮包

上傳Shp壓縮包參考自Enterprise的web map的Add Layer from File

web map 地址: https://<root-url>/arcgis/home/webmap/viewer.html

  1. 打開web map, 選擇要加載的圖層
  2. 打開F12查看network


    由此可知, 上傳shp壓縮包, 我們改變token, file即可
  3. 編寫代碼
    function uploadZip() {
      var form = document.getElementById('upload')
      const token = 'kN2ZCLkYENJ3-rwxD_3kjUkLp4RX9v8XhmA-lJsy4c1JeNRdRFYNNQr0R7dk67TSKQzeVkZSmqETbzzZsGqaISv9qMk2cn7qSxI5oFC0ZSmanw7Cw8cSsHiYAzsCztNA3IbQTREAwTrE323y43kGTQ..'
    
      formData = new FormData(form);
      formData.append('f', 'json')
      formData.append('option', 'on')
      formData.append('filetype', 'shapefile')
      formData.append('publishParameters', '{"name":"1980","targetSR":{"wkid":102100},"maxRecordCount":4000,"enforceInputFileSizeLimit":true,"enforceOutputJsonSizeLimit":true,"locationType":"none","generalize":true,"maxAllowableOffset":10.583354500043306,"reducePrecision":true,"numberOfDigitsAfterDecimal":0}')
      $.ajax({
       url:"https://simpleportal.esricd.local/arcgis/sharing/rest/content/features/generate?token=" + token,
       type:"post",
       data: formData,
       processData:false,
       contentType:false,
       success:function(res){
        console.log(res)
       },
       error:function(err){
        alert("網絡連接失敗,稍後重試",err);
       }
      })
    }

     

  4. 得到features

執行GP工具

在server中獲取GP工具的默認參數字段

填充默認參數字段中缺少的features

      const changeBeforeParam = config.transMatrixParams // gp工具的默認參數
      const changeAfterParam = config.transMatrixParams
      changeBeforeParam.features = this.paramList[0].changeBefore
      changeAfterParam.features = this.paramList[1].changeAfter

      // 實例化模型參數
      const transMatrixGpToolParmas = new FormData()
      transMatrixGpToolParmas.append('changeBefore', JSON.stringify(changeBeforeParam))
      transMatrixGpToolParmas.append('changeAfter', JSON.stringify(changeAfterParam))
      transMatrixGpToolParmas.append('env:outSR', '')
      transMatrixGpToolParmas.append('env:processSR', '')
      transMatrixGpToolParmas.append('returnZ', false)
      transMatrixGpToolParmas.append('returnM', false)
      transMatrixGpToolParmas.append('returnTrueCurves', false)
      transMatrixGpToolParmas.append('f', 'pjson')
      transMatrixGpToolParmas.append('context', '')

      postTransMatrixGpTool(transMatrixGpToolParmas,
          (successResponse) => {
            // 執行失敗?
            if (successResponse.status !== 200) {
              alertErrorMessage(this, '執行計算異常!!')
              return
            }
            const waitingTaskFinshed = setInterval(() => {
              // 檢查執行情況
              trasnMatrixTool.checkJobStatus(successResponse.data.jobId).then((params) => {
                if (params.jobStatus === 'job-succeeded') {
                  this.isLoading = false
                  this.transMatrixToolResultJobId = params.jobId
                  this.computeTransMatrixCallBack()
                  // 執行完畢
                  window.clearInterval(waitingTaskFinshed)
                } else if (params.jobStatus === 'job-failed') {
                  // 執行失敗
                  window.clearInterval(waitingTaskFinshed)
                  this.isLoading = false
                  alertErrorMessage(this, '計算模型執行異常! 請重試')
                } else if (!params.jobStatus) {
                  // 並沒有執行成功
                  window.clearInterval(waitingTaskFinshed)
                  this.isLoading = false
                }
              })
            }, 1000)
          },
          // eslint-disable-next-line
          (errorResponse) => {
            this.isLoading = false
            alertErrorMessage(this, '計算超時, 請稍後再試!')
          })
    },

總結

    我們可以通過api生成token並上傳shp壓縮包得到features, 但是這個features或者featureCollection的格式與arcgis js api 4.x版本實例化Feature的格式不一致, 所以不能直接得到一個Feature, 但是, 我們可以使用features作爲gp工具的參數, 發送post請求到Server,  來實現上傳shp壓縮包並加載到地圖上的功能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章