初识QGIS表达式

前段时间,《QGIS实操与技巧》专辑中的多篇文章都用到了QGIS表达式(Expression),但受限于篇幅并未对其深入剖析。事实上,表达式是极为强大而灵活的功能,是QGIS很多高级功能得以实现的基础。本文试图从总体上向大家介绍QGIS表达式的基本概念、应用场景与使用方法,后续的文章还会进一步分门别类地深入阐述表达式的诸多用途。

01 什么是表达式

表达式,是将同类型的数据(如常量、变量、函数等),用运算符号按一定的规则连接起来的、有意义的式子。

与常规表达式不同,QGIS中的表达式是构筑在空间数据(字段、变量)和函数(预设函数、自定义函数)的基础上,为操作几何图形和属性数据、地图符号化、打印布局输出提供了强大的工具。

很多人对QGIS中的表达式到底是哪种编程语言感到疑惑,实际上它是一种类SQL语言,支持SQL语法的一个子集,从不严谨的角度来看,可以把表达式看成一句简单程序语句。因此,要理解和深入使用表达式,需要一点SQL语言基础和编程思维。

02 表达式的典型应用场景

在QGIS中,表达式应用之广泛达到令人惊叹的程度,在大部分的酷炫出图效果、高级的查询、繁琐复杂的数据更新中,都能看到表达式的身影。

  • 创建或者更新属性字段

在【字段计算器】中,表达式可基于已有的空间图形特征和属性数据创建字段,也可以按照需求更新已有的属性字段,例如根据几何图形的中心点生成x、y坐标,用人口数量除以面积计算得到人口密度字段等。
在这里插入图片描述

  • 要素查询和选择

要素的查询和选择是空间数据处理的基础操作,表达式是筛选数据的最佳工具,例如从全国城市中找到规模大于200的城市,只需建立条件“城市规模大于200”,所有满足条件的要素便可提取出来。
在这里插入图片描述

  • 符号化的数据定义重载

在地图符号化过程中,需要设置符号的各种属性,例如点的大小、颜色等。这些符号属性可以通过输入常规的数值、颜色值设置,也可以通过表达式来定义其取值。地图渲染引擎实时计算表达式的取值并赋值给相应的符号属性,也就是说,符号的属性忽略输入框给定的数值,取值于表达式计算结果,这个过程叫做符号化的数据定义重载。例如下图表达式执行的结果是:判断城市的规模是否大于等于200,如果是,则符号的大小设置为8,否则符号大小设置为2。
在这里插入图片描述

  • 打印布局的应用

表达式在制作地图集起着重要作用。通常地图集会根据当前地图内容定义标签,例如地图名称、制图日期等,相对于手工输入标签内容,使用表达式可以减少大量手工劳动。

在这里插入图片描述

03 表达式构造器

表达式字符串构造器对话框是构建表达式的主要界面,QGIS中提供多种方式调出表达式构造器:

1.点击QGIS中的在这里插入图片描述按钮。

2.点击【属性】工具栏中【使用表达式选择要素】按钮。

3.编辑属性数据时,使用在这里插入图片描述【字段计算器】。

4.设置符号化样式、标签样式、布局元素时,使用在这里插入图片描述【由数据定义覆盖】。

5.使用【几何图形生成器】对图层进行渲染时。

无论从QGIS哪个上下文使用表达式,表达式字符串构造器的界面大体相同,如下图:

在这里插入图片描述

表达式字符串构造器界面由左侧的代码输入区、中间的函数和变量选择区、右侧的帮助面板和字段取值预览区三大部分组成。

代码输入区是一个文本框,可以在里面输入表达式代码,也可以将构建好的表达式拷贝粘贴到代码输入区去执行。代码输入区的下方有表达式结果预览,如果语法和语义没有问题,则显示表达式计算结果;如果存在错误,则提供简要的错误描述,并提供详细错误信息的链接。代码输入区的上方提供操作符按钮,可以在构建表达式时快速输入操作符,其效果与从键盘输入操作符的效果相同,也可以从函数和变量选择区的操作符类别中选择需要的操作符。

在这里插入图片描述

函数和变量选择区以分组方式,将函数和变量在树形结构中列出。QGIS将函数和变量分成约20个大类,包括变量、操作符、地图、地图图层、记录和属性、时间和日期、数学、数组、条件等。由于函数和变量内容庞大、条目众多,在选择区上方提供了搜索框,通过输入函数或者变量的名字进行快速查找。双击函数或者变量,即可将其添加到代码输入区中。
在这里插入图片描述

帮助面板区域随着函数和变量的选择发生改变。对于函数,帮助面板显示函数的说明、参数和示例,如果选择的是变量,帮助面板将显示变量说明和当前取值。如果选择属性字段,则可以将字段的取值取出前10个或者取出字段所有可能取值,显示在字段取值预览区。在构建表达式时,列出字段的可能取值可为构建表达式提供便利。

在这里插入图片描述

04表达式的构成

  • 常量

常量包括数值型常量、字符串常量和属性字段引用三个方面。

数值型:包括整型数值和带小数的浮点型数值常量,如123,3.14。

字符串常量:取值为用单引号括起来的字符串,如‘单向道路’。注意,如果字符串常量中包含单引号本身,则用两个连续单引号表示,如’this’‘s’,计算结果为字符串:this’s。

属性字段引用:被引用的属性字段用双引号将字段名括起来表示,如“name”。当表达式进行计算时,引用的属性字段用实际字段取值替代。

  • 变量

QGIS中的变量用于存储程序、项目、图层或者打印布局中的可变内容,如QGIS的语言设置、当前版本、项目文件的存储位置、地图当前比例尺、打印布局的名称等。

变量遵从层级结构,从上到下分别为:全局变量、项目变量、图层变量、打印布局变量等。从表达式字符串构造器的函数和变量选择区,可以找到变量分支,包含当前上下文可以使用的所有变量集合。

在表达式中,变量用“@+变量名”表示。

  • 函数

QGIS中内置函数包括聚合、数组、颜色、条件、转换、日期和时间、聚合、文件和路径、模糊匹配、通用、几何图形、打印布局、地图图层、地图、数学、处理、栅格、记录和属性、字符串等分组,每个分组下所包含的函数数量如下:

在这里插入图片描述

05 表达式举例

1.

concat(to_string(@grid_number), '°    ')

该表达式来自《QGIS 3.10 制图手把手教程》,为网格线标签构建了合适的表示方式,即在网格度数后面加上’° '。其中,concat是字符串合并函数,将两个字符串合并为一个。to_string是转换函数,@grid_number是变量,表示当前网格注记值。因此,整个表达式的意思为:取出当前网格注记取值,将其转换为字符串,并与’° '合并,形成新的网格注记标签。

2.

"primary_fuel" IN ('Biomass', 'Geothermal', 'Hydro', 'Solar', 'Wind', 'Storage', 'Wave and Tidal')

该表达式来自《QGIS 3.10 矢量样式设置》,用于基于规则的符号渲染时,对要渲染的要素进行过滤。其中,"primary_fuel"由双引号括起来,表示字段primary_fuel。IN是操作符,表示若在值列表中则返回1。后面括号内为字符串常量。整个表达式的意思为:查找属性表字段primary_fuel中值为(‘Biomass’, ‘Geothermal’, ‘Hydro’, ‘Solar’, ‘Wind’, ‘Storage’, ‘Wave and Tidal’)中某一个的要素,将其按照设定的样式显示出来。

3.

CASE
WHEN "Crime type" LIKE 'Violence%' THEN 10
WHEN "Crime type" LIKE 'Criminal%' THEN 5
ELSE 1
END

该表达式来自《QGIS 3.10 制作热力图》,用于创建犯罪地点图层的暴力程度权重字段。这个表达式采用CASE WHEN … THEN…ELSE … END条件函数进行多条件判断,"Crime type"为犯罪类型字段,LIKE为操作符,表示如果第一个参数与所提供的模式匹配,则返回1。整个表达式的意思是:如果犯罪类型(“Crime type”)以Violence(暴力)开头,则给该犯罪事件赋值权重10;如果犯罪类型(“Crime type”)以Criminal(刑事犯罪)开头,则给该犯罪事件赋值权重5;其他情况权重为1。

本文从定义、应用场景、表达式构造器和表达式的构成四个方面对QGIS表达式进行了初步介绍,后续将在此基础上做深入剖析和分享,如果对表达式深度使用感兴趣,想领略表达式强大而灵活的功能,敬请关注表达式系列文章。


吴建玲

2020年7月24日


版权声明


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


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/QGISClass/article/details/107575534
今日推荐