李恒民,李娜,曾慶飛,張照杰
(山東正元地理信息工程有限責任公司,山東濟南 250101)
Silverlight API實現富客戶端展示的時候,緩沖區分析往往傾向于調用封裝Query方法來實現緩沖區查詢,計算并返回緩沖區內影響到的所有地物,對于緩沖區內地物進行統計的計算并不多見,在客戶端也沒有較好的方法實現。對于設計拓撲計算和交叉面積計算的統計,客戶端不好實現,而Silverlight通過Webservice調用AO的方式,能夠輕松解決這些問題,故此處使用WebService方式,采用HTTP協議傳送數據,在服務器端實現拓撲計算,并在客戶端調用Webservice服務,實現緩沖區壓覆面積統計。
Buffer操作創建多邊形圖形,這些多邊形通過在輸入圖形周圍計算指定距離的緩沖區得到。該操作以BufferParameters對象作為輸入,該對象包括了用于進行緩沖的圖形,指定的距離和單位,操作和輸出圖形所用的空間參考,以及是否在結果中聯合重復的圖形[1]。ArcGIS Server API for Silverlight實現緩沖區分析,需要用到geometry service,這是ArcGIS Server 9.3中提供的一種服務,提供對幾何圖形的操作,比如buffering,simplifying,計算面積/長度,或投影,特別適合于使用Silverlight API建立的應用程序。geometry service只對于管理員和開發者可見,連接到服務器的用戶并不能看見geometry service,默認情況下不能使用,必須為自己的應用程序手動創建它。
要創建geometry service,必須用“Geometry”命名,每個服務器上只能有一個geometry service;但可以允許該服務的多個實例,Geometry services總是池化的,可以和其他服務一樣停止,啟動和刪除[2]。
對使用geometry service,首先需要對這個服務進行調用:

其中括號內的地址為Geometry服務的URL,是ArcGIS的Rest服務,所以,其中的 rest不可少,localhost為本地服務,網絡服務需要書寫機器名或IP地址,如地址書寫為:”http://ZYGIS/ArcGIS/rest/services/Geometry/GeometryServer”。
緩沖區分析的參數需要在程序中進行設定:

其中,BufferSpatialReference和OutSpatialReference為空間參考,須與主地圖的空間參考相一致,此處程序中采用主地圖的空間參考mainMap.SpatialReference;Features為待緩沖的圖形,一般為用戶輸入的點線面。如下代碼是緩沖區分析完成事件:


這樣緩沖區分析得到的圖形即可輸出到名為"AnalysisLayer"的GraphicsLayer圖層上。
AO本身是COM組件,.NET是利用 COMInterop技術與其打交道的,顯然Silverlight的客戶端環境不能實現,需要與服務器端進行通信。Silverlight與服務器端通信,最常用的是WebClient類,稍復雜的還有Http-WebRequest類,而傳統的 ASP.NET WebService與WCF則為遠程調用AO提供了可能[3]。
Silverlight前臺工程所使用的動態庫包括ESRI.ArcGIS.Client;緩沖區分析生成的圖形類型為ESRI.ArcGIS.Client.Graphic,但 Silverlight 后臺工程所使用的動態庫為:ESRI.ArcGIS.Geometry;在后臺調用 AO進行多邊形交叉面積計算,需要用到的圖形類型為ESRI.ArcGIS.Geometry.IGeometry,故需要將前臺的圖形進行相應的轉換后,由參數傳給后臺。
取graphic的圖形 graphic.Geometry,將其轉化為坐標字符串,緩沖區生成的圖形為Polygon,故使用下列轉換方法進行轉化:

系統自定義的Geometry類型,繼承自IGeometry,并定義其構成字符串string WKT{get;set;}以及設定字符串的方法bool SetWkt(string WKT);此處只列出參數的設定:


根據自定義Geometry與IGeometry的關系,定義轉換函數 ToGeometry,將前臺傳來的字符串轉換為IGeometry,完成Graphic參數的傳遞。
通過Web服務可以共享數據,還可以調用其他應用程序生成的數據,而不用考慮其他應用程序如何生成這些數據。Web服務需要一系列的協議來實現,如:HTTP協議SMTP、FTP;簡單對象訪問協議SOAP。Web服務的運作還需要Web服務描述語言WSDL和統一描述發現集成協議UDDI的支持。建立Web服務實質就是在支持SOAP通信的類中建立一個或多個方法[4]。
在WEB工程中建立WebService如下,在其中調用公共類中定義的方法,并設定返回數據:

緩沖區壓覆的地物面積的計算基本思想:
(1)打開數據,對所分析圖層進行查詢,將所有主屬性字段得到

(2)對所有主屬性字段進行循環,找到所有與緩沖區相交的圖形,并利用空間分析,求出多邊形相交部分,并求出相交面積。
首先,需要定義IGeometry為拓撲操作ITopologicalOperator,并對其進行Simplify操作:

為后面的拓撲計算做準備。
其次,定義存放數據的SortedList,并定義空間查詢

當pFeature符合條件時,進行空間拓撲計算:

使用pTop.Intersect求出相交部分,并定義 IArea以獲取相交面積

在Silverlight工程中添加服務引用,在地址欄,輸入新建的WebService服務的地址,http://localhost/QZServices/WebService/MapService.asmx,并定義服務名稱,重新生成并更新引用后,將能夠在客戶端調用此方法。

分析完成事件中,將統計結果填充到dataGrid:


圖1 緩沖區壓覆面積統計結果
任意緩沖區的壓覆面積統計結果如圖1所示。在圖形中輸入任意圖形,即自動產生緩沖區,并將緩沖區壓覆范圍中相關圖層的壓覆面積按照主屬性統計出來,統計面積使用單位為默認平方米,也可以將平方米轉換為畝等用戶使用方便的單位,將結果以表格形式列出,并將總量累計統計。
文中實現了Silverlight API對AO的簡單調用,并實現了緩沖區壓覆地物的面積統計,為客戶端調用AO計算方法提供了實例,但只是簡單的實例計算,對于復雜的統計計算并未進行深入研究,希望在未來的工作中進行進一步研究。
[1]Robert W.Sebesta.Web程序設計(2010版)[M].北京:清華大學出版社,2010.
[2]黃東.ArcGIS API for Silverlight應用開發教程[R].ESRI中國(北京)有限公司培訓材料,2011.
[3]http://bbs.esrichina -bj.cn/ESRI/thread -48129 -1 -1.html
[4]http://bbs.esrichina - bj.cn/ESRI/viewthread.php?tid=73505