上面地图是在 map 模式下生成的。它是一幅静态地图(当你点击时,不会有任何的改变)。
但是打开下面的地图,可以使用鼠标点击进行交互操作。
http://webgis.cn/cgi-bin/mapserv?map=/owg/mdc1.map&layer=states_line&layer=topo&mode=browse
前面将 MapServer 需要的参数都放在 URL 中,这是显式使用参数的方式,但是会导致 URL 变得很长。
另外一种方式是使用表单来提交参数,下面即为一个表单:
这部分代码如下
<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 :
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 文本内容,关键是此页面内的表单代码块(右键点击您的浏览器页面并选择“查看来源” 或者其他类似操作):
现在,让我们为我们的应用建立一个交互式的界面。
下面展示的是使用表单进行提交,各种参数通过 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模板。
map 和 layer 变量是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 template ,一般使用 HTML,JavasSript或XML注释的形式给出。
此行不会传递到客户端。这个特定字符串不区分大小写。
MapServer的模板文件名后缀是有限制的,可用的后缀为:
.gml , .html , .htm , .js ,.kml , .svg , .tmpl , .wml , .xml 。
所有CGI参数都可以在模板中替换引用,MapServer特定参数以及用户定义的参数。 原则上,参数由MapServer 直接传递, 不进行任何处理。此功能对于实现MapServer应用程序至关重要。
下面的参考仅列出了获取MapServer修改的信息所需的模板占位特定字符串,例如, 新的比例尺,查询结果等。
模板的占位字符串区分大小写。
属性项替换必须与dbase文件中的项名称相同。
ArcView和ArcInfo通常会生成dbase文件,其项目名称全部为大写。当模板是URL时,应用适当的URL编码(即 ' '到 '+' )。
一些占位字符串也可以以转义形式(如URL编码)提供。
模板只是HTML文件或URL字符串,其中包含每次处理模板时由mapserv替换的特殊字符。简单替换允许诸如活动层或空间范围之类的信息从用户传递到mapserv并再次传回。 大多数情况下,新值被转储到将再次传递的表单变量中。 下面给出了特殊字符和表单变量的列表。 HTML模板可以包含任何内容,包括JavaScript和Java调用。
在HTML文件中,属性值可以在引号("")内。
在引号内写入属性值允许您设置值无法正常使用的特殊字符(如:], =,"和空格。要在属性值中编写单引号,只需使用两个引号("")。