本篇博客簡要介紹瞭如何在使用ArcGIS Restful API生成token, 並使用該token上傳shp壓縮包
生成Token
上傳shp壓縮包需要使用的是Portal的Token, 那麼需要使用Portal的Restful API
API文檔地址 https://<root-url>/arcgis/portalhelp/apidocs/rest/index.html
- 參考文檔說明, 打開自己的生成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
- 打開web map, 選擇要加載的圖層
- 打開F12查看network
由此可知, 上傳shp壓縮包, 我們改變token, file即可 - 編寫代碼
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); } }) }
- 得到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壓縮包並加載到地圖上的功能