运行时替换

作者

史蒂夫·莱姆

联系

Gmail.com上的sdlim.

最后更新

2021-05-14

介绍

从4.0版开始,对mapserver cgi的运行时替换就已经存在了,而且它的使用还在继续扩展。简而言之,它允许您根据通过CGI请求传递的数据更改映射文件的部分。

警告

此功能只能通过 MAPSERV公司 CGI应用。在mapscript中,这很容易由您自己完成,因为开发人员可以完全控制如何处理输入。

区分大小写

由于版本6.4,CGI参数名不区分大小写。CGI参数值区分大小写。

基本实例

假设您希望用户动态地设置表达式的一部分,这样他们可以突出显示某个土地覆盖类别,并且您有一个表单元素(称为ctype),允许他们在其中进行选择:森林、水、湿地和发达国家。

请求应该看起来像(假设“Marsh”是有效的土地覆盖类别)::

http://...mapserv?map=....&ctype=marsh

然后您可以设置一个这样的层:

LAYER
    NAME 'covertypes'
    ...
    VALIDATION
        "ctype" "^[a-z]{5,10}$"
    END
    CLASSITEM 'type'
    CLASS # highlighted presentation
        EXPRESSION '%ctype%'
        ...
    END
    CLASS # default presentation
        ...
    END
END

Ctype参数的值限制为小写字符a到z,并且值的长度可以在5到10个字符之间。正则表达式开始(^)和结束($)锚点对于限制值非常重要- 始终使用它们

处理请求时,CTYPE的值将替换字符串%CTYPE%,映射文件将正常处理。如果没有传入任何CType,则表达式将永远不会为true,因此除了轻微的性能影响之外,它不会真正影响任何内容。通常,您会设置一个默认类来绘制不匹配的特性,但这不是必需的。

支持的参数

must 通过窗体或URL更改映射文件参数 . 下面是允许运行时替换的属性列表:

  • 类:表达式

  • 类别:文本

  • 类别:标题

  • 层:连接

  • 层:数据

  • 图层:过滤器

  • 层:tileindex

7.0 新版功能.

  • 层:元数据

7.0 新版功能.

  • 层:处理

6.2 新版功能.

  • MAP

7.0 新版功能.

  • outputformat:所有格式选项

7.0 新版功能.

  • map->web:元数据(仅限值,不包括键)

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中没有提供默认值

运行时替换机制通常会创建语法错误的映射文件,如果调用URL中没有提供替换参数,则几乎总是语义错误的映射文件。

由于版本5.6,您可以为任何替换参数提供默认值,如果在URL中找不到该参数,则将应用该值。你可以通过在里面提供特殊的条目来做到这一点。 CLASSLAYERWEB 验证块:

VALIDATION
    'default_sound' 'yes'
    'default_nseats' '5'
    'default_multimedia' 'yes'
END

在本例中,将创建映射文件,就好像URL包含“&sound=yes&nseats=5&multimedia=yes”。

WEB 剖面图 MAP

CLASS 重写 LAYER 哪些超越 WEB. METADATA VALIDATION

VALIDATION

因为运行时替换会影响映射文件的潜在敏感区域,如数据库列和文件名,所以必须使用模式验证(从6.0版开始)

模式验证使用正则表达式,这些表达式是描述如何将字符串与模式进行比较的字符串。您的系统正则表达式的确切功能可能会有所不同,但是您可以通过谷歌搜索“正则表达式教程”来找到大量的一般信息。

从MapServer 5.4.0开始,首选机制是 VALIDATION LAYER METADATA VALIDATION 块可用于 CLASSLAYERWEB .

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

METADATAVALIDATION,