【摘 要】本文闡述了利用開源軟件MapServer進(jìn)行WebGIS技術(shù)研究的重要意義,詳述了MapServer的特點(diǎn)、體系結(jié)構(gòu)及實(shí)現(xiàn)地圖網(wǎng)絡(luò)發(fā)布的關(guān)鍵技術(shù),并結(jié)合應(yīng)用實(shí)例,開發(fā)實(shí)現(xiàn)了基于MapServer的城市地名地址信息發(fā)布系統(tǒng)。
【關(guān)鍵詞】開源軟件;MapServer;WebGIS;體系結(jié)構(gòu);地圖發(fā)布
隨著WebGIS的應(yīng)用日益廣泛,如何低成本高效率地開發(fā)WebGIS已經(jīng)成為GIS產(chǎn)業(yè)發(fā)展的迫切需求,基于MapServer的WebGIS解決方案正好迎合了這一點(diǎn)。MapServer是由美國(guó)明尼蘇達(dá)大學(xué)和NASA 聯(lián)合開發(fā)的一個(gè)具有強(qiáng)大的空間數(shù)據(jù)網(wǎng)絡(luò)發(fā)布功能的開源WebGIS軟件平臺(tái)。一方面其強(qiáng)大的功能和商業(yè)軟件相比毫不遜色,另一方面,作為一款開源軟件,其具有新技術(shù)跟進(jìn)及時(shí)、價(jià)格低廉、安全性好、代碼透明等特點(diǎn)。目前,國(guó)外對(duì)MapServer的研究與應(yīng)用已較為成熟,而國(guó)內(nèi)的研究與應(yīng)用甚少。通過開源軟件技術(shù)路線,我們可以發(fā)展和掌握較多的自主知識(shí)產(chǎn)權(quán), 對(duì)GIS產(chǎn)業(yè)國(guó)產(chǎn)軟件的自主創(chuàng)新有著重要意義。
1 MapServer特點(diǎn)
MapServer是面向?qū)ο蟮模九渲梦募﨧apFile和MapScript模塊的API組織都是基于對(duì)象的。MapServer基于C語(yǔ)言開發(fā),利用多個(gè)開源的外部支持庫(kù)(GEOS、OGR/GDAL、Proj.4等)實(shí)現(xiàn)對(duì)多種失量和柵格數(shù)據(jù)以及投影變換的支持。MapServer沒有自己的數(shù)據(jù)格式,但可通過集合PostGIS和開源數(shù)據(jù)庫(kù)PostgreSQL實(shí)現(xiàn)對(duì)地理空間數(shù)據(jù)的存儲(chǔ)和SQL查詢操作。同時(shí),MapServer基于ka-map,MapLab,Cartoweb,Chameleon等一系列客戶端JavaScript API來支持對(duì)地理空間數(shù)據(jù)的傳輸與表達(dá),并且遵守開放地理空間協(xié)會(huì)(Open Geospatial Consortium,OGC)制定的WMS、WFS、WCS、WMC、SLD、GML和Filter Encoding等一系列規(guī)范。總而言之,從技術(shù)角度而言,MapServer比其他同類產(chǎn)品采用更便捷的安裝方法,支持更多的數(shù)據(jù)類型,支持更廣的系統(tǒng)平臺(tái)。
2 MapServer體系結(jié)構(gòu)
2.1 MapServer的數(shù)據(jù)源。從數(shù)據(jù)存儲(chǔ)位置上劃分,MapServer數(shù)據(jù)源有四種:1)本地?cái)?shù)據(jù):直接讀取存儲(chǔ)在本地的地圖數(shù)據(jù),如shappfile文件等;2)局域網(wǎng)數(shù)據(jù):存儲(chǔ)在局域網(wǎng)數(shù)據(jù)服務(wù)器上,基于TCP/IP協(xié)議通過空間數(shù)據(jù)引擎或空間數(shù)據(jù)庫(kù)訪問,如ArcSDE、Oracle Spatial等;3)廣域網(wǎng)數(shù)據(jù):存儲(chǔ)于遠(yuǎn)程數(shù)據(jù)服務(wù)器上,基于HTTP 協(xié)議接收遠(yuǎn)程發(fā)布的遵守OGC互操作規(guī)范的地圖數(shù)據(jù),如Web地圖服務(wù)WMS (Client / Server)等;4)分布式數(shù)據(jù):存儲(chǔ)于多臺(tái)數(shù)據(jù)服務(wù)器上,通過“融合(Fusion)MapServer”機(jī)制實(shí)現(xiàn)數(shù)據(jù)集成與共享,類似于ERSI用“版本”來管理工作流的方式(Managing work flow with versions)[1]。從數(shù)據(jù)存儲(chǔ)格式上劃分,MapServer數(shù)據(jù)源主要有矢量地圖數(shù)據(jù)和柵格地圖數(shù)據(jù),通過使用GDAL/OGR外部支持庫(kù)來實(shí)現(xiàn)對(duì)多種矢量及柵格數(shù)據(jù)訪問的支持,詳細(xì)的支持?jǐn)?shù)據(jù)格式列表可見http://www.gdal.org[2]。2.2 MapServer的核心--MapServer CGI程序。MapServer實(shí)際運(yùn)行時(shí)在物理上就是一個(gè)CGI程序。CGI主要的功能就是在服務(wù)器應(yīng)用程序和客戶之間傳遞信息,其工作流程為:當(dāng)瀏覽器通過URL告知Web Server調(diào)用MapServer CGI模塊時(shí),Web Server就為CGI模塊創(chuàng)建一個(gè)進(jìn)程(CGI程序);CGI模塊運(yùn)行并加載URL指定的MapFile文件,讀取MapFile文件中的TEMPLATE文件(HTML文件),并將TEMPLATE文件中CGI 變量的替換變量(template substitutions)替換成具體的值(同時(shí)根據(jù)MapFile中指定的路徑讀取相關(guān)地圖數(shù)據(jù));處理完TEMPLATE文件后,CGI模塊將TEMPLATE文件處理結(jié)果以HTML的形式返回給Web Server,Web Server再將HTML文件輸出到用戶瀏覽器上。這時(shí)TEMPLATE文件(HTML文件)就作為用戶的交互界面。2.3 MapServer的地圖服務(wù)接口類型。MapServe使用許多開源類庫(kù)來完成數(shù)據(jù)格式轉(zhuǎn)換、地圖投影轉(zhuǎn)換等,而本身專注于地圖繪制、地圖服務(wù)接口環(huán)境、兼容OGC互操作規(guī)范等方面。MapServer的地圖服務(wù)接口類型主要有:1)Mapscript模式的地圖服務(wù):MapServer的Mapscript支持多種高級(jí)腳本程序語(yǔ)言(PHP、Python、C#等)生成交互式的Web地圖服務(wù)程序;2) CGI模式地圖服務(wù):使用\"HTTP GET\"或者\(yùn)"HTTP POST\"兩種方式接受參數(shù)輸入,動(dòng)態(tài)創(chuàng)建地圖或者執(zhí)行查詢操作;3) OGC互操作規(guī)范服務(wù):支持Web地圖服務(wù)WMS (Client/Server),Web地圖要素服務(wù)WFS (Client/Server),Web制圖環(huán)境WMC, Web圖層服務(wù)WCS[3].三種接口類型運(yùn)行時(shí)在物理上均是CGI程序,均讀取相同的MapFile地圖配置文檔,MapFile(*.map文件)是MapServer數(shù)據(jù)的核心,它將各種地圖要素組織成具有層次關(guān)系的對(duì)象系統(tǒng),定義了MapServer加載的數(shù)據(jù)中的對(duì)象之間的相互關(guān)系,數(shù)據(jù)來源,使用的數(shù)據(jù)格式,用戶交互和對(duì)OGC 協(xié)議的支持等[4],類似于ArcGIS的mxd地圖配置文檔。MapFile文檔的編輯方式很多,可以用專業(yè)地圖文檔編輯工具也可以直接用文本編輯器。MapServer體系結(jié)構(gòu)圖如圖1所示。
3 地圖網(wǎng)絡(luò)發(fā)布的實(shí)現(xiàn)
3.1構(gòu)建MapServer開發(fā)平臺(tái)。在進(jìn)行MapServer開發(fā)前首先需要搭建好基礎(chǔ)開發(fā)平臺(tái),本文選擇了如下開源軟件來配置基礎(chǔ)開發(fā)平臺(tái):Web服務(wù)器為Apache2.2.4,WebGIS服務(wù)器為MapServer4.10.1,數(shù)據(jù)庫(kù)服務(wù)器為PostgreSQL/PostGIS( Geographic Object for PostgreSQL)(采用局域網(wǎng)數(shù)據(jù))。對(duì)初涉者來說構(gòu)建MapServer開發(fā)平臺(tái)較為困難和繁瑣,因?yàn)樾枰幾gMapServer自身及其所需的大量開源支持類庫(kù)的源代碼。MapServer官方網(wǎng)站發(fā)布了已經(jīng)編譯好的版本MS4W(MapServerForWindows),其安裝過程較為復(fù)雜,可參見參考文獻(xiàn):[4]。MapServer配置好后就可以用其專用的開源工具M(jìn)apLab來配置MapFile文件了,如圖2所示。也可以用文本編輯工具(如寫字板)直接編輯*.map格式的文件來配置MapFile文件。3.2開發(fā)方式選擇。MapServer有兩種開發(fā)方式:MapServerCGI和MapScript。本文采用了MapScript結(jié)合PHP的開發(fā)方式。利用MapScript模塊就需要其他服務(wù)器端解決方案(指腳本語(yǔ)言),如PHP(以CGI模
塊安裝在WebServer上)。MapScript模塊作為PHP的擴(kuò)展模塊,放在PHP安裝路徑的extensions目錄下。MapScript模塊保留MapFile文件的層次對(duì)象結(jié)構(gòu),向PHP提供對(duì)象結(jié)構(gòu)的API。那么,與 MapServer CGI模塊無法靈活修改不同,程序員在服務(wù)器端就可以使用PHP通過調(diào)用MapScript的API靈活的選擇、修改MapFile文件[5]。
同時(shí),結(jié)合PHP對(duì)眾多數(shù)據(jù)庫(kù)——非空間數(shù)據(jù)庫(kù),如Oracle, MySQL等的支持,使MapScript在WebGIS中整合空間數(shù)據(jù)和非空間數(shù)據(jù)變的容易。
雖然可以通過修改源代碼來使MapServer CGI具有需要的特性,但難以實(shí)現(xiàn)較為復(fù)雜的動(dòng)態(tài)交互,而利用其他服務(wù)端腳本語(yǔ)言和MapScript可以更容易實(shí)現(xiàn)復(fù)雜的WebGIS功能。
5 結(jié)束語(yǔ)
MapServer通過支持OGC協(xié)會(huì)的若干標(biāo)準(zhǔn),支持分布和互操作。不論是使用MapServer CGI模塊或服務(wù)端腳本語(yǔ)言結(jié)合MapScript,都可以實(shí)現(xiàn)服務(wù)端與客戶瀏覽器的動(dòng)態(tài)交互。MapServer在網(wǎng)絡(luò)地圖發(fā)布方面的強(qiáng)大功能有待進(jìn)一步探索,對(duì)于從事WebGIS開發(fā)的組織而言,研究MapServer無疑符合其長(zhǎng)遠(yuǎn)利益。本文對(duì)MapServer的原理及應(yīng)用只做了初步探討,旨在拋磚引玉。
參考文獻(xiàn):
[1]胡楠,閔星.基于MapServer的網(wǎng)絡(luò)地圖發(fā)布技術(shù)應(yīng)用研究[J].天津測(cè)繪,2010,5:45-46
[2]宋現(xiàn)鋒,劉軍志等.開源代碼技術(shù)的FLASH地圖實(shí)現(xiàn)方法[J].地球信息科學(xué),2006,12:101-105
[3]熊靜,張?bào)?基于MapServer 的遙感影像發(fā)布系統(tǒng)的研究[J].遙感信息,2007,1:53-56
[4]Jeff Mckenna. MS4W(MapServer For Windows)Installation[EB/OL]. [2012-11-26].http://maptools.org/ms4w/index.phtml?page=README_INSTALL.txt
[5]Jeff McKenna.PostGIS/PostgreSQL[EB/OL]. [2012-11-26].http://mapserver.gis.umn.edu/docs/reference/vector_data/postgis/
[6]杜雄.基于MapServer數(shù)據(jù)互操作與Web共享模式的研究[EB/OL].[2013-10-16].http://www.cnblogs.com/charmdx/articles/450711.html