首页 > 代码库 > 毕业设计总结:(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 URL的显示,这个就是我们要调用的东西。而REST协议和SOAP协议的区别以及优劣大家可以去网络上自己搜索,简单来说就是REST更为轻便,协议调用更为简单。

有了这个我们就可以在VS 2010 中调用GP工具。不过在调用之前,我们还需要做几件准备工作。

首先要做的就是对ESRI插件的调用,GP工具的借口之类的,VS里肯定没有,因此只有调用了ESRI的插件,才使得整个程序能够成功的调用GP工具。引用

.Client是必须要添加的,添加完插件还要对添加的组件进行声明,否则VS无法识别。

在MainPage.xaml中(最顶头的地方)添加如下代码:

xmlns:esri="http://schemas.esri.com/arcgis/client/2009"

现在就可以进行GP工具的调用了。

调用的过程其实很简单,从编程的角度来讲,就是声明事件,定义事件,完成调用。首先在.cs中声明一个地理处理服务事件,在 

public partial class MainPage : UserControl

中完成对事件的定义:

Geoprocessor MyGeoprocessor;

接着便是事件的具体编写:

MyGeoprocessor = new Geoprocessor("http://localhost:6080/arcgis/rest/services/56HG/HydrologyTool/GPServer/HydrologyTool"); MyGeoprocessor.JobCompleted += new EventHandler<JobInfoEventArgs>(MyGeoprocessor_JobCompleted); MyGeoprocessor.GetResultDataCompleted += new EventHandler<GPParameterEventArgs>(MyGeoprocessor_GetResultDataCompleted); MyGeoprocessor.GetResultImageLayerCompleted += new EventHandler<GetResultImageLayerEventArgs>(MyGeoprocessor_GetResultImageLayerCompleted); MyGeoprocessor.Failed += new EventHandler<TaskFailedEventArgs>(MyGeoprocessor_Failed);

具体的例子ESRI官网和帮助文档里都有,大家只要肯学习就可以了。

完成调用:

HttpWebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp); //定义GP服务参数:InterpolationJobParameter List<GPParameter> MyGeoprocessorJobParameter = new List<GPParameter>(); //请求河流网提取的GP工具服务 MyGeoprocessor.SubmitJobAsync(MyGeoprocessorJobParameter);

获取栅格数据可以通过地理处理服务的GetResultImageLayerCompleted事件来获得结果,但是我们需要在地理处理服务的Completed事件中进行请求,Completed事件表示本次地理处理任务已经完成,接下来才能获取地理处理服务的结果。

在开始部分我们已经注册地理处理服务的JobCompleted,GetResultDataCompleted和GetResultImageLayerCompleted事件,接下来在相应部分完成相对各个函数的编写。

其中JobCompleted是获取结果的前提,所有的获取地理处理结果的请求,都要等地理处理服务完成(及JobCompleted),同时请求结果的时候不能同时请求两个结果,如获取的最终的矢量河流网数据的代码如下:

private void MyGeoprocessor_JobCompleted(object sender, JobInfoEventArgs e) { if (e.JobInfo.JobStatus == esriJobStatus.esriJobFailed) { MessageBox.Show("请求服务失败!" + e.JobInfo.Messages.ToString()); return; } HttpWebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp); //获取GP服务结果,这里需要注意的是结果的名称必须和我们发布的GP服务参数列表一致 MyGeoprocessor.GetResultDataAsync(e.JobInfo.JobId, "StreamT_stream_shp"
);    
    
        }

对获取结果失败的弹窗提示:

private void MyGeoprocessor_Failed(object sender, TaskFailedEventArgs e) { MessageBox.Show(e.Error.ToString()); MyBusyIndicator.IsBusy = false
;
        }

完成对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中直接调用两个结果.

网站页面:

111

载入底图,即调用DEM底图服务:3333

河流网提取结果:1231

第三篇文章算是总结和其他功能的描述。权当自娱自乐,也给自己的学习梳理下思路。