运行时替换¶
- 作者
史蒂夫·莱姆
- 联系方式
来自明尼苏达州第纳尔
- 最后更新
2017-04-30
介绍¶
从4.0版开始,对mapserver cgi的运行时替换就已经存在了,而且它的使用还在继续扩展。简而言之,它允许您根据通过CGI请求传递的数据更改 Mapfile 的部分。
警告
此功能只能通过 mapserv服务 CGI应用。在mapscript中,由于开发人员可以完全控制处理输入数据,所以对您来说这很容易完成,。
区分大小写¶
由于版本6.4,CGI参数名不区分大小写。CGI参数值区分大小写。
基本实例¶
假设您希望用户动态地设置表达式的一部分,这样他们可以突出显示某个土地覆盖类别,并且您有一个表单元素(称为ctype),允许他们在其中进行选择:森林、水、湿地和发达国家。
请求的格式:(假设“Marsh”是有效的土地覆盖类别)::
http://...mapserv?map=....&ctype=marsh
然后您可以设置一个这样的层:
LAYER
NAME 'covertypes'
...
VALIDATION
"ctype" "[a-z]+"
END
CLASSITEM 'type'
CLASS # highlighted presentation
EXPRESSION '%ctype%'
...
END
CLASS # default presentation
...
END
END
处理请求时,CTYPE的值将替换字符串%CTYPE%, Mapfile 将正常处理。如果没有传入任何CType,则表达式将永远不会为true,因此除了轻微的性能影响之外,它不会真正影响任何内容。通常,您可以设置一个默认类来绘制不匹配的特性,但这也不是必需的。
支持的参数¶
并非每个mapfile参数都支持运行时替换,那些最有意义的参数已经开始得到其支持。所有参数必须经过验证。请记住,您还可以使用map_object_属性类型语法进行运行时配置,该语法在 :ref:`cgi_mapfile_change_parameters`中详细介绍。下面是允许运行时替换的属性列表:
类:表达式
类别:文本
类别:标题
层:连接
层:数据
图层:过滤器
层:tileindex
层:元数据
7.0 新版功能.
层:处理
7.0 新版功能.
MAP
6.2 新版功能.
outputformat 所有格式选项
7.0 新版功能.
map->web 元数据(仅限值,不包括键)
7.0 新版功能.
FILTERs¶
您可以使用运行时替换来更改过滤器中的值。例如,您的过滤器可以这样写:
FILTER (multimedia='%multimedia%' and seats >= '%nseats%' and Sound= '%sound%')
然后(假设您使用的是CGI接口),您可以使用用户以HTML格式定义的值传入名为multimedia、nseats和sound的变量。
你还应该定义 VALIDATION 这些变量上的表达式,以防止无意中向Postgis提交SQL(由于版本6.0,验证是必需的)。在层中,您将执行以下操作:
VALIDATION
'multimedia' '^yes|no$'
'sound' '^yes|no$'
'nseats' '^[0-9]{1,2}$'
END
我们用正则表达式来验证添加到筛选器之前的字符串的相应变量值。前两个将多媒体和声音的值限制为“是”或“否”。第三个将NSEAT的值限制为2位整数。
如果URL中没有提供默认值¶
运行时替换机制通常会创建语法错误的 Mapfile ,如果调用URL中没有提供替换参数,则几乎总是语义错误的 Mapfile 。
从版本5.6开始,您可以为任何替换参数提供默认值,如果在URL中找不到该参数,则将应用该值。你可以通过在里面提供特殊的条目来做到这一点。请参考 CLASS , LAYER 或 WEB 验证块:
VALIDATION
'default_sound' 'yes'
'default_nseats' '5'
'default_multimedia' 'yes'
END
在本例中,就像URL包含“&sound=yes&nseats=5&multimedia=yes”,一个 Mapfile 将被创建。
直到7.0.7版本才实现为“map”的“web”部分中的替换参数提供默认值。
如果相同的默认键出现在多个验证块中,则更专业的块中的键将覆盖更通用的块中的键。即“class”覆盖“layer”,后者覆盖“web”。使用“metadata”块而不是“validation”也可以使用相同的功能,但从MapServer 5.4.0开始,这种功能已被弃用。在shp2img实用程序中也可以访问此行为,允许您在不使用Web服务器的情况下测试运行时替换 Mapfile 。
VALIDATION¶
因为运行时替换会影响 Mapfile 的潜在敏感区域,如数据库列和文件名,所以必须使用模式验证(从6.0版开始)
模式验证使用正则表达式,这些表达式是描述如何将字符串与模式进行比较的字符串。您的系统正则表达式的确切功能可能会有所不同,但是您可以通过谷歌搜索“正则表达式教程”来找到大量的常规信息。
从MapServer 5.4.0开始,首选机制是“layer”定义中的 validation`块。这与旧的“metadata”机制稍有不同。 :ref:`validation`块可与 :ref:`class、 :ref:`layer`和 :ref:`web`一起使用。
VALIDATION
# %firstname% substitutions can only have letters and hyphens
'firstname' '^[a-zA-Z\-]+$'
# %parcelid% must be numeric and between 5 and 8 characters
'parcelid' '^[0-9]{5,8}$'
# %taxid% must be two capital letters and six digits
'taxid' '^[A-Z]{2}[0-9]{6}$'
END
如果相同的键出现在多个验证块中,则更专业的块中的键将覆盖更通用的块中的键。即“class”覆盖“layer”,后者覆盖“web”。