基於REST的方式下載Portal中的要素服務

Portal中下載要素服務的流程

正像之前的博客中談到的,要素服務在Portal中有兩種存儲方式,一種是存儲到時空型數據庫中,一種是存儲到關係型數據庫中。兩種存儲方式的不同,導致了下載流程的不一樣。

  • 從關係型數據庫中下載

在要素服務的面板中右側,點擊Export Data,可以看到可以將要素服務導出成Shapefile、CSV File、Excel、FGDB等格式的文件,這裏以Shapefile爲例,點擊Export to Shapefile,在彈出的對話框中設置相應的參數信息,即可完成Shapefile的導出功能。
要素導出選項
要素導出成Shapfile參數示例
導出成功後,當前頁面會自動刷新,轉置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支持的文件格式。

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