1.7. MapServer的使用过程#

MapServer作为WebGIS解决方案。它是面向对象的,基本概要MapFile和MapScrip模块的API组织是基于对象的。MapServer通过支持OGC协会的几个标准来支持分发和互操作性。无论是使用MapServer CGI组件,还是服务器脚本语言+MapScrip,都可以实现服务器端和客户端浏览器之间的动态交互。配置MapFile文件的语法简单易学,特别是如果您有使用桌面地理信息系统软件(如ArcMap)制作专题地图的经验。与商业软件相比,MapServer是开源的,可以免费使用,并可以根据需要修改源代码。需要指出的是,MapServer作为一个开源项目,正在不断开发中;但近年来,功能已经比较完善,更新量也比较小。本网站的内容基于Mapserver7.0版及更高版本。

一旦配置了MapFile文件,就可以使用MapServer CGI模块或MapScript模块来开发WebGIS程序。它们之间的区别是:

  1. 使用MapServer CGI模块需要做的工作是:准备MapFile所需的资源,配置MapFile,并设计用户界面(即html文件,您可以使用脚本语言如JavaScript来增强交互性)。服务器端设计是不可能的,因为MapServer CGI本身就是一个定制的服务器端程序。当然,可以通过修改源代码使Map Server CGI具有所需的功能。

  2. 使用MapScript模块需要其他服务器端解决方案(指脚本语言),如PHP(作为CGI模块安装在Web服务器上)。MapScript模块作为一个PHP扩展模块放置在PHP安装路径的扩展目录中。MapScript模块保留了MapFile文件的分层对象结构,并为PHP提供了对象结构的API。然后,程序员可以在服务器端使用PHP灵活地选择通过调用MapScrip API来修改MapFile文件;而不是像MapServer CGI模块那样僵化。同时,结合PHP对Oracle、Sybase、MySQL等多种非空间数据库的支持,使得空间数据和非空间数据在WebGIS中的集成变得容易。

MapScript支持的语言包括PHP、Perl、Python、Java、TCL、C#等。

1.7.1. Mapfile 的基本要求#

如您所见,Mapfile的语法相对简单。通常,MapServer的关键字和值不区分大小写。然而,在这本书中,关键字始终是大写的,值是小写的。这是为了清楚起见,没有必要。假设它们区分大小写是个好主意。但是,您应该知道,在这种情况下,当您与空间数据集交互时,属性值仍然区分大小写,这一点可能很重要。例如,基础数据库中的属性名称可能区分大小写,因此对表达式包含的属性的引用也将区分大小写。

包含嵌入空格的字符串必须用引号引起来。可以使用单引号或双引号,但必须成对使用。不能让一个字符串使用两个不同的引号字符。

1.7.2. MapServer Mapfile 格式分析#

MapServer将地图配置为通过 Mapfile (Mapfile)发布。 Mapfile 是MapServer的核心,它将各种地图元素组织成一个层次化的对象系统。映射文件定义了组成映射的元素以及它们之间的关系,并告诉MapServer在哪里加载数据以及如何表示数据。在 Mapfile 中,层是数据和样式的组合;其中的数据是空间数据和属性数据的组合;样式是通过类和样式对象实现的。

Map files use # as line comment characters. The map files all use the keyword MAP as the beginning of the map object, and the keyword END as the end mark of the map object definition. The entire map file represents a map object. Between the MAP and END keys are key/value pairs describing the properties of the map object.

地图对象具有许多特性,例如地图图像格式(ImageType)、地图大小(SIZE)、地图数据路径(SHAPEPATH)、地图范围(范围)以及地图使用的符号集(SYMBOLSET)和字体集(FONTSET)。

每个 Mapfile 必须至少有一个Layer对象。用户可以定义任意多个层,但MapServer的默认最大层数限制为100个层。此参数可以通过修改 map.h 文件,但是在完成修改后,需要重新编译MapServer才能使用它。

MapServer不仅支持矢量层,还支持栅格图像层,如GeoTIFF、JPEG、PNG和GIF。更值得注意的是,MapServer还支持WMS层,即从其他WMS服务器获取地图图像以形成地图对象的层。

每个层还具有一些常用属性,如层名称(名称)、数据集(数据)、类型(类型)和是否显示(状态)等。

每个层都有一个或多个类对象,用于对层中的要素进行分类。通常,Layer对象中有一个关键字CLASSITEM,用于指定属性字段,以便根据该字段的值将层分为类别(Class)或主题(Theme)。如果在Layer对象中指定了关键字CLASSITEM,则每个Class对象中都需要一个关键字表达式来指示类别表示的属性值。类对象通常有一个名称属性。

每个类对象使用一个或多个样式对象来定义此类要素的显示样式,例如符号的类型(符号)、填充的颜色(COLOR或OUTLINECOLOR)、符号的大小(SIZE)等。

1.7.3. 映射文件的结构#

映射文件由层次结构中的对象组成。层次结构的顶部是映射对象(即映射文件本身)。地图对象既包含简单项目,也包含结构化项目。简单项目由键值对组成,结构化项目包含其他项目,每个项目可以是简单的,也可以是结构化的。您已经看到了这两种类型的映射文件的结构示例,例如,第2章中讨论的First.map包含以下行:

NAME "First"
EXTENT -125.00 20.00 -65.00 50.00

这些行中的每一行都包含一些简单的映射文件对象。您还会注意到,这些关键字指定的值使映射作为一个整体具有意义。例如,关键字名称首先设置映射的名称。此关键字在映射级用于指定一个字符串,该字符串标识在映射文件的生成输出文件MapServer的过程中生成的所有映射。但是,请注意,一个关键字可以在其他级别使用相同的名称,其功能取决于使用它的位置。同样,关键字的作用域设置了整个映射的作用域,因此还必须在映射层次结构级别定义它。和名字一样,它也可以在更低的级别上使用。

请注意,如果您是MapServer和User的新手,在映射文件的不同级别使用相同的关键字(如名称、模板或颜色)可能会造成混淆。当您熟悉映射文件的概念时,这应该不是问题,事实上,您会意识到开发人员选择用相对相似的概念在不同的级别定义相同的关键字。

First.map包括以下几行:

WEB
   TEMPLATE '/var/www/htdocs/first.html'
   IMAGEPATH '/var/www/htdocs/tmp'
   IMAGEURL '/tmp/'
END

这是一个结构化对象的示例。Web对象确定MapServer将使用的HTML模板以及模板所在的位置。Web对象通常用于确定MapServer如何响应Web请求,并且可以包含比此处显示的关键字更多的关键字。由于Web对象定义用于显示整个地图,因此指定地图是有意义的。但是,相同的关键字模板可以在更低的级别使用,其功能也有很大不同。很多MapServer对象都可以定义地图,但现在我将向您介绍一个Layer对象。

1.7.4. 利用MapServer CGI组件开发WebGIS#

CGI是一组规则,用于定义Web服务器与同一台计算机上的其他软件之间的通信。遵循CGI通信规则的其他软件称为CGI程序或CGI脚本。Web服务器可以使用CGI程序实现动态交互功能(服务器端)。通常,cgi程序运行在服务器端的小程序上,由WEB服务器调用。对从Web服务器获取的数据进行处理(如表单数据处理、数据库查询等),并将处理结果返回给Web服务器:

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

CGI程序可以用任何语言编写,只要它们遵循CGI通信规则。诸如编译语言:C、C++等;脚本语言:Perl、Python、Bourne Shell、Java等。

MapServer CGI模块是一个用C语言编写的CGI程序,非常小。MapServer CGI模块的核心mapserv.exe只有36KB。

当浏览器通过URL通知Web服务器调用MapServer CGI模块时,Web服务器为CGI模块创建一个进程;CGI模块运行并加载URL指定的MapFile文件,并读取MapFile文件中的模板文件(Html文件)。将模板文件中CGI变量的模板替换为特定值,CGI模块对模板文件进行处理后,将模板文件处理结果(Html文件)返回给Web服务器,WEB服务器将该Html文件输出到用户浏览器。此时,模板文件(HTML文件)被用作用户的交互界面。

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

  1. 配置映射文件:通常,使用的用户界面是在Web对象的模板属性中指定的。用户还可以通过URL指定要使用的用户界面。

  2. 设计初始化界面:考虑到访问CGI程序(mapserv.exe)的URL很长,而且普通用户不知道访问CGI程序(mapserv.exe)的URL格式,所以在初始交互界面中嵌入了一个指向CGI程序(mapserv.exe)的链接(URL)。

  3. 设计用户交互和交互界面:这里我们需要介绍MapServer CGI模块的关键概念:CGI变量和模板。MapServer CGI变量可以看作是CGI模块的mapserv EXE接口。在URL或HTML表单中调用CGI变量可以完成大多数动态交互,如层选择、放大和缩小等。

模板是HTML文件或URL。模板包含CGI变量及其替代变量,其中替代变量(模板替代)与CGI变量一一对应。设计用户交互和交互界面,即在URL或HTML文件中使用CGI变量和替代变量。那么,既然模板替换与CGI变量一一对应,为什么要引入模板替换的概念呢?这在概念上确实有点矫枉过正。但是,可以使用替代变量来指示CGI变量的值为空。

使用MapServer CGI模块开发WebGIS的示例将在附录2中提供。

1.7.5. 用MapScrip组件开发WebGIS#

CGI模块编程是使用CGI变量及其替代变量,CGI模块是编译程序(mapserv.exe);使用CGI模块很难实现更复杂的动态交互。使用其他服务器端脚本语言和MapScrip可以更轻松地实现复杂的WebGIS功能。

这里我们将以流行的服务器端脚本语言PHP为例,介绍MapScrip模块的用法。PHP作为CGI程序安装在Web服务器中,MapScript模块放置在PHP安装路径中的扩展下,而 php.int 文件配置为支持使用MapScrip模块,并且完成了PHP/MapScript安装。可以使用函数加载MapScript模块 dl (“MapScript模块名称”)在 *.php 文件或 *.phtml 文件。MapScript模块提供的API是基于对象的,它将MapFile中的对象组织到对象接口中。对象属性和方法可以在 *.php 文件或 *.phtml 档案。

由作者使用PHP/MapScrip编写的程序的源代码将在附录3中提供。

1.7.6. MapServer数据处理流程#

客户端将参数和所需的CGI程序发送到MapServer。MapServer收到客户端发送的参数后,根据参数中指定的映射文件路径读取映射文件。根据映射文件中指定的数据路径读取相关数据。将读取的数据转换为文本数据。这项工作是通过调用带有GD图形库的FreeType字体引擎来完成的。创建图形后,将其保存到客户端参数中指定的目录。根据 Mapfile 中定义的信息,MapServer读取指定的模板(模板文件),配置html和屏幕显示及相关数据,创建并嵌入图形(如比例尺大小、样本图像、参考文本),动态生成的空间信息图嵌入到模板中,生成可供客户使用的文件。完成后返回给客户端。

1.7.7. Mapfile#

Some tools for Mapfile, including VIM highlight tool, Sublime highlight tool.

MapFile files organize various map elements into object systems with hierarchical relationships. Data sources, data formats used, user interaction and support for the OGC protocol are also defined in MapFile.

  • MapObject

  • 查询映射

  • 符号

  • 投影

  • WebObject

  • 参考地图

  • 输出格式

  • 比例尺

  • 伦格德

  • 层对象

  • 标签对象

  • 标签对象

  • 功能

  • 投影

  • 类对象

  • 联接对象

  • 标签对象

  • Style对象

  • 栅格对象

MapFile中的对象及其层次关系;请注意,为了绘图方便,某些对象被省略为对象

MapFile的语法很简单。MapFile的关键字包括对象名称(图2中的所有对象)、对象关键字和对象结束标记“end”。对象名称和对象结束标记“end”不区分大小写;属性名称是区分大小写的Shapfile文件,其配置ESRI应为大写,而PostGIS文件始终为小写。在MapFile文件中,符号 # 用于单行注释。 Mapfile 有一个 .map 扩展名,可以使用各种文本编辑器编写。

以下是MapFile的一个示例:

配置一个完整的MapFile文件需要:地理信息系统数据源、字体文件、符号文件。GIS数据源可以分布在不同的计算机上:字体文件用于定义输出地图中使用的字体类型。地图中使用的点、线和面符号可以在MapFile文件的符号对象中定义;但是,为了实现符号重用-而不必在不同的MapFile文件中定义相同的符号,通常在MapFile外部定义单独的符号文件。

MapFile文件中的大多数对象要么对应于地图元素,要么在GIS中常用。如Lengend、Scalebar、Layer等。这些对象的功能明显且易于理解。MapFile文件中对象和属性的含义将在附录1中详细说明,这里解释四个特殊对象的含义:Web对象、OutputFormat对象、Query对象、Reference Map对象。

  • Web对象定义如何处理Web界面。例如:属性IMAGEPATH定义了存储临时文件和图像的路径,模板定义了使用的交互界面文件。

  • OutputFormate对象定义输出图像的格式。MapServer将GIS数据格式文件(如shapefile)转换为MIME(多用途互联网邮件扩展)协议支持的图像格式,如gif、png、jpeg等。

  • QueryMap对象定义了查询结果的生成机制。例如:属性样式(不是对象)设置选定要素的显示方式。

  • 参考贴图对象定义如何创建参考贴图。MapServer支持三种参考地图类型。参考地图最常见的用途是作为地图查看窗口。

可以使用参考地图来观察查询结果。当发生点查询时,会在输出参考地图中生成一个点符号,以指示要查询的位置。区域查询在参考地图中生成一个框以指示查询区域。要素查询在参考地图中显示查询的要素。简而言之,可以将参考地图视为查询的观察窗口 [5] 。

规划WebGIS网站后,配置MapFile文件步骤:

  1. 准备MapFile文件所需的资源,包括GIS数据、字体文件和符号文件。

  2. 根据WebGIS网站的要求,遵循MapFile的语法,使用文本编辑软件或MapLab等专门的MapFile编写软件来编写MapFile。

  3. 使用调试软件(如MapLab)进行测试,以查看MapFile配置是否正确和适当。