摘 要: 將ArcGIS Server地圖服務、WebServer服務集成于Adobe Flash Builder 4下,研究開發了基于ArcGIS Flex API的校園電子地圖展示軟件。該軟件提供了山西某大學詳細的地圖信息,不僅擁有常規地圖導航、支持屬性模糊查詢空間要素等功能,而且還對任意兩個熱點間最短路徑分析功能進行合理定制,對校園風光和人文歷史的展示產生了很好的效果。
關鍵詞: WebGIS;ArcGIS Flex API;RIA;地圖控件;最短路徑分析
隨著計算機技術的飛速發展,地理信息系統逐漸融入了人們生活的各個方面,作為其發展的必然趨勢之一的WebGIS也成為了諸多專家們所熱衷的研究領域。國內外的GIS廠家都推出各自的WebGIS產品,ArcGIS Flex API就是一種基于ArcGIS Server的一種客戶端應用開發框架。ArcGIS Flex API與Flash Builder 4結合可以構建出表現出色、交互體驗良好的富互聯網程序(RIA)。傳統的WebGIS電子地圖采用HTML頁面形式,在傳輸數據量大、實時性要求比較高時會存在一定延時,嚴重影響界面操作效率;富互聯網程序(RIA)可將桌面程序的表現力與瀏覽器的程序方便、快捷結合在一起,具有豐富的數據模型可將原來在后臺程序處理的問題現在轉移到客戶端,使數據能夠被緩存在客戶端,從而實現一個比基于HTML的響應速度更快、數據往返于服務器的次數更少的應用程序[1]。基于ArcGIS Flex API的校園電子地圖軟件針對地圖展示提供了山西某高校詳盡的地圖信息,不僅可以屬性模糊查詢定位目標,準確地對校園進行長度和面積的量算,為校園規劃管理提供參考;而且還可以準確地查找兩個關鍵點之間的最短路徑,為用戶進行簡潔的路線指引。
1 環境的搭建
首先,安裝ArcMap 10軟件,用于原始數據源處理;其次,完成ArcGIS Server 10軟件的安裝,作為整個應用程序的GIS服務器,提供必要的地圖服務。ArcGIS相關軟件安裝完成后,進行Microsoft Visual studio 2010和Microsoft SQL Server 2008的安裝;在VS2010環境下可以發布WebServer服務供前臺調用,Microsoft SQL Server 2008存儲數據庫。最后安裝Adobe Flash Builder4.0用于開發RIA。
2 服務為主體的開發流程
整個軟件基于B/S架構開發,因此如何合理發布、配置和調用服務自然而然成為整個開發過程的核心工作。在整個開發過程中主要涉及到地圖服務和WebServer服務兩大類,基于ArcGIS Server發布的不同種類的地圖服務是電子地圖展示功能實現的基礎,基于VS2010發布的WebServer服務是對客戶端管理員信息處理的后臺服務。服務為主體的開發流程如圖1所示。
3 基于ArcGIS Flex API地圖功能的實現
作為一套基于Flex開發運行在瀏覽器端的地圖API,ArcGIS Flex API可以滿足一些GIS開發需求,如地圖瀏覽、多個專題圖層疊加、地圖符號的客戶端繪制、動態對象跟蹤顯示(車輛、飛機等)、運行GIS相關的空間分析模型、屬性條件查詢、空間條件查詢和編輯適量數據[2]。把ArcGIS Flex API類庫文件添加到新工程中的library path選項卡里,就可以開始開發工作。基于ArcGIS Flex API的校園電子地圖主要功能包括地圖導航功能、地圖面積和距離量算、空間要素查詢定位、最短路徑分析等;按功能發布了相應的地圖服務和管理用戶信息的WebServer服務。
3.1 Map控件的使用
Map控件可以說是整個WebGIS程序開發的核心,它是一個粗粒度的類,其中封裝了大量的細粒度接口,如地圖空間范圍、空間參考、圖層集合和比例級別等[2]。Map控件相當于一個容器,可以包含多個地圖服務圖層,用來交互式瀏覽地圖。軟件設計中Map控件實現主要代碼如下。
<esri:Map id="mainMap" logoVisible="false"
mouseUp="mainMap_mouseUpHandler(event)
doubleClick="mainMap_doubleClickHandler(event)"
mouseOver="mainMap_mouseOverHandler(event)"
extentChange="mainMap_extentChangeHandler(event)"
left="0" right="1" top="78" bottom="0"
>
<!—用于顯示的動態地圖服務圖層-->
<esri:ArcGISDynamicMapServiceLayer
url="http://mypc/ArcGIS/rest/services/sxauGIS/MapServer" />
<!—用于氣泡顯示的矢量服務圖層-->
<esri:FeatureLayer
url="http://mypc/ArcGIS/rest/services/sxauFeatureLayer/
MapServer/0"
mode="selection"
id="myFeatureLayer"visible="false"
outFields="[imageSource,url,infor]"/>
<!—用于渲染查詢元素的圖層-->
<esri:GraphicsLayer id="myFindGraphicsLayer"
symbol="{baseSfs}"/>
……
</esri:Map>
id為mainMap的Map控件,其不僅包含了用于地圖直觀顯示的動態地圖服務圖層、用于氣泡顯示的矢量服務圖層,還包含了一系列作為客戶端渲染幾何矢量圖形(如查詢結果高亮顯示、路徑渲染等)載體的GraphicsLayer類型圖層。這些圖層為應用程序地圖功能實現提供了有利的保障。
3.2 地圖導航功能
NavigationTool是一個非可視化控件,常常要與界面控件結合,用于地圖的導航操作。由于Map控件內部本身就集成了鼠標滾輪放大、縮小及左鍵平移的功能;因此,在工具欄地圖導航功能添加了上一視圖、下一視圖(需對上下視圖不可用情況進行處理)、全圖顯示作為補充。應用程序工具欄如圖2所示。
首先定義NavigationTool控件實例,指定相關Map控件實例:
<esri:NavigationTool id="navigationTool"map="{mainMap}"/>
工具欄上3個導航功能實現方法類似,以全圖顯示(工具欄第3個)為例進行說明,在其對應的Image控件 實例單擊事件里添加如下代碼。
if(navigationTool.isFirstExtent==false&&this.initMapExtent!=this.mainMap.extent.extent)
{
//調用NavigationTool全圖顯示方法
navigationTool.zoomToFullExtent();
this.initMapExtent=this.mainMap.extent.extent;
}
else
{
Alert.show("當前視圖已為全圖顯示!","提示");
}
單擊事件處理函數里對當前地圖顯示狀態進行了判斷,若不為全圖顯示狀態則設定為全圖顯示狀態,為全圖顯示則彈框提示。
3.3 建筑物信息氣泡提示
氣泡是一種把業務數據和地圖結合在一起的有效方式[2]。地圖控件(Map)提供了一個infoWindow屬性用來在地圖上顯示氣泡信息,氣泡內容通過其infoWindowContent屬性控制,標題則是由其infoWindow屬性下label次級屬性控制。軟件中的氣泡提示格式是對氣泡內容進行了定制(自定義LabelDataRenderer組件,包含建筑物名稱、建筑物圖片和相關網址鏈接3部分內容,數據源則是通過對FeatureLayer服務圖層查詢得到,并在LabelDataRenderer實例加載時對實例屬性初始化),每次觸發氣泡提示實際上是目標建筑物對infoWindow的infoWindowContent屬性重新賦值;建筑物氣泡提示包含了兩種類型:展示狀態下氣泡提示和管理員編輯狀態下氣泡提示。管理員登錄后可以對建筑物氣泡屬性進行編輯并直接保存到后臺GIS服務器,如圖3所示。
3.4 模糊查詢建筑物中心定位
實現建筑物名稱模糊查詢(全部建筑物名稱綁定到ComboBox可初步實現)和建筑物查詢結果中心定位,如圖4所示。建筑物查詢采用QueryTask(可以執行空間查詢,又可以執行屬性查詢),會涉及到QueryTask、Query和FeatureSet 3個類。
第一步,實例化QueryTask,url屬性指向將要查詢的地圖服務圖層。
<!—定義查詢任務-->
<esri:QueryTask id="myQueryTask" url="http://mypc/ArcGIS/rest/services/sxauFeatureLayer/MapServer/0"/>
第二步,在查詢按鈕單擊事件里設置搜索參數Query實例。
//屬性查詢條件
query.where="NAME="+"′"+this.qText.textInput.text+"′";
myQueryOutFieldArr=new Array();
myQueryOutFieldArr.push("NAME");
//指定返回的字段
query.outFields=myQueryOutFieldArr;
query.returnGeometry=true;
第三步,提交請求注冊處理函數,渲染查詢結果到目標圖層上。
/*提交注冊處理函數,onNameQueryResult為結果回調函數,onNameQueryFault是錯誤處理函數*/
myQueryTask.execute(query,newAsyncResponder(onNameQueryResult
,onNameQueryFault));
最后,onNameQueryResult函數中派發事件向主程序傳遞Graphic類型的數組,在主程序中將查詢結果添加到相應的GraphicLayer圖層上,中心地位的功能則是參照查詢結果Graphic的extent屬性加入一定偏移量賦值給地圖控件的extent屬性,從而間接地達到查詢結果中心定位顯示。
3.5 距離測量和面積測量
將距離測量和面積測量設計到了管理員權限范圍,它們屬于地圖空間分析的范疇,在客戶端完全實現不太現實,ArcGIS Flex API中GeometryService類提供了各種空間分析功能,客戶端請求服務器端,等待服務器端返回結果,最后計算完成事件,整個過程異步執行。首先發布一個幾何服務(Geometry)供GeometryService類實例引用,設定距離所需參數、面積所需參數傳入GeometryService類實例的用于測距離(lengths)、用于測面積(areasAndLengths)方法,最后在GeometryService類實例中lengthsComplete、areasAndLengthsComplete屬性處理函數里面獲取相對應的測量結果。
3.6 關于起點終點的最短路徑分析
最短路徑的求取問題是可以拓展為許多方面的最高效率問題,最短路徑不僅是指一般意義上的距離最短,還可以是時間最短、費用最少、線路利用率最高等標準[3]。針對展示功能設計了兩點間最短路徑分析,網絡數據集中邊權重屬性默認長度字段即可。實現大致分為數據源處理,地圖服務發布和RouteTask類、RouteParameters類的實例相結合從而得到路徑。
第一步,數據源處理(構建網絡數據集以及建立地圖文檔)和地圖服務發布。
網絡數據集的優劣性直接影響了后續路徑分析的正確與否,為了提高路徑分析正確率,采用一套科學的數據源規范化處理流程至關重要。數據源處理流程如圖5所示。
在ArcMap10中新建地圖文檔,將網絡數據集加入該文檔中,并在文檔中新建路徑(Network Analyst模塊內),把圖層精簡后,用作路徑分析地圖服務的數據源,效果如圖6所示。
將處理后的數據源發布成用于路徑分析的地圖服務。
第二步,RouteTask類和RouteParameters類的實例相結合得到路徑。
RouteTask是一個非可視化的控件,可針對相應地圖服務進行最短路徑分析,可以根據提供的參數(RouteParameters類實例)求解得到相應最短路徑。關于起點終點的最短路徑分析:將起點終點名稱作為查詢條件對網絡數據集端點圖層(一系列帶屬性端點)進行查詢,把查詢結果賦值給stops屬性(RouteParameters子組件對應路徑中停靠點屬性)即可,調用RouteTask實例中solve方法(需傳入RouteParameters實例)并在其solveComplete屬性的事件處理函數里渲染起點終點提示以及兩點間最短路徑。
3.7 管理員信息管理
采用客戶端調用ASP.NET Web服務的方式對服務器端的關系數據庫(存有管理員信息)進行增、刪、改操作。整個軟件界面狀態分為展示狀態和管理員登錄狀態,管理員登錄狀態相比前者增加了測量和管理員信息編輯等模塊。
綜上所述,地圖服務和WebServer服務合理的發布和調用是基于ArcGIS Flex API電子地圖開發的基礎,也是地圖功能實現的有力保障。這類便捷的開發方式必將長時間流行于WebGIS領域。
參考文獻
[1] 賈靜,耿襯.基于ArcGIS API for Flex的Web應用初探[J].地理空間信息,2012(6):114-118.
[2] 賈慶雷,萬慶.ArcGIS Server開發指南——基于Flex和 .NET[M].北京:科學出版社,2011.
[3] 高晟.基于ArcGIS對矢量數據模型的最短路徑分析[J].微型機與應用,2011,36(15):84-87.