mapserver概述

来源:百度文库 编辑:神马文学网 时间:2024/04/29 01:22:16
2007-12-27 10:27
摘自——《http://www.3snews.com/blog/user1/zdxxg/archives/2006/3573.html》
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版本为基础的