在地理信息科学的世界里,QGIS 以其开源、强大和灵活的特性,成为了无数GIS专业人士和爱好者的首选工具。然而,要真正驾驭 QGIS 并将其效能发挥到极致,仅仅掌握图形用户界面的点击操作是远远不够的。今天,我们将深入探讨 QGIS 中一个堪称“瑞士军刀”的功能——表达式(Expressions)。
无论您是希望自动化数据处理、创建动态的地图符号系统,还是构建智能化的打印布局,表达式都将是您不可或缺的利器。

什么是 QGIS 表达式?
简单来说,QGIS 表达式是一种微型编程语言,它允许您通过编写公式来访问和处理数据。这些公式可以执行数学计算、操作文本、评估地理空间关系,并根据特定条件返回动态结果。
表达式的应用场景几乎贯穿了 QGIS 的每一个角落:
- 数据计算:使用字段计算器根据现有属性动态创建或更新字段。
- 要素选择:构建复杂的查询逻辑,精确选择符合多重条件的要素。
- 动态样式与标注:根据要素的属性值(如人口数量、道路等级)自动改变其颜色、大小或标签内容,让地图“活”起来。
- 几何生成:在不创建新图层的情况下,动态生成缓冲区、质心等几何图形用于渲染。
- 打印布局自动化:自动更新标题、比例尺、图例等,甚至根据地图集要素动态显示信息。
- 表单约束:在数据采集时,设置字段的默认值或验证规则,确保数据质量。
核心工具:表达式字符串构建器
QGIS 提供了一个强大的集成界面——表达式字符串构建器,来帮助我们编写和测试表达式。这不仅仅是一个简单的文本框,更是一个功能完备的开发环境。
它主要由以下几个部分组成:
- 表达式编辑区:您编写公式的地方,支持语法高亮和自动补全。
- 函数列表区:一个庞大的函数库,按类别(如几何、字符串、数学)整齐排列。您可以搜索并双击将函数添加到编辑器中。
- 帮助面板:当您选中一个函数时,这里会立即显示其详细说明、语法和使用示例,是学习和调试的最佳帮手。
- 预览区:实时显示当前表达式在某个要素上的计算结果,让您能够立即验证公式的正确性。
表达式函数巡礼:从入门到精通
QGIS 提供了数百个内置函数。我们不必一次性记住所有,但了解几个关键类别及其代表性函数,将极大地拓宽您的数据处理思路。
1. 几何函数 (Geometry Functions)
这是GIS的核心。几何函数允许您查询、计算和操作要素的空间属性。
-
$geometry:返回当前要素的几何对象本身。 -
$area:计算多边形要素的面积。 -
length():计算线要素的长度。 -
buffer($geometry, 100):为当前要素创建一个100地图单位的缓冲区。 -
intersection(geom1, geom2):返回两个几何对象的交集部分。 -
transform($geometry, 'EPSG:4326', 'EPSG:3857'):动态进行坐标参考系变换。
实战示例:假设您想为一个“河流”图层设置样式,使其宽度与河流等级("level"字段)成正比,您可以在符号系统设置中使用表达式:"level" * 5。
2. 条件函数 (Conditional Functions)
条件函数让您的逻辑充满智慧,能够根据不同情况返回不同结果。
-
CASE ... WHEN ... THEN ... ELSE ... END:这是最强大、最常用的条件语句,用于处理多个分支逻辑。 -
if(condition, result_if_true, result_if_false):简单的二元条件判断。 -
coalesce(value1, value2, ...):返回参数列表中的第一个非空(non-NULL)值,非常适合为缺失数据提供默认值。
实战示例:为城市点图层创建标注,根据人口("POP"字段)分为三类:
CASE
WHEN "POP" > 1000000 THEN '特大城市'
WHEN "POP" > 500000 THEN '大城市'
ELSE '中小型城市'
END
3. 字符串函数 (String Functions)
处理文本属性是家常便饭。字符串函数可以帮助您拼接、格式化和提取文本信息。
-
concat('名称: ', "NAME")或更简洁的'名称: ' || "NAME":连接字符串,创建复合标签。 -
format_number(12345.67, 2):将数字格式化为带千位分隔符和两位小数的字符串('12,345.67')。 -
regexp_replace('QGIS 3.44', '\\d+\\.\\d+', 'LTS'):使用正则表达式进行高级替换,结果为'QGIS LTS'。 -
upper()/lower():将文本转换为大写或小写。
实战示例:创建一个包含名称和面积的详细标注:
"NAME" || '\n' || '面积: ' || format_number(round($area / 1000000, 2), 2) || ' km²'
这个表达式将显示城市名称,换行后显示格式化后的平方千米面积。
4. 聚合函数 (Aggregates Functions)
聚合函数允许您对一组要素(通常来自另一个图层)进行统计计算,这是进行空间关联分析的利器。
-
aggregate(layer, aggregate, expression, filter):最核心的聚合函数。 -
sum(expression)、count(expression)、mean(expression):在聚合函数内部使用的具体统计方法。
实战示例:计算每个“省”图层内,所有“城市”图层的人口总和。在“省”图层的字段计算器中创建一个新字段 total_pop,使用以下表达式:
aggregate(
layer:='城市',
aggregate:='sum',
expression:="population",
filter:=intersects($geometry, geometry(@parent))
)
这个表达式会遍历所有与当前省份多边形相交的城市点,并将其"population"字段的值累加起来。
5. 变量 (Variables)
变量提供了对QGIS工程、图层、地图布局等环境信息的动态访问。它们都以 @ 符号开头。
-
@project_crs:返回当前工程的坐标参考系。 -
@layer_name:返回当前表达式所在图层的名称。 -
@map_scale/@map_rotation:在打印布局中,动态获取当前地图项的比例尺和旋转角度。 -
@user_full_name:获取当前用户的全名,用于制图信息的自动署名。
更上一层楼:创建自定义函数
当内置函数无法满足您独特的、复杂的计算需求时,QGIS 允许您使用 Python 编写自己的自定义函数。通过菜单栏的 视图 -> 面板 -> 函数编辑器,您可以定义一个函数,它将自动出现在表达式构建器的 "Custom" 组中。
例如,创建一个计算两数之和的简单函数:
from qgis.core import *
from qgis.gui import *
@qgsfunction(args='auto', group='Custom')
def my_sum(value1, value2, feature, parent):
"""计算两个值的和"""
return value1 + value2
保存后,您就可以在任何表达式中像使用内置函数一样调用 my_sum(field1, field2)。
结论
QGIS 表达式是连接数据和地图可视化之间的强大桥梁,是提升工作效率、实现高级地图制图和分析自动化的关键技能。它将静态的数据属性转变为动态的、有意义的地理信息。
初看起来,函数列表可能令人望而生畏,但请记住:
- 从实践开始:从一个简单的需求入手,如创建一个复合标注。
- 善用帮助:表达式构建器中的帮助面板是您最好的老师。
- 不断探索:当您遇到一个重复性的手动任务时,问问自己:“我能用表达式来解决它吗?”
现在就打开 QGIS,调出表达式构建器,开始你的探索之旅吧。