上面地图是在 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文件中,属性值可以在引号(""
)内。
在引号内写入属性值允许您设置值无法正常使用的特殊字符(如:]
, =
,"
和空格。要在属性值中编写单引号,只需使用两个引号(""
)。