职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 1017|回复: 0

[ 转帖]基于MapServer的WebGIS开发

[复制链接]
蓝色梦幻 发表于 2008-9-10 22:25 | 显示全部楼层 |阅读模式
基于MapServer的WebGIS开发
来源:http://phimath.blogchina.com/  作者:冯学韬 [字体:大 中 小]  

基于MapServer的WebGIS开发



冯学韬

(兰州大学 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  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版本为基础的。
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-2 21:16 , Processed in 0.128042 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表