01 符号概述
符号(Symbol)是地图和GIS的核心概念。QGIS使用渲染器(Renderer)完成图层在地图窗口中的绘制,即所谓的图层渲染。图层渲染之前需要告诉渲染器使用什么符号渲染图层,如果没有显式指定,QGIS会为渲染器提供默认的符号。
根据图层类型不同,QGIS中的符号分为三类:标记(Marker)、线(Line)、填充(Fill),分别适用于点图层、线图层和面图层。点击“工程工具栏”中的“样式管理器”按钮,弹出“样式管理器”对话框,可以查看QGIS预带的标记、线、填充符号库,这些符号库可以统称为系统符号库。



QGIS系统符号库可以胜任基本的制图任务,但难以满足各行业、各专业对地图符号的个性化需要。事实上,任何GIS软件的符号库都不可能直接支持所有领域需要的符号体系,而是通过提供自定义符号能力实现系统符号库的灵活扩展。作为开源GIS软件,QGIS的自定义符号功能灵活且易用,可以根据特定需要快速自定义符号,满足差异化需求。
本文以天地图北京网站(http://beijing.tianditu.gov.cn/)提供的2020年版1:80万北京市全市域标准地图为例,介绍QGIS自定义符号的实现原理,并在此基础上演示制作两个自定义符号的过程。
02 下载北京市标准地图
2020年版1:80万北京市全市域标准地图下载地址为:http://beijing.tianditu.gov.cn/bzdt/,点击地图说明下方的“下载”按钮即可下载。

下载的压缩文件解压缩后包含两个文件:bj2020_80w_1.jpg和bj2020_80w_1.pdf,打开bj2020_80w_1.pdf,放大页面到右下角的图例位置,可以看出该地图包含10个图层,每个图层都具有各自不同的符号。其中,“区人民政府驻地”、“区界”这两个图层所采用的符号是QGIS系统符号库中所没有的,需要通过自定义符号实现。

03 符号与符号图层
就像地图是由图层叠加而成的一样,QGIS中的符号由符号图层(Symbol Layer)叠加而成,这意味着以下两点:
(1)符号是分层的,由多个(1…n)符号图层叠加在一起组成。既然是叠加,就有上层和下层之分,上层的符号图层可能会盖住下层的符号图层。
(2)符号是矢量的,可以通过设置不同的尺寸改变符号的大小,但其形状及各部分尺寸的相对比例保持不变。
打开QGIS“样式管理器”,找到并双击“标记”面板中的“topo hospital”标记,弹出“符号选择器”对话框。可以看出,该符号由两个符号图层叠加而成,分别是位于上层的加号符号图层和位于下层的圆形符号图层。

点击“符号选择器”中位于符号图层列表下方的圆形符号图层,可以查看该符号图层的主要属性:
(1)符号图层类型:简单标记
(2)大小:5.2毫米
(3)填充颜色:白色(255, 255, 255)
(4)描边颜色:红色(227,26,28)
(5)描边样式:实线
(6)描边宽度:0.4毫米
(7)连接样式:斜角
(8)旋转角度:0度
(9)偏移量:横坐标偏移0毫米、纵坐标偏移0毫米
(10)锚点:垂直居中、水平居中

点击“符号选择器”中位于符号图层列表上方的加号符号图层,也可以查看该符号图层的主要属性,在此从略。
“符号选择器”右上角以按钮形式提供了针对符号图层的管理功能,包括:
(1)“添加符号图层”:为符号添加新的符号图层。
(2)“移除符号图层”:移除选中的符号图层。
(3)“上移”:将选中的符号图层向上移动一层。
(4)“下移”:将选中的符号图层向下移动一层。
(5)“创建符号图层副本”:将选中的符号图层复制一份,粘贴在所选符号图层的下一层。
(6)“锁定符号图层颜色”:锁定后,当使用符号时,如果修改符号的颜色,该符号图层的颜色不随之发生变化,依然保持在符号库中设定的颜色。

线符号在符号图层组织方面与标记符号并无不同,两者的区别主要在于线和标记表达方式的不同。打开QGIS“样式管理器”,找到并双击“线”面板中的“topo path”,弹出“符号选择器”对话框。

该线符号使用了自定义虚线线型,点击“使用自定义虚线线型”选项下方的虚线按钮,弹出“自定义虚线线型”对话框。可以看出,此线型由3毫米长的短横和2毫米长的空格组成,两者组合达成虚线效果。

至此,我们已经了解了QGIS符号图层的基本概念,可以开始尝试制作自定义符号。
04 制作标记符号
打开下载的bj2020_80w_1.pdf文件,尽最大可能放大图例区域中的“区人民政府驻地”图例项,通过拷屏的方式将其保存为图片,然后选择合适的图片查看工具打开图片。这里用的是操作系统自带的“截图和草图”工具,提供了标尺工具可以测量图片元素的大小。

可以看出,该符号是由两个大小不一的圆形符号叠加而成,通过标尺测量,可以得到两个圆形符号的主要尺寸参数(不需要特别精确),计量单位为格。
(1)大圆:外直径78、线宽5
(2)小圆:外直径38、线宽5
需要关注的是尺寸参数之间的相对比例而不是绝对值,假定线宽为1,则大圆外直径为15.6(78/5),小圆外直径为7.6(38/5)。
在设计符号图层的时候,这里测量得到的外直径即对应符号的大小,线宽则对应符号的描边宽度。假定将描边宽度设为0.25毫米,则大圆符号的大小为3.9(0.25*15.6)毫米,小圆符号的大小为1.9(0.25*7.6)毫米。
“区人民政府驻地”图例项的颜色为红色,具体RGB值为:(238,28,37)。
在“样式管理器”中切换到“标记”面板,点击下方的“添加项”按钮,弹出“符号选择器”对话框。QGIS会自动生成一个默认的标记符号,该符号包含一个简单标记符号图层。

点击“符号选择器”右上角的“添加符号图层”按钮,QGIS将为该符号添加一个新的简单标记符号图层。
选中位于上方的简单标记符号图层,该符号图层对应小圆,将其属性取值设置如下:
(1)大小:1.9毫米
(2)填充颜色:透明填充
(3)描边颜色:RGB值为:(238,28,37)
(4)描边宽度:0.25毫米

选中位于下方的简单标记符号图层,该符号图层对应大圆,将其属性取值设置如下:
(1)大小:3.9毫米
(2)填充颜色:透明填充
(3)描边颜色:RGB值为:(238,28,37)
(4)描边宽度:0.25毫米

至此,该标记符号已经制作完成。点击“符号选择器”对话框中的“OK”按钮,为该符号起个名字保存起来。

在QGIS中随便打开一个点图层,将自定义的“区人民政府驻地”符号应用于该图层,查看一下效果。

点击菜单“工程-->导入/导出-->导出地图为PDF文件”,将地图导出为PDF文件。打开PDF文件,尽可能放大地图,可以看出地图上的自定义符号是矢量的,不会因为地图的放大而变得模糊,且其形状与bj2020_80w_1.pdf文件中的“区人民政府驻地”图例项是一致的。

05 制作线符号
打开下载的bj2020_80w_1.pdf文件,尽最大可能放大图例区域中的“区界”图例项。

可以看出,该图例项由长横线、短横线、空格三部分组成,可以将其拆解两部分,各作为一个符号图层。第一个符号图层由长横线和空格组成,长横线的长度为45格,空格的长度为27格。第二个符号图层由短横线和空格组成,短横线的长度为7格,空格的长度为65格。长横线和短横线的高度都为4格。

对于长横线符号图层,比较好处理,通过定义横线长度和空格长度即可生成。对于短横线图层,也可以定义横线长度和空格长度,但由于短横线的起点相比长横线的起点有一个偏移量,长度为55(45+(27-7)/2),也需要在符号图层中加以指定。
根据长横线长度、短横线长度、空格长度、线高度的测量结果,假定线高度(对应符号图层的描边宽度)为0.4毫米,得到各主要尺寸参数如下:
(1)描边宽度:0.4毫米
(2)长横线长度:4.5毫米
(3)长横线空格长度:2.7毫米
(4)短横线长度:0.7毫米
(5)短横线空格长度:6.5毫米
(6)短横线偏移量:5.5毫米
“区界”图例项的颜色为棕色,具体RGB值为:(132,65,54)。
在“样式管理器”中切换到“线”面板,点击下方的“添加项”按钮,弹出“符号选择器”对话框。QGIS会自动生成一个默认的线符号,该符号包含一个简单线符号图层。点击“符号选择器”右上角的“添加符号图层”按钮,QGIS将为该符号添加一个新的简单线符号图层。分别为两个线符号图层设置参数如下:


点击“符号选择器”对话框上的“OK”按钮,为该符号起个名字保存起来,并可以打开某个线图层,试验一下符号效果。

06 小结
自定义符号功能是制作内容丰富、表达生动地图的重要保证,有必要对其进行深入研究。本文初步探讨了QGIS自定义符号的基本原理,并通过实例尝试制作了标记符号和线符号。事实上,QGIS的符号体系远不止这些内容,填充符号、SVG符号、通过数据定义覆盖控制符号参数等更为复杂的内容均未涉及。
愿本文能对大家理解QGIS自定义符号的原理起到入门指引的作用,希望大家能在此基础上制作出更多更精美的符号,更希望有人能制作出一些符号库上传到QGIS协会官方样式库(https://plugins.qgis.org/styles/)中,与世界分享,谢谢!
Q博士本人
2021年7月6日


本文介绍了QGIS自定义符号的原理,以2020年版1:80万北京市标准地图为例,展示了如何制作标记符号和线符号。通过自定义符号,满足地图符号的个性化需求,实现对QGIS系统符号库的扩展。
1504





