3.1. 使用CGI的MapSever交互

要通过Mapfile配置文件进行映射,已经了解了地图、层和类的基本概念,并知道Mapfile的各个部分是如何组合的。现在转到一款应用程序,它将提供完整的平移和缩放功能,以及打开和关闭图层的能力。

到目前为止,只有在创建地图时才能查看地图。创建Web地图应用程序通常意味着创建可由(应用程序的)用户更改的地图。也就是说,用户可以改变地图的内容(或信息)。要以交互方式完成此操作,使用MapServer HTML模板。

MapServer CGI是基于模板的。当第一次执行以响应Web请求时,它读取描述地图的层和其他组件的配置文件( Mapfile )。它绘制并保存地图。接下来读取Mapfile中标识的一个或多个HTML模板文件。每个模板都由传统的HTML标记标记和特殊的MapServer替换字符串组成。例如,这些字符串用于指定映射由MapServer创建的图像的路径、标识要渲染的层以及指定缩放级别和方向。MapServer替换这些字符串的当前值,并将数据流发送到Web服务器,Web服务器将其转发到浏览器。当请求者更改页面上的任何表单元素(例如,通过更改缩放方向或缩放值)并单击提交按钮时,MapServer将从Web服务器接收具有这些新值的请求,这个循环又开始了。

3.1.1. 关于MapServer网络访问的技术说明

最初目的是在CGI环境中生成地图,在该环境中,用户通过Web浏览器连接到ApacheWeb服务器。在这个环境中,Apache会调用MapServer,它可以从浏览器传递各种形式的变量。

利用这些信息,MapServer会生成地图和网页,并将这些地图和网页返回给浏览器。当然,MapServer仅根据浏览器的信息生成地图是不够的。

事实上,CGI MapServer网络应用程序有四个组件: Mapfile 、HTML初始化表单、一个或多个模板文件和空间数据(库)。

注:Web应用程序可以为静态页面提供固定内容,也可以通过脚本响应Web表单提供动态内容,以及数据库查询等功能。

确定这些脚本和Web服务器之间交互的标准称为通用网关接口,通常缩写为CGI。

这四个组成部分将在本章中讨论。前提是用户的Web浏览器已经显示了初始化的文件。

与所有Web应用程序一样,MapServer基于无状态协议,即每次调用时,它只知道浏览器与其通信的信息。无状态协议禁止使用程序回答除最后一个问题之外的任何问题。然而,一些聪明的代码可以提供一个有状态的环境,使Web应用程序能够完成更复杂的工作。例如,通过以隐藏形式将状态信息存储在变量中(如URL或Cookie),可以在调用之间维护状态。但有些方法需要引导程序,因此它包含第一次调用所需的信息。

在MapServer中,这是通过初始化文件来完成的。在CGI MapServer应用程序中,初始化文件是传统的HTML表单,其中包含将硬编码转换为表单变量的初始化信息。MapServer使用的几乎所有值都可以在初始化文件中设置。

当Apache第一次使用HTML的初始化表单调用MapServer时,将使用Form变量指定 Mapfile 的名称(扩展名通常是 .map )。

它会查找该文件的字体、符号、模板和空间数据。 Mapfile 还指定最终地图的大小和地理范围,以及地图是GIF、JPEG还是PNG格式。在读取 Mapfile 后,MapServer渲染一个或多个图像:地图本身、图例和比例尺,可能还有参考地图。它将这些图像存储在 Mapfile 中的指定位置。

为了显示结果,MapServer需要设计地图格式并组织相关元素,使其成为网页。程序本身不会生成HTML;相反,它会扫描HTML模板以替换字符串。字符串替换可以引用文件、地图几何图形的详细信息、层规范或比例因子。它们也可以是CGI变量的常量,例如图像大小、贴图文件的名称、贴图范围等。

MapServer用适当的值替换该字符串,并将修改后的HTML返回给请求信息的浏览器。

在本章中,将构建一个地图应用程序,以说明使用MpaServer的简单性以及组件如何协同工作。

接下来的章节将介绍MapServer的功能(投影、瓦片检索、标注、查询等),这些功能将使MapServer的功能更加明显。

3.1.2. 通过CGI开发MapServer应用程序

MapServer提供了两个开发接口:CGI和MapScrip。CGI是MapServer应用程序开发最基本的方法。在CGI模式下,MapServer使用GD库将空间数据转换为地理图形,并将其传输回用户的浏览器。用户不需要安装任何特定的浏览程序就可以通过浏览器对其进行操作。

用户可以通过类似如下的URL直接向MapServer服务器发送请求,MapServer根据请求的参数创建相应的地图图像,并将结果返回给用户的浏览器:

http://hostname/cgi-bin/mapserv?map=/ms4w/apps/txitorial/htdocs/example1-1.map&layer=states&mode=map

其中 /cgi-bin/mapserv 是MapServer cgi程序。 ? 后面是由MapServer CGI参数组成的查询字符串,如 maplayermodemap 参数指定要由MapServer处理的地图文件, layer 参数告诉 mapserv 显示该层, mode 参数告诉 mapserv 生成静态地图图像。

或者,也可以通过指定 mode 参数添加到浏览器。此时,当用户点击地图时,MapServer将以用户点击的位置为中心生成放大、缩小或重新定位的地图。

生成动态地图需要一个带有表单的HTML模板来与用户交互。

一个简单的表格如下:

<!-START OF MAPSERVER FORM->
<form name=”mapserv” method=”GET" action="/cgi-bin/mapserv.exe">
<!-HIDDENMAPSERVERCGIVARIABLES->
<input type=Mhidden"name="map"value=n[map]">
<input type="hidden"name="imgext"value="[mapext]n>
<input type="hidden"name="imgxy"value="199.5149.5">
<input type="hidden"name="zoom"value=,T'>
<input type="hidden"name="mode"value="browse">
<div align="center">
<table border='T'cellpadding="0"cellspacing=”0">
<tr>
<td>
<!-THE INTERACTIVE,DYNAMICALLY CREATEDMAP->
<input type="image"name="img"src="[img]"
width=”400”height=”300”>
</td>
</tr>
</table>
</div>
</form>

MapServer HTML模板是带有MapServer标记的HTML格式的文件。MapServer标签是括在方括号中的MapServer CGI变量 ([] ),例如 [map][img] ,以及 [mapext] 等,表示 Mapfile 、地图图像URL和地图范围。通过使用Html模板,可以大大简化MapServer CGI编程。

当MapServer CGI程序接收到来自MapServer HTML模板的请求时,首先解析参数,处理请求并生成必要的输出,将这些输出中的一部分替换为HTML模板中相应的MapServer标记(变量),最后将具有输出结果的HTML(模板)文件返回给客户端浏览器。由于模板中的地图作为表单元素返回,因此用户可以与其交互。

MapServer为Web制图提供了许多CGI变量。MapServer Mapfile 中的几乎所有关键字都可以定义为变量,但在地图的核心中并没有太多的CGI变量。此外,用户还可以自定义变量,例如用户可以定义名为 root ,用于表示应用程序的根目录。

MMap浏览只能依靠MapServer提供Web地图服务的基本功能。此外,MapServer还提供强大的空间和属性查询功能。在CGI模式中,广泛使用HTML模板来构造查询和组织查询返回的信息,这通常涉及与Mapfile 、模板和MapServer CGI程序的复杂交互。

MapServer有多种模式( mode ,并浏览( browse )模式是MapServer的默认模式。与查询相关的模式有18种。通过使用这些查询模式,MapServer可以实现根据鼠标位置查询点、根据输入坐标值查询点、通过输入表达式查询属性、根据元素序列号查询。

MapServer创建图例和比例(可在 Mapfile 中配置)并生成参考地图。参考地图显示当前显示的地图的上下文,缩放和平移由用户控制。

3.1.3. MapServer HTML模板

对于MapServer HTML模板,需要将MapServer模板声明添加到每个HTML模板文件中。否则,当使用GetFeatureInfo(具有INFO_FORMAT集合)作为文本/html请求时,您将收到以下错误消息:

Content-type: text/xml isValidTemplate(): Web application error.
Missing magic string, template-file doesn't look like a MapServer template.

需要在每个模板的开头添加:

<!-- MapServer Template -->

示例模板查询footer.html为:

<!-- MapServer Template -->

MapServer HTML模板实际上是特定于MapServer的HTML文件-这些表标记是包含在中的MapServer CGI变量 [] 。当MapServer CGI程序处理应用程序时,它首先解析 query_string 和Mapfile,并产生必要的输出。这些输出需要写入一个HTML模板文件中,该文件必须使用Web模板关键字在Mapfile中定义(或在单独的HTML初始化文件中)。CGI程序在将其发送到Web浏览器之前,将用适当的值替换HTML模板中的所有变量。如果您直接在Web浏览器上查看HTML模板的内容,将没有可用的地图,只有空图像和其他未知含义的字符。

MapServer的网络地图提供了一些变量- img 变量,其中几个常用的CGI变量被设计为map接口初始化的一部分,但实际上所有的MapFile参数都可以定义为变量。

有关cgi变量的明确引用,请访问:http://www.mapserver.org/cgi/index.html

MapServer使用的CGI变量也可以由开发人员定义,MapServer将把它传递给应用程序。例如,我们可以创建一个名为 root 来表示本教程的根目录-- root 将由以下人员阅读 /tutorial 。当MapServer CGI值处理我们的HTML模板时,它将替换 [root] 标记和 /tutorial 。您将在下面的每个示例中看到这一点。