首页 > 代码库 > 毕业设计总结:(2)GP工具调用
毕业设计总结:(2)GP工具调用
感谢论坛博主@Mr|Right的文章以及他对我的帮助。
在上一篇文章中已经完成了GP工具的发布,这篇文章中主要涉及到GP工具的调用。
废话不多说,直接开始。
系统开发的硬件配置:
操作系统:Windows 8.1 专业版
软件平台:ArcGIS 10.1(包括Server 10.1和Desktop 10.1)
ArcGIS API 3.1 for Silverlight
Visual Studio 2010
Microsoft Silverlight 5 SDK
Microsoft Access 2013
浏览器端:IE浏览器
软件平台主要是ArcGIS 10.1和Visual Studio 2010,还有很多是ArcGIS针对Silverlight的插件,而Silverlight是什么大家可以自行百度。
在VS中新建项目,选择C#下的Silverlight应用程序,关于在网站中和Silverlight拼接的问题,我查阅了一些资料。某个可恶的同学说Silverlight没有前途,我就不做过多介绍了。
在ArcGIS Server Manager界面,会有参数设置。
如上图所示,右侧会有REST URL的显示,这个就是我们要调用的东西。而REST协议和SOAP协议的区别以及优劣大家可以去网络上自己搜索,简单来说就是REST更为轻便,协议调用更为简单。
有了这个我们就可以在VS 2010 中调用GP工具。不过在调用之前,我们还需要做几件准备工作。
首先要做的就是对ESRI插件的调用,GP工具的借口之类的,VS里肯定没有,因此只有调用了ESRI的插件,才使得整个程序能够成功的调用GP工具。
.Client是必须要添加的,添加完插件还要对添加的组件进行声明,否则VS无法识别。
在MainPage.xaml中(最顶头的地方)添加如下代码:
现在就可以进行GP工具的调用了。
调用的过程其实很简单,从编程的角度来讲,就是声明事件,定义事件,完成调用。首先在.cs中声明一个地理处理服务事件,在
中完成对事件的定义:
Geoprocessor MyGeoprocessor;
接着便是事件的具体编写:
具体的例子ESRI官网和帮助文档里都有,大家只要肯学习就可以了。
完成调用:
获取栅格数据可以通过地理处理服务的GetResultImageLayerCompleted事件来获得结果,但是我们需要在地理处理服务的Completed事件中进行请求,Completed事件表示本次地理处理任务已经完成,接下来才能获取地理处理服务的结果。
在开始部分我们已经注册地理处理服务的JobCompleted,GetResultDataCompleted和GetResultImageLayerCompleted事件,接下来在相应部分完成相对各个函数的编写。
其中JobCompleted是获取结果的前提,所有的获取地理处理结果的请求,都要等地理处理服务完成(及JobCompleted),同时请求结果的时候不能同时请求两个结果,如获取的最终的矢量河流网数据的代码如下:
);
}
对获取结果失败的弹窗提示:
;
}
完成对GP服务结果的绘制,由于GP工具处理的结果是矢量的线段,因此设置好颜色和宽度后很容易就绘制出来:
private void MyGeoprocessor_GetResultDataCompleted(object sender, GPParameterEventArgs e) { GPRecordSet gpr = e.Parameter as GPRecordSet; if (map1.Layers["ContourLayer"] != null) { map1.Layers.Remove(map1.Layers["ContourLayer"]); } GraphicsLayer contourLayer = new GraphicsLayer() { ID = "ContourLayer" }; GPFeatureRecordSetLayer featureSetLayer = e.Parameter as GPFeatureRecordSetLayer; //遍历结果获取其中包含的要素,并添加到河流网图层中 foreach (Graphic graphic in featureSetLayer.FeatureSet.Features) { //设置河流网的样式 graphic.Symbol = new SimpleLineSymbol() { Style = SimpleLineSymbol.LineStyle.Solid, Color = new SolidColorBrush(Colors.Blue), Width = 1.2 }; contourLayer.Graphics.Add(graphic); } //将结果添加到当前的地图中 map1.Layers.Add(contourLayer); MessageBox.Show("水网矢量生成完成!"); }
等等,总之如果你有编程基础的话,大致意思你都能看懂(其实很基础,但题主也是水货,懒得讲清楚)。
当然由于河流网的提取的结果是矢量线段,如果处理的结果是一张图片的话,就需要换一种调用方式,比如在洼地填充(fill)函数中,有个可选输出项是下降率栅格输出图像,想要调用这个服务就必须现在ArcGIS Server Manager页面中勾选“异步调用”中的“查看含地图服务的结果”:
在VS中,则要完成对GetResultImageLayerCompleted事件的定义。
private void MyGeoprocessor_GetResultImageLayerCompleted(object sender, GetResultImageLayerEventArgs e) { //返回的结果实际上是一张图片 GPResultImageLayer imagelayer = e.GPResultImageLayer; //定义图层的ID imagelayer.ID = "InterpolationLayer"; //设置透明度 imagelayer.Opacity = 0.7; imagelayer.DisplayName = "下降率栅格图层"; //清空原有的结果 if (map1.Layers["InterpolationLayer"] != null) { map1.Layers.Remove(map1.Layers["Interpolation"]); } //添加当前结果到图层中 map1.Layers.Add(imagelayer); //获取坡度统计表格数据 MyGeoprocessor.GetResultDataAsync(jobID, "ZonalTable"); }
在JobCompleted中添加:
MyGeoprocessor.GetResultImageLayerAsync(e.JobInfo.JobId, "OutputRaster");
ok,但要注意每次只能返回一个结果,所以不能同时在JobCompleted中直接调用两个结果.
网站页面:
载入底图,即调用DEM底图服务:
河流网提取结果:
第三篇文章算是总结和其他功能的描述。权当自娱自乐,也给自己的学习梳理下思路。