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