MapServer的HTML图例¶
- 作者
Jeff McKenna
- 联系方式
jmckenna在gatewaygeomatics.com
- 最后更新
2016-02-25
介绍¶
HTML图例是MapServer中传统GIF图例的替代方案。以下文档描述了在MapServer CGI应用程序中实现HTML图例的过程(注意:需要MapServer版本>3.5)。
本文档假定您已经熟悉MapServer的某些方面:
设置MapServer Mapfile 和模板。
实施¶
生成HTML图例的关键组件有:1)Legend对象中的模板参数;2)HTML文件中的CGI[图例]标记;3)HTML图例模板文件。这意味着,如果HTML页面设置了CGI[Legend]参数,并且mapfile的Legend对象的模板设置为有效的HTML Legend文件,则会返回HTML Legend。以下部分将讨论这些组件。
Mapfile 的图例对象¶
HTML图例由 Mapfile 的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 版后已移除.
例如,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 版后已移除.
例如,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 版后已移除.
例如,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] 上下文中:
[if name=layer_status value=...] ... [/if]
值是以整数格式属于组的第一层的层状态:0=off,1=on,2=default
[if name=layer_visible value=...] ... [/if]
值是组中第一层的可见性:0=不可见,1=可见
[if name=group_name value=...] ... [/if]
[if name=any_layer_metadata value=...] ... [/if]
使用属于该组的 Mapfile 中第一层的元数据值
[if name=any_web_metadata value=...] ... [/if]
[if name=layer_queryable value=...] ... [/if]
值是组中第一层的可查询性:0=不可查询,1=可查询
5.6 新版功能.
在**[leg_layer_html]**上下文中:
[if name=layer_status value=...] ... [/if]
值是以整数格式表示的层状态:0=off,1=on,2=default
[if name=layer_type value=...] ... [/if]
值是层的整数格式类型:0=点,1=线,2=多边形,3=栅格,4=注释(自6.2起已弃用),5=查询,6=圆
[if name=layer_name value=...] ... [/if]
值是字符串格式的层名称
[if name=layer_group value=...] ... [/if]
值是以字符串格式表示的层的组名
[if name=layer_visible value=...] ... [/if]
值是层的可见性:0=不可见,1=可见
[if name=any_layer_metadata value=...] ... [/if]
[if name=any_web_metadata value=...] ... [/if]
[if name=layer_queryable value=...] ... [/if]
值是层的可查询性:0=不可查询,1=可查询
5.6 新版功能.
在**[leg_class_html]**上下文中:
[if name=layer_status value=...] ... [/if]
值是类所在层的状态
[if name=layer_type value=...] ... [/if]
值是层的整数格式类型:0=点,1=线,2=多边形,3=栅格,4=注释(自6.2起已弃用),5=查询,6=圆
[if name=layer_name value=...] ... [/if]
值是字符串格式的层名称
[if name=layer_group value=...] ... [/if]
值是以字符串格式表示的层的组名
[if name=layer_visible value=...] ... [/if]
值是层的可见性:0=不可见,1=可见
[if name=class_name value=...] ... [/if]
[if name=any_layer_metadata value=...] ... [/if]
[if name=any_web_metadata value=...] ... [/if]
[if name=layer_queryable value=...] ... [/if]
值是层的可查询性:0=不可查询,1=可查询
5.6 新版功能.
使用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]