摘要: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 Gateway Interface(CGI)技术。在服务器端通过CGI应用程序连接Web Server和GIS空间数据库,客户端仅须使用浏览器就可以对空间数据进行查询分析[2]。美国的明尼苏达大学(University of Minnesota),提供的WebGIS解决方案:MapServer,就是利用CGI技术。MapServer支持三层体系结构[3],如下:
CGI |
GIS空间数据库 |
MapServer CGI 模块 或者 脚本语言+MapScript
|
|
Web服务器 |
客户端浏览器 |
图1,三层体系结构
(图1,图中的脚本语言指服务端脚本语言;MapServer的CGI模块和MapScript模块将在后面介绍)
相比与由商业企业提供的众多WebGIS解决方案,MapServer是开源项目。这就意味着你可以免费使用MapServer,并具有自行修改、复制以及再分发的权利[4]。同时MapServer还有众多的优点[5]:
1) 支持的矢量格式:ESRI shapefiles, PostGIS, ESRI 的ArcSDE等(通过OGR库实现)。支持的栅格格式:TIFF/GeoTIFF, EPPL7 等(通过GDAL库实现)。
2) 对shapefile文件,可以建立四元树空间索引。
3) 完全支持定制的template的输出。
4) 支持微软和Apple公司共同研制的字型标准TrueType。
5) 支持分块的(tiled)矢量和栅格数据。
6) 地图元素(如比例尺、图例,参照图等)自动控制 。
7) 图像比例自动调节。
8) 利用逻辑或正则表达式生成专题地图。
9) 特征标注(包含标注冲突解决)。
10) 可以通过URLs动态的对MapServer进行配置。
11) 支持动态的投影变换。
12) 对Open Geospatial Consortium若干网络规范的支持:WMS (client/server), non-transactional WFS (client/server), WCS (server only), WMC, SLD, GML 和Filter Encoding[6]。
2,MapServer的组成及开发方法
MapServer是使用C语言编写的开源软件,它本身又依赖一些开源的或免费的库,如Shapelib, FreeType, Proj.4, GDAL/OGR[5]。
(一)必须的库:
a) GD Library :MapServer通过使用GD graphics library来表现GIF, PNG和JPEG 格式的图像。这些图像通过MapServer CGI在浏览器上浏览。
b) Regex:Regex是一个正则表达式库。
(二)可选的库:
a) JPEG library:由GD调用生成JPEG 图像。
b) PNG library:由GD调用生成PNG图像。
c) Zlib:由libpng 用来提供图形压缩功能。
d) FreeType 2:由GD.调用提供TrueType支持。
e) PROJ.4:Proj.4用于动态的投影变换。WMS, WFS 或 WCS Services也需要它的支持。
f) GDAL/OGR:MapServer 使用GDAL/OGR库来读入raster (GDAL) and vector (OGR)格式的数据
g) ArcSDE:ArcSDE是ESRI公司的空间数据库引擎(它不是免费的)用于支持MapServer进入SDE 数据库。
h) EPPL7:用来读取EPPL7 数据库和旧版本的Erdas LAN/GIS 文件。它是作为MapServer的内置库。
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
TEMPLATE "/ms4w/apps/myapps/htdocs/temp.html"
IMAGEPATH "/ms4w/tmp/ms_tmp/"
IMAGEURL "/ms_tmp/"
END#END WEB
#
# Start of legend
#
LEGEND
KEYSIZE 20 10
KEYSPACING 10 20
LABEL
FONT heiti
TYPE TRUETYPE
SIZE MEDIUM
COLOR 0 0 89
END
STATUS ON
END#END LENGEND
#
# Start of scalebar
#
SCALEBAR
STATUS ON
IMAGECOLOR 255 255 255
STYLE 1
LABEL
FONT huawen
COLOR 0 0 0
SIZE SMALL
END
SIZE 250 5
COLOR 0 0 255
BACKGROUNDCOLOR 0 0 0
OUTLINECOLOR 0 0 0
UNITS KILOMETERS
INTERVALS 5
END#END SCALEBAR
#
#start of querymap
#
QUERYMAP
STYLE HILITE
COLOR 255 0 0
END#END QUERYMAP
#
#start of projection
#
PROJECTION
"init=epsg:20073"
END#PROJECTION
#
# Start of layer definitions
#
LAYER
NAME bou1_4p
TYPE POLYGON
STATUS ON
DATA bou1_4p
CLASS
NAME "bou1_4p"
SYMBOL 0
COLOR 255 255 0
END
END # Layer
END # Map File
2.1.1,配置MapFile需要的资源
配置一个完整的MapFile文件需要:GIS数据源,字体文件,符号文件。GIS数据源可以 分布在不同的计算机上;字体文件用来定义输出地图中使用的字体类型。地图中使用的点,线,面符号可以在MapFile文件Symbol对象中定义;不过为 了实现符号的重用——无须在不同的MapFile文件中定义相同的符号,通常在MapFile外部定义独立的符号文件。
2.1.2,MapFile文件中对象及其属性解释
MapFile文件中大部分对象或与地图要素相对应,或是GIS中应用较普遍的概念;如Lengend,Scalebar,Layer等。这些对象的作用 是较为明显,易懂的。在附录1中将对MapFile文件中的对象和属性的意义做详尽的解释。在这里解释四个特别对象的意义:Web Object,Outputformat Object,Query Object,Reference Map Object。
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, Bourne shell,Java等[7]。
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
从上面“2.2.1,利用MapServer CGI模块开发WebGIS”中可以看出使用CGI模块编程就是利用CGI变量和它的替换变量,而CGI模块是编译好的程序(mapserv.exe); 使用CGI模块难以实现较为复杂的动态交互。利用其他服务端脚本语言和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
[4] http://www.opensource.org/
[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
【原创】如何安装MapServer 4.4.1的Windows版及学习手册
由 hellogis2 于 2005-03-20 15:38
如何安装MapServer 4.4.1的Windows版及学习手册
1 下载MapServer 4.4.1的Windows版
http://mapserver.gis.umn.edu/win32bin/ms441pg.zip
2 下载MapServer 4.0 Tutorial
http://terrasip.gis.umn.edu/projects/tutorial/tutorial.zip
3 建立MapServer目录在C盘.
4 将ms441pg.zip解压,放在MapServer内.
5 将C:\MapServer\bin内的mapserv.exe拷贝到c:\Inetpub\Scripts内.
6 将C:\MapServer\Proj目录到C:\内.(Proj连目录名称,并不是Proj内的所有资料)
7 将C:\MapServer\bin内的所有dll的文件,拷贝到C:\Windows\system32内
(即是bgd.dll, dal12.dll, hd420m.dll, hm420m.dll, iconv.dll, libcurl.dll, libmap.dll,
libpq.dll, NCScnet.dll, NCSEcw.dll, NCSEcwC.dll, NCSUtil.dll, pdflib.dll, proj.dll,
xerces-c_1_7_0.dll拷贝到C:\Windows\system32内)
8 将Tutorial.zip解压,放在C:\Inetpub\wwwroot内
9 执行Internet Information Services
启动在树将目录的"预设的Web站台"
10 测试MapServer
打开Internet Explorer,在Address栏内输入
http://localhost/scripts/mapserv.exe然后按Enter
若果正常,在Internet Explorer内会看到No query information to decode. QUERY_STRING not set.
11 执行记事本(或其他文书Editor程式).
12 选"档案->开启旧档"
在档名栏内输入
C:\Inetpub\wwwroot\tutorial\example1-1.html
选"编辑->取代"
输入下面资料
寻找目标: /cgi-bin/mapserv40
取代为: /Scripts/mapserv.exe
按全部取代按钮
输入下面资料
寻找目标: http://terrasip.gis.umn.edu/
取代为: http://localhost/
按全部取代按钮
输入下面资料
寻找目标: map=/data/projects
取代为: map=C:/Inetpub/wwwroot
按全部取代按钮
选"档案->存档"
13 最后在Internet Explorer,在Address栏内输入
http://localhost/tutorial/example1-1.html
这时你会看到这个tutorial的第一个教程及地图显示在Internet Explorer内,你只要将所有tutorial内的教程,按照第12个步骤,
就可以顺利执行这些教程.
这些步骤希望对你们有用,因为我用的是NT2000 Workstation版,所以可能在其他版本的Windows有些分别.