Silverlight调用GP服务第二篇之调用GP服务(Geoprocessing Service)过程详解
2012-11-03 13:06
501 查看
[b]Silverlight调用GP服务详解[/b]
上一篇主要讲了如何发布GP服来绘制等值线及等直面,这里主要将如何通过Silverlight来调用GP服务。
这里先写一下具体的调用过程:
声明GP服务变量(Geoprocessor),并实例化
注册GP服务任务完成事件及失败事件
根据发布的GP服务,定义GP服务的参数
输入GP服务参数请求GP服务
获取结果:在Compeleted事件函数中完成获取结果的代码,对于是要素类结果,需要注册GetResultDataCompleted事件,对于是栅格数据结果需要注册GetResultImageLayerCompleted事件,然后在事件的回调函数中完成最终结果的获取。
这里需要注意的问题:
a. GP服务是同步调用还是异步调用
b. 获得结果的坐标系是否和当前一致
c. GP服务的输入参数必须和发布的GP服务一致(之后会详细说明)
d. 获取结果的名称必须和发布的GP服务一致(之后会详细讲到)
以上大致的说了一下GP服务调用的基本过程,下面就开始正式的工作吧。
[b]一.基本界面[/b]
首先我们构建一个简单的Web界面,如下图所示:
View Code
4.2 定义GP服务的请求参数
这里需要的参数必须和我们发布的GP服务一致。我们打开绘制等值线的GP服务链接,基本参数如下所示:
以上是绘制等值面的GP服务参数列表,并给出了参数信息的详细说明,这里我们可以看出绘制等值面的GP服务只有一个输入参数:PollutionPoints,类型是GPFeatureRecordSetLayer,也就是要素集。同时只有一个输出参数:RasterData,类型是GPRasterDataLayer,即栅格数据。
下面我们定义绘制等值面的GP服务参数。
注意这里的PollutionPoints,这里的名称必须和之前我们发布的GP服务参数列表一致。而且还需要注意这里的GP服务参数类型,必须是要素集。
同理,我们可以看看绘制等值线的GP服务参数列表,如下图所示:
后台定义的绘制等值线的GP服务参数代码:
注意上面的GP服务参数名称必须保持一致。
五.获取GP服务的结果,并在地图上显示
之前说过,请求GP服务结果都会有一个Completed事件,所以我们获取结果的代码将在该事件回调函数中完成。之前我们已注册了GP事件,其回调函数如下:
下面我们就开始获取等值面的结果。
在请求等值面GP服务的完成事件中添加如下代码:
注意这里的RasterData必须和之前我们发布的GP服务输出参数名称一致,否则将无法获取到结果。
这里我们注意到,GetResultImageLayerAsync也是一个异步请求,因此我们需要在其完成事件的回调函数中获得最终的结果,之前我们已经注册了其完成的事件函数,现在添加如下代码:
这里说明一点:由于栅格数据不支持在Web客户端直接读取,因此我们通过结果地图服务,将其在服务器端根据我们设置的渲染格式,生成一张图片。然后在客户端实际上是获取这张图片,而不是栅格数据,当客户端的地图范围发生改变时(移动,缩放),就会在服务器端动态的生成响应的图片,并在Web客户端显示其相应的结果。
最后,你还可以在Failed事件中添加GP服务请求失败时的相应处理。
以上的过程便是获取GP绘制等直面的结果。
下面是获得的结果:
点击加载xml文档,打开xml文件,就会添加相应的Graphic,如下图所示:
接着点击预测,结果如下:
接下来,我们看看如何获取等值线的结果。其过程和等值面的获取相似,只不过等值线的结果是线要素,而等值面则是一张图片,两则在获取和显示上有一点点的差别。
下面是绘制等值线GP请求的Completed事件响应函数代码,和等值面的差不多,唯一不同的就是异步请求的函数,以及阐述不一样。
同样需要注意请求结果的参数必须和发布的等值线GP服务输出参数名称一致。
然后我们在GetResultDataCompleted事件响应函数中添加相应的代码获取结果,并在地图上显示出来。代码如下:
同理添加GP服务请求失败处理函数:
这样获取等值线结果的工作已经完成,下面看一看效果:
到此,关于Silverlight调用GP服务绘制等值线以及等值面的所有过程已经讲述完毕。
(版权所有,转载请标明出处)
上一篇主要讲了如何发布GP服来绘制等值线及等直面,这里主要将如何通过Silverlight来调用GP服务。
这里先写一下具体的调用过程:
声明GP服务变量(Geoprocessor),并实例化
注册GP服务任务完成事件及失败事件
根据发布的GP服务,定义GP服务的参数
输入GP服务参数请求GP服务
获取结果:在Compeleted事件函数中完成获取结果的代码,对于是要素类结果,需要注册GetResultDataCompleted事件,对于是栅格数据结果需要注册GetResultImageLayerCompleted事件,然后在事件的回调函数中完成最终结果的获取。
这里需要注意的问题:
a. GP服务是同步调用还是异步调用
b. 获得结果的坐标系是否和当前一致
c. GP服务的输入参数必须和发布的GP服务一致(之后会详细说明)
d. 获取结果的名称必须和发布的GP服务一致(之后会详细讲到)
以上大致的说了一下GP服务调用的基本过程,下面就开始正式的工作吧。
[b]一.基本界面[/b]
首先我们构建一个简单的Web界面,如下图所示:
View Code
//等值线GP服务 ContourTask = new Geoprocessor("http://qzj-pc/ArcGIS/rest/services/ContourService_with_Focal_Statistics/GPServer/ContourService"); ContourTask.JobCompleted += new EventHandler<JobInfoEventArgs>(ContourTask_JobCompleted); ContourTask.GetResultDataCompleted += new EventHandler<GPParameterEventArgs>(ContourTask_GetResultDataCompleted); ContourTask.Failed += new EventHandler<TaskFailedEventArgs>(ContourTask_Failed); //等值面GP服务 InterpolationTask = new Geoprocessor("http://qzj-pc/ArcGIS/rest/services/InterpolationService_Stretch/GPServer/InterpolationModel"); InterpolationTask.JobCompleted += new EventHandler<JobInfoEventArgs>(InterpolationTask_JobCompleted); InterpolationTask.GetResultImageLayerCompleted += new EventHandler<GetResultImageLayerEventArgs>(InterpolationTask_GetResultImageLayerCompleted); InterpolationTask.Failed += new EventHandler<TaskFailedEventArgs>(InterpolationTask_Failed);
4.2 定义GP服务的请求参数
这里需要的参数必须和我们发布的GP服务一致。我们打开绘制等值线的GP服务链接,基本参数如下所示:
以上是绘制等值面的GP服务参数列表,并给出了参数信息的详细说明,这里我们可以看出绘制等值面的GP服务只有一个输入参数:PollutionPoints,类型是GPFeatureRecordSetLayer,也就是要素集。同时只有一个输出参数:RasterData,类型是GPRasterDataLayer,即栅格数据。
下面我们定义绘制等值面的GP服务参数。
//添加这段代码,非常有用,否则将无法获取GP服务的结果 HttpWebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp); //将从xml中解析出来的点构建成要素集,并作为我们GP服务输入的参数 FeatureSet featureSet = new FeatureSet(graphicsLayer.Graphics); //定义GP服务参数:InterpolationJobParameter List<GPParameter>InterpolationJobParameter = new List<GPParameter>(); //添加GP服务参数 InterpolationJobParameter.Add(new GPFeatureRecordSetLayer("PollutionPoints", featureSet)); //请求等直面GP服务 InterpolationTask.SubmitJobAsync(InterpolationJobParameter);
注意这里的PollutionPoints,这里的名称必须和之前我们发布的GP服务参数列表一致。而且还需要注意这里的GP服务参数类型,必须是要素集。
同理,我们可以看看绘制等值线的GP服务参数列表,如下图所示:
后台定义的绘制等值线的GP服务参数代码:
//定义绘制等值线的GP服务参数 List<GPParameter> ContourJobParameter = new List<GPParameter>(); //添加要素集参数 ContourJobParameter.Add(new GPFeatureRecordSetLayer("PollutionPoints", featureSet)); //添加等值线间距参数 ContourJobParameter.Add(new GPDouble("Contour_interval", 4.0001)); //添加容差设置参数 ContourJobParameter.Add(new GPLinearUnit("XY_Tolerance", esriUnits.esriMeters, 1)); //请求等值线GP服务 ContourTask.SubmitJobAsync(ContourJobParameter);
注意上面的GP服务参数名称必须保持一致。
五.获取GP服务的结果,并在地图上显示
之前说过,请求GP服务结果都会有一个Completed事件,所以我们获取结果的代码将在该事件回调函数中完成。之前我们已注册了GP事件,其回调函数如下:
下面我们就开始获取等值面的结果。
在请求等值面GP服务的完成事件中添加如下代码:
private void InterpolationTask_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服务参数列表一致 InterpolationTask.GetResultImageLayerAsync(e.JobInfo.JobId, "RasterData"); }
注意这里的RasterData必须和之前我们发布的GP服务输出参数名称一致,否则将无法获取到结果。
这里我们注意到,GetResultImageLayerAsync也是一个异步请求,因此我们需要在其完成事件的回调函数中获得最终的结果,之前我们已经注册了其完成的事件函数,现在添加如下代码:
private void InterpolationTask_GetResultImageLayerCompleted(object sender, GetResultImageLayerEventArgs e) { //返回的结果实际上是一张图片 GPResultImageLayer imagelayer = e.GPResultImageLayer; //定义图层的ID imagelayer.ID = "InterpolationLayer"; //设置透明度 imagelayer.Opacity = 0.7; //清空原有的结果 if (map.Layers["InterpolationLayer"] != null) { map.Layers.Remove(map.Layers["Interpolation"]); } //添加当前结果到图层中 map.Layers.Add(imagelayer); MessageBox.Show("绘制完成!"); }
这里说明一点:由于栅格数据不支持在Web客户端直接读取,因此我们通过结果地图服务,将其在服务器端根据我们设置的渲染格式,生成一张图片。然后在客户端实际上是获取这张图片,而不是栅格数据,当客户端的地图范围发生改变时(移动,缩放),就会在服务器端动态的生成响应的图片,并在Web客户端显示其相应的结果。
最后,你还可以在Failed事件中添加GP服务请求失败时的相应处理。
private void InterpolationTask_Failed(object sender, TaskFailedEventArgs e) { MessageBox.Show("请求服务失败:" + e.Error.ToString()); }
以上的过程便是获取GP绘制等直面的结果。
下面是获得的结果:
点击加载xml文档,打开xml文件,就会添加相应的Graphic,如下图所示:
接着点击预测,结果如下:
接下来,我们看看如何获取等值线的结果。其过程和等值面的获取相似,只不过等值线的结果是线要素,而等值面则是一张图片,两则在获取和显示上有一点点的差别。
下面是绘制等值线GP请求的Completed事件响应函数代码,和等值面的差不多,唯一不同的就是异步请求的函数,以及阐述不一样。
private void ContourTask_JobCompleted(object sender, JobInfoEventArgs e) { if (e.JobInfo.JobStatus == esriJobStatus.esriJobFailed) { MessageBox.Show("请求等值线服务失败:" + e.JobInfo.Messages); return; } HttpWebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp); //请求绘制等值线GP服务,注意这里和等值面的异步请求函数不一样 ContourTask.GetResultDataAsync(e.JobInfo.JobId, "ContourLine_shp"); }
同样需要注意请求结果的参数必须和发布的等值线GP服务输出参数名称一致。
然后我们在GetResultDataCompleted事件响应函数中添加相应的代码获取结果,并在地图上显示出来。代码如下:
private void ContourTask_GetResultDataCompleted(object sender, GPParameterEventArgs e) { if (map.Layers["ContourLayer"] != null) { map.Layers.Remove(map.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 = 3 }; contourLayer.Graphics.Add(graphic); } //将结果添加到当前的地图中 map.Layers.Add(contourLayer); MessageBox.Show("等值线绘制完成!"); }
同理添加GP服务请求失败处理函数:
private void ContourTask_Failed(object sender, TaskFailedEventArgs e) { MessageBox.Show("请求等值线服务失败:" + e.Error.ToString()); }
这样获取等值线结果的工作已经完成,下面看一看效果:
到此,关于Silverlight调用GP服务绘制等值线以及等值面的所有过程已经讲述完毕。
(版权所有,转载请标明出处)
相关文章推荐
- Silverlight调用GP服务第二篇之调用GP服务(Geoprocessing Service)过程详解
- Silverlight调用GP服务第二篇之调用GP服务(Geoprocessing Service)过程详解
- Silverlight调用GP服务第二篇之调用GP服务(Geoprocessing Service)过程详解
- Silverlight 调用GP服务第一篇之发布GP服务(Geoprocessing Service)
- Silverlight 调用GP服务第一篇之发布GP服务(Geoprocessing Service)
- Silverlight 调用GP服务第一篇之发布GP服务(Geoprocessing Service)
- Silverlight 调用GP服务第一篇之发布GP服务(Geoprocessing Service)
- GP(Geoprocessing)服务的发布与调用
- GP(Geoprocessing)服务的发布与调用
- 【技术类】GP(Geoprocessing)服务的发布与调用
- 发布GP服务(Geoprocessing Service)
- 关于客户端无法获得服务器端GP服务(Geoprocessing Service)结果的解决办法
- 关于客户端无法获得服务器端GP服务(Geoprocessing Service)结果的解决办法
- 关于客户端无法获得服务器端GP服务(Geoprocessing Service)结果的解决办法
- Service之跨进程调用服务ADIL详解(二)
- ArcGIS API for Silverlight 调用GP服务加载等值线图层
- Android AudioPolicyService服务启动过程详解
- ArcGIS API for javascript开发笔记(四)——GP服务调用之GP模型的规范化制作详解
- Service跨进程调用服务三部曲之AIDL详解(二)
- ArcGIS API for Silverlight 调用GP服务加载等值线图层