一、背景说明

通过调用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服务(异步调用)的更多相关文章

  1. 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)(转)

    1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...

  2. 《ArcGIS Runtime SDK for Android开发笔记》

    开发笔记之基础教程 ArcGIS Runtime SDK for Android 各版本下载地址 <ArcGIS Runtime SDK for Android开发笔记>——(1).And ...

  3. 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:概述

    1.前言 数据生产和数据展示是常见的两大专业级移动GIS应用场景,这里我们针对数据生产环节的ArcGIS的离在线一体化技术给大家做一个基本的介绍和梳理. 使用ArcGIS离在线一体化技术首先需要以下基 ...

  4. 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步

    1.前言 上一篇文章中我们实现了离线要素的编辑操作,这一篇中主要介绍离在线一体化技术中最后一个环节离线数据的同步功能,通过对数据的上传,服务器端的版本化管理,实现数据生产管理的整个流程. 转载请注明出 ...

  5. 《ArcGIS Runtime SDK for Android开发笔记》——(6)、基于Android Studio的ArcGIS Android工程结构解析

    1.前言 Android Studio 是第一个Google官方的 Android 开发环境.其他工具,例如 Eclipse,在 Android Studio 发布之前已经有了大规模的使用.为了帮助开 ...

  6. 《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用

    1.前言 学习ArcGIS Runtime SDK开发,其实最推荐的学习方式是直接看官方的教程.示例代码和帮助文档,因为官方的示例一般来说都是目前技术最新,也是最详尽的.对于ArcGIS Runtim ...

  7. 《ArcGIS Runtime SDK for Android开发笔记》——(9)、空间数据的容器-地图MapView

    1.前言 在上一篇内容里介绍了 关于ArcGIS Android开发的未来(“Quartz”版Beta)相关内容,期间也提到了关于API接口的重构,开发思路的调整,根据2015UC资料也可以知道新版预 ...

  8. 《ArcGIS Runtime SDK for Android开发笔记》——(11)、ArcGIS Runtime SDK常见空间数据加载

    ArcGIS Runtime SDK for Android 支持多种类型空间数据源.每一种都提供了相应的图层来直接加载,图层Layer是空间数据的载体,其主要继承关系及类型说明如下图所示: 转载请注 ...

  9. 《ArcGIS Runtime SDK for Android开发笔记》——(3)、ArcGIS Runtime SDK概述

    1.前言 ArcGIS Runtime SDK是一整套用于构建原生及跨平台的地图应用程序的开发包,包括移动设备的Android.iOS.Windows Phone,针对桌面的.Net.Java.OSX ...

  10. 《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境

    1.前言 2015年1月15日,发布ArcGIS Runtime SDK for Android v10.2.5版本.从该版本开始默认支持android studio开发环境,示例代码的默认开发环境也 ...

随机推荐

  1. QiniuUpload- 一个方便用七牛做图床然后插入markdown的小工具

    最近一段时间有用markdown做笔记,其他都好,但是markdown插入图片挺麻烦的,特别是想截图之后直接插入的时候.需要首先把图片保存了,然后还要上传到一个地方生成链接才能插入.如果有个工具可以直 ...

  2. c#基础: 线程的初级用法总结

    启动一个线程的两种方法:     a.使用无参的方法       Thread thread1 = new Thread(new ThreadStart("调用的方法名")):   ...

  3. 让DIV垂直居中的几种办法

    1.使用CSS3 的伸缩盒布局 <!doctype html> <html> <head> <meta charset="utf-8"&g ...

  4. 连接Oracle11g数据库时遇到无监听,网络适配器无法建立等问题的一些解决办法

    最近在用Java做一个学生成绩管理系统,打算用Oracle数据库.由于原先没接触过Oracle,所以安装完数据库后,连接数据库时遇到各种问题,网上搜索解决方案还是没有解决时,又重新安装了几次.终于在前 ...

  5. iOS~~MD5加密

    // 一般加密 +(NSString *)md5String:(NSString *)str { const char *password=[str UTF8String]; unsigned cha ...

  6. Jquery对回复者添加匿名评论选项

    通过prop方法获取checked属性,获取的checked返回值为boolean,选中为true,否则为flase <input type="checkbox" id=&q ...

  7. [总结] Stack: Java V.S. C++

    小结一下Stack 的主要API操作. 在c++ 和 java 中,stack 的操作几乎相同,只有查询栈顶元素一项操作的名称不同 (top() v.s. peek()) . 此外,在构造函数中,Ja ...

  8. jsp 、js和css

    css的一些样式 1.自动换行 .AutoNewline { Word-break: break-all;/*必须*/ width :50px;/*这里是设置多宽就进行换行 */ }

  9. MySQL中的两个时间函数,用来做两个时间之间的对比

    TIMESTAMPDIFF,(如果当期时间和之前时间的分钟数相比较.大于1天,即等于1:小于1天,则等于0) select TIMESTAMPDIFF(DAY,'2016-11-16 10:13:42 ...

  10. 1170: 非常男女(XCOJ 前缀和)

    1170: 非常男女 时间限制: 1 Sec  内存限制: 128 MB提交: 22  解决: 9 标签提交统计讨论版 题目描述 Matrix67已经当过多次“媒人”了.他因此获得了许多经验.例如,距 ...