Portal中下載要素服務的流程
正像之前的博客中談到的,要素服務在Portal中有兩種存儲方式,一種是存儲到時空型數據庫中,一種是存儲到關係型數據庫中。兩種存儲方式的不同,導致了下載流程的不一樣。
- 從關係型數據庫中下載
在要素服務的面板中右側,點擊Export Data,可以看到可以將要素服務導出成Shapefile、CSV File、Excel、FGDB等格式的文件,這裏以Shapefile爲例,點擊Export to Shapefile,在彈出的對話框中設置相應的參數信息,即可完成Shapefile的導出功能。
導出成功後,當前頁面會自動刷新,轉置Shapefile的頁面,在當前的頁面中點擊Download按鈕下載Shapefile文件。
- 從時空型數據庫中下載
從時空型數據庫中導出要素服務,首先要通過GA的Copy to DataStore工具將要素服務複製到關係型數據庫中,然後關係型數據庫導出要素服務的流程導出。
跟蹤Portal中導出要素服務的網絡請求,可以得到整個流程使用的哪些REST API,接下來將會一一介紹。
通過REST API實現要素服務的下載
- 從時空型數據庫中下載
如上所述,首先我們需要做的是調用Copy to DataStore的REST API將要素導出至關係型數據庫中。
該工具的API使用方式和GA的Overlay工具使用方式類似,請參考我的另外一篇博客,這裏就不在贅述了。
導出成功後的操作流程請參看下一小節。
- 從關係型數據庫中下載
在實際應用中我們會常常獲取到要素服務的名稱,但是Portal中的導出工具是以ItemId爲基準的,因此我們提前要根據要素服務的名稱查找其對應的ID。
查找的參數配置及實現代碼如下:
let searchParams = {
countFields: "access, contentstatus, categories",
q: that.gaOutputName,
start: 1,
num: 10,
f: "json",
countSize: 10,
token: portalToken
};
let searchRequestUrl =
"https://" +
Vue.prototype["portalDomainName"] +
"/arcgis/sharing/rest/search";
postRequestOfAxios(
searchRequestUrl,
qs.stringify(searchParams),
function(requestResultInfo) {
let overlayResultId = requestResultInfo.data.results[0].id;
// do export
},
function(requestErrorInfo) {
failCallBack();
console.log(requestErrorInfo);
}
);
接下來呢,就是根據獲取到的ID執行要素導出功能。導出的API參數配置及功能實現如下所示。導出成功後,會返回一個相應的JOB ID,需要每個一段時間根據這個JOB ID查看任務狀態,直到導出這個狀態結束爲止。
let exportToShpParams = {
itemId: overlayResultId,
exportFormat: "Shapefile",
f: "json",
token: portalToken
};
let exportRequestUrl =
"https://" +
Vue.prototype["portalDomainName"] +
"/arcgis/sharing/rest/content/users/" +
Vue.prototype["portalUserName"] +
"/export";
postRequestOfAxios(
exportRequestUrl,
qs.stringify(exportToShpParams),
function(requestResultInfo) {
let exportShpFileJobId = requestResultInfo.data.jobId;
let exportShpFileItemId = requestResultInfo.data.exportItemId;
// 間隔2秒,查詢要素導出的狀態。
let exportStatusWindowsInterval = window.setInterval(function() {
let exportStatusShpFileJobUrl =
"https://" +
Vue.prototype["portalDomainName"] +
"/arcgis/sharing/rest/content/users/" +
Vue.prototype["portalUserName"] +
"/items/" +
exportShpFileItemId +
"/status";
let exportShpFileStatusData = {
jobId: exportShpFileJobId,
jobType: "export",
f: "json",
token: portalToken
};
postRequestOfAxios(
exportStatusShpFileJobUrl,
qs.stringify(exportShpFileStatusData),
function(requestResultInfo) {
if (requestResultInfo.data.status === "completed") {
window.clearInterval(exportStatusWindowsInterval);
// do download
}
},
function(requestErrorInfo) {
console.log(requestErrorInfo);
window.clearInterval(exportStatusWindowsInterval);\
}
);
}, 2000);
},
function(requestErrorInfo) {
failCallBack();
console.log(requestErrorInfo);
}
);
導出成功後,根據導出結果的item id以及Portal的token拼接Shapefile的下載地址,然後使用location.href方法下載Shapefile文件,實現代碼如下:
location.href =
"https://" +
Vue.prototype["portalDomainName"] +
"/arcgis/sharing/rest/content/items/" +
exportShpFileItemId +
"/data?token=" +
portalToken;
至此,我們完成要素服務導出及下載爲Shapefile的整個流程,感興趣的朋友可以試試將要素服務導出成CSV等其他Portal支持的文件格式。