3.2. 交互式地图与浏览模型

3.2.1. 查看示例

上面的地图在 map 在模式下生成。它是静态地图(当您单击时不会发生任何变化)。

但打开下面的地图,可使用鼠标点击来进行互操作。

http://webgis.cn/cgi-bin/mapserv?map=/owg/mdc1.map&layer=states_line&layer=topo&mode=browse

3.2.2. 使用POST表单提交CGI变量

以前将MapServer需要的所有参数放在URL中,这是显式使用参数的方式,但这可能会导致URL变得非常长。

说明

另一种方法是使用表单提交参数。这是一张表格:

POST表单

这部分代码如下所示

<form method=POST action="/cgi-bin/mapserv">
<input type="submit" value="Use forms to generate maps">
<input type="hidden" name="map" value="/owg/mfc1.map">
<input type="hidden" name="layer" value="modis">
<input type="hidden" name="layer" value="states_line">
</form>
<IMG SRC="[img]" width=400 height=300 border=0>

对于POST提交,需要将参数放置在表单中。

3.2.3. Mapfile和模板文件描述

Mapfile描述

现在,我们来看一下 Mapfile :

 1MAP
 2    NAME "mapv19"
 3    IMAGETYPE "PNG24"
 4    EXTENT -180 -90 180 90
 5    SIZE 600 300
 6    SHAPEPATH "/gdata"
 7    SYMBOLSET "../symbols/symbols35.sym"
 8    FONTSET "../fonts/fonts.list"
 9    IMAGECOLOR 255 255 255
10    WEB
11        TEMPLATE "tmpl-pan.html"
12        IMAGEPATH "/owg/ms_tmp/"
13        IMAGEURL "/ms_tmp/"
14    END
15    LAYER
16        NAME "topo"
17        DATA "land_shallow_topo_8192.tif"
18        STATUS OFF
19        TYPE RASTER
20        PROCESSING "BANDS=1,2,3"
21        OFFSITE 71 74 65
22    END
23    LAYER
24        NAME "states_line"
25        DATA "wcountry.shp"
26        STATUS OFF
27        TYPE LINE
28        CLASS
29            NAME "State Boundary"
30            STYLE
31                SYMBOL "line5"
32                COLOR 255 255 0
33                SIZE 1
34            END
35        END
36    END
37END

与静态地图相比,只有以下行实际添加到Mapfile中:

TEMPLATE 'example1-9.html'

这会告知MapServer使用该页面 example1-9.html 作为模板文件。在将该文件发送到Web浏览器之前,MapServer将处理该文件并替换其遇到的标记,这是MapServer实现动态页面的机制。

The above code snippet defines the parameters of the Web object, starting with the keyword WEB and ending with the keyword END. The WEB object tells the map server the name of the HTML template file (in this case, only one, named example1-9.html ), the paths to the images to create, and the URLs to point to those images. As before, IMAGEPATH specifies the path to images created by MapServer. In this case you use absolute paths, but you can also use relative paths from the location of the mapfile. Note that you cannot remove the leading or final slash / from the IMAGEURL. The string defined by IMAGEURL is appended to the base URL (ie, http://localhost ) to generate the URL for the image rendered on the page.

Note that if you’re not sure about the importance of /, or what Apache’s DocumentRoot is, you can look it up at http://httpd.apache.org/docs/mod/core.html#documentroot.

超文本标记语言文件

在模板文件中,除了HTML文本内容之外,关键是该页面中的表单代码块(在浏览器页面上单击鼠标右键并选择“查看源代码”或类似的内容):

现在,让我们为我们的应用程序构建一个交互界面。

下面显示了如何使用表单提交,并通过输入控件传递各种参数。

<!-- START OF MAPSERVER FORM -->
<form name="mapserv" method="GET" action="/cgi-bin/mapserv">
    <input type="hidden" name="root" value="/owg">

用户每次单击地图时,此块都会执行MapServer CGI程序( /cgi-bin/mapserv ),可以使用以下内容定义此处的程序:

<input type="hidden" name="program" value="/cgi-bin/mapserv">

以下两个变量是用户定义的变量。如果它在方括号中找到正确的标记 [] ,MapServer将把它的值传递给HTML模板。

maplayer 变量是MapServer内部变量,它们是MapServer地图应用程序所必需的。

  <!-- HIDDEN MAPSERVER CGI VARIABLES -->
  <input type="hidden" name="map" value="[map]">
  <input type="hidden" name="imgext" value="[mapext]">
  <input type="hidden" name="imgxy" value="199.5 149.5">
  <input type="hidden" name="zoom" value="1">
  <input type="hidden" name="mode" value="browse">

  <div align="center">
  <table border="1" cellpadding="0" cellspacing="0">
  <tr>
        <td>
          <!-- THE INTERACTIVE, DYNAMICALLY CREATED MAP --
          <input type="image" name="img" src="[img]"
            width="400" height="300">
        </td>
      </tr>
    </table>
  </div>
</form>

map_web_template 变量将替换Mapfile中Web对象中的模板参数。

这张地图实际上是另一种形式。 input 使用以下代码表示:

<input type="image" name="img" src="[img]" width="400" height="300">

方括号中的项目 ([map][mapext] ,以及 [img] )是所谓的MapServer标记-这些是MapServer CGI变量,它们是用于赋值的MapServer CGI程序。标签 [map] 是 Mapfile 路径的占位符,因此当MapServer运行时,它将被替换为 "/owg/mfc1.map" 。标签 [mapext] 将替换为当前地图范围,该范围将随着在地图上的单击而更改; [img] 标记将被替换为MapServer CGI程序创建的图像的路径,在MapServer在服务器端呈现图像后,该名称将传递给客户端。在服务器上,路径 IMAGEPATH ( /owg/ms_tmp/ )必须存在并且具有适当的权限,可检查图像是否存在(在服务器上)的 IMAGEPATH ( /owg/ms_tmp/ )路径。

请注意,上面的调用也有一个隐藏变量 "mode" 具有价值的 "browse"" ,MapServer在 tmp 目录。该图像被引用为 [img] ,这就是在浏览器中看到的内容。

3.2.4. 对MapServer模板文件的要求

地图服务器模板文件必须包含特定字符串 mapserver template 在第一行,通常以HTML、JavasSript或XML注释的形式给出。这一行不会传递给客户端。此特定字符串不区分大小写。

MapServer的模板文件名后缀有限。可用的后缀包括: .gml.html.htm.js.kml.svg.tmpl.wml.xml

CGI变量

所有CGI参数都可以替换模板中的引用、MapServer特定参数和用户定义的参数。原则上,参数由MapServer直接传递,无需任何处理。此功能对于实现MapServer应用程序至关重要。

以下参考仅列出了获取有关MapServer修改的信息(如新比例尺、查询结果等)所需的模板占位符特定字符串。

模板的占位符字符串区分大小写。

属性项替换必须与dBASE文件中的项名称相同。

ArcView和ArcInfo通常生成项目名称全部为大写的dBASE文件。当模板为URL时,应用适当的URL编码(即, ' ''+' )。

某些占位符字符串也可以转义形式提供,例如URL编码。

特殊字符

模板只是一个包含在每次处理模板时被mapserv替换的特殊字符的HTML文件或URL字符串。简单的替换允许将活动层或空间范围等信息从用户传递到地图服务器,然后再传递回来。在大多数情况下,新值被转储到将再次传递的表单变量中。以下是特殊字符和表单变量的列表。HTML模板可以包含任何内容,包括JavaScript和Java调用。

在HTML文件中,属性值可以用引号引起来 ("" )。通过在引号中写入属性值,可设置值通常不使用的特殊字符(例如: ]=" 和空格。要在属性值中使用单引号,请仅使用两个引号 ("" )。