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