趙建偉,季 民
(1.山東科技大學(xué) 測(cè)繪科學(xué)與工程學(xué)院,山東 青島266590)
我國(guó)擁有2 900 余所高等學(xué)校,校園面積大、建筑多是其顯著特點(diǎn),然而商業(yè)地圖對(duì)校園的展示不夠全面,因此開(kāi)發(fā)校園電子地圖是改善這種狀況行之有效的途徑。校園電子地圖針對(duì)老師、同學(xué)的需求提供相關(guān)校園信息,相較于其他電子地圖擁有自己的特征。校園電子地圖以先進(jìn)的科學(xué)技術(shù)為載體,以互聯(lián)網(wǎng)為傳播媒介,將校園環(huán)境作為指定領(lǐng)域,最大程度地還原真實(shí)的校園。
校園電子地圖基于商業(yè)地圖API 與商業(yè)GIS 軟件已取得了較好的成果,如吳肖[1]等利用Google Map API 為用戶提供向Google 地圖添加各種個(gè)性化內(nèi)容的功能,并在此基礎(chǔ)上進(jìn)行二次開(kāi)發(fā),取得了一定成果;程鋼[2]等以百度地圖開(kāi)發(fā)平臺(tái)為基礎(chǔ),利用ArcMap制作校園電子地圖數(shù)據(jù),基于百度地圖API 實(shí)現(xiàn)了查詢、測(cè)距等功能;但基于開(kāi)源軟件的校園電子地圖建設(shè)卻研究較少。
商業(yè)GIS 軟件價(jià)格昂貴,各廠商開(kāi)發(fā)的不同數(shù)據(jù)格式嚴(yán)重阻礙了地理信息產(chǎn)業(yè)的發(fā)展。商業(yè)地圖往往采用自己的坐標(biāo)系,如百度地圖的火星坐標(biāo)系,在地圖匹配等方面極不便利。開(kāi)源軟件的功能齊全,具有開(kāi)放性、易用性、可擴(kuò)展性等特點(diǎn),并擁有良好的跨平臺(tái)能力和可擴(kuò)展性,突破了商業(yè)GIS 軟件技術(shù)壁壘,成為許多企業(yè)級(jí)用戶的首選,逐漸從科研院所和高校走向了市場(chǎng)。例如,胡達(dá)天[3]等利用開(kāi)源Javascript 庫(kù)Leaflet實(shí)現(xiàn)了跨平臺(tái)地圖客戶端的開(kāi)發(fā);汪鵬[4]等利用開(kāi)源GIS 軟件構(gòu)建了地理信息服務(wù)體系框架,并采用QGIS進(jìn)行地圖渲染,GeoServer 進(jìn)行地圖發(fā)布,Leaflet 進(jìn)行地理信息服務(wù)調(diào)用,驗(yàn)證了框架的可行性;楊珩[5]等基于全開(kāi)源框架,進(jìn)行了互聯(lián)網(wǎng)地圖系統(tǒng)的開(kāi)發(fā)應(yīng)用。
Leaflet 是一個(gè)為建設(shè)移動(dòng)設(shè)備友好互動(dòng)地圖而開(kāi)發(fā)的現(xiàn)代的、開(kāi)源的Javascript 庫(kù),是一個(gè)小型化的地圖框架,通過(guò)小型化和輕量化來(lái)滿足移動(dòng)網(wǎng)頁(yè)的需要。雖然其代碼僅有33 KB,但具有開(kāi)發(fā)人員開(kāi)發(fā)在線地圖的絕大部分功能,且Leaflet 擁有良好的可擴(kuò)展性,支持插件擴(kuò)展,能通過(guò)Ajax 等技術(shù)來(lái)處理控件、注記以及Layers 的響應(yīng)事件,因此得到了廣泛的應(yīng)用[6-7]。
針對(duì)校園電子地圖的特征,根據(jù)最新研究以及綜合比較,本文將空間和屬性數(shù)據(jù)存儲(chǔ)在PostgreSQL/PostGIS 中進(jìn)行數(shù)據(jù)組織與管理,利用uDig 進(jìn)行地圖數(shù)據(jù)渲染,采用地圖服務(wù)器GeoServer 進(jìn)行地圖服務(wù)發(fā)布,采用開(kāi)源Javascript 庫(kù)Leaflet 進(jìn)行地圖服務(wù)調(diào)用并開(kāi)發(fā)客戶端功能,從而構(gòu)建了PostGIS+uDig+GeoServer+Leaflet 的輕量級(jí)全開(kāi)源GIS 框架。本文依據(jù)該框架開(kāi)發(fā)了校園電子地圖系統(tǒng),實(shí)現(xiàn)了相關(guān)功能,不但節(jié)省了系統(tǒng)研發(fā)成本而且豐富了校園信息,具有一定的實(shí)踐意義和應(yīng)用價(jià)值。
開(kāi)放地理空間信息聯(lián)盟(OGC)的主要研究對(duì)象是地理空間內(nèi)容、地理信息服務(wù)、地理信息數(shù)據(jù)處理以及數(shù)據(jù)共享等服務(wù)標(biāo)準(zhǔn)[8]。針對(duì)WebGIS,OGC 較常用的服務(wù)標(biāo)準(zhǔn)包括網(wǎng)絡(luò)地圖服務(wù)(WMS)、網(wǎng)絡(luò)要素服務(wù)(WFS)、網(wǎng)絡(luò)覆蓋服務(wù)(WCS)以及網(wǎng)絡(luò)地圖切片服務(wù)(WMTS)等。針對(duì)校園電子地圖數(shù)據(jù)量小、數(shù)據(jù)精度高等特點(diǎn),本文將其發(fā)布為WMS。
WMS 描述了利用HTTP 通過(guò)網(wǎng)絡(luò)訪問(wèn)地理空間數(shù)據(jù)的規(guī)范,支持HTTP 標(biāo)準(zhǔn)中的GET 和POST 請(qǐng)求,請(qǐng)求中顯示圖層、范圍等參數(shù)的定義,響應(yīng)返回jpeg、png 等圖片格式的地圖數(shù)據(jù)[7]。WMS 主要包括GetMap、GetCapabilities、GetFeatureInfo 三個(gè)重要操作,其中GetMap 負(fù)責(zé)返回多種格式的圖片數(shù)據(jù);GetCapabilities 負(fù)責(zé)以xml 格式返回服務(wù)級(jí)元數(shù)據(jù),包括服務(wù)類型、版本信息、請(qǐng)求內(nèi)容等;GetFeatureInfo 負(fù)責(zé)返回要素屬性信息,如常用的點(diǎn)選要素查詢屬性信息。
校園電子地圖系統(tǒng)采用B/S 架構(gòu)模式,分為數(shù)據(jù)層、服務(wù)層和應(yīng)用層,具體結(jié)構(gòu)如圖1 所示。
圖1 系統(tǒng)總體架構(gòu)
數(shù)據(jù)層采用PostgerSQL/PostGIS 進(jìn)行空間數(shù)據(jù)的存儲(chǔ)與管理工作。PostgreSQL 是對(duì)象關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),基于PostgreSQL 拓展出PostGIS 用以管理空間數(shù)據(jù)[9]。在數(shù)據(jù)層進(jìn)行校園專題數(shù)據(jù)庫(kù)建設(shè),將圖層數(shù)據(jù)進(jìn)行概括分類,并存儲(chǔ)到數(shù)據(jù)庫(kù);利用pgRouting 對(duì)路網(wǎng)數(shù)據(jù)進(jìn)行拓?fù)錁?gòu)建以及編寫(xiě)最短路徑功能函數(shù)[10-11]。
服務(wù)層包括網(wǎng)絡(luò)服務(wù)器和地圖服務(wù)器。網(wǎng)絡(luò)服務(wù)器選用輕量級(jí)應(yīng)用服務(wù)器Tomcat,負(fù)責(zé)客戶端與應(yīng)用服務(wù)器之間的通信以及客戶端的請(qǐng)求;通過(guò)GeoServer地圖服務(wù)器調(diào)用PostGIS 數(shù)據(jù)庫(kù)中的數(shù)據(jù)并發(fā)布為WMS,處理來(lái)自瀏覽器的服務(wù)請(qǐng)求,通過(guò)多種數(shù)據(jù)源接口直接訪問(wèn)空間數(shù)據(jù),最終將處理的結(jié)果以jpeg、gif、png 等格式傳輸?shù)娇蛻舳恕?/p>
應(yīng)用層采用開(kāi)源Javascript 庫(kù)Leaflet 進(jìn)行圖層加載和具體功能開(kāi)發(fā),開(kāi)發(fā)工具為開(kāi)源軟件Hbuilder。利用Ajax 請(qǐng)求WMS,通過(guò)URL 確定操作,Ajax 引擎通過(guò)回調(diào)函數(shù)的方式在客戶端接收返回的數(shù)據(jù),調(diào)用Leaflet API 解析數(shù)據(jù)并進(jìn)行屬性信息的展示。
為了能更準(zhǔn)確全面地表達(dá)校園信息,需進(jìn)行校園電子地圖符號(hào)設(shè)計(jì),并通過(guò)風(fēng)格化圖層描述器(SLD)文件實(shí)現(xiàn)圖層渲染。SLD 是基于XML 的樣式描述語(yǔ)言,由OGC 于2005 年提出。SLD 是一個(gè)行業(yè)標(biāo)準(zhǔn),在一定條件下允許WMS 服務(wù)器對(duì)地圖可視化的表現(xiàn)形式進(jìn)行擴(kuò)展。通過(guò)SLD 可從客戶端對(duì)地圖樣式進(jìn)行配置,增強(qiáng)地圖可視化的靈活性。
點(diǎn)圖層符號(hào)設(shè)計(jì),根據(jù)不同類別設(shè)置特定的元素進(jìn)行點(diǎn)圖層渲染,通過(guò)
線圖層符號(hào)設(shè)計(jì),設(shè)置輔助線能更加精細(xì)地刻畫(huà)校園(圖2b),通過(guò)對(duì)道路中心線的符號(hào)設(shè)計(jì),達(dá)到道路標(biāo)注的效果。在
面圖層渲染,通過(guò)
圖2 渲染效果
在進(jìn)行Ajax 請(qǐng)求時(shí),地圖容器坐標(biāo)與地理坐標(biāo)需相互轉(zhuǎn)換(圖3),其中地圖容器坐標(biāo)以像素為單位,以左上角為起始點(diǎn),水平向右為X軸正方向,垂直向
下為Y軸正方向;地理坐標(biāo)以經(jīng)緯度為單位,以左下角為起始點(diǎn),水平向右為X軸正方向,垂直向上為Y軸正方向。已知容器高度為Height,寬度為Width,地理坐標(biāo)區(qū)域范圍為(minLon,minLat)~(maxLon,maxLat)。根據(jù)式(1)、式(2)計(jì)算得到X、Y軸上每個(gè)像素所代表的經(jīng)度(scaleX)和緯度(scaleY)。
設(shè)地圖容器坐標(biāo)系下P點(diǎn)的坐標(biāo)為(x,y),根據(jù)式(3)、式(4)求得地理坐標(biāo)的經(jīng)緯度為(Lon,Lat)。
請(qǐng)求完成并返回?cái)?shù)據(jù)后,前端呈現(xiàn)數(shù)據(jù)時(shí),根據(jù)式(5)、式(6)再將地理坐標(biāo)轉(zhuǎn)換為地圖容器坐標(biāo)。
圖3 坐標(biāo)轉(zhuǎn)換示意圖
A* 算法以Dijkstra 算法和廣度優(yōu)先搜索(BFS)算法為基礎(chǔ),是一種啟發(fā)式搜索算法。在靜態(tài)路網(wǎng)中進(jìn)行最短路徑求解時(shí),其計(jì)算節(jié)點(diǎn)數(shù)量比Dijkstra 算法少,因此更高效,計(jì)算公式為:
式中,f(j)為節(jié)點(diǎn)j從起始點(diǎn)到終點(diǎn)的最短距離的估計(jì)值;g(j)為從起始點(diǎn)到當(dāng)前節(jié)點(diǎn)j的實(shí)際最短距離,由Dijkstra 算法求得;h(j)為節(jié)點(diǎn)j到終點(diǎn)最短距離的估計(jì)值,稱為啟發(fā)函數(shù)[9]。當(dāng)h(j)=0 時(shí),A* 算法即為Dijkstra 算法,因此A*算法是對(duì)Dijkstra 算法的改進(jìn),即加入了啟發(fā)函數(shù)h(j),能保證最短路徑的搜索向終點(diǎn)方向進(jìn)行。h(j)常用歐幾里得距離和曼哈頓距離進(jìn)行計(jì)算,以歐幾里得距離為例,假設(shè)A點(diǎn)的經(jīng)緯度為(x1,y1),B點(diǎn)的經(jīng)緯度為(x2,y2),則A、B點(diǎn)之間的距離公式為:
A*算法流程如圖4 所示,其中Open 表記錄所有已生成而未被考察的節(jié)點(diǎn),Close 表記錄已被考察過(guò)的節(jié)點(diǎn)。
圖4 A*算法流程圖
1)初始圖層加載。首先進(jìn)行地圖容器初始化,指定地圖的中心點(diǎn)并設(shè)置縮放級(jí)別,底圖選用Open Street Map;再進(jìn)行WMS 加載,調(diào)用tileLayer 下的wms()方法進(jìn)行參數(shù)設(shè)置,并通過(guò)map.addLayer 方法添加到地圖容器中。針對(duì)商業(yè)地圖對(duì)校園展示細(xì)節(jié)不夠的問(wèn)題,通過(guò)添加輔助線、細(xì)化校園的方式,更加全面地展示校園。
2)基礎(chǔ)功能。校園電子地圖的基礎(chǔ)功能包括地圖的放大、縮小、平移,返回主界面以及前進(jìn)、撤退,距離測(cè)量與打印,比例尺顯示與鷹眼地圖功能,動(dòng)態(tài)繪制矢量要素功能,能實(shí)現(xiàn)點(diǎn)要素、線要素、面要素以及圓和矩形的繪制與刪除。
3)路徑規(guī)劃功能。通過(guò)在PostgreSQL 中編寫(xiě)最短路徑功能函數(shù),在GeoServer 中配置新的SQL 視圖,調(diào)用SQL 功能函數(shù)。在客戶端添加WMS,將起始點(diǎn)與終點(diǎn)的信息以參數(shù)的形式傳到GeoServer,將查詢結(jié)果返回到客戶端并疊加圖層顯示。室內(nèi)地圖路徑查詢結(jié)果如圖5 所示。
4)樓層圖分層瀏覽功能。當(dāng)?shù)貓D縮放時(shí),建筑內(nèi)部地圖與校園室外地圖之間能進(jìn)行無(wú)縫切換,并進(jìn)行樓層圖的分層瀏覽。將同一棟樓不同樓層的數(shù)據(jù)添加到同一個(gè)圖層組中,采用control.layers()方法實(shí)現(xiàn)圖層的分層動(dòng)態(tài)顯示。
5)查詢功能,主要提供室內(nèi)房間信息的查詢,如面積、座位數(shù)、用途、是否為多媒體等。采用Ajax 技術(shù)進(jìn)行WMS 請(qǐng)求,能加快地圖顯示與事件響應(yīng)速度。通過(guò)Ajax 向GeoServer 請(qǐng)求地圖服務(wù),GeoServer 返回JSON 格式的數(shù)據(jù),并通過(guò)Ajax 回調(diào)函數(shù)接收數(shù)據(jù);再通過(guò)data.features[i].properties 解析獲取屬性信息,點(diǎn)擊事件執(zhí)行函數(shù),以彈框方式顯示屬性信息,如圖6 所示。
圖5 路徑查詢結(jié)果界面
圖6 屬性查詢結(jié)果界面
本文根據(jù)OGC 標(biāo)準(zhǔn)規(guī)則,構(gòu)建了輕量級(jí)全開(kāi)源框架,進(jìn)行了校園專題數(shù)據(jù)庫(kù)建設(shè),研究了校園電子地圖符號(hào)設(shè)計(jì)、坐標(biāo)轉(zhuǎn)換和路徑查詢算法實(shí)現(xiàn)等關(guān)鍵技術(shù)。校園電子地圖實(shí)現(xiàn)的基本功能包括矢量要素繪制、圖層管理、比例尺、鷹眼和距離測(cè)量等,主要功能包括校園室內(nèi)外地圖的瀏覽與無(wú)縫切換,路徑規(guī)劃與屬性查詢等。Leaflet 以其開(kāi)源、簡(jiǎn)單、高性能等特性,為GIS軟件開(kāi)發(fā)提供了技術(shù)支撐,具有廣泛的應(yīng)用前景。