基于
MapServer
的
WebGIS
开发
冯学韬
摘要:
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]
,如下:
MapServer
CGI 模块
或者
脚本语言+MapScript
|
图
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
中包括的对象及其层次关系:
图
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 Tou
r
.
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
(f
engxuetao 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栏内输入
[url]http://localhost/scripts/mapserv.exe然后按Enter[/url]
若果正常,在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有些分别.