基于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支持的文件格式。