接上文,在编写代码之前我们先回忆一下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(二)相关推荐

  1. ArcGIS Runtime SDK for .NET 100.0中如何执行.gpk(一)

    ArcGIS Runtime 100.0 SDKs 于2016年11月发布,是ArcGIS Runtime采用全新架构下的第一个商业版本,新架构下的Runtime采用了统一的API,方便用户使用的同时 ...

  2. ArcGIS Runtime SDK for Android 100使用比例尺、指北针、书签

    需求: 如何在ArcGIS Runtime SDK for Android 100.x中实现比例尺.指北针.书签等功能 效果图: 例如:比例尺和指北针效果 实现思路: 使用arcgis-runtime ...

  3. ArcGIS Runtime SDK for .Net 100.6 如何加载本地数据

    由于ArcGIS Engine的32位.部署繁重.不适应新一代Web GIS的发展等缺点,Esri推出了ArcGIS Runtime产品,该产品因其64位.部署轻便.跨平台.更好地适应新一代Web G ...

  4. element 点击控制expend的显示隐藏_四、ArcGIS Runtime SDK for iOS 100.X教程系列之图层控制显示隐藏...

    一个图层服务上多个图层时,结合服务的链接地址访问查看详细信息进行代码编写会更方便,形如以下这个arcgis服务: http://arcgis.wuhanrt.cn:6080/arcgis/rest/s ...

  5. 基于Arcgis Runtime SDK 100.x 的Android GIS开发之基础配置

    原始文档地址下载:传送门(密码:3jfu) API reference:传送门 本篇博客基于Android Studio, Arcgis Runtime 100.5.0, 截止博客发布时均为最新版本, ...

  6. 《ArcGIS Runtime SDK for Android开发笔记》——(15)、要素绘制Drawtools3.0工具DEMO

    1.前言 移动GIS项目开发中点线面的要素绘制及编辑是最常用的操作,在ArcGIS Runtime SDK for iOS 自带AGSSketchLayer类可以帮助用户快速实现要素的绘制,图形编辑. ...

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

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

  8. ArcGIS Runtime SDK for Windows Phone 入门教程

    ArcGIS Runtime SDK for Windows Phone 入门教程 基本概念 Windows Phone平台介绍 Windows Phone是微软发布的一款手机操作系统,它将微软旗下的 ...

  9. arcgis runtime sdk java部署和踩到的坑

    环境:JKD11,arcgis-runtime-sdk-java-100.13.0 pom文件中配置如下:(另外还需要引用javafx的依赖,请自行百度) <dependency>< ...

最新文章

  1. 少儿编程python线上课程-北京Python程序开发课程
  2. c语言双分支结构运算符,c语言——运算符、分支结构、循环结构
  3. P4 详解各硬件部分
  4. 11G数据库导入10G的操作实践
  5. 无字库12864液晶屏滚动显示程序[转]
  6. Kotlin入门(28)Application单例化
  7. 老李分享知识:性能测试之TPS和吞吐率
  8. 领英linkedin跳转到国内的解决办法
  9. 通达信登录服务器文件夹,我也搞定了通达信交易系统多帐号登录交易!
  10. Kali Linux 暴力破解 wifi密码
  11. java ffmpeg swf_flash – ffmpeg:将仅音频flv转换为swf
  12. nginx代理图片服务器
  13. odroid平台——ASUS Xtion Pro Live + Openni + ROS搭建(Xu4升级版)
  14. asterisk连接sip139网络电话
  15. 基于android的有声听书系统
  16. 扁平风轮播图大屏展示html页面源码
  17. 下了个蓝屏代码查看工具,就中病毒了。。。什么鬼病毒,竟然还是用的VBS
  18. PIA Servlets
  19. ORACLE 表空间扩展方法,ORACLE 表空间扩展方法
  20. H5视频之直播流服务搭建(一)

热门文章

  1. 基于头脑风暴优化的BP神经网络(预测应用) - 附代码
  2. 特征选择-嵌入式选择
  3. 5G技术中的无源光器件(三)
  4. 高清无线手机投屏电脑软件Airserver7全平台兼容
  5. 教你用TensorFlow实现手写数字识别
  6. 2021-2025年中国体声波(BAW)射频滤波器行业市场供需与战略研究报告
  7. 有赞放出的这21组私域电商数据藏着2022年新机会
  8. arcgis fishnet 单位_Arcgis CreateFishnet工具,生成到FileGDB中要素类的格网大小不一致...
  9. 内推比例提升100%,离不开用产品运营的方式做招聘
  10. LINUX 修复MBR扇区故障