QGIS字段计算器怎么用?常用表达式有哪些?

GIS基础理论
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

很多刚接触 QGIS 的同学都会问:QGIS字段计算器怎么用?常用表达式有哪些? 如果你需要批量计算面积、生成编号、拼接字段、提取坐标、按条件赋值,字段计算器基本是 QGIS 属性表处理中最常用的工具之一。本文以实际 GIS 数据处理场景为主,讲清楚字段计算器的位置、表达式写法、常用公式和容易出错的地方。

引言:QGIS字段计算器适合解决什么问题

QGIS字段计算器用于根据已有字段、几何对象或表达式规则,批量生成或更新属性字段。它的典型用途包括:

  • 根据图斑几何计算面积、周长、长度。
  • 把多个字段合并成一个新的名称字段。
  • 根据行政区代码、用地类型、面积范围进行条件分类。
  • 从点图层中提取 X、Y 坐标。
  • 给要素生成序号、唯一编码或标准化字段值。
  • 批量修正空值、大小写、文本空格和字段格式。

简单说,只要你想对属性表进行批量计算,而不是一行一行手工修改,就应该优先考虑 QGIS 字段计算器。

QGIS字段计算器怎么用和QGIS字段计算器常用表达式示意图
QGIS 字段计算器的基本使用流程:打开属性表、创建或更新字段、填写表达式并检查结果。

背景:为什么 GIS 属性表不能只靠手工编辑

在 GIS 项目中,一个图层往往有几百、几千甚至几十万条要素。比如地块图层、道路中心线、兴趣点 POI、行政区边界、管线数据等,都需要维护大量属性字段。

如果手工逐条编辑,会遇到几个问题:

  • 效率低:大量重复操作很容易耗费时间。
  • 错误多:复制、粘贴、输入单位时容易出现人为错误。
  • 难复现:别人无法确认你每一条数据是怎样算出来的。
  • 难更新:数据变化后,需要重新计算,手工方式不利于维护。

QGIS 字段计算器的价值就在于:把属性计算规则写成表达式,让软件按同一规则批量处理。这样既能提高效率,也能保证计算过程可检查、可复现。

原理:QGIS字段计算器的基本逻辑

理解 QGIS 字段计算器并不难,它的核心逻辑可以拆成三部分:

  • 输入对象:当前图层中的每一个要素。
  • 表达式:你写的计算规则,例如面积、拼接、判断条件。
  • 输出字段:把计算结果写入新字段,或更新已有字段。

例如,在面图层中使用表达式 $area,QGIS 会对每一个面要素计算面积,并把结果写入指定字段。使用表达式 "name" || '-' || "type",QGIS 会把 name 字段和 type 字段拼接成新的文本。

需要注意的是,字段计算器里的字段名一般用双引号包裹,例如 "DLMC"。文本常量用单引号包裹,例如 '建设用地'。这是很多新手最容易混淆的地方。

步骤:QGIS字段计算器怎么用

步骤一:打开图层属性表

  1. 在 QGIS 图层面板中选中目标图层。
  2. 右键图层,选择打开属性表
  3. 检查字段名称、字段类型和已有属性值是否正常。

如果你要计算面积或长度,建议先确认图层坐标系是否适合量算。经纬度坐标系下直接计算面积,经常会得到不符合预期的结果。

步骤二:打开字段计算器

  1. 在属性表上方工具栏中点击字段计算器按钮。
  2. 如果要新增字段,勾选创建新字段
  3. 如果要修改已有字段,勾选更新已有字段并选择目标字段。

初学者建议优先创建新字段,不要直接覆盖原字段。确认结果无误后,再决定是否删除旧字段或替换原字段。

步骤三:设置字段名称和字段类型

新增字段时,需要设置字段名、字段类型和长度。常见选择如下:

用途 推荐字段类型 说明
面积、长度、比例 小数 适合保存带小数位的计算结果
数量、序号、分类编码 整数 适合保存编号、等级、计数结果
名称、说明、拼接结果 文本 适合保存行政区名、类型名、备注信息
日期 日期 适合保存采集日期、更新时间

字段类型选错会导致表达式结果无法正确写入。例如,把文本结果写入整数型字段,可能得到空值或报错。

步骤四:输入表达式并预览结果

在表达式输入框中填写计算规则。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 字段计算器,既能提高效率,也能减少面积不准、字段覆盖、空值异常等常见问题。