运行时替换

作者

史蒂夫·莱姆

联系方式

来自明尼苏达州第纳尔

最后更新

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中找不到该参数,则将应用该值。你可以通过在里面提供特殊的条目来做到这一点。请参考 CLASSLAYERWEB 验证块:

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”。

一些运行时替换具有特殊的警告。

ID

除了定义的任何“metadata”或“validation”之外,“id”参数还将接受特殊检查。它必须是字母数字,并且不能超过63个字符。