交互地图及Browse模式

查看示例

上面地图是在 map 模式下生成的。它是一幅静态地图(当你点击时,不会有任何的改变)。

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

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

使用Post表单提交CGI变量

前面将 MapServer 需要的参数都放在 URL 中,这是显式使用参数的方式,但是会导致 URL 变得很长。

说明

另外一种方式是使用表单来提交参数,下面即为一个表单:

POST 表单

这部分代码如下

<form method=POST action="/cgi-bin/mapserv">
<input type="submit" value="使用表单生成地图">
<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 提交,需要将参数放在表单中。

Mapfile 与 模板文件说明

Mapfile 说明

现在,看一下 Mapfile :

01 MAP
02     NAME "mapv19"
03     IMAGETYPE "PNG24"
04     EXTENT -180 -90 180 90
05     SIZE 600 300
06     SHAPEPATH "/gdata"
07     SYMBOLSET "../symbols/symbols35.sym"
08     FONTSET "../fonts/fonts.list"
09     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
37 END

与静态地图相比,实际上添加到 Mapfile 的只有下面这一行:

TEMPLATE 'example1-9.html'

这告诉MapServer使用页面 example1-9.html 作为模板文件。MapServer将处理此文件并替换它遇到的标记,然后再将其发送到Web浏览器。这是 MapServer 实现动态页面的机制。

在上面的代码片段定义Web对象的参数,以关键字 WEB 开始, 以关键字 END 终止。WEB 对象告诉地图服务器HTML模板文件的名称(在这种情况下,只有一个,名为 example1-9.html ),创建的图像的路径,并在URL指向那些图像。像以前一样,IMAGEPATH指定的MapServer创建的图像的路径。在这种情况下,你使用绝对路径,但也可以从mapfile的位置使用相对路径。请注意,您不能从IMAGEURL删除的开始或最后的斜线 /。由IMAGEURL定义的字符串附加到基本URL(即,http://localhost的)生成URL的页面上呈现的图像。

注意如果你不确定/ 的重要性,或者是 Apache 的 DocumentRoot 是什么,可以在 http://httpd.apache.org/docs/mod/core.html#documentroot 查询。

HTML文件

在模板文件中,除了 HTML 文本内容,关键是此页面内的表单代码块(右键点击您的浏览器页面并选择“查看来源” 或者其他类似操作):

现在,让我们为我们的应用建立一个交互式的界面。

下面展示的是使用表单进行提交,各种参数通过 input 控件来传递。

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

每次用户单击地图时,此块都会执行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 对象中的 TEMPLATE 参数 。

地图实际上是另一种形式的 input,使用下面的代码来表示 :

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

方括号中的项([map] , [mapext] , and [img] )就是所谓的MapServer标签 - 这些是MapServer CGI变量,它们在重新加载时会被MapServer CGI程序进行赋值。标签 [map] 是 Mapfile 路径的占位符,因此当MapServer运行时, 它将替换为 "/owg/mfc1.map" 。 标签 [mapext] 将替换为当前地图范围,这个值会随着在地图上点击而改变;[img] 标签将替换为MapServer CGI程序创建的图像的路径,在 MapServer 在服务器端渲染生成图片后,会将名称传递到客户端。在服务器上,路径 IMAGEPATH/owg/ms_tmp/ ) 必须存在,并且具有相应的权限。可以检查一下 MapServer 中 IMAGEPATH/owg/ms_tmp/ )路径下是否存在此图像(在服务器上)。

注意上面的调用还有一个隐藏变量 "mode",其值为 "browse"" ,这个变量会告诉 MapServer 在 tmp 目录中创建和存储图像。然后,此图像被引用为 [img] ,也就是在浏览器中看到的内容。

MapServer 模板文件的要求

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编码)提供。

特殊字符

模板只是HTML文件或URL字符串,其中包含每次处理模板时由mapserv替换的特殊字符。简单替换允许诸如活动层或空间范围之类的信息从用户传递到mapserv并再次传回。 大多数情况下,新值被转储到将再次传递的表单变量中。 下面给出了特殊字符和表单变量的列表。 HTML模板可以包含任何内容,包括JavaScript和Java调用。

在HTML文件中,属性值可以在引号("")内。 在引号内写入属性值允许您设置值无法正常使用的特殊字符(如:]="和空格。要在属性值中编写单引号,只需使用两个引号("")。