冯学韬
(兰州大学fxtao98@yahoo.com.cn)
摘要:WebGIS是将Web技术和GIS技术相结合的新技术,有着广泛的应用。通过WebGIS技术,客户端仅需使用浏览器(不一定包含专门插件)就可以对分布在Web上的GIS数据进行查询、分析等交互操作。实现WebGIS技术之一是在服务器端使用CGI技术,由美国明尼苏达大学开发的MapServer就是采用这种技术。本文将详细介绍实现WebGIS的开源软件MapServer4.4.2的配置文件和它的两个独立模块,及应用它们开发WebGIS的方法。
关键词:MapServer,WebGIS,开源,CGI,脚本语言
1,背景介绍
地理信息系统对地表信息建立数学模型,利用计算机技术对数据进行存储,处理,分析。 其中采用Web技术的地理信息系统即WebGIS。 WebGIS的关键特征是面向对象、分布式和互操作。它将GIS数据和功能封装成对象,并且这些对像支持分布式计算,可以存储在不同的服务器上;对象通过一致的通信协议,可以方便的进行交换和交互操作[1]。
WebGIS的实现方法之一是利用Common
GIS空间数据库
MapServer
CGI 模块
或者
脚本语言+MapScript
Web服务器
客户端浏览器
图1,三层体系结构
(图1,图中的脚本语言指服务端脚本语言;MapServer的CGI模块和MapScript模块将在后面介绍)
相比与由商业企业提供的众多WebGIS解决方案,MapServer是开源项目。这就意味着你可以免费使用MapServer,并具有自行修改、复制以及再分发的权利[4]。同时MapServer还有众多的优点[5]:
1)
2)
3)
4)
5)
6)
7)
8)
9)
10)
11)
12)
2,MapServer的组成及开发方法
MapServer是使用C语言编写的开源软件,它本身又依赖一些开源的或免费的库,如Shapelib, FreeType, Proj.4, GDAL/OGR[5]。
(一)必须的库:
a)
b)
(二)可选的库:
a)
b)
c)
d)
e)
f)
g)
h)
MapServer可以看作是两个独立模块的统称:MapServer CGI模块和MapScript模块。在服务器端可以使用任一模块,编写WebGIS程序。不过它们使用相同的配置文件MapFile。本文的重点就是介绍MapFile文件,及使用两个模块开发WebGIS的方法。
2.1,MapFile文件
MapFile文件将各种地图要素组织成具有层次关系的对象系统[5]。数据来源,使用的数据格式,用户交互和对OGC协议的支持也在MapFile中定义。MapFile中包括的对象及其层次关系:
MapObject
Querymap
Symbol
Projection
WebObject
Reference Map
Outputformat
Scalebar
Lengend
Layer Object
Label Object
Label Object
Feature
Projection
Class Object
Join Object
Label Object
Style Object
Grid Object
图2,MapFile对象层次关系
(图2,MapFile中的对象及其层次关系;注意为绘图方便有些对象省略Object)
MapFile的语法很简单。MapFile的关键字包括对象名(图2中的所有对象)、对象属性(keyword),对象结束标记“END”。对象名和对象结束标记“END”大小写不敏感;属性名大小写敏感,配置ESRI的shapfile文件要使用大写,PostGIS的却总是小写。在MapFile文件中,符号“#”对单行注释。MapFile文件以“.map”为扩展名,可以使用各种文字编辑器编写。以下是MapFile的一个例子:
#
# Start of map file
#
NAME CHINA
STATUS ON
SIZE 400 300
SYMBOLSET ../etc/symbols.sym
FONTSET ../etc/fonts.txt
EXTENT 73 35 137 45
UNITS DD
SHAPEPATH "../data/china"
IMAGECOLOR 255 255 255
#
# Start of web interface definition
#
WEB
END#END WEB
#
# Start of legend
#
LEGEND
END#END LENGEND
#
# Start of scalebar
#
SCALEBAR
END#END SCALEBAR
#
#start of querymap
#
QUERYMAP
END#END QUERYMAP
#
#start of projection
#
PROJECTION
END#PROJECTION
#
# Start of layer definitions
#
LAYER
END # Layer
END # Map File
2.1.1,配置MapFile需要的资源
配置一个完整的MapFile文件需要:GIS数据源,字体文件,符号文件。GIS数据源可以分布在不同的计算机上;字体文件用来定义输出地图中使用的字体类型。地图中使用的点,线,面符号可以在MapFile文件Symbol对象中定义;不过为了实现符号的重用——无须在不同的MapFile文件中定义相同的符号,通常在MapFile外部定义独立的符号文件。
2.1.2,MapFile文件中对象及其属性解释
Web Object定义如何处理web接口。如:属性IMAGEPATH定义存储临时文件和图像的路径,TEMPLATE定义使用的交互界面文件[5]。
Outputformate Object定义输出图像的格式。MapServer将GIS数据格式文件(如shapefile)转换成MIME(Multipurpose Internet Mail Extensions)协议支持的图像格式,如gif,png,jpeg等[5]。
QueryMap Object定义了查询结果的生成机制。如:属性STYLE(不是对象)设置选中的特征如何显示[5]。
Reference Map Object定义参照地图如何创立。MapServer支持三种参照地图类型。参照地图最普遍的用法是做为map的观察窗口。可以利用参照地图对查询结果进行观察。当点查询发生时,会在输出Reference Map中产生一个点符号,以指示被查询的位置。区域查询就在Reference Map 中产生一个方框,以指示查询区域。特征查询就在Reference Map显示查询的特征。总之,Reference Map可以视为查询的观察窗口[5]。
2.1.3,配置MapFile文件的步骤
在规划好WebGIS网站之后,配置MapFile文件步骤:
1)准备MapFile文件需要的资源,包括GIS数据,字体文件,符号文件。
2)按照WebGIS网站的需求,遵循MapFile的语法,使用文本编辑软件或MapLab等专门的MapFile编写软件编写MapFile。
3)使用调试软件(如MapLab)测试、查看MapFile配置是否正确、合适。
2.2,MapServer环境下的WebGIS开发
配置好MapFile文件后,就可以使用MapServer CGI模块或MapScript模块开发WebGIS程序。它们的区别:
利用MapServer CGI模块需要做的工作:准备MapFile需要的资源,配置MapFile,设计用户交互界面(即html文件,可以使用脚本语言,如JavaScript增强交互性)。无法进行服务器端设计,因为MapServer CGI本身就是定制好的服务器端程序。当然可以通过修改源代码来使Map Server CGI具有需要的特性。
利用MapScript模块就需要其他服务器端解决方案(指脚本语言),如PHP(以CGI模块安装在Web Server上)。MapScript模块作为PHP的扩展模块,放在PHP安装路径的extensions目录下。MapScript模块保留MapFile文件的层次对象结构,向PHP提供对象结构的API。那么,程序员在服务器端就可以使用PHP通过调用MapScript的API灵活的选择,修改MapFile文件;而不像MapServer CGI模块那样死板。同时结合PHP对众多数据库——非空间数据库,如Oracle, Sybase, MySQL等的支持,在WebGIS中整合空间数据和非空间数据变的容易。
MapScript支持的语言:PHP,Perl,Python,Java,Tcl,C#等[5]。
2.2.1,利用MapServer CGI模块开发WebGIS
CGI是一组定义了Web服务器与在同一台机器上的其他软件相互通信的规则。遵循CGI通信规则的其他软件叫CGI程序或CGI脚本。Web服务器可利用CGI程序实现动态交互功能(Server-side)。通常CGI程序是运行在服务器端的小程序,被Web服务器调用,处理从Web服务器获得的数据(如对表单数据处理,查询数据库等),将处理结果返回给Web服务器:
Web服务器——CGI程序——其他软件(如数据库)。
CGI程序可以使用任何语言编写,只要遵循CGI通信规则。编译语言:C、C++等;脚本语言:Perl, Python,
MapServer CGI模块是用C语言编写的CGI程序,非常小。MapServer CGI模块的核心mapserv.exe不过36KB。
当浏览器通过URL告知Web Server调用MapServer CGI模块时,Web Server就为CGI模块创建一个进程;CGI模块运行并加载URL指定的MapFile文件,读取MapFile文件中的TEMPLATE文件(HTML文件),并将TEMPLATE文件中CGI 变量的替换变量(template substitutions)替换成具体的值;处理完TEMPLATE文件后,CGI模块将TEMPLATE文件处理结果(HTML文件)返回给Web Server,Web Server在将HTML文件输出到用户浏览器上。这时TEMPLATE文件(HTML文件)就作为用户的交互界面。
使用MapServer CGI程序设计WebGIS的基本步骤:
1)配置MapFile
一般在Web Object的TEMPLATE属性中指明使用的用户交互界面。用户也可以通过URL指明使用的用户交互界面。
2)设计初始化界面。
考虑到访问CGI程序(mapserv.exe)URL很长,而且对于普通用户并不知道访问CGI程序(mapserv.exe)的URL格式;所以在初始交互界面中嵌入指向CGI程序(mapserv.exe)的链接(URL)。
3)设计用户交互及交互界面:
这里需要引出MapServer CGI模块的关键概念:CGI 变量和Templates。MapServer CGI 变量可以看作是CGI模块mapserv.exe的接口。在URL或HTML的表单中调用CGI变量就可以完成大多数动态交互,如图层选择,放大缩小等。
Templates是HTML文件或URL。在Templates中含有CGI变量和它的替换变量,这里替换变量(template substitutions)与CGI变量相一一对应。
设计用户交互及交互界面,即在URL或HTML文件中使用CGI变量和替换变量。那么,既然替换变量(template substitutions)与CGI变量相一一对应,又为何要引入替换变量(template substitutions)的概念了?确实在概念上有点多取一举。不过,使用替换变量可以用来指示CGI变量值为空的情况。
在附录2中将提供利用MapServer CGI模块开发WebGIS的例子。
2.2.2,利用MapScript模块开发WebGIS
这里将以流行的服务器端脚本语言PHP为例介绍MapScript模块的使用方法。
PHP以CGI程序安装在Web Server中,把MapScript模块放置在PHP安装路径的extensions下,配置php.int文件支持使用MapScript模块,就完成PHP/Mapscript安装。
在*.php文件或*.phtml文件中使用函数:dl(“MapScript模块名称”)就可以加载MapScript模块了。
由MapScript模块提供的API是基于对象的,它将MapFile中对象组织成对象接口。在*.php文件或*.phtml文件中可以调用对象的属性和方法。
在附录3中将提供由作者使用PHP/MapScript编写的程序源代码。
3,结论
MapServer作为WebGIS解决方案。它是面向对象的,基本配置文件MapFile和MapScript模块的API组织都是基于对象的。MapServer通过支持OGC协会的若干标准,支持分布和互操作。不论是使用MapServer CGI模块或服务端脚本语言+MapScript,都可以实现服务端与客户浏览器的动态交互。配置MapFile文件的语法简单、易学;如果你有使用过桌面GIS软件(如ArcMap)做过专题地图的经验,更是如此。
与商业软件相比,MapServer是开源的,你可以免费使用,还可以根据需要修改源代码。
需要指出的是MapServer作为开源项目,在不断的发展中。本文介绍的内容是以Mapserver的4.4.2版本为基础的。
4,致谢
5,参考文献
[1]http://gis.pku.edu.cn/course/giscourse/resources/dlxx/gis_11_1.htm
[2] 夏福祥.Web GIS技术[ C].中国海外GIS协会文集,1998
[3] Shashi Shekhar,Sanjay Chawla].Spatial Databases:A Tour.New Jersey: Prentice Hall, 2003
[5]http://mapserver.gis.umn.edu/doc.html
[6]http://www.opengeospatial.org/
[7]http://hoohoo.ncsa.uiuc.edu/cgi/
[8]http://nfgis.nsdi.gov.cn/nfgis/chinese/c_xz.htm
The WebGIS Programing Based On MapServer
(fengxuetao Lanzhou University)
Abstract:WebGIS as a new technique,which is general used,is a combination of web technique and gis technique. Using it on client,the browse(not all include pull-in components) can query,analysis the gis data distributing WWW. The one technique constructing WebGIS, is using CGI(common gateway interface) that the Mapserver constructed by University of Minnesota(UMN) uses. This thesis will introduce in details the open-source MapServer4.4.2——its essential configuration file and two
unattached modules, and the methods to use it for the WebGIS programming.
Key words:MapServer, WebGIS, open source, CGI, scripting language
来源(http://space.cz2000.cn/?uid-128-action-viewspace-itemid-1167)