带MapServer的HTML图例

作者

杰夫麦克纳

联系

jmckenna在gatewaygeomatics.com

最后更新

2016-02-25

介绍

HTML图例是MapServer中传统GIF图例的替代方案。以下文档描述了在MapServer CGI应用程序中实现HTML图例的过程(注意:需要MapServer版本>3.5)。

本文档假定您已经熟悉MapServer的某些方面:

  • 设置MapServer映射文件和模板。

实施

生成HTML图例的关键组件有:1)Legend对象中的模板参数;2)HTML文件中的CGI[图例]标记;3)HTML图例模板文件。这意味着,如果HTML页面设置了CGI[Legend]参数,并且mapfile的Legend对象的模板设置为有效的HTML Legend文件,则会返回HTML Legend。以下部分将讨论这些组件。

映射文件的图例对象

HTML图例由映射文件的Legend对象中的新模板参数启用。如果在Legend对象中设置了模板,则将读取HTML Legend模板文件,并使用该文件生成一个HTML Legend,该HTML Legend将插入主HTML模板中[Legend]标记的位置。与其他MapServer模板类似,HTML图例模板文件名必须以“.html”扩展名结尾。

示例1。具有新模板参数的图例对象示例

...
# LEGEND object
LEGEND
  STATUS ON
  KEYSIZE 18 12
  # LABEL object
  LABEL
    TYPE BITMAP
    SIZE MEDIUM
    COLOR 0 0 89
  END
  TEMPLATE "legend.html"  ### HTML template file
END
...

如果未设置模板,则[Legend]标记将在GIF/PNG图像(传统行为)中生成常规图像。

CGI[图例]标记

传统的CGI[Legend]标记返回图像的URL,因此通常在HTML文件中的<img src=[Legend]>标记内使用。新的HTML[Legend]标记返回一个HTML块,因此当将现有应用程序模板从使用传统图像图例转换为新的HTML图例时,必须删除主应用程序模板中的img标记。还要注意,如果在URL中指定了图例模式,那么如果没有指定模板,MapServer将返回包含整个图例的GIF。

CGI Reference doc 有关CGI参数的更多信息。

示例2。主HTML模板中的[Legend]标记(带模板集)

...
<FONT SIZE=+1><B>Legend</B></FONT><BR><HR>[legend]<HR>
...

示例3。主HTML模板中的[Legend]标记(未设置模板)

...
<FONT SIZE=+1><B>Legend</B></FONT><BR><HR><IMG SRC="[legend]"><HR>
...

HTML图例模板文件

HTML图例模板文件是一个单独的文件,其中包含以下每个标记中的0或1个,这些标记定义了用于构建图例的HTML块:

[leg_group_html] ... [/leg_group_html]
[leg_layer_html <OPTIONAL PARAMS>] ... [/leg_layer_html]
[leg_class_html <OPTIONAL PARAMS>] ... [/leg_class_html]

Note

模板解析器将忽略图例模板文件中[leg_u*html]标记对之外的任何文本或HTML标记。

以下示例显示HTML图例模板文件的外观:

例4。HTML图例模板文件

[leg_group_html]
<tr>
    <td colspan=3 bgcolor=#cccccc><b>[leg_group_name]</b></td>
</tr>
[/leg_group_html]

[leg_layer_html order_metadata=legend_order opt_flag=5]
<tr>
    <td>
        <input type=checkbox name="map_[leg_layer_name]_status"
       value=1 [if name=layer_status oper=eq value=2]CHECKED[/if]>
     </td>
    <td colspan=2>
        <a href="[metadata name=href]">[metadata name=layer_title]</a>
    </td>
</tr >
[/leg_layer_html]

[leg_class_html]
<tr>
    <td width=15> </td>
    <td>
        <img src="[leg_icon width=20 height=10]" width=20 height=10>
    </td>
    <td>
        [leg_class_name]
    </td>
</tr>
[/leg_class_html]

模板文件支持的标记:

标题块

标签

[leg_header_html]...[/leg_header_html]

描述

用作图例标题的HTML块。

组块

标签

[leg_group_html<可选参数>]…[/leg_group_html]

描述

如果层应在图例中分组,则用于层组标题的HTML块。如果未设置,则不会在图例中对层进行分组。

当使用[leg_group_html]标记时,不属于任何组的图层(即 Mapfile 中未设置的图层组)及其类将不会显示在图例中。组列表由order_元数据参数决定,稍后将对此进行解释。

支持参数:

参数

opt_flag=<bit_mask>

描述

通过添加以下值控制组的显示(默认值为15)。opt_标志应用于组中的所有层。如果至少有一个层与标志匹配,则组将显示在图例中。

1

如果设置,即使组中的所有层都超出比例,也显示组(默认:隐藏超出比例的组)。

2

如果设置,即使组中的所有层都处于关闭状态,也显示组(默认:隐藏状态为关闭的组)。

4

如果设置,即使组中的所有层都是查询类型,也显示组(默认:隐藏查询类型组)

8

如果设置,即使组中的所有层都是类型批注,也显示组(默认:隐藏类型批注的组)

6.2 版后已移除: 在现有图层中使用CLASS->标签或CLASS->样式,而不是单独的注记图层

例如,opt_flag=12(如下所示)表示显示所有层类型,包括查询和注释层(4+8)

[leg_group_html opt_flag=12]
   ...
[/leg_group_html]

支持的标签:

标签

[leg_group_name]

描述

返回组的名称。

标签

[layer_status]

描述

返回组中第一层的状态。

标签

[腿图标宽度=<可选宽度>高度=<可选高度>]

描述

在组上下文中,[leg_icon]标记返回属于此组的第一层中第一个类的图例图标的URL。

标签

[元数据名称=<metadata_field_to_display>]

描述

从Web的元数据返回指定的元数据值。

例如,下面的组块只在图例中显示组的名称:

[leg_group_html]
  <tr><td colspan=2><b>[leg_group_name]</b></td></tr>
[/leg_group_html]

层块

标签

[leg_layer_html<可选参数>]。[/leg_层u html]

描述

用于层标题的HTML块。如果未设置,则不显示任何层标题(可能允许仅包含类的图例)。

支持参数:

参数

order_metadata=<field_to_order_by>

描述

指定层元数据的值<field_to_order_by>控制图例中层的顺序和可见性。

  • <field_to_order_by>>=0的图层按此值的顺序排序,接受具有相同值的多个图层,在这种情况下,地图图层顺序适用于这些图层之间。

  • 具有<field_to_order_by><0的层始终隐藏在图例中。

参数

opt_flag=<bit_mask>

描述

控制层显示过程。添加以下值以获取所需选项(默认值为15):

1

如果设置,即使超出比例也显示图层(默认:隐藏超出比例的图层)。

2

如果设置了,即使状态为“关闭”,也显示图层(默认:隐藏状态为“关闭”的图层)。

4

如果设置,即使类型为查询也显示层(默认:隐藏类型查询的层)

8

如果已设置,则即使类型为“批注”,也显示层(默认值:隐藏类型批注的层)

6.2 版后已移除: 在现有图层中使用CLASS->标签或CLASS->样式,而不是单独的注记图层

例如,opt_flag=14(如下所示)表示不要在超出比例的图例中显示层。

[leg_layer_html opt_flag=14]
  ...
[/leg_layer_html]

支持的标签:

标签

[leg_layer_group]

描述

返回层的组名。已将其添加到MapServer v4.8.

标签

[leg_layer_index]

描述

返回层的mapfile索引值,这对于排序很有用。已将其添加到MapServer v4.8.

标签

[leg_layer_maxscale]

描述

返回为层设置的最大比例。已将其添加到MapServer v4.8.

标签

[leg_layer_minscale]

描述

返回为层设置的最小比例。已将其添加到MapServer v4.8.

标签

[leg_layer_name]

描述

返回当前层名称值。

标签

[腿图标宽度=<可选宽度>高度=<可选高度>]

描述

在层上下文中,[leg_icon]标记返回此层中第一个类的图例图标的URL。

标签

[元数据名称=<metadata_field_to_display>]

描述

从该层的元数据和Web的元数据返回指定的元数据值。

例如,下面的图层块只显示图层类别和图层名称的图标:

[leg_layer_html]
   <tr><td><img src=[leg_icon width=15 height=15]><b>[leg_layer_name]</b></td></tr>
[/leg_layer_html]

类块

标签

[leg_class_html<可选参数>]。[/leg_class_html]

描述

用于类的HTML块。如果未设置,则不显示任何类(可能允许仅包含层标题的图例)。请注意,不显示名称为空的类。

支持参数:

参数

opt_flag=<bit_mask>

描述

控制层(即类)显示过程。添加以下值以获取所需选项(默认值为15)。请注意,将此参数用于类块的效果与在层块中使用opt_flag参数的效果相同。

1

如果设置,即使超出比例也显示图层(默认:隐藏超出比例的图层)。

2

如果设置了,即使状态为“关闭”,也显示图层(默认:隐藏状态为“关闭”的图层)。

4

如果设置,即使类型为查询也显示层(默认:隐藏类型查询的层)

8

如果已设置,则即使类型为“批注”,也显示层(默认值:隐藏类型批注的层)

6.2 版后已移除: 在现有图层中使用CLASS->标签或CLASS->样式,而不是单独的注记图层

例如,opt_flag=14(如下所示)表示在图例中不显示超出比例的类。

[leg_class_html opt_flag=14]
  ...
[/leg_class_html]

支持的标签:

标签

[leg_class_index]

描述

返回类的mapfile索引值,该值对于排序和创建图例图标很有用。已将其添加到MapServer v4.8.

标签

[leg_class_maxscale]

描述

返回为类设置的最大刻度。已将其添加到MapServer v4.8.

标签

[leg_class_minscale]

描述

返回为类设置的最小刻度。已将其添加到MapServer v4.8.

标签

[leg_class_name]

描述

返回类名值。

标签

[leg_class_title]

描述

返回类标题值。

标签

[leg_layer_name]

描述

返回父层名称。已将其添加到MapServer v4.8.

标签

[腿图标宽度=<可选宽度>高度=<可选高度>]

描述

在层上下文中,[leg_icon]标记返回此层中第一个类的图例图标的URL。

标签

[元数据名称=<metadata_field_to_display>]

描述

从此类所属的层的元数据和Web的元数据返回指定的元数据值。

例如,下面的类块只显示层的类和类名的图标:

[leg_class_html]
  <tr><td><img src=[leg_icon width=15 height=15]><b>[leg_class_name]</b></td></tr>
[/leg_class_html]

条件文本

[if]标记可用于上面的任何[leg_uuuuhtml]标记中,以放置条件文本。语法是:

[if name=<field_to_check> oper=<eq|neq|isset|isnull> value=<to_compare_with_field>] ... [/if]

注:

支持嵌套的if。参数“oper”可以是“eq”表示相等,“neq”表示不相等,“isset”(不言自明)或“isnull”(不言自明)。默认值相等。

示例6。[if]标记可用于维护层的状态复选框

[leg_layer_html order_metadata=legend_order opt_flag=5]
<tr>
    <td>
        <input type=checkbox name="map_[leg_layer_name]_status"
         value=1 [if name=layer_status oper=eq value=2]CHECKED[/if] >
    </td>
    <td colspan=2>
        <a href="[metadata name=href]">[metadata name=layer_title]</a>
    </td>
</tr >
[/leg_layer_html]

可以在[if]标记中测试的可能值取决于使用[if]标记的上下文。目前,可以测试的值数量有限,但可以根据需要添加新值。

请注意,下列[如果]上下文中项目的顺序按其优先顺序列出。规则始终是,特殊关键字具有最高优先级(如图层状态等),其次是图层级元数据,最后是地图级元数据。可测试的可能值如下:

在**[leg_group_html]**上下文中:

  • [如果name=layer_status value=..]…[如果]

    值是以整数格式属于组的第一层的层状态:0=off,1=on,2=default

  • [如果名称=层可见值=………………[如果]

    值是组中第一层的可见性:0=不可见,1=可见

  • [如果name=group_name value=..]…[如果]

  • [如果name=any_layer_metadata value=..]。[如果]

    使用属于该组的映射文件中第一层的元数据值

  • [如果name=any_web_metadata value=..]。[如果]

  • [如果名称=层可查询值=……………[/如果]

    5.6 新版功能.

    值是组中第一层的可查询性:0=不可查询,1=可查询

在**[leg_layer_html]**上下文中:

  • [如果name=layer_status value=..]…[如果]

    值是以整数格式表示的层状态:0=off,1=on,2=default

  • [如果名称=层类型值=………………[如果]

    值是层的整数格式类型:0=点,1=线,2=多边形,3=栅格,4=注释(自6.2起已弃用),5=查询,6=圆

  • [如果名称=层名称值=……………[如果]

    值是字符串格式的层名称

  • [如果name=layer_group value=..]…[/如果]

    值是以字符串格式表示的层的组名

  • [如果名称=层可见值=………………[如果]

    值是层的可见性:0=不可见,1=可见

  • [如果name=any_layer_metadata value=..]。[如果]

  • [如果name=any_web_metadata value=..]。[如果]

  • [如果名称=层可查询值=……………[/如果]

    5.6 新版功能.

    值是层的可查询性:0=不可查询,1=可查询

在**[leg_class_html]**上下文中:

  • [如果name=layer_status value=..]…[如果]

    值是类所在层的状态

  • [如果名称=层类型值=………………[如果]

    值是层的整数格式类型:0=点,1=线,2=多边形,3=栅格,4=注释(自6.2起已弃用),5=查询,6=圆

  • [如果名称=层名称值=……………[如果]

    值是字符串格式的层名称

  • [如果name=layer_group value=..]…[/如果]

    值是以字符串格式表示的层的组名

  • [如果名称=层可见值=………………[如果]

    值是层的可见性:0=不可见,1=可见

  • [如果name=class_name value=..]…[如果]

  • [如果name=any_layer_metadata value=..]。[如果]

  • [如果name=any_web_metadata value=..]。[如果]

  • [如果名称=层可查询值=……………[/如果]

    5.6 新版功能.

    值是层的可查询性:0=不可查询,1=可查询

使用HTML图例的示例站点

https://demo.mapserver.org/itasca_legend/

此演示基于MapServer Itasca演示,包含几种不同的HTML图例,其中一些图例如下所示:

  • “HTML Legend 1”-仅显示类,类似于传统的图例:

    [leg_class_html opt_flag=15]
       <img src=[leg_icon]> [leg_class_name]<br>
    [/leg_class_html]
    
  • “HTML Legend 2”-显示带有href链接和类的层标题:

    [leg_layer_html order_metadata=WMS_ORDER visibility_flag=15]
       <a href="[leg_layer_name]">[metadata name=WMS_TITLE]</a><BR>
    [/leg_layer_html]
    
    [leg_class_html visibility_flag=15]
       <img src=[leg_icon]> [leg_class_name]<br>
    [/leg_class_html]
    
  • “HTML Legend 3”-按组显示层,带复选框以打开/关闭层:

    [leg_group_html]
       <tr><td colspan=2><b>[leg_group_name]</b></td></tr>
    [/leg_group_html]
    
    [leg_layer_html order_metadata=WMS_ORDER opt_flag=15]
       <tr>
            <td><input type=checkbox name=layer value=[leg_layer_name]
              [if name=layer_status value=1]CHECKED[/if]>
               [if name=layer_type value=4]
                   <img src=[leg_icon width=22 height=18]>
               [/if]
               [if name=layer_type oper=neq value=4]<img src=[leg_icon]>[/if]
            </td>
            <td>
               <a href="[leg_layer_name]">[metadata name=WMS_TITLE]</a>
            </td>
       </tr>
    [/leg_layer_html]