一、背景说明
通过调用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开发介绍,来自Esri 中国技术人员的培训材料。
ArcGIS Runtime SDK for Android开发基础,分为上下篇。
包含三个版本: arcgis-android-sdk-v10.2.9 arcgis-runtime-sdk-vandroid-100.0.0 arcgis-runtime-sdk-vandroid-100.1.0
arcgis-runtime-sdk-android-100.5 官网下载的安卓 arcgis runtime sdk
ArcGIS Runtime SDK for Java 100.12.0 的...如需在生产环境中使用ArcGIS Runtime SDK for Java,请联系ESRI公司获得授权,现在也有国产替代产品GeoScne Runtime SDK for Java,可以联系易智瑞公司获得相关资源和授权。
ArcGIS Runtime SDK for Android v1.1发布啦,增强和改进如下: API: 1、从ArcGIS.com上搜索和使用content、users和groups; 2、支持要素定义存储在本地设备上的要素的高级符号化渲染; 3、支持单个应用程序中多个...
如题,此为官网下载的ArcGIS Runtime SDK for Android v100.4.0版的官方开发包和英文版开发指南。PS:请浏览器直接下载,不要用迅雷,不要用迅雷,不要用迅雷。
arcgis runtime sdk for android示例程序,包括地图浏览,标注和查询等功能的实现。
ArcGIS Runtime SDK for Android 100.1.0应用和开发,入门级开发指导,ArcGIS Runtime SDK for Android 100.1.0应用和开发。
如题,ESRI官方下载的ArcGIS Runtime SDK for .NET v100.4 官方开发包(官方原版),方便没有帐号的同志们下载。开发包较大,但请勿使用迅雷下载。
如题,ESRI官方下载的ArcGIS Runtime SDK for .NET v100.3 官方开发包,方便没有帐号的同志们下载。开发包较大,但请勿使用迅雷下载。
esri官网发布的ArcGIS Runtime SDK for Android,版本100.0.0,包括guide文档
ArcGIS Runtime SDK for WPF 10.2.5 版本破解License standard版本 测试可以使用,无弹出信息 测试环境:vs2013 win7_64
DrawTool3.0 DEMO 移动GIS项目开发中点线面的要素绘制及编辑是最常用的操作,ArcGIS Runtime SDK for iOS 自带AGSSketchLayer类可以帮助用户快速...DrawTool3.0 DEMO 基于ArcGIS Runtime SDK for Android 10.2.8开发
ArcGIS Runtime SDK for Android v10.2.3
ArcGIS RunTime SDK for Android 2.0 的ZIP.
arcgis-runtime-sdk-android-100.12.0
ArcGIS Android SDK非常强大,使用它可以让我们做出具有制图、地理编码、导航、地理处理等能力的apps,并且可以结合ArcGISOnline或者自己的ArcGIS server的空间分析能力。
ArcGIS Runtime SDK for Android移动开发培训班教材
arcgis runtime sdk for .net 100.4-100.6版本+arcgis runtime local server sdk 100.6,由于文件过大,百度网盘链接,有需要的朋友可以下载