感謝論壇博主@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中直接調用兩個結果.
網站頁面:
第三篇文章算是總結和其他功能的描述。權當自娛自樂,也給自己的學習梳理下思路。