QGIS字段计算器怎么用?常用表达式有哪些?
很多刚接触 QGIS 的同学都会问:QGIS字段计算器怎么用?常用表达式有哪些? 如果你需要批量计算面积、生成编号、拼接字段、提取坐标、按条件赋值,字段计算器基本是 QGIS 属性表处理中最常用的工具之一。本文以实际 GIS 数据处理场景为主,讲清楚字段计算器的位置、表达式写法、常用公式和容易出错的地方。
引言:QGIS字段计算器适合解决什么问题
QGIS字段计算器用于根据已有字段、几何对象或表达式规则,批量生成或更新属性字段。它的典型用途包括:
- 根据图斑几何计算面积、周长、长度。
- 把多个字段合并成一个新的名称字段。
- 根据行政区代码、用地类型、面积范围进行条件分类。
- 从点图层中提取 X、Y 坐标。
- 给要素生成序号、唯一编码或标准化字段值。
- 批量修正空值、大小写、文本空格和字段格式。
简单说,只要你想对属性表进行批量计算,而不是一行一行手工修改,就应该优先考虑 QGIS 字段计算器。

背景:为什么 GIS 属性表不能只靠手工编辑
在 GIS 项目中,一个图层往往有几百、几千甚至几十万条要素。比如地块图层、道路中心线、兴趣点 POI、行政区边界、管线数据等,都需要维护大量属性字段。
如果手工逐条编辑,会遇到几个问题:
- 效率低:大量重复操作很容易耗费时间。
- 错误多:复制、粘贴、输入单位时容易出现人为错误。
- 难复现:别人无法确认你每一条数据是怎样算出来的。
- 难更新:数据变化后,需要重新计算,手工方式不利于维护。
QGIS 字段计算器的价值就在于:把属性计算规则写成表达式,让软件按同一规则批量处理。这样既能提高效率,也能保证计算过程可检查、可复现。
原理:QGIS字段计算器的基本逻辑
理解 QGIS 字段计算器并不难,它的核心逻辑可以拆成三部分:
- 输入对象:当前图层中的每一个要素。
- 表达式:你写的计算规则,例如面积、拼接、判断条件。
- 输出字段:把计算结果写入新字段,或更新已有字段。
例如,在面图层中使用表达式 $area,QGIS 会对每一个面要素计算面积,并把结果写入指定字段。使用表达式 "name" || '-' || "type",QGIS 会把 name 字段和 type 字段拼接成新的文本。
需要注意的是,字段计算器里的字段名一般用双引号包裹,例如 "DLMC"。文本常量用单引号包裹,例如 '建设用地'。这是很多新手最容易混淆的地方。
步骤:QGIS字段计算器怎么用
步骤一:打开图层属性表
- 在 QGIS 图层面板中选中目标图层。
- 右键图层,选择打开属性表。
- 检查字段名称、字段类型和已有属性值是否正常。
如果你要计算面积或长度,建议先确认图层坐标系是否适合量算。经纬度坐标系下直接计算面积,经常会得到不符合预期的结果。
步骤二:打开字段计算器
- 在属性表上方工具栏中点击字段计算器按钮。
- 如果要新增字段,勾选创建新字段。
- 如果要修改已有字段,勾选更新已有字段并选择目标字段。
初学者建议优先创建新字段,不要直接覆盖原字段。确认结果无误后,再决定是否删除旧字段或替换原字段。
步骤三:设置字段名称和字段类型
新增字段时,需要设置字段名、字段类型和长度。常见选择如下:
| 用途 | 推荐字段类型 | 说明 |
|---|---|---|
| 面积、长度、比例 | 小数 | 适合保存带小数位的计算结果 |
| 数量、序号、分类编码 | 整数 | 适合保存编号、等级、计数结果 |
| 名称、说明、拼接结果 | 文本 | 适合保存行政区名、类型名、备注信息 |
| 日期 | 日期 | 适合保存采集日期、更新时间 |
字段类型选错会导致表达式结果无法正确写入。例如,把文本结果写入整数型字段,可能得到空值或报错。
步骤四:输入表达式并预览结果
在表达式输入框中填写计算规则。QGIS 字段计算器通常会显示表达式是否有效,并可预览计算结果。
例如,计算面图层面积:
$area
把平方米转换为公顷:
$area / 10000
拼接两个字段:
"XZQMC" || '-' || "DLMC"
按条件赋值:
case
when "area_mu" >= 100 then '大地块'
when "area_mu" >= 10 then '中地块'
else '小地块'
end
步骤五:点击确定并检查属性表
点击确定后,QGIS 会把表达式应用到当前图层的要素上。完成后不要马上关闭项目,建议检查以下内容:
- 新字段是否已生成。
- 字段值是否有空值或异常值。
- 面积、长度单位是否符合预期。
- 文本拼接结果是否出现多余空格或空字符串。
- 条件判断是否覆盖了所有可能情况。
步骤:QGIS字段计算器常用表达式有哪些
1. 计算面积
面图层最常见的 QGIS 字段计算器常用表达式是面积计算。基础写法如下:
$area
如果图层使用米为单位的投影坐标系,结果通常是平方米。换算为公顷:
$area / 10000
换算为亩:
$area / 666.6667
如果你发现面积明显不对,优先检查图层坐标系,不要只怀疑表达式。
2. 计算长度或周长
线图层计算长度可使用:
$length
面图层计算周长也可使用:
$perimeter
如果需要转换为千米:
$length / 1000
3. 提取点坐标 X 和 Y
点图层中经常需要把坐标写入属性表。提取 X 坐标:
x($geometry)
提取 Y 坐标:
y($geometry)
如果图层坐标系是经纬度坐标系,X 通常表示经度,Y 通常表示纬度。如果图层是投影坐标系,X 和 Y 则是平面坐标值。
4. 字段拼接
把行政区名称和地类名称拼接成一个字段:
"XZQMC" || '-' || "DLMC"
如果需要处理空值,可以使用 coalesce:
coalesce("XZQMC", '') || '-' || coalesce("DLMC", '')
coalesce 的作用是:当字段为空值时,用指定内容替代,避免拼接结果变成空值。
5. 条件赋值
按面积大小分类:
case
when "area_mu" >= 100 then '大地块'
when "area_mu" >= 10 then '中地块'
else '小地块'
end
按用地类型编码赋值:
case
when "DLBM" = '0101' then '水田'
when "DLBM" = '0201' then '果园'
when "DLBM" = '0301' then '乔木林地'
else '其他'
end
条件表达式适合处理分类、分级、标准化命名等任务。写条件时要注意顺序,范围大的条件不要放在范围小的条件前面。
6. 生成序号
生成当前要素编号可以使用:
$id
如果想从 1 开始:
$id + 1
需要注意,$id 是 QGIS 当前要素 ID,不一定等同于稳定的业务编号。数据编辑、导出、合并后,编号可能发生变化。如果需要长期使用的唯一编号,建议使用专门的 ID 生成规则。
7. 生成唯一标识
生成 UUID:
uuid()
UUID 适合用于要素唯一标识,尤其是在后续要和数据库、WebGIS 或外业采集系统对接时。
8. 文本转大写或小写
转大写:
upper("code")
转小写:
lower("code")
去掉字段前后空格:
trim("name")
9. 截取字符串
截取行政区代码前 6 位:
substr("XZQDM", 1, 6)
这个表达式常用于从完整行政区划代码中提取省、市、县级代码。
10. 计算当前日期
写入当前日期:
now()
如果字段类型是文本,也可以格式化日期:
format_date(now(), 'yyyy-MM-dd')
常见坑:QGIS字段计算器结果不对通常是什么原因
1. 面积计算不准,多半是坐标系问题
如果图层是 EPSG:4326 这类经纬度坐标系,直接使用 $area 计算面积很容易出现不符合预期的结果。因为经纬度单位是度,不是米。
建议做法:
- 先把数据另存为合适的投影坐标系。
- 中国范围内可根据项目要求选择 CGCS2000 高斯克吕格投影或地方常用投影。
- 再使用字段计算器计算面积、长度或周长。
2. 字段名和文本引号写反
字段名使用双引号,例如:
"DLMC"
文本常量使用单引号,例如:
'耕地'
如果写成 'DLMC',QGIS 会把它当作普通文字,而不是字段值。
3. 更新已有字段前没有备份
字段计算器可以直接更新已有字段,但这也意味着原字段值会被覆盖。对于重要数据,建议先复制图层或新增一个临时字段进行测试。
4. 字段类型与表达式结果不一致
例如表达式返回 '大地块',但你创建的是整数型字段,结果就可能写入失败。创建字段前先判断表达式输出是文本、整数还是小数。
5. 空值导致拼接或计算异常
空值不是空字符串。字段中只要有 NULL,就可能影响拼接、计算和条件判断。文本拼接时建议使用:
coalesce("name", '')
数值计算时可使用:
coalesce("area", 0)
6. 只对选中要素计算却忘记检查选择状态
如果属性表中存在选中要素,字段计算器可能只对选中要素进行更新,具体取决于当前操作选项。计算前建议确认是否需要“仅更新选中要素”。
方法比较:字段计算器、处理工具箱和 Python 哪个更适合
| 方法 | 适合场景 | 优点 | 限制 |
|---|---|---|---|
| QGIS 字段计算器 | 属性表批量计算、面积长度、字段拼接、条件赋值 | 上手快、可视化、适合日常 GIS 编辑 | 复杂流程复用能力有限 |
| QGIS 处理工具箱 | 字段重构、批处理、空间分析流程 | 适合和其他空间处理工具组合 | 简单字段计算时步骤略多 |
| 表达式选择 | 按条件筛选要素 | 适合先筛选再编辑 | 主要用于选择,不一定直接写入字段 |
| PyQGIS 或 Python | 批量处理多个图层、自动化生产流程 | 可复用、可脚本化、适合工程化 | 需要编程基础 |
如果只是单个图层的字段计算,优先使用 QGIS 字段计算器。如果需要批量处理多个文件、多个图层,或者要定期重复执行,建议考虑 QGIS 模型构建器、处理工具箱批处理或 PyQGIS 脚本。
检查清单:使用QGIS字段计算器前后要确认什么
计算前检查
- 目标图层是否可编辑,数据是否已备份。
- 字段名称是否明确,没有重名或含义混乱。
- 图层坐标系是否适合面积和长度计算。
- 要新增字段还是更新已有字段已经确认。
- 字段类型、长度、小数位数是否匹配表达式结果。
- 当前是否存在选中要素,是否只想计算选中部分。
计算后检查
- 新字段是否成功生成。
- 是否出现 NULL、0、异常大值或异常小值。
- 随机抽查几条记录,手动验证表达式结果。
- 面积、长度单位是否与项目要求一致。
- 条件分类是否覆盖所有数据类型。
- 保存编辑前确认没有误更新原字段。
FAQ:QGIS字段计算器常见问题
QGIS字段计算器在哪里打开?
先打开图层属性表,然后点击属性表工具栏中的字段计算器按钮。也可以在图层编辑和处理流程中通过相关字段工具调用表达式功能。
QGIS字段计算器怎么计算面积?
面图层中可以使用 $area。如果投影坐标系单位是米,结果通常为平方米。公顷可用 $area / 10000,亩可用 $area / 666.6667。计算前务必检查坐标系。
QGIS字段计算器表达式为什么报错?
常见原因包括字段名写错、引号混用、字段类型不匹配、括号没有闭合、条件表达式缺少 end。建议先从简单表达式测试,再逐步增加条件。
字段计算器可以只计算选中的要素吗?
可以。属性表中选中要素后,字段计算器通常可以选择仅更新选中要素。计算前一定要确认当前选择状态,避免只更新了一部分数据或误更新了全部数据。
为什么字段拼接后结果为空?
很可能是某个参与拼接的字段存在 NULL。可以使用 coalesce("字段名", '') 把空值替换为空字符串,再进行拼接。
QGIS字段计算器能生成唯一编号吗?
可以使用 uuid() 生成 UUID,也可以使用 $id + 1 生成简单序号。但 $id 不一定适合作为长期业务主键,正式项目中建议使用稳定的编码规则。
结论:先确认坐标系和字段类型,再写表达式
QGIS 字段计算器并不只是一个“算字段”的小工具,它是 GIS 属性数据标准化、批量处理和质量检查的重要入口。掌握面积计算、长度计算、字段拼接、条件赋值、坐标提取和空值处理这些常用表达式,基本可以覆盖大多数日常 QGIS 属性表处理任务。
实际使用时记住一个原则:先确认数据坐标系、字段类型和更新范围,再执行表达式。这样使用 QGIS 字段计算器,既能提高效率,也能减少面积不准、字段覆盖、空值异常等常见问题。