摘 要: 根據大學新生報到時的實際需求,設計一個新生報到服務系統。系統使用ArcGIS系列軟件對校園地圖信息進行設計;結合Mobile GIS,數據庫設計和無線數據通訊等多項技術,在Android平臺上采用面向服務的設計思想,加入改進后的Dijkstra算法,用Java建模來提取節點間的最優路徑和次最優路徑,將結果在地圖上繪出最短路徑,最終達到指引效果。
關鍵詞: Android; GIS; 最優路徑分析; Java
中圖分類號: TN964?34 文獻標識碼: A 文章編號: 1004?373X(2013)20?0079?05
地理信息技術迅速發展,日益廣泛的應用領域對GIS的要求不斷提高,如今GIS已成為現代社會最主要的信息資源和手段之一。隨著Android智能手機的普及,Android應用產品的開發需求變得越來越多。大學校園占地面積大,校園建筑物類型繁多,新生報到當天校園內人流量大,報到程序復雜,易造成校園的混亂。具有校園路徑導航功能的地圖應用非常實用,可以方便地幫助用戶快速找到前往報名點的最優路徑,提高報名效率,減少不必要的精力和時間。此外,Android手機的實時性能夠滿足用戶隨時隨地查詢建筑物的需求,實現對校園內建筑物的空間查詢,方便熟悉校園,更快地適應新環境。
1 系統結構和系統設計中的技術
本系統采用美國ESRI公司的ArcGIS系統軟件對校園地圖信息進行設計,通過ArcGIS Server將ArcMap制作的地圖實現發布[1]。在Android平臺下,結合ESRI推出的ArcGIS Runtime for Android API插件的應用,訪問自行發布的地圖,并對地圖進行操作。借助改進的Floyd算法來實現報到過程中最優路徑的指引。最終將搜索的路徑結果顯示在具有Android操作系統的手機上,完成指引。
1.1 Geodatabase空間數據庫
Geodatabase是一種面向對象的空間數據模型,它為ArcGIS更好地管理和使用地理數據提供了數據接口和管理框架。在本系統中,Geodatabase用于存放空間數據和屬性數據的簡單表格,為地圖服務提供數據源。在ArcGIS中有兩種數據存儲方式:一是基于文件的存儲方式,Shapefile文件和Coverage文件;二是基于空間數據庫的存儲方式,包括PersonalGeodatabase、FileGeodatabase和ArcSDEGeodatabase。本系統選擇的是PersonalGeodatabase的存儲方式,它將所有的數據集都存儲在Microsoft Access數據文件內,包括空間數據和非空間數據。
1.2 ArcGIS Server地圖服務器
ArcGIS Server是一個用于構建集中管理、支持多用戶的企業級GIS應用的平臺[1]。提供了豐富的GIS功能,例如地圖、定位器和用在中央服務器應用中的軟件對象。本系統采用ArcGIS Server作為GIS數據組織平臺,它是一套面向服務的GIS應用組件,在服務器端組織數據,并將其作為地圖服務發布在ArcGIS Server服務器上,供不同的終端調用。
1.3 Android平臺
2007年11月,Google推出移動操作系統Android,并宣稱Android是首個為移動終端打造的真正開放和完整的移動操作系統[2]。自此,基于Android的手機和平板電腦開始陸續出現,Android系統開源性的優勢正日益凸顯,其在市場上的后勁也越來越足。Android由Linux內核、系統運行庫、應用程序框架和應用程序組成。在國內,智能手機領域的爭奪也是愈演愈烈,安裝Android系統的手機越來越受到消費者的青睞[2]。在系統的設計過程中,運用到了一些相關技術,介紹如下:
(1)XML的解析技術
XML是一種常用的存儲數據方式,在Android平臺內部很多地方使用了XML存儲。XML解析主要有三種方式:SAX,DOM,PULL。SAX讀取是單向的,不占內存空間、解析屬性方便,但對于嵌套多個分支來說處理不是很方便。DOM把整個XML文件加載到內存中去,只能處理數據量較小的文件。PULL對于節點處理比較好,類似SAX,同樣節省內存。本文將使用XML方式對數據進行文件存儲,并采用PULL解析的方法解析XML文件。
(2)GPS定位技術
在移動設備上,定位幾乎已經是一個必不可少的功能了。在Android中,設備可以通過GPS、移動通訊網絡、WIFI網絡來進行定位。這些定位功能都被分裝在一個LocationManager對象中。在本系統中,選擇GPS定位,獲得用戶所在的位置。
1.4 ArcGIS Runtime for Android
ArcGIS Runtime SDKs for Smartphones and Tablets是ESRI為開發者提供的移動應用開發包,目前支持IOS、Android、Windows Phone三大主流移動操作系統,將GIS的適用范圍從內業擴展到外業。ArcGIS Runtime SDK for Android通過ArcGIS Server REST服務獲取數據和服務資源[2]。運用ArcGIS for Android插件,開發的Android程序可以瀏覽ArcGIS.com或ArcGIS Server提供的地圖。
2 針對校園環境的地圖系統設計
2.1 空間數據的采集和輸入
空間數據采集是指將遙感影像、紙質地圖、外業觀測數據等不同來源的數據進行處理,使之成為GIS軟件能夠識別和分析的形式,這往往是構建一個具體的GIS系統的第一步??臻g數據包括圖像數據、拓撲數據、參數數據和屬性數據[2]。建立一個GIS系統經常要用到不同類型的數據,在本地圖中,主要包括以下幾種數據:
(1)地圖數據。采用了學校校園紙質的平面地圖,圖上實體間的空間關系直觀,實體的類別、屬性可以用各種不同的符號加以識別和表示。過去一段時間里,建立GIS系統最直接的數據來源就是對紙質地圖進行矢量化。
(2)影像數據。為了能夠獲取清晰地影像數據,本系統中利用GEtScreen軟件,在Google Earth上截取校園范圍的衛星影像數據,為下一步地理配準提供數據基礎。
(3)實測數據。實測數據是指通過各種野外實驗實地測量所得到的數據。由于設備有限,本地圖直接通過現成的地圖軟件來獲取GPS點位數據、道路路線長度等數據??紤]精確度,選取了多個地圖軟件進行測量比較,包括ArcGIS Online,Google Map,Google Earth。
2.2 空間參考與地理配準
精確定位地理要素對于制圖和GIS來說至關重要,正確描述要素的位置和形狀,需要引入一個用于定義位置的框架——空間參考??臻g參考是用于存儲各要素和柵格數據集坐標屬性的坐標系。坐標系統用于定位坐標點,通過坐標系統可以確定要素在地球上的位置。常用的坐標系統有兩種:地理坐標系和投影坐標系,本系統選擇的是地理坐標系——GCS_WGS_1984。該坐標系就是GPS所采用的坐標系,通過GPS獲得的坐標信息都是按這個坐標系提供的經緯度,移動平臺上GPS也是按照這個坐標系獲得的經緯度。
確定好參照的坐標系統之后,需要對影像數據進行地理配準。地理配準是在設計要素圖層之前很重要的步驟,通過地理配準將影像數據中相應的坐標信息對準到空間參考系上。地理配準一般要經過添加控制點、檢查殘差、選擇地理配準方法以及進行地理配準等幾個步驟,其中控制點的選擇通過地圖軟件測量獲得,并且只有均勻選取獲得的底圖才不會失真。
2.3 空間數據編輯與圖層結構
空間數據編輯是對空間數據進行處理、修改和維護的過程。通常來講,采集的空間數據在集合圖形和空間屬性上往往存在錯誤或者不夠完善的地方,需要通過后續的編輯對其進行修改和處理。ArcGIS的數據編輯功能是在ArcMap中完成的。ArcMap提供了強大的數據編輯能力,它能創建和編輯要素數據、表格數據、拓撲和幾何網絡數據等,能編輯空間數據庫和不同類型的數據文件。為了在地圖上顯示各類信息的空間位置并對其進行分析,必須給計算機提供幾何表示,如線要素、面要素等。本地圖的要素劃分,主要分為以下幾類:
(1)建筑結構屬性:建筑物屬于面要素,數據中包括建筑物結構形狀屬性、建筑物ID號, 標注名稱,坐標信息。
(2)道路信息:道路設置成線要素,包括道路ID號,道路長度,道路交點坐標信息。
(3)運動場信息:運動場屬于面要素,包括建筑物結構形狀屬性、建筑物ID,坐標信息。
(4)交叉路口信息:交叉路口設置成點要素,主要是收集交點的坐標信息。
圖層結構是把同一種或幾種地理要素的信息放在同一個圖層上,每個圖層存為一個獨立的文件,這種文件在ArcMap中可以疊加顯示。為了方便管理,根據本地圖的要素劃分情況將每一種物理結構存放一個圖層。當完成所需要的圖層以后,對各個圖層中屬性表進行編輯,存入數據。
2.4 地圖的發布
將地圖服務發布在ArcGIS Server服務器上,可供不同的終端調用。運用ArcGIS Server發布地圖服務有兩種方式:ArcCatalog和ArcGIS Server Manager,在本系統中選擇ArcGIS Server Manager方式發布,在發布之前需先進行IIS的安裝配置和用戶權限的設置。若地圖發布成功,在瀏覽器中輸入發布地圖的地址,便可以對地圖進行訪問。通過ArcGIS Runtime for Android插件在應用程序中訪問已發布的地圖。
3 基于Dijkstra算法求解前N條最優路徑
3.1 算法的理論基礎
Dijkstra算法被公認為是圖論中求解最短路徑問題的優秀算法[1]。考慮實際情況中,用戶在使用本系統對路徑進行指引時,除最優的決策外,還希望得到次優、再次優等決策參考,因此在本系統中利用Dijkstra算法計算出用戶位置與目標位置之間的最優路徑信息與次最優路徑信息。文獻[7]提出了一種借助Dijkstra算法求解前N條最優路徑問題的算法設計[1]。文中提出賦權圖[G=(V,E)]上兩頂點間的任一路徑都必然是它的某一子圖[G’=(V,E)]上兩頂點間的最短路徑,且任意子圖[G’=(V,E)]上兩頂點間的最短路徑必大于或者等于賦權圖[G=(V,E)]上兩頂點間的最短路徑。由此結論提出求解前N條最優路徑的思想:將賦權圖[G=(V,E)]的最短路徑上的邊分別從邊集中刪除,獲得一批子圖,將這些子圖上最短路徑取并集得到次最短路徑集合,這樣分離出最短路徑和次最短路徑集,遞歸可將全部路徑轉化為某一子圖上的最短路徑。文獻[8]中提出,文獻[7]結果集中存在重復路徑[1],為解決此問題,引入候選刪除邊集合的概念,通過實驗及實際應用的檢驗,證明了算法的正確性和有效性。
3.2 算法的設計和分析
在文獻[7]和文獻[8]的基礎上,為提高效率本文采用雙向搜索法,并且引入反向追蹤的思想。在實際應用中無需獲得兩頂點間所有路徑,所以本文只需獲得賦權圖[G=(V,E)]上的最短路徑和次最短路徑集,程序運用Java語言編寫。首先,為討論方便起見,定義部分參數如下:
result:最優路徑集,存放前N條最短路徑信息,包括路徑點集,路徑長度;
curPath:當前最優路徑,包括路徑點集,路徑長度;
curVertex:存放當前最短路徑的點集合,即候選刪除點集合;
subPath:子路徑集合,存放上文子圖中,當前恢復點與目的點的最短路徑;
prePath:子路徑點集合,存放當前最優路徑中,當前恢復點之前的子路徑的點;
curReVex:當前恢復點,循環恢復curVertex中已經刪除的點;
NcurVertex:當前最優路徑中,當前恢復點的下一個點。
首先由Dijkstra算法求解出賦權圖[G=(V,E)]的最短路徑,由于文中只需求解最短路徑和次最短路徑,所以程序只需循環兩次,該最短路徑即為當前最優路徑 curPath,路徑的結點存放于點集合curVertex中。然后將該路徑上所有的點與弧全部從[G=(V,E)]中刪除,接著引入當前恢復點curReVex,以當前恢復點作為中間討論點,其中引入反向追蹤的思想,curReVex從點集合curVertex的倒數第二位起反向循環,并采用雙向搜索法尋找路徑,在curReVex之前的路徑,存放于子路徑點集合prePath中,實際上即為當前路徑curVertex中起始點與恢復點前一個點的點集。curReVex之后的路徑,求得的是某子圖中curReVex到目標點的最優路徑(curReVex和NcurVertex之間弧未恢復),存放于子路徑集合subPath中。只需將subPath中的點信息與prePath中點信息合并,存放于subPath中,即可形成次最優路徑集。最后通過計算比較,根據路徑長度進行有小到大排序,取出次最優路徑中的最短路徑,即獲得整個賦權圖[G=(V,E)]的次最短路徑。
3.3 算法的實現
下面是算法的主要程序,一些自定方法不再詳細介紹。
public List
{ /*Dijkstra算法求解出賦權圖的最短路徑*/
Dijkstra Alg dijkstra = new Dijkstra Alg(graph);
Path shortestpath = dijkstra.get_shortest_path(souVex,desVex);
int count = 0;//循環計數
pathCandidates.add(shortestpath);
// 最短路徑存放于最優路徑候選集中
pathVertex.put(shortestpath,souVex);
//算法的主程序
while(!pathCandidates.isEmpty() count < N)
{
Path curPath = pathCandidates.poll();
//獲取當前最短路徑
result.add(curPath);
//在當前最短路徑加入結果路徑集中
int pathLength = curPath.get_vertices().size();
//獲得當前路徑的點的個數
List
//當前路徑的點集合
for(int i=0; i { /*調用自定義方法,刪除當前最優路徑中所有的點與弧*/ graph.remove_vertex(curVertex.get(i).get_id()); graph.remove_edge(new Pair } /*反向搜索思想計算子圖中以目標點結尾的最優路徑長度*/ Dijkstra Alg reverseTree = new Dijkstra Alg(graph); reverseTree.get_shortest_path(desVex,1); /*采用雙向搜索法尋找次最優路徑*/ for(int i=pathLength?2; i>=0; ??i) { Vertex curReVex = curVertex.get(i);//當前恢復的點 //調用自定義方法,恢復當前點 graph.recover_removed_vertex(curReVex.get_id()); //計算目標點與當前恢復點之間的距離,獲得子路徑 Path subPath = reverseTree.update_cost_forward(curReVex); if(subPath != 1) { /*循環獲得當前恢復點curReVex之前的路徑點集 */ double distance1 = 0; List for(int j=0; j { Vertex curVex = curVertex.get(j); if(curVex.get_id() == curReVex.get_id()){ j=pathLength; }else { //計算prePath點集合所形成的子路徑長度 distance1+=graph.get_edge_weight_of_graph( curVertex.get(j),curVertex.get(j+1)); prePath.add(curVex); } } prePath.addAll(subPath.get_vertices()); //次最優路徑點集 subPath.set_weight(distance1+subPath.get_weight()); //路徑總長度 subPath.get_vertices().clear(); //清空所有點 subPath.get_vertices().addAll(prePath); // 存放完整路徑 /*增加判斷條件,防止出現重復路徑*/ if(!pathVertex.containsKey(subPath)) { pathCandidates.add(subPath); pathVertex.put(subPath,curReVex); } } //調用自定義方法,恢復當前點與下個點之間的弧 Vertex NcurVertex = curVertex.get(i+1); graph.recover_removed_edge(newPair curReVex.get_id(),NcurVertex.get_id())); /*計算恢復邊以后,當前恢復點與目標點之間的路徑長度。這里調用get_start _distance ()方法獲得的是輸入點與目標點之間的距離。*/ double distance2 = graph.get_edge_weight(curReVex,NcurVertex) + reverseTree.get_start _distance ().get(NcurVertex); //加入恢復邊之后,路徑長度進行更新 reverseTree.get_start_ distance ().put(curReVex,distance2); reverseTree.get_predecessor_index().put(curReVex,NcurVertex); //傳入參數curReVex,計算總路徑長度,進行排序 reverseTree.correct_cost_backward(curReVex); } ++count; //循環計數 } return result; //返回結果 } 4 系統實現 本文以江蘇科技大學(東校區)為例,設計實現了江蘇科技大學(東校區)的新生報到服務系統。通過ArcGIS系列軟件實現整個校園內部建筑物、道路、運動場的顯示;利用用改進后的Dijkstra,在新生報到服務系統中實現最優路徑與次最優路徑;最后在Android平臺上進行顯示。 Android程序的開發是在Eclipse平臺上完成的,完成程序編寫以后,對程序進行調試,可將程序部署在Android手機環境中進行測試。利用Android手機測試,需要通過USB連接手機,在聯機情況下,Eclipse直接將程序部署于實機環境中運行[1]。以下是點擊報到按鈕以后,獲得的最優路徑和次最優路徑。 5 結 語 隨著Android智能手機的普及和移動互聯網技術的快速發展,Mobile GIS的應用需求也不斷增加,已經成為GIS新的發展方向。針對新生報到過程的繁瑣和校園環境的復雜,本文提出一種應用于Android手機上的校園報到指引系統,系統結合改進的Dijkstra算法,運用了Mobile GIS,GPS,XML解析、Android等各項技術,并運用GPS對用戶進行定位,實時地更新用戶所處的位置,在Android手機上實現隨時隨地對學校道路和建筑物進行查詢。本系統在向新生報到進行道路指引的同時,還向其展示了校園全景風貌,包括校園內的建筑分布情況,方便新生更快地熟悉校園、融入校園。 參考文獻 [1] 李展坤,趙文吉,段福洲,等.基于ArcGIS Mobile的最短路徑分析方法研究[J].首都師范大學學報:自然科學版,2010,31(3):83?85. [2] 吳辛.基于GIS的校園信息管理系統的設計與實現[D].銀川:寧夏大學,2009. [3] 汪永松.Android開發平臺之旅[M].北京:機械工業出版社,2010. [4] WENG Yi?hua,SUN Fu?Shing,GRIGSDY J D. An android phone application in geology [J]. Computers Geosciences,2012(44): 24?30. [5] 周靖雄,陳友飛.基于ArcGIS Android API的GPS手機導航系統關鍵技術的研究與實現[J].數字技術與應用,2012(4):45?47. [6] 牟乃夏,劉文寶,王海銀,等.ArcGIS10地理信息系統教程從初學到精通[M].北京:測繪出版社,2012. [7] DENG Yong,CHEN Yu?xin,ZHANG Ya?juan,et al. Fuzzy Dijkstra algorithm for shortest path problem under uncertain environment [J]. Applied Soft Computing,2012,12(3): 1231?1237. [8] 柴登峰,張登榮.前N條最短路徑問題的算法及應用[J].浙江大學學報:工學版,2002,36(5):531?534. [9] 王峰,游志勝,曼理春,等.Dijkstra及基于Dijkstra的前N條最短路徑算法在智能交通系統中的應用[J].計算機應用研究,2006(9):203?206. [10] 佘志龍,陳昱勛,鄭名杰,等. Google Android SDK開發范例大全[M].2版.北京:人民郵電出版社,2010.