李恒民,李娜,曾慶飛,張照杰
(山東正元地理信息工程有限責(zé)任公司,山東濟(jì)南 250101)
Silverlight API實現(xiàn)富客戶端展示的時候,緩沖區(qū)分析往往傾向于調(diào)用封裝Query方法來實現(xiàn)緩沖區(qū)查詢,計算并返回緩沖區(qū)內(nèi)影響到的所有地物,對于緩沖區(qū)內(nèi)地物進(jìn)行統(tǒng)計的計算并不多見,在客戶端也沒有較好的方法實現(xiàn)。對于設(shè)計拓?fù)溆嬎愫徒徊婷娣e計算的統(tǒng)計,客戶端不好實現(xiàn),而Silverlight通過Webservice調(diào)用AO的方式,能夠輕松解決這些問題,故此處使用WebService方式,采用HTTP協(xié)議傳送數(shù)據(jù),在服務(wù)器端實現(xiàn)拓?fù)溆嬎?,并在客戶端調(diào)用Webservice服務(wù),實現(xiàn)緩沖區(qū)壓覆面積統(tǒng)計。
Buffer操作創(chuàng)建多邊形圖形,這些多邊形通過在輸入圖形周圍計算指定距離的緩沖區(qū)得到。該操作以BufferParameters對象作為輸入,該對象包括了用于進(jìn)行緩沖的圖形,指定的距離和單位,操作和輸出圖形所用的空間參考,以及是否在結(jié)果中聯(lián)合重復(fù)的圖形[1]。ArcGIS Server API for Silverlight實現(xiàn)緩沖區(qū)分析,需要用到geometry service,這是ArcGIS Server 9.3中提供的一種服務(wù),提供對幾何圖形的操作,比如buffering,simplifying,計算面積/長度,或投影,特別適合于使用Silverlight API建立的應(yīng)用程序。geometry service只對于管理員和開發(fā)者可見,連接到服務(wù)器的用戶并不能看見geometry service,默認(rèn)情況下不能使用,必須為自己的應(yīng)用程序手動創(chuàng)建它。
要創(chuàng)建geometry service,必須用“Geometry”命名,每個服務(wù)器上只能有一個geometry service;但可以允許該服務(wù)的多個實例,Geometry services總是池化的,可以和其他服務(wù)一樣停止,啟動和刪除[2]。
對使用geometry service,首先需要對這個服務(wù)進(jìn)行調(diào)用:
其中括號內(nèi)的地址為Geometry服務(wù)的URL,是ArcGIS的Rest服務(wù),所以,其中的 rest不可少,localhost為本地服務(wù),網(wǎng)絡(luò)服務(wù)需要書寫機器名或IP地址,如地址書寫為:”http://ZYGIS/ArcGIS/rest/services/Geometry/GeometryServer”。
緩沖區(qū)分析的參數(shù)需要在程序中進(jìn)行設(shè)定:
其中,BufferSpatialReference和OutSpatialReference為空間參考,須與主地圖的空間參考相一致,此處程序中采用主地圖的空間參考mainMap.SpatialReference;Features為待緩沖的圖形,一般為用戶輸入的點線面。如下代碼是緩沖區(qū)分析完成事件:
這樣緩沖區(qū)分析得到的圖形即可輸出到名為"AnalysisLayer"的GraphicsLayer圖層上。
AO本身是COM組件,.NET是利用 COMInterop技術(shù)與其打交道的,顯然Silverlight的客戶端環(huán)境不能實現(xiàn),需要與服務(wù)器端進(jìn)行通信。Silverlight與服務(wù)器端通信,最常用的是WebClient類,稍復(fù)雜的還有Http-WebRequest類,而傳統(tǒng)的 ASP.NET WebService與WCF則為遠(yuǎn)程調(diào)用AO提供了可能[3]。
Silverlight前臺工程所使用的動態(tài)庫包括ESRI.ArcGIS.Client;緩沖區(qū)分析生成的圖形類型為ESRI.ArcGIS.Client.Graphic,但 Silverlight 后臺工程所使用的動態(tài)庫為:ESRI.ArcGIS.Geometry;在后臺調(diào)用 AO進(jìn)行多邊形交叉面積計算,需要用到的圖形類型為ESRI.ArcGIS.Geometry.IGeometry,故需要將前臺的圖形進(jìn)行相應(yīng)的轉(zhuǎn)換后,由參數(shù)傳給后臺。
取graphic的圖形 graphic.Geometry,將其轉(zhuǎn)化為坐標(biāo)字符串,緩沖區(qū)生成的圖形為Polygon,故使用下列轉(zhuǎn)換方法進(jìn)行轉(zhuǎn)化:
系統(tǒng)自定義的Geometry類型,繼承自IGeometry,并定義其構(gòu)成字符串string WKT{get;set;}以及設(shè)定字符串的方法bool SetWkt(string WKT);此處只列出參數(shù)的設(shè)定:
根據(jù)自定義Geometry與IGeometry的關(guān)系,定義轉(zhuǎn)換函數(shù) ToGeometry,將前臺傳來的字符串轉(zhuǎn)換為IGeometry,完成Graphic參數(shù)的傳遞。
通過Web服務(wù)可以共享數(shù)據(jù),還可以調(diào)用其他應(yīng)用程序生成的數(shù)據(jù),而不用考慮其他應(yīng)用程序如何生成這些數(shù)據(jù)。Web服務(wù)需要一系列的協(xié)議來實現(xiàn),如:HTTP協(xié)議SMTP、FTP;簡單對象訪問協(xié)議SOAP。Web服務(wù)的運作還需要Web服務(wù)描述語言WSDL和統(tǒng)一描述發(fā)現(xiàn)集成協(xié)議UDDI的支持。建立Web服務(wù)實質(zhì)就是在支持SOAP通信的類中建立一個或多個方法[4]。
在WEB工程中建立WebService如下,在其中調(diào)用公共類中定義的方法,并設(shè)定返回數(shù)據(jù):
緩沖區(qū)壓覆的地物面積的計算基本思想:
(1)打開數(shù)據(jù),對所分析圖層進(jìn)行查詢,將所有主屬性字段得到
(2)對所有主屬性字段進(jìn)行循環(huán),找到所有與緩沖區(qū)相交的圖形,并利用空間分析,求出多邊形相交部分,并求出相交面積。
首先,需要定義IGeometry為拓?fù)洳僮鱅TopologicalOperator,并對其進(jìn)行Simplify操作:
為后面的拓?fù)溆嬎阕鰷?zhǔn)備。
其次,定義存放數(shù)據(jù)的SortedList,并定義空間查詢
當(dāng)pFeature符合條件時,進(jìn)行空間拓?fù)溆嬎?
使用pTop.Intersect求出相交部分,并定義 IArea以獲取相交面積
在Silverlight工程中添加服務(wù)引用,在地址欄,輸入新建的WebService服務(wù)的地址,http://localhost/QZServices/WebService/MapService.asmx,并定義服務(wù)名稱,重新生成并更新引用后,將能夠在客戶端調(diào)用此方法。
分析完成事件中,將統(tǒng)計結(jié)果填充到dataGrid:
圖1 緩沖區(qū)壓覆面積統(tǒng)計結(jié)果
任意緩沖區(qū)的壓覆面積統(tǒng)計結(jié)果如圖1所示。在圖形中輸入任意圖形,即自動產(chǎn)生緩沖區(qū),并將緩沖區(qū)壓覆范圍中相關(guān)圖層的壓覆面積按照主屬性統(tǒng)計出來,統(tǒng)計面積使用單位為默認(rèn)平方米,也可以將平方米轉(zhuǎn)換為畝等用戶使用方便的單位,將結(jié)果以表格形式列出,并將總量累計統(tǒng)計。
文中實現(xiàn)了Silverlight API對AO的簡單調(diào)用,并實現(xiàn)了緩沖區(qū)壓覆地物的面積統(tǒng)計,為客戶端調(diào)用AO計算方法提供了實例,但只是簡單的實例計算,對于復(fù)雜的統(tǒng)計計算并未進(jìn)行深入研究,希望在未來的工作中進(jìn)行進(jìn)一步研究。
[1]Robert W.Sebesta.Web程序設(shè)計(2010版)[M].北京:清華大學(xué)出版社,2010.
[2]黃東.ArcGIS API for Silverlight應(yīng)用開發(fā)教程[R].ESRI中國(北京)有限公司培訓(xùn)材料,2011.
[3]http://bbs.esrichina -bj.cn/ESRI/thread -48129 -1 -1.html
[4]http://bbs.esrichina - bj.cn/ESRI/viewthread.php?tid=73505