MapServer 之 绘制地图图例

来源:互联网 发布:java回调机制 编辑:程序博客网 时间:2024/05/17 06:12

      MapServer 渲染的地图中,颜色与种类的对应是用图例表示的,图例是多个符号与种类对应的图片,在 GIS 制作的专题图中图例很常见。如下图就是一个比较常见的图例,壁挂的中国地图中都会有,主要是标识作用。那我们在 MapServer 中怎么根据其渲染的地图,动态生成一个图例呢?这篇文章主要涉及这些内容。

示例图例

      当然,你可以写一个 HTML 页面,放置在地图页面上,但是一旦地图有所改变,那么静态的 HTML 图例就必须跟着更改,相比之下,让地图的渲染者(MapServer)在生成地图的同时,生成图例更为合适,因为没有比“地图的生产者”更了解其“生产”的地图了。

如何配置

      当然,要实现以上提到的功能,在 mapserver 中要靠配置 mapfile 和 templates(WMS GetFeatureInfo配置中有用到,通常是一个 mapserver 定制的 html 文件),有三点需要注意:

  • mapfile 需要配置 LEGEND (“图例”的英文单词)对象;
  • LEGEND 中需要配置 TEMPLATE 参数,并且值为一个 html 文件位置;
  • html 文件中需要有 CGI [legend] 参数。

具体实现

      其实,在默认情况下, wms 包含一个操作:GetLegendGraphic (见下图),这个操作的目的就是取得图层对应的图例,虽然支持该操作,但是如果不配置 LEGEND 对象,mapserver 还是不知道该怎么具体渲染,所以我们需要配置一下。

GetCapabilities
GetCapabilities 操作取得的XML描述文档

      我们在之前配置好 WFS 的 mapfile 基础上配置图例的样式,在 MAP 对象级别配置。注意默认情况下, mapserver 不支持中文,需要在 LABEL 中配置语言编码和字体,才能得到中文的图例:

LEGEND    STATUS ON    KEYSIZE 30 15    LABEL        TYPE TRUETYPE        FONT heiti        SIZE MEDIUM        COLOR 200 0 0        ENCODING UTF-8    END    TEMPLATE "legend.html"END

其中,各个参数分别代表的意义如下:

  • KEYSIZE,图例中的样式图片的大小;
  • LABEL,标注样式的对象;
    • FONT,配置标注的字体类型,如宋体、楷体等;
    • ENCODING ,配置标注的语言编码,如 UTF-8,GBK等;
  • TEMPLATE,规定图例样式的HTML文件地址(可选参数,不设置得到的图例是mapserver 默认的样式)。

请求图例

      我们上面说到,请求图例操作是 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 99 99 99        WIDTH 1    END # STYLE ENDEND # CLASS ENDCLASS    NAME "xiao mai"    TITLE "小麦"    EXPRESSION {小麦}    STYLE        COLOR 222 245 179        OUTLINECOLOR 99 99 99        WIDTH 1    END # STYLE ENDEND # CLASS ENDCLASS    NAME "empty"    TITLE "空地"    EXPRESSION {空地}    STYLE        COLOR "#333333"        OUTLINECOLOR "#ffd166"        WIDTH 3    END # STYLE ENDEND # CLASS ENDCLASS    NAME "forest"    TITLE "森林"    EXPRESSION {森林}    STYLE        COLOR 0 200 0        OUTLINECOLOR "#ffd166"        WIDTH 3    END # STYLE ENDEND # CLASS ENDCLASS    NAME "cutton"    TITLE "棉花"    EXPRESSION {棉花}    STYLE        COLOR 0 0 220        OUTLINECOLOR "#ffd166"        WIDTH 3    END # STYLE ENDEND # CLASS END

生成图例

样式更复杂的配置

      以上的图例比较简单,只是单纯的填充色和边界颜色和宽度,那是因为我们的 CLASS 配置的比较简单,如果我们渲染的图层是点图层,且配置了 SYMBOL 子对象,那么类似与开篇的那张图例中的五角星等形状的图标就会出现在图例中。样式配置超出了本篇的讨论范围,这里就不涉及了。

      当然,目前为止介绍的知识 mapserver 默认的渲染图例,我们可以通过 LEGEND 中的 TEMPLATE 参数配置的 html 文件对其进行定制,当然,这个 html 文件不是普通的 html ,它除了基本的 html 特性,还有一些 mapserver 定制的属性和特性,比较负责,这里就不扩展了,以后会写一篇介绍,现在想看的可以到这里来看。

总结

      文章主要介绍了利用 mapserver 制作图例的思路和方法,因为 mapserver 渲染图例和渲染地图使用的是同一套 mapfile 配置文件,所以其表达是一致的,所以让地图的生产者来负责标注地图的图例,是比较合理的,如果地图渲染的样式需要改变,或者新增了一类地物,只需修改 mapfile,那么地图和图例的更改将是同步的。

好的,就写到这里,有什么问题,可以在文章下面留言或者给我发邮件。

1 0