MapServer 渲染的地图中,颜色与种类的对应是用图例表示的,图例是多个符号与种类对应的图片,在 GIS 制作的专题图中图例很常见。如下图就是一个比较常见的图例,壁挂的中国地图中都会有,主要是标识作用。那我们在 MapServer 中怎么根据其渲染的地图,动态生成一个图例呢?这篇文章主要涉及这些内容。
当然,你可以写一个 HTML 页面,放置在地图页面上,但是一旦地图有所改变,那么静态的 HTML 图例就必须跟着更改,相比之下,让地图的渲染者(MapServer)在生成地图的同时,生成图例更为合适,因为没有比“地图的生产者”更了解其“生产”的地图了。
如何配置当然,要实现以上提到的功能,在 mapserver 中要靠配置 mapfile 和 templates(WMS GetFeatureInfo配置中有用到,通常是一个 mapserver 定制的 html 文件),有三点需要注意:
具体实现其实,在默认情况下, wms 包含一个操作:GetLegendGraphic (见下图),这个操作的目的就是取得图层对应的图例,虽然支持该操作,但是如果不配置 LEGEND 对象,mapserver 还是不知道该怎么具体渲染,所以我们需要配置一下。
GetCapabilities 操作取得的XML描述文档
我们在之前配置好 WFS 的 mapfile 基础上配置图例的样式,在 MAP 对象级别配置。注意默认情况下, mapserver 不支持中文,需要在 LABEL 中配置语言编码和字体,才能得到中文的图例:
LEGEND STATUS ON KEYSIZE TRUETYPE FONT heiti SIZE MEDIUM COLOR ENCODING UTF-8 END TEMPLATE "legend.html" END其中,各个参数分别代表的意义如下:
请求图例
我们上面说到,请求图例操作是 wms 的一部分,那么其调用方式和 wms 的其他操作是一样的,如下 HTTP GET 方式,得到的便是 mapserver 根据 mapfile 配置得到的图例,其样式和地物名字与渲染的地图是一致的:
http://127.0.0.1/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&map=wms_example.map&LAYER=wms_layer&Format=image/png&SLD_VERSION=1.1.0默认是将样式(CLASS)的样式填充一个矩形作为图例的样式,标题(TITLE)属性作为图例名称的,所以我对图层的样式如下配置,得到图下的图例:
CLASS NAME "yu mi" TITLE "玉米" EXPRESSION {玉米} STYLE COLOR "#337A33" OUTLINECOLOR WIDTH # NAME "xiao mai" TITLE "小麦" EXPRESSION {小麦} STYLE COLOR OUTLINECOLOR WIDTH # NAME "empty" TITLE "空地" EXPRESSION {空地} STYLE COLOR "#333333" OUTLINECOLOR "#ffd166" WIDTH # NAME "forest" TITLE "森林" EXPRESSION {森林} STYLE COLOR OUTLINECOLOR "#ffd166" WIDTH # NAME "cutton" TITLE "棉花" EXPRESSION {棉花} STYLE COLOR OUTLINECOLOR "#ffd166" WIDTH # CLASS END 样式更复杂的配置以上的图例比较简单,只是单纯的填充色和边界颜色和宽度,那是因为我们的 CLASS 配置的比较简单,如果我们渲染的图层是点图层,且配置了 SYMBOL 子对象,那么类似与开篇的那张图例中的五角星等形状的图标就会出现在图例中。样式配置超出了本篇的讨论范围,这里就不涉及了。
当然,目前为止介绍的知识 mapserver 默认的渲染图例,我们可以通过 LEGEND 中的 TEMPLATE 参数配置的 html 文件对其进行定制,当然,这个 html 文件不是普通的 html ,它除了基本的 html 特性,还有一些 mapserver 定制的属性和特性,比较负责,这里就不扩展了,以后会写一篇介绍,现在想看的可以到这里来看。
总结文章主要介绍了利用 mapserver 制作图例的思路和方法,因为 mapserver 渲染图例和渲染地图使用的是同一套 mapfile 配置文件,所以其表达是一致的,所以让地图的生产者来负责标注地图的图例,是比较合理的,如果地图渲染的样式需要改变,或者新增了一类地物,只需修改 mapfile,那么地图和图例的更改将是同步的。
好的,就写