关闭

基于MapServer的WebGIS开发

标签: cgiobjectreference服务器语言web
2847人阅读 评论(0) 收藏 举报

 

[日期:2005-6-9] 来源:http://phimath.blogchina.com/  作者:冯学韬 [字体: ]

基于MapServerWebGIS开发

冯学韬

兰州大学 fxtao98@yahoo.com.cn

 

摘要:WebGIS是将Web技术和GIS技术相结合的新技术,有着广泛的应用。通过WebGIS技术,客户端仅需使用浏览器(不一定包含专门插件)就可以对分布在Web上的GIS数据进行查询、分析等交互操作。实现WebGIS技术之一是在服务器端使用CGI技术,由美国明尼苏达大学开发的MapServer就是采用这种技术。本文将详细介绍实现WebGIS的开源软件MapServer4.4.2的配置文件和它的两个独立模块,及应用它们开发WebGIS的方法。

关键词:MapServerWebGIS,开源,CGI,脚本语言

1,背景介绍

地理信息系统对地表信息建立数学模型,利用计算机技术对数据进行存储,处理,分析。 其中采用Web技术的地理信息系统即WebGIS WebGIS的关键特征是面向对象、分布式和互操作。它将GIS数据和功能封装成对象,并且这些对像支持分布式计算,可以存储在不同的服务器上;对象通过一致的通信协议,可以方便的进行交换和交互操作[1]

WebGIS的实现方法之一是利用Common  Gateway InterfaceCGI)技术。在服务器端通过CGI应用程序连接Web ServerGIS空间数据库,客户端仅须使用浏览器就可以对空间数据进行查询分析[2]。美国的明尼苏达大学(University of Minnesota),提供的WebGIS解决方案:MapServer,就是利用CGI技术。MapServer支持三层体系结构[3],如下:

 

CGI

GIS空间数据库

MapServer

CGI 模块

或者

脚本语言+MapScript

 

 

Web服务器

客户端浏览器

1,三层体系结构

(图1,图中的脚本语言指服务端脚本语言;MapServerCGI模块和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]

2MapServer的组成及开发方法

MapServer是使用C语言编写的开源软件,它本身又依赖一些开源的或免费的库,如Shapelib, FreeType, Proj.4, GDAL/OGR[5]

(一)必须的库:

a)        GD Library MapServer通过使用GD graphics library来表现GIF, PNGJPEG 格式的图像。这些图像通过MapServer CGI在浏览器上浏览。

b)        RegexRegex是一个正则表达式库。

(二)可选的库:

a)        JPEG library:由GD调用生成JPEG 图像。

b)        PNG library:由GD调用生成PNG图像。

c)        Zlib:由libpng 用来提供图形压缩功能。

d)        FreeType 2:由GD.调用 提供TrueType支持。

e)        PROJ.4Proj.4用于动态的投影变换。WMS, WFS WCS Services也需要它的支持。

f)          GDAL/OGRMapServer 使用GDAL/OGR库来读入raster (GDAL) and vector (OGR)格式的数据

g)        ArcSDEArcSDEESRI公司的空间数据库引擎(它不是免费的)用于支持MapServer进入SDE 数据库。

h)        EPPL7:用来读取EPPL7 数据库和旧版本的Erdas LAN/GIS 文件。它是作为MapServer的内置库。

MapServer可以看作是两个独立模块的统称:MapServer CGI模块和MapScript模块。在服务器端可以使用任一模块,编写WebGIS程序。不过它们使用相同的配置文件MapFile。本文的重点就是介绍MapFile文件,及使用两个模块开发WebGIS的方法。

2.1MapFile文件

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

2MapFile对象层次关系

(图2MapFile中的对象及其层次关系;注意为绘图方便有些对象省略Object

MapFile的语法很简单。MapFile的关键字包括对象名(图2中的所有对象)、对象属性(keyword),对象结束标记“END”。对象名和对象结束标记“END”大小写不敏感;属性名大小写敏感,配置ESRIshapfile文件要使用大写,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.2MapFile文件中对象及其属性解释

    MapFile文件中大部分对象或与地图要素相对应,或是GIS中应用较普遍的概念;如LengendScalebarLayer等。这些对象的作用是较为明显,易懂的。在附录1中将对MapFile文件中的对象和属性的意义做详尽的解释。在这里解释四个特别对象的意义:Web ObjectOutputformat ObjectQuery ObjectReference Map Object

Web Object定义如何处理web接口。如:属性IMAGEPATH定义存储临时文件和图像的路径,TEMPLATE定义使用的交互界面文件[5]

Outputformate Object定义输出图像的格式。MapServerGIS数据格式文件(如shapefile)转换成MIMEMultipurpose Internet Mail Extensions)协议支持的图像格式,如gifpngjpeg[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.2MapServer环境下的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通过调用MapScriptAPI灵活的选择,修改MapFile文件;而不像MapServer CGI模块那样死板。同时结合PHP对众多数据库——非空间数据库,如Oracle, Sybase, MySQL等的支持,在WebGIS中整合空间数据和非空间数据变的容易。

MapScript支持的语言:PHPPerlPythonJavaTclC#等[5]

2.2.1,利用MapServer CGI模块开发WebGIS

CGI是一组定义了Web服务器与在同一台机器上的其他软件相互通信的规则。遵循CGI通信规则的其他软件叫CGI程序或CGI脚本。Web服务器可利用CGI程序实现动态交互功能(Server-side)。通常CGI程序是运行在服务器端的小程序,被Web服务器调用,处理从Web服务器获得的数据(如对表单数据处理,查询数据库等),将处理结果返回给Web服务器:

Web服务器——CGI程序——其他软件(如数据库)。

CGI程序可以使用任何语言编写,只要遵循CGI通信规则。编译语言:CC++等;脚本语言:Perl, Python,  Bourne shellJava[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 ServerWeb Server在将HTML文件输出到用户浏览器上。这时TEMPLATE文件(HTML文件)就作为用户的交互界面。

使用MapServer CGI程序设计WebGIS的基本步骤:

1)配置MapFile

一般在Web ObjectTEMPLATE属性中指明使用的用户交互界面。用户也可以通过URL指明使用的用户交互界面。

2)设计初始化界面。

考虑到访问CGI程序(mapserv.exeURL很长,而且对于普通用户并不知道访问CGI程序(mapserv.exe)的URL格式;所以在初始交互界面中嵌入指向CGI程序(mapserv.exe)的链接(URL)。

3)设计用户交互及交互界面:

这里需要引出MapServer CGI模块的关键概念:CGI 变量和TemplatesMapServer CGI 变量可以看作是CGI模块mapserv.exe的接口。在URLHTML的表单中调用CGI变量就可以完成大多数动态交互,如图层选择,放大缩小等。

TemplatesHTML文件或URL。在Templates中含有CGI变量和它的替换变量,这里替换变量(template substitutions)与CGI变量相一一对应。

设计用户交互及交互界面,即在URLHTML文件中使用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模块的使用方法。

PHPCGI程序安装在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解决方案。它是面向对象的,基本配置文件MapFileMapScript模块的API组织都是基于对象的。MapServer通过支持OGC协会的若干标准,支持分布和互操作。不论是使用MapServer CGI模块或服务端脚本语言+MapScript,都可以实现服务端与客户浏览器的动态交互。配置MapFile文件的语法简单、易学;如果你有使用过桌面GIS软件(如ArcMap)做过专题地图的经验,更是如此。

与商业软件相比,MapServer是开源的,你可以免费使用,还可以根据需要修改源代码。

需要指出的是MapServer作为开源项目,在不断的发展中。本文介绍的内容是以Mapserver4.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 ShekharSanjay Chawla].Spatial DatabasesA TourNew 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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:129268次
    • 积分:2042
    • 等级:
    • 排名:第18841名
    • 原创:73篇
    • 转载:5篇
    • 译文:1篇
    • 评论:31条
    最新评论