QGIS中如何用表达式设置标签样式

地图中的标签(Label),实际上指的是传统地图制图学中的地图注记(Annotation)。标签是地图上的标注和各种文字说明,是地图的基本构成要素之一。和地图上其他符号一样,标签也是一种地图符号。

标签的设计包括标签内容、字体、字号、颜色、位置等,好的设计能使地图更整洁、美观、重点突出,使读者可以更快捷地识别出地理现象的分布规律。

在QGIS中,整洁美观的标签离不开表达式与标签设计的深度结合,表达式可以从标签内容、标签字体、字号、颜色、位置、方向、文字间隔、文字轮廓、背景、重叠的处理和牵引线等方面参与标签的设计,为标签样式设置提供更大的灵活性。

标签内容

标签设计首先要解决内容问题,即要在地图上显示什么文字。默认情况下,QGIS采用“单一标签”模式为地图添加标签,标签取值来源于图层属性表中的某个字段。点击【值】右侧的下拉按钮,可以看到当前图层对应的所有属性字段,选择任意字段,其内容就会以默认样式显示在地图上。以2020年地震数据为例,当选择地震发生地(LOCATION_NAME)字段作为标签内容时,默认样式如下图:

在这里插入图片描述
在专题地图中,需要重点突出专题内容,单一字段标签很难满足丰富性的需求,需要组合多个字段构建标签内容。例如,在地图上直观地标注地震发生的地点、时间、等级,如下图效果:

在这里插入图片描述
要达到上图效果,首先观察地震数据属性表内容:
在这里插入图片描述
我们需要三个方面的信息:地震发生地点、地震等级(EQ_PRIMARY)和地震时间

发生地点从属性字段LOCATION_NAME提取。

地震等级从属性字段EQ_PRIMARY提取。

时间的提取稍微复杂一些,从属性表可以看到, YEAR、MONTH、DAY、HOUR、MINUTE、SECOND六个字段对应地震发生的年、月、日、时、分和秒。在本例中,在地图上展示时间精度达到“日”即可,所以需要用表达式将YEAR、MONTH、DAY三个字段串接起来。在《QGIS表达式中的函数》中,曾经剖析过串接函数concat,它的作用是将多个字符串连接成一个字符串。本文将使用另一个字符串操作符“||”完成字符串合并,“||”操作符的功能与concat函数类似,区别在于:“||”只能连接两个字符串,而concat函数对参数的个数没有限制。例如,实现短横线连接年、月、日字段,两个函数的实现分别是:

concat(  "YEAR" ,'-' , "MONTH"  ,'-',  "DAY" 
"YEAR"  || '-' ||  "MONTH"  || '-' ||  "DAY"

在构建表达式时,要特别注意属性表字段中的空值(NULL)。这是一个特殊的取值,表示该数据项没有数据。当空值参与表达式运算时,大多数情况下表达式的计算结果也将为空值,这可能不是期待的结果,因此对空值要做特殊处理。例如,当地震等级(EQ_PRIMARY)为空值时,我们仍然希望在地图上显示地震时间和地点,因此,可以用CASE WHEN…THEN…END条件表达式来处理这种情况:

case when "EQ_PRIMARY" is NULL then '-' else  "EQ_PRIMARY" end

该表达式的逻辑为:判断EQ_PRIMARY字段的取值是否为NULL,如果是,返回字符串‘-’,如果不是,返回字段取值。

点击【值】右侧的 表达式按钮,在表达式代码编辑器输入如下代码,完成地震标签内容设置。

地点:' || LOCATION_NAME
||  '\n'  || 
'时间:' ||  "YEAR"  || '-' ||  "MONTH"  || '-' ||  "DAY" 
||  '\n'  || 
'地震等级:' ||  case when "EQ_PRIMARY" is NULL then '-' else  "EQ_PRIMARY" end

在这里插入图片描述

标签的字体

为了突出表现重点内容,可以为标签设置不同的字体。例如,让中国发生的地震用“微软雅黑”字体,其他国家用默认的宋体,可以通过【由数据定义覆盖】来实现。点击【字体】右侧的【由数据定义覆盖】按钮,打开表达式构造器。
在这里插入图片描述

地震数据中,“COUNTRY”字段代表地震发生地所属国家,因此,在表达式中可以用该字段来判断地震是否发生在中国,表达式代码如下:

case when upper("COUNTRY") like '%CHINA%' then ‘微软雅黑’ end

CASE WHEN … THEN … END语句用于条件判断。

upper函数将“COUNTRY”字段的取值全部转变为大写,可以屏蔽字母大小写的影响。

Like是操作符,代表如果like操作符左边的参数与所提供的模式匹配,则返回1。

%是SQL语言中通配符,代表任意字符的匹配,且不计字符的多少。在本例中表示只要字符串中含有“CHINA”,不管其前后有多少、什么字符,均为匹配成功。

该表达式意思是:判断“COUNTRY”字段中是否含有“CHINA”,如果是,返回‘微软雅黑’。

在这里插入图片描述
使用【由数据定义覆盖】功能,需要特别注意的是,与其他表达式构造器不同,在代码编辑区下方不仅提供表达式计算结果预览,而且同时显示表达式预期的格式,即该表达式预期的返回值类型和举例。预期的格式与调出表达式构造器的位置有关,例如,点击【字体】右侧的【由数据定义覆盖】按钮,则表达式预期返回的是代表字体的字符串。

字体改变后,效果如图:

在这里插入图片描述

标签字号

除设置不同的字体以外,设置不同的字号大小也可以为标签提供区分度。表达式可以根据条件设置字号,例如地震发生在中国境内则用大一点的字号表示,其他国家保持默认的大小。点击【大小】右侧的【由数据定义覆盖】按钮,打开表达式构造器。
在这里插入图片描述
判断是否属于中国境内的表达式内容与上面的设置相同,所不同的是,字号大小需要的返回值是一个双精度浮点型数字(double),且要求返回值大于等于0(见下图红框标出的预期的格式),因此得到的表达式如下:

case when upper("COUNTRY") like '%CHINA%' then 14 else 10 end

该表达式意思为:判断地震发生的国家是否包含中国( “COUNTRY”字段中是否含有“CHINA”),如果是,设置字号为14,否则,设置字号为10。
在这里插入图片描述
设置字号效果如下图:
在这里插入图片描述

标签的颜色

表达式同样可以根据需要设置标签的颜色。仍以突出中国境内地震地点为例,将中国境内地震点用不同颜色的标签展示出来,可以点击【颜色】右侧的【由数据定义覆盖】按钮,打开表达式构造器。
在这里插入图片描述
同样需要注意设置颜色的表达式返回值,是以‘#’开头的表示16进制颜色的字符串,或者是以逗号分隔的红、绿、蓝三色取值,如红色为‘255,0,0’,也可以直接给出颜色名称,如‘red’。如果不知道想要的颜色用16进制字符串如何表示,可以点击【颜色】右侧的下拉箭头,找到该颜色后,点击【复制颜色】按钮,即可将对应的16进制字符串复制到表达式中。

case when upper("COUNTRY") like '%CHINA%'then '#e31a1c' end

上述表达式实现的效果是:判断地震发生的国家是否包含中国(“COUNTRY”字段中是否含有“CHINA”),如果是,设置标签颜色为‘红色’,否则,颜色保持默认的黑色。
在这里插入图片描述
设置标签颜色的效果如下图:
在这里插入图片描述

标签的位置

标签默认的位置是以相互不遮盖为前提放置在点的右上方,如果右上方出现遮盖,标签根据情况放置在其他位置,如下图:
在这里插入图片描述

在为沿海地区要素设置标签时,我们希望标签能尽量出现在海域,以减少对陆地要素的遮挡,即达到如下的效果:
在这里插入图片描述
上述效果的设置过程为:

在【图层样式】面板中,切换到【位置】标签。标签的位置分为三种设置:制图、点周围、和离点偏移量。以【点周围】为例,该设置是以要素中心点为原点将地图画布分为9个象限:正上方(above)、左上方(above left)、右上方(above right)、中心点(over)、左边(left)、右边(right)、左下方(below left)、正下方(below)和右下方(below right),表达式需要返回数字形式的某个象限取值。例如,设置朝鲜和韩国境内的标签位于点的左边,则表达式需要返回3,代表左边象限。

点击【象限】右侧的【由数据定义覆盖】按钮,打开表达式构造器。

在这里插入图片描述
在表达式代码编辑器输入下面表达式:

case when upper("COUNTRY") like '%KOREA%' then 3 end

该表达式的意思为:判断“COUNTRY”字段中是否含有“KOREA”,如果有,则让标签位于第3象限,即在点的左边。
在这里插入图片描述

小结

本文从表达式应用的视角,介绍了表达式在设置标签内容、字体、字号、颜色和位置方面的使用方法。需要说明的是:

(1)地图制图是一门综合性很强的学科,突出重点,丰富地图背景元素,仅靠标签的设计是不够的,而是需要多种地图要素符号化的综合表达。

(2)表达式不仅可以设计标签的内容、字体、字号、颜色和位置,其他的样式如标签的字间隔、字方向、轮廓、阴影、背景、牵引线等,均可以通过【由数据定义覆盖】构建表达式来定义,使用方法与其他表达式构建过程大体相同,不一一赘述。

(3)上述表达式应用举例遵从以简单为主的原则,希望通过这些例子,能让大家了解基本的使用方法,举一反三。除了用‘COUNTRY’字段,其他字段也可以作为表达式的条件,例如,突出强调等级大于 6的地震,或者强调死亡人数超过10人的地震,都可以通过表达式设置不同的样式达到突出和强调的效果。

(4)为了达到一个制图目的,可以有多种方法,表达式只是其中一种。例如,想突出强调中国境内的地震点,可以将中国的地震点提取出来另存为单独的图层,对该图层设置不一样的风格。但是,分别存储图层的方式在后续的数据更新可能会带来一定的工作量。

关于使用表达式设置标签样式的内容就介绍到这里,表达式很强大,使用门槛也比较高,希望本文能给大家学习表达式带来帮助,如果文中有理解不到位的地方,欢迎指出,共同进步。


吴建玲

2020年8月6日


版权声明


本文欢迎转载,转载时请注明出处。


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/QGISClass/article/details/108139299