ArcGIS Runtime SDK for .NET 100.0中如何执行.gpk(二)
接上文,在编写代码之前我们先回忆一下ArcMap中执行该脚本工具的过程,首先我把一个Dem影像添加进来,然后我在该影像范围内使用人机交互的方式画了一条线,那么我们在Runtime中也可以采用该思路:即首先加载该Dem影像(为了画线时便于定位),然后map上画线作为输入inputLine。
1,首先加载本地Dem影像(这是100.0的新特性哦)并且显示到该区域。这里不做详细介绍,可参考下面代码:
//加载DEM并且缩放到该区域Map map = new Map(Basemap.CreateTopographic());string pathToRaster = @"D:\work\github\ExecuteGPK\LasVegasNED13_geoid1.tif";var myRaster = new Raster(pathToRaster);// create a RasterLayer using the Rastervar newRasterLayer = new RasterLayer(myRaster);map.OperationalLayers.Add(newRasterLayer);Viewpoint viewPoint = new Viewpoint(36.131, -115.144, 800000);myMapView.Map = map;await myMapView.SetViewpointAsync(viewPoint, TimeSpan.FromSeconds(2));
2,开启LocalServer,LocalServer 是单实例对象( singleton object),也就是说整个工程中只有一个,因此我们可以添加全局变量:
private Esri.ArcGISRuntime.LocalServices.LocalServer _localServer;
接下来开启LocalServer:
private async void StartLocalServer(){// Get the singleton LocalServer object using the static "Instance" property_localServer = Esri.ArcGISRuntime.LocalServices.LocalServer.Instance;// Handle the StatusChanged event to react when the server is started_localServer.StatusChanged += ServerStatusChanged;// Start the local server instanceawait _localServer.StartAsync();}private async void ServerStatusChanged(object sender, Esri.ArcGISRuntime.LocalServices.StatusChangedEventArgs e){// Check if the server started successfullyif (e.Status == Esri.ArcGISRuntime.LocalServices.LocalServerStatus.Started){}}
ServerStatusChanged事件可以用来监测LocalServer的状态。
3,执行本地gpk,可按照下面步骤:
a,新建LocalGeoprocessingService对象,传入该.gpk所在路径,获取其full URL,之后的过程其实和执行在线GP服务一样;
b,创建GeoprocessingTask对象,传入刚刚获取到的URL;
c,创建GeoprocessingParameters对象,用于输入必要参数,注意需要设置GeoprocessingExecutionType为同步或者异步;
d,使用GeoprocessingTask.CreateJob获取GeoprocessingJob,该对象可以监听job的状态;
e,执行Job,如果执行成功的话会得到GeoprocessingResult,执行失败可以捕获异常信息;
f,最后通过GeoprocessingResult获取返回值。
4,重点讲下参数的构建,构建参数时需要确认参数类型,Runtime中支持的参数类型及说明如下表:
由上表可以看出如果是输入矢量要素的话需要使用FeatureRecordSetLayer这种类型,对应的Runtime参数类型就是GeoprocessingFeatures,这也是为什么我们要自定义脚本工具(而不是直接调用系统工具Interpolate Shape)并且输入参数类型指定为Feature Set的原因。
那么GeoprocessingFeatures如何构建呢?可以使用FeatureCollectionTable实现,下面是FeatureCollectionTable的帮助:
其AddFeatureAsync方法可以添加要素,CreateFeature()方法可以新建要素,返回Feature对象,接下来看下Feature类:
与ArcObjects的逻辑一致,可以为该Feature赋予几何和属性,那么怎么获取Geometry呢?这里我们直接屏幕画线,使用MapView.SketchEditor获取SketchEditor,然后使用StartAsync(SketchCreationMode, Boolean)里面指定SketchCreationMode.Polyline就可以直接画线了,画完双击结束后即可获取Geometry,赋给Feature.Geometry,最后通过FeatureCollectionTable.AddFeatureAsync将该Feature添加进来即可。
由于我们构建的gpk就需要这一个参数,因此参数就构建完了。不过还有一点需要注意,由于我们需要获取Z值,所以GeoprocessingParameters.ReturnZ属性需要设为true,此外,还可以设置输出要素的空间参考。
5,获取结果类型为GeoprocessingResult,可以根据输出的参数名称“outputLine”获取GeoprocessingFeatures对象,进而获取IFeatureSet,由于我们仅输入了一条线,因此输出只有一个Feature,获取到该Feature后可以获取其Geometry即为Polyline,为了检测Z值是否返回,我们获取输出线的起点Z值和终点Z值,最终以MessageBox方式弹出。
下面就把这一部分的代码汇总一下:
StartLocalServer();LocalGeoprocessingService localServiceGP = new LocalGeoprocessingService(@"D:\work\github\ExecuteGPK\InterpolateShape.gpk");localServiceGP.ServiceType = GeoprocessingServiceType.SynchronousExecute;// Handle the status changed event to check when it's loadedlocalServiceGP.StatusChanged += async (svc, args) =>{// If service started successfully, create a gp taskif (args.Status == LocalServerStatus.Started){// Get the URL for the specific geoprocessing toolvar gpSvcUrl = (svc as LocalGeoprocessingService).Url.AbsoluteUri + "/InterpolateShape";// Create the geoprocessing taskGeoprocessingTask gpRouteTask = new GeoprocessingTask(new Uri(gpSvcUrl));GeoprocessingParameters para = new GeoprocessingParameters(GeoprocessingExecutionType.SynchronousExecute);// Create the schema for a lines table (one text field to contain a name attribute)var inputFeatures = new FeatureCollectionTable(new List<Field>(), GeometryType.Polyline, myMapView.SpatialReference);Feature inputFeature = inputFeatures.CreateFeature();var geometry = await myMapView.SketchEditor.StartAsync(SketchCreationMode.Polyline, false);inputFeature.Geometry = geometry;await inputFeatures.AddFeatureAsync(inputFeature); para.Inputs.Add("inputLine", new GeoprocessingFeatures(inputFeatures));para.ReturnZ = true;para.OutputSpatialReference = myMapView.SpatialReference;GeoprocessingJob routeJob = gpRouteTask.CreateJob(para);try{// Execute analysis and wait for the resultsGeoprocessingResult geoprocessingResult = await routeJob.GetResultAsync();GeoprocessingFeatures resultFeatures = geoprocessingResult.Outputs["outputLine"] as GeoprocessingFeatures;IFeatureSet interpolateShapeResult = resultFeatures.Features;Esri.ArcGISRuntime.Geometry.Polyline elevationLine = interpolateShapeResult.First().Geometry as Esri.ArcGISRuntime.Geometry.Polyline;MapPoint startPoint = elevationLine.Parts[0].Points[0];int count = elevationLine.Parts[0].PointCount;MapPoint stopPoint = elevationLine.Parts[0].Points[count - 1];double chazhi = stopPoint.Z - startPoint.Z;MessageBox.Show("终点的Z值为: " + stopPoint.Z.ToString() + ",起点的Z值为: " + startPoint.Z.ToString());}catch (Exception ex){if (routeJob.Status == JobStatus.Failed && routeJob.Error != null)MessageBox.Show("Executing geoprocessing failed. " + routeJob.Error.Message, "Geoprocessing error");elseMessageBox.Show("An error occurred. " + ex.ToString(), "Sample error");}// Create parameters, run the task, process results, etc.// ...}};// Start the local geoprocessing serviceawait localServiceGP.StartAsync();
界面为:
结果为:
三、遇到的问题与技巧
遇到的问题
发布过GP服务的用户都知道,GP服务的执行方式有两种:即同步和异步:
同样执行gpk也是如此,上面代码中有一点不知道您注意到没有,那就是LocalGeoprocessingService.ServiceType属性,这里指定的是GeoprocessingServiceType.SynchronousExecute也就是同步执行。悲剧的是我开始没加这句代码(其实也不怪我,Runtime的官网示例中也没有这句代码而且也没有地方有相关说明),后面参数处使用GeoprocessingParameters para = new GeoprocessingParameters(GeoprocessingExecutionType.SynchronousExecute);会报错:
那就改成异步执行吧,使用GeoprocessingExecutionType.AsynchronousSubmit,这次没有报错,但输出线要素的Z值始终是0!崩溃了,好在后来看到LocalGeoprocessingService.ServiceType属性,设置为同步后,参数处也设为同步就执行成功了。后来想尝试一下异步执行,于是将ServiceType设为异步,参数也设为异步,但始终得到的Z值为0,不知道为什么,如果大家异步执行这个工具成功了的话欢迎给我留言!
帮助中同步异步参数的详细说明
技巧
localServer会把gpk发布成本地的GP Service,如下图:
这时我们可以在浏览器中输入该URL,跟在线的GP Service类似,这里我将服务类型设为了异步,然后点击提交:、
输入inputLine的Json格式,执行:
生成的结果:
如果这里是可以成功的,那么我们在程序中参数构建正确了也应该是可以成功的,但如果这里都无法执行成功,那就别指望在Runtime中执行成功了,所以建议如果大家执行gpk失败了,可以在这里测试一下。
执行成功后,在那个临时目录下(注意,如果LocalServer关闭了,这个临时目录就销毁了)找到该outputLine是有Z值的。也就是说异步是正常的,但是为什么我的Runtime程序中获取的Z值就是0呢?我也是醉了。
LocalServer所支持的工具列表
好吧,就啰嗦到这吧,希望您看完后能对Desktop中如何制作gpk以及ArcGIS Runtime for .NET 100.0中如何执行gpk有个初步认识,测试工程和测试数据已上传至百度云盘了,链接:http://pan.baidu.com/s/1jIIE5Ps 密码:lixo,有兴趣的同学可以下载。
ArcGIS Runtime SDK for .NET 100.0中如何执行.gpk(二)相关推荐
- ArcGIS Runtime SDK for .NET 100.0中如何执行.gpk(一)
ArcGIS Runtime 100.0 SDKs 于2016年11月发布,是ArcGIS Runtime采用全新架构下的第一个商业版本,新架构下的Runtime采用了统一的API,方便用户使用的同时 ...
- ArcGIS Runtime SDK for Android 100使用比例尺、指北针、书签
需求: 如何在ArcGIS Runtime SDK for Android 100.x中实现比例尺.指北针.书签等功能 效果图: 例如:比例尺和指北针效果 实现思路: 使用arcgis-runtime ...
- ArcGIS Runtime SDK for .Net 100.6 如何加载本地数据
由于ArcGIS Engine的32位.部署繁重.不适应新一代Web GIS的发展等缺点,Esri推出了ArcGIS Runtime产品,该产品因其64位.部署轻便.跨平台.更好地适应新一代Web G ...
- element 点击控制expend的显示隐藏_四、ArcGIS Runtime SDK for iOS 100.X教程系列之图层控制显示隐藏...
一个图层服务上多个图层时,结合服务的链接地址访问查看详细信息进行代码编写会更方便,形如以下这个arcgis服务: http://arcgis.wuhanrt.cn:6080/arcgis/rest/s ...
- 基于Arcgis Runtime SDK 100.x 的Android GIS开发之基础配置
原始文档地址下载:传送门(密码:3jfu) API reference:传送门 本篇博客基于Android Studio, Arcgis Runtime 100.5.0, 截止博客发布时均为最新版本, ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(15)、要素绘制Drawtools3.0工具DEMO
1.前言 移动GIS项目开发中点线面的要素绘制及编辑是最常用的操作,在ArcGIS Runtime SDK for iOS 自带AGSSketchLayer类可以帮助用户快速实现要素的绘制,图形编辑. ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(3)、ArcGIS Runtime SDK概述
1.前言 ArcGIS Runtime SDK是一整套用于构建原生及跨平台的地图应用程序的开发包,包括移动设备的Android.iOS.Windows Phone,针对桌面的.Net.Java.OSX ...
- ArcGIS Runtime SDK for Windows Phone 入门教程
ArcGIS Runtime SDK for Windows Phone 入门教程 基本概念 Windows Phone平台介绍 Windows Phone是微软发布的一款手机操作系统,它将微软旗下的 ...
- arcgis runtime sdk java部署和踩到的坑
环境:JKD11,arcgis-runtime-sdk-java-100.13.0 pom文件中配置如下:(另外还需要引用javafx的依赖,请自行百度) <dependency>< ...
最新文章
- 少儿编程python线上课程-北京Python程序开发课程
- c语言双分支结构运算符,c语言——运算符、分支结构、循环结构
- P4 详解各硬件部分
- 11G数据库导入10G的操作实践
- 无字库12864液晶屏滚动显示程序[转]
- Kotlin入门(28)Application单例化
- 老李分享知识:性能测试之TPS和吞吐率
- 领英linkedin跳转到国内的解决办法
- 通达信登录服务器文件夹,我也搞定了通达信交易系统多帐号登录交易!
- Kali Linux 暴力破解 wifi密码
- java ffmpeg swf_flash – ffmpeg:将仅音频flv转换为swf
- nginx代理图片服务器
- odroid平台——ASUS Xtion Pro Live + Openni + ROS搭建(Xu4升级版)
- asterisk连接sip139网络电话
- 基于android的有声听书系统
- 扁平风轮播图大屏展示html页面源码
- 下了个蓝屏代码查看工具,就中病毒了。。。什么鬼病毒,竟然还是用的VBS
- PIA Servlets
- ORACLE 表空间扩展方法,ORACLE 表空间扩展方法
- H5视频之直播流服务搭建(一)
热门文章
- 基于头脑风暴优化的BP神经网络(预测应用) - 附代码
- 特征选择-嵌入式选择
- 5G技术中的无源光器件(三)
- 高清无线手机投屏电脑软件Airserver7全平台兼容
- 教你用TensorFlow实现手写数字识别
- 2021-2025年中国体声波(BAW)射频滤波器行业市场供需与战略研究报告
- 有赞放出的这21组私域电商数据藏着2022年新机会
- arcgis fishnet 单位_Arcgis CreateFishnet工具,生成到FileGDB中要素类的格网大小不一致...
- 内推比例提升100%,离不开用产品运营的方式做招聘
- LINUX 修复MBR扇区故障