ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用)
一、背景说明
通过调用GP服务,Android客户端也能实现专业的、复杂的GIS分析处理功能,从而增加应用的实用价值。
ArcGIS Server发布的GP服务,分为同步和异步两种类型,一般执行步骤较多,耗时较长的GP服务都采用异步方式,执行速度较快的服务则采用同步方式。如果不确定GP服务是同步还是异步方式,则可以通过服务目录查看,如下图:

本文将介绍如何通过异步的方式来调用GP服务(同步方式在SDK的示例程序中有,较为简单),本例调用的GP服务来自ArcGIS Online,服务地址为:http://sampleserver4.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/Incident_Data_Extraction/GPServer/Extract%20Data%20Task。该服务相关的业务数据服务为:http://sampleserver4.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/Incident_Data_Extraction/MapServer。该GP服务提供数据提取的功能,就是根据用户选择的待提取图层、提取范围、输出格式,将数据提取,并打包返回客户端,由客户下载zip压缩包。先来看一下GP服务的参数要求:

可见该服务提供了三个输入参数,分别是:待提取的图层、提取范围和输出格式,此外还有一个输出参数,用于获取提取结果。
二、示例效果
本例的执行效果如下:
1.底图与待提取的业务数据:

2.绘制用于提取的多边形范围:

3.提交提取任务,开始执行提取操作:

4.提取任务执行完成,获得了提取结果的URL(图片上方),点击可下载:

5.完成下载提取结果:

6.到下载目录中查看下载结果,output-1.zip:

三、关键代码
1.设置参数
public void startAsynchronous(Polygon aoiGeometry){
//被裁切的目标图层
GPString pointLayer = new GPString();
pointLayer.setValue("Incident Points");
GPString lineLayer = new GPString();
pointLayer.setValue("Incident Lines");
GPString polygonLayer = new GPString();
pointLayer.setValue("Incident Areas");
GPMultiValue<GPString> clipLayers = new GPMultiValue<GPString>("Layers_to_Clip");
clipLayers.addValue(pointLayer);
clipLayers.addValue(lineLayer);
clipLayers.addValue(polygonLayer);
//用于裁切的范围
Graphic g = new Graphic(aoiGeometry, fillSymbol);
GPFeatureRecordSetLayer aoi = new GPFeatureRecordSetLayer("Area_of_Interest");
aoi.setGeometryType(Geometry.Type.POLYGON);
aoi.addGraphic(g);
//返回的数据格式
GPString format = new GPString("Feature_Format");
format.setValue("Shapefile - SHP - .shp");
params2 = new ArrayList<GPParameter>();
params2.add(clipLayers);
params2.add(aoi);
params2.add(format);
try {
dialog = ProgressDialog.show(Viewshed.this, "", "Extacting. Please wait...", true, true);
gpExtract = new Geoprocessor("http://sampleserver4.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/Incident_Data_Extraction/GPServer/Extract%20Data%20Task");
gpExtract.setOutSR(map.getSpatialReference());
gpExtract.setProcessSR(map.getSpatialReference());
ExtractRunable queryRunable = new ExtractRunable();
Thread thread = new Thread(queryRunable);
thread.start();
}
catch (Exception e) {
e.printStackTrace();
}
}
2.提交任务,开始异步执行
class ExtractRunable implements Runnable {
@Override
public void run() {
GPJobResource jobResource = null;
try {
jobResource = gpExtract.submitJob(params2);
}
catch (Exception e1) {
e1.printStackTrace();
}
jobID = jobResource.getJobID();
}
}
3.通过Timer定时查询任务状态并处理结果
class ExtractRunable implements Runnable {
@Override
public void run() {
GPJobResource jobResource = null;
try {
jobResource = gpExtract.submitJob(params2);
}
catch (Exception e1) {
e1.printStackTrace();
}
jobID = jobResource.getJobID();
//通过定时器每隔2秒查询Job状态
checkJobStatusTimer = new Timer();
checkJobStatusTimer.schedule(new TimerTask() {
@Override
public void run() {
GPJobResource jobRes = null;
try {
jobRes = gpExtract.checkJobStatus(jobID);
}
catch (Exception e) {
e.printStackTrace();
}
if(jobRes == null) return;
JobStatus status = jobRes.getJobStatus();
switch(status){
case CANCELLED:
Toast.makeText(Viewshed.this, "CANCELLED", Toast.LENGTH_LONG).show();
break;
case DELETED:
Toast.makeText(Viewshed.this, "DELETED", Toast.LENGTH_LONG).show();
break;
case FAILED:
GPMessage[] message = jobRes.getMessages();
Toast.makeText(Viewshed.this, "FAILED:"+message[0].toString(), Toast.LENGTH_LONG).show();
break;
case SUCCEEDED:
try {
GPDataFile result = (GPDataFile)gpExtract.getResultData(jobID, "Output_Zip_File");
url = result.getUrl();
uiHandler.sendEmptyMessage(CLOSE_LOADING_WINDOW);
}
catch (Exception e) {
e.printStackTrace();
}
break;
case TIMED_OUT:
Toast.makeText(Viewshed.this, "TIMED_OUT", Toast.LENGTH_LONG).show();
break;
default:
break;
}
}
}, 1000, 2000);
}
}
以上是本例的关键代码,如需完整代码,请在评论中留下邮箱。
ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用)的更多相关文章
- 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)(转)
1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...
- 《ArcGIS Runtime SDK for Android开发笔记》
开发笔记之基础教程 ArcGIS Runtime SDK for Android 各版本下载地址 <ArcGIS Runtime SDK for Android开发笔记>——(1).And ...
- 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:概述
1.前言 数据生产和数据展示是常见的两大专业级移动GIS应用场景,这里我们针对数据生产环节的ArcGIS的离在线一体化技术给大家做一个基本的介绍和梳理. 使用ArcGIS离在线一体化技术首先需要以下基 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步
1.前言 上一篇文章中我们实现了离线要素的编辑操作,这一篇中主要介绍离在线一体化技术中最后一个环节离线数据的同步功能,通过对数据的上传,服务器端的版本化管理,实现数据生产管理的整个流程. 转载请注明出 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(6)、基于Android Studio的ArcGIS Android工程结构解析
1.前言 Android Studio 是第一个Google官方的 Android 开发环境.其他工具,例如 Eclipse,在 Android Studio 发布之前已经有了大规模的使用.为了帮助开 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用
1.前言 学习ArcGIS Runtime SDK开发,其实最推荐的学习方式是直接看官方的教程.示例代码和帮助文档,因为官方的示例一般来说都是目前技术最新,也是最详尽的.对于ArcGIS Runtim ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(9)、空间数据的容器-地图MapView
1.前言 在上一篇内容里介绍了 关于ArcGIS Android开发的未来(“Quartz”版Beta)相关内容,期间也提到了关于API接口的重构,开发思路的调整,根据2015UC资料也可以知道新版预 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(11)、ArcGIS Runtime SDK常见空间数据加载
ArcGIS Runtime SDK for Android 支持多种类型空间数据源.每一种都提供了相应的图层来直接加载,图层Layer是空间数据的载体,其主要继承关系及类型说明如下图所示: 转载请注 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(3)、ArcGIS Runtime SDK概述
1.前言 ArcGIS Runtime SDK是一整套用于构建原生及跨平台的地图应用程序的开发包,包括移动设备的Android.iOS.Windows Phone,针对桌面的.Net.Java.OSX ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境
1.前言 2015年1月15日,发布ArcGIS Runtime SDK for Android v10.2.5版本.从该版本开始默认支持android studio开发环境,示例代码的默认开发环境也 ...
随机推荐
- POJ 2392 Space Elevator 背包题解
多重背包.本题不须要二分优化.相对简单点.由于反复数十分小,小于10. 而添加一个限制每种材料的高度做法.假设使用逆向填表,那么仅仅须要从这个高度往小递归填表就能够了. 还有就是注意要排序,以限制高度 ...
- 6、Cocos2dx 3.0游戏开发找小三之游戏的基本概念
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27689713 郝萌主友情提示: 人是习惯的产物,当你 ...
- PixelFormat 枚举
成员名称 说明 Alpha 像素数据包含没有进行过自左乘的 alpha 值. Canonical 默认像素格式,每像素 32 位. 此格式指定 24 位颜色深度和一个 8 位 alpha 通道. Do ...
- FineUI布局应用(二)
一.FineUI页面布局分为 1.Fit布局 <f:Panel ID="Panel1" Title="布局Fit(Layout=Fit)" runat=& ...
- SDWebImage实现原理详解
1)当需要获取网络图片的时候,我们首先需要的便是URL,如果没有URL什么都没有,获得URL后,SDWebImage实现的并不是直接去请求网路,而是检查图片缓存中有没有和URL相关的图片,如果有则直接 ...
- css实现超连接按钮形式显示
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- MFC线程(三):线程同步事件(event)与互斥(mutex)
前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到. Win32 API中的线程事件 HANDLE hEvent = NULL; void MainTestFu ...
- 使用div+iframe实现弹窗及弹出内容无法显示的解决
使用div+iframe实现弹窗 除了使用实际的弹出窗口,还可以使用控制一个div的display属性来模拟一个弹出窗口的操作,这里使用在Div里放一个iFrame的方式,主要考虑到可以在需要的时候加 ...
- python学习视频整理
python3英文视频教程(全87集) http://pan.baidu.com/s/1dDnGBvV python从入门到精通视频(全60集)链接:http://pan.baidu.com/s/1e ...
- 答:我们公司的ASP.NET 笔试题,你觉得难度如何
闲来无事,逛逛园子,发现有个面试题,觉得有意思.已自己的理解答来看看,不足之处,请多指教. 原文地址:http://www.cnblogs.com/leotsai/p/aspnet-tests-for ...