正像之前的博客中谈到的,要素服务在Portal中有两种存储方式,一种是存储到时空型数据库中,一种是存储到关系型数据库中。两种存储方式的不同,导致了下载流程的不一样。
在要素服务的面板中右侧,点击Export Data,可以看到可以将要素服务导出成Shapefile、CSV File、Excel、FGDB等格式的文件,这里以Shapefile为例,点击Export to Shapefile,在弹出的对话框中设置相应的参数信息,即可完成Shapefile的导出功能。
导出成功后,当前页面会自动刷新,转置Shapefile的页面,在当前的页面中点击Download按钮下载Shapefile文件。
从时空型数据库中导出要素服务,首先要通过GA的Copy to DataStore工具将要素服务复制到关系型数据库中,然后关系型数据库导出要素服务的流程导出。
跟踪Portal中导出要素服务的网络请求,可以得到整个流程使用的哪些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支持的文件格式。