畢業設計總結:(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

第三篇文章算是總結和其他功能的描述。權當自娛自樂,也給自己的學習梳理下思路。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM