【移动应用开发技术】ArcGIS Runtime for Android 使用异步GP服务绘制等值线_第1页
【移动应用开发技术】ArcGIS Runtime for Android 使用异步GP服务绘制等值线_第2页
【移动应用开发技术】ArcGIS Runtime for Android 使用异步GP服务绘制等值线_第3页
【移动应用开发技术】ArcGIS Runtime for Android 使用异步GP服务绘制等值线_第4页
【移动应用开发技术】ArcGIS Runtime for Android 使用异步GP服务绘制等值线_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】ArcGISRuntimeforAndroid使用异步GP服务绘制等值线

关于基于Android上ArcGISServerGP服务的调用,已经有前辈给出了很好的例子:/esrichinacd/article/details/9231815以及官方的帮助文档:/android/sample-code/viewshed/详细通过仔细学习上面的内容,您也可以基本了解GP服务的使用过程。本文我们主要将以下三部分内容:1.学会使用使用ArcMap构建等值线GP服务模型2.学会使用ArcGISServer发布我们创建的GP服务模型3.学会ArcGISRuntimeforAndroid下异步调用GP服务,绘制等值线其中前两部分可本博客其他文章有详细说明可参考:/potential/archive/2012/10/27/2742355.html这篇文章使用的是10.0的ArcGISServer,而这里我们使用的是10.1的ArcGISServer,因此在此我们也会提到10.1下如何来发布我们的服务。如果您熟悉GP服务的发布过程,可直接跳转至第三部分。第三部分的内容主要解决以下几个问题:1.如果根据现有的坐标信息和对应的属性数据,构造相应的地理要素?例如:现在有某个省的个监测点的降雨数据(监测点经纬度,及监测点的降雨量),那么如何在地图上对这些监测点的数据进行反映?2.如何在Android平台上根据这些监测点的数据来对整个地区进行插值呢?并将等值线添加到Android移动平台的地图中?3.如何根据等值线的值,动态设置其不同的颜色呢?一、使用ArcMap构建等值线的GP服务模型既然我们要创建等值线那么,肯定需要绘制等值线的数据,即进行等值线绘制的点。而等值线又是怎么得到的呢?很简单,根据这些点的位置和其表示的值(如该店的降雨量,浓度值等)对其进行插值。插值的过程就是根据已有的点来计算某一未知区域的点的浓度值。常用的插值方法有拉格朗日插值,克里金插值,反距离插值,样条函数插值等。一般情况下我们选择反距离和克里金插值,如果想得到非常平滑的插值结果,则可以采用三次样条插值。

插值完成之后,实际上得到的是更多的点,而绘制等值线就是将具有相同属性值的点连接起来得到等值线。通常情况下我们需要自己代码完成插值过程和追踪等值点的算法。并连接等值点。但是在ArcGIS中有内置的插值工具和等值线工具供我们使用。但是在ArcGIS中各个功能模块都是一个单独的工具,而通过上面的分析我们知道绘制等值线至少有两个过程:1.插值,2.依据插值结果绘制等值线

因此依据上面的分析我们通过ArcMap的ModelBuilder可以构建如下的工具模型:

但是通常情况下上述得到的等值线有可能不会很平滑,如果需要较平滑的等值线可以再加上一个平滑工具,如:

通过加上平滑工具,设置平滑容差,可以得到较为平滑的等值线。二、

发布GArcMap构建的GP服务模型

在ArcGISServer10.1中,发布GP服务的方式较之前有所改变,不再是发布GP服务模型本身,而是发布在GP服务模型在ArcMap运行之后的结果,如图所示:

然后出现发布服务的选项:

publishaservice:直接将现有模型结果发布为GP服务。

Saveaservicedefinitionfile:保存为服务定义文件,可以用于在ArcGISServerManager中发布为服务。

Overwriteanexistingservice:覆盖当前的ArcGISServer服务。这里我们选择第二个选项,Saveaservicedefinitionfile.这样的好处是可以在ArcGISManager上远程发布。同时sd文件也很容易迁移到其他的机器。

保存为sd文件之后,登陆ArcGISServerManager页面,点击发布服务:

然后点击选择文件,选择之前在ArcMap中保存的服务定义文件(.sd).然后点击下一步。

之后选择发布服务的名称,和所在服务的目录。最后点击下一步,发布服务。在服务发布之后登陆服务的rest页面可以查看服务的具体参数信息:

接下来我们就需要开始编码来调用我们这里的GP服务实现绘制等值线的功能。到此我们的绘制等值线的GP服务以及发布完成,接下来就是编码的过程。当然为了确保您的GP服务能够正确运行,建议在编码之前,通过ArcMap来验证一下您的GP服务。验证过程可参考之前的博文,鉴于篇幅在此不再赘述。三、

ArcGISRuntimeforAndroid调用异步GP服务绘制等值线

本文开发环境:ArcGISRuntimeforAndroid-10.2.2EclipseJavaEEIDEforWebDevelopers-Version:JunoServiceRelease2JDK-7Android4.0.3及以上(ArcGISRuntimeforAndroid10.2.2要求OPENGL2.0环境,Android4.0.3及以上版本的模拟器支持2.0的OPENGL)ArcGISServer10.1

调试过程在真机上实现3.1ArcGISRuntimeforAndroidGP服务调用过程

首先我们需要了解GP服务的几个问题:

3.1.1.查看当前GP服务是异步还是同步

ArcGIS的GP服务有异步和同步的两种模式,默认情况下(ArcGISServer10.1)使用的是异步模式。

通过REST页面的参数我们也可以知道GP服务时何种模式:

或者

Asynchronous表示的是异步模式,SubmitJob也表示异步模式,他们是对应的。3.11.2异步和同步的区别

异步模式通常适用于模型较复杂,运行时间较长的GP服务,而同步适用于模型较简单,运行时间较短的GP服务。

对于同步的GP服务,需要等待服务执行完成,然后再去获取结果

对于异步的GP服务,无需客户端等待,但是需要客户端去查询GP服务执行的状态,如果执行完成,然后再去获取结果,所有的过程需要开发人员自己编写代码,包括服务调用,状态轮询等。在ArcGISRuntimeforAndroid中并没有提供类似与.net下的回调函数,以方便我们获取GP服务结果(如果您使用过C#+Silverlight/WPF/Win8/WindowsPhone下的GP服务,我们知道异步执行GP服务有个JobCompeleted事件,我们可以在该事件回调函数中写获取GP服务结果的代码)。而ArcGISRuntimeforAndroid中并没有这样的事件供我们使用。3.2

ArcGISRuntime调用GP服务的详细过程

ArcGISRuntimeforAndroid中调用GP服务的核心类是:Geoprocessor.该类封装了调用GP服务所需的方法。其中较为重要的如下表所示:用于开始调用异步GP服务,并返回本次GP服务调用的相关信息(如标示id,状态等)。和同步不同的是每一次异步调用GP服务都会生成一个jobID来标示每一次GP调用的任务,通过这个jobId我们可以找到该次GP服务调用的状态,结果。Geoprocessor构造函数有两个重载,都必须传入GP服务的地址。

下面我们以上述绘制等值线的基础为例子,来具体说明如何让调用GP服务。

通过之前绘制等值线GP服务的REST页面,我们知道请求GP服务需要三个输入参数和一个输出参数(计算结果这里即表示等值线),我们先看一看输入参数:ForecastPoints:预测点要素集,表示进行等值线绘制的点,且必须带有concentration属性,concentration属性即为点要素的属性,表示改点代表的浓度值,类型是GPFeatureRecordSetLayerContour_interval:等值线间距,类型是:GPDoubleSmoothing_Tolerance:平滑容差,类型GPLinearUnit

而在调用GP服务时,我们需要将上述的参数添加到GPParameter类的集合中(List<GPParameter>),最后调用GP服务传递的是List<GPParameter>集合。

下面我们来构造上述GP服务参数,首先我们新建一个类,取名:GPService,然后定义所所需的参数:并实例化:说明:10.2的ArcGISRuntimeforAndroid的API中对于GraphicsLayer有了很大的改进,在声明GraPhicsLayer对象时可以指定Gphics的渲染模式,当指定为DYNAMIC时可以极大优化Graphic的加载速度,从而提高用户体验。同时为了简化整个过程,这里我们用于绘制等值线的点,以及其对于的浓度值并不是真实的数据,我们将采用代码来生成模拟的数据,具体过程是:用户输入一个点,以该点为中心生成21x41个网格点。当然换成真实数据的过程一样。下面是生成模拟数据的方法,这里我们使用了一个椭圆的函数来构造浓度值,因此我们预期的等值线应该是一个一个的椭圆,此外还需要注意的是用于预测的点要素集必须包含concentration属性,因为我们这里服务器端的GP服务是根据concentration属性来绘制等值线的。要素的的属性数据是以键值对的方式存放的。在构造完所需的参数之后,我们添加集合辅助方法:注意:在ArcGISRuntimeforAndroid的API中,没有单独为Graphic提供添加属性(Attributes,如果您熟悉.net下的ArcGISapi,那么您应该知道可以通过Graphic的addAttributes方法来为Graphic添加属性),由于没有类似.net下的addAttributes方法,因此在需要给Graphic添加方法时只能通过两种方式:在构造Graphic的时候就将我们的属性数据传递过去,比如本文使用的方法。通过将Graphic添加到GraPhicsLayer,然后调用GarphicsLayer的updateGraphic(intid,Map<String,Object>attributes)方法来更新Graphic的Attributes属性。定义好参数以及相关的辅助方法后,下面就来完成请求GP服务的代码,定义一个StartGPService方法:为了使得请求GP服务时不影响前台的UI线程,因此我们重新new一个线程,因为如果直接在UI线程来添加用于预测的网格点(21x41)会有卡顿的现象。这里的submitJobandPolling方法如下,大致过程是:1.提交当前的GP服务请求绘制等值线。2.提交完成之后,取得当前的请求的JobId。3.通过Timer,同时根据当前的JobId轮询该GP服务的执行状态4.如果GP服务执行完成,则停止轮询5.如果GP服务执行成功,则获取GP服务的结果:getResultData(jobId,"ContourLine"),得到GPParameter6.因为是等值线,所以结果是线要素,因此我们将GPParameter转为GPFeatureRecordSetLayer。7.读取GPFeatureRecordSetLayer中的Graphic,即等值线8.根据等值线的值(contour属性)分类渲染等值线。9.将等值线图层添加到地图中代码如下:到此关于GP服务的准备过程全部完成,下面我们开始编写调用的代码,有了上面的工作,下面的就很容易了:首先我们看一下Android界面的布局:这里加载本地数据为预留功能。然后我们实例化一个GPService对象,传入自动绘制预测点要素集所需的起点坐标和MapView对象,然后设置等值线间距和平滑容差,最后调用GP服务即可。代码如下:最后等待我们的等值线出来吧。最后的效果图:总结:关于GP服务,实际上无论Java平台还是C#平台,无论Silverlight,Flex还是JavaScript,无论WindowPhone还是Android(IOS没有了解过,不是很清楚,屌丝没有苹果机真啊)他们调用GP服务的过程基本上都是一样一样的,注意是基本上。因此多少还是有些差别,但是总体上来说都遵循这样的过程:1.声明Geoprocessor变量,指定GP服务地址。2.根据GP服务,声明其所需的参数,并添加到GPParameter集合(其他平台名字也行稍有不一样)3.根据异步和同步,执行调用GP服务的方法4.获取GP服务的结果了解了这个过程那么您就知道GP服务该如何使用了。一点题外话:

再次写博客,发现上一次还是一年以前,不由的感慨时间飞逝,这一年中,浑浑噩噩的感觉就过去了,然后匆匆忙忙的找了份工作,然后马上就要毕业了...留给自己

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论