这里介绍在MapServer中如何通过CGI方式实现地图的浏览与缩放控制。
与前面地图一样,我们通过传递我们的mapfile路径和其他参数( map=/ms4w/apps/tutorial/htdocs/example2-1.map&mode=browse
)
初始化我们的应用程序MapServ( /cgi-bin/mapserv
)。这里有一个链接:
在 Mapfile 中, 需要添加: TEMPLATEPATTERN '.'
, 不然可能会出现:
loadWeb(): General error message. URL-based TEMPLATE configuration failed pattern validation.
为了清晰起见,使用 Python 代码,将参数作成列表,如下:
>>> paras = [
... ['map', '/owg/mdca.map'],
... ['mode', 'browse'],
... ['root', '/oswebgis'],
... ['program', '/cgi-bin/mapserv'],
... ['layer', 'modis'],
... ['zoom', '0'],
... ['map_web', 'template+example2-1.html']
... ]
>>> url_para = '&'.join(x for x in ['='.join(x ) for x in paras])
>>> url_para
'map=/owg/mdca.map&mode=browse&root=/oswebgis&program=/cgi-bin/mapserv&layer=topo&zoom=0&map_web=template+example2-1.html'
如果要使用多个图层,则要多次使用 layer
参数 。 但是可以使用同一个模板文件。
>>> paras = [
... ['map', '/owg/mdca.map'],
... ['mode', 'browse'],
... ['root', '/oswebgis'],
... ['program', '/cgi-bin/mapserv'],
... ['layer', 'modis'],
... ['layer', 'states_line'],
... ['zoom', '0'],
... ['map_web', 'template+example2-1.html']
... ]
>>> url_para = '&'.join(x for x in ['='.join(x ) for x in paras])
>>> url_para
'map=/owg/mdca.map&mode=browse&root=/oswebgis&program=/cgi-bin/mapserv&layer=topo&layer=states_line&zoom=0&map_web=template+example2-1.html'
这次我们使用 browse
模式而不是 map
模式。browse
模式告诉 MapServer 在 /tmp/
目录上创建一个地图(图片)。图像的路径和名称由 MapServer 引用,名称为 img
。当 MapServer 解析 HTML 模板时,它会将 [img]
标记替换为图像的正确路径:img
。
可以使用此地图执行一些操作。 首先,单击图像的任何部分,地图将刷新并使单击的点居中。这是平移。 如果单击 Map Control
下拉框,则可以选择 zoom in
或 zoom out
值。如果您将其设置为 Zoom In 2x
,然后单击地图的任何部分,则地图将被刷新,放大,并且点击的点居中。如果缩小,则会发生相反的情况。当选择“放大”或“缩小”值并单击“刷新”按钮时,地图以上一个地图的中心进行放大或缩小。您可以随时使用刷新按钮刷新地图。
缩放/平移控件使用内部MapServer CGI变量。 此示例显示如何使用“缩放”变量。 zoom的值决定了放大或缩小的距离。 如果值为“0”,则MapServer会根据用户的鼠标单击重新定位图像。如果该值大于“0”,则CGI程序放大(地图的当前比例乘以缩放值)。 如果它是负数,则CGI程序缩小(将当前比例除以缩放值)。 可用于控制缩放和平移的其他变量是“zoomdir”和“zoomsize”。这两个变量几乎与“缩放”相同 - “zoomdir”控制缩放方向,“zoomsize”控制放大或缩小的距离。请查看OSGeo Gallery或MapServer wiki中的其他示例,了解其他缩放/平移控制选项。
尝试将“地图模式”从 browse
更改为 map
。 点击刷新后会发生什么?请记住,当我们使用 mode=map
时,MapServer会返回一个静态地图......它会忽略HTML模板,只是将地图图像直接流式传输到浏览器。
虽然添加了更多数据层,但它仍然类似于第一部分中的 Mapfile。
现在,看看HTML模板文件。 您会注意到它本质上是一个调用MapServer CGI程序的HTML表单。因为它是一个表单,您可以使用单选按钮和复选框以及下拉框来实现您的界面。不要被这个例子所限制 - 创造性很好。 ;)有关更多信息,请查看HTML模板参考页面。
下面展示的是使用表单进行提交,各种参数通过 input
来传递。效果与上面是一样的:
这里看一下 Mapfile :
01 MAP
02 NAME "mapv1a"
03 TEMPLATEPATTERN "."
04 IMAGETYPE "PNG24"
05 EXTENT -180 -90 180 90
06 SIZE 600 300
07 SHAPEPATH "/gdata"
08 SYMBOLSET "../symbols/symbols35.sym"
09 FONTSET "../fonts/fonts.list"
10 IMAGECOLOR 255 255 255
11 WEB
12 TEMPLATE "example1-a.html"
13 IMAGEPATH "/owg/ms_tmp/"
14 IMAGEURL "/ms_tmp/"
15 END
16 LAYER
17 NAME "topo"
18 DATA "land_shallow_topo_8192.tif"
19 STATUS OFF
20 TYPE RASTER
21 PROCESSING "BANDS=1,2,3"
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