QGIS Python控制台怎么用?常用命令有哪些?
QGIS Python控制台怎么用?常用命令有哪些? 这是很多刚接触 QGIS 自动化的同学会遇到的第一个问题:明明界面上能点出来的操作,为什么还要用 Python 控制台?简单说,QGIS Python控制台适合快速检查图层、批量修改属性、调用处理工具、测试 PyQGIS 代码,也是以后写 QGIS 插件和自动化脚本的入口。
引言
在 QGIS 中,Python 控制台不是一个“高级用户才用得上”的功能。对于 GIS 学生、初级 GIS 工程师和空间数据分析人员来说,它最实用的价值是:把重复点击变成几行命令,把手动检查变成可复现的流程。
本文围绕一个具体目标展开:学会打开和使用 QGIS Python控制台,并掌握常用 PyQGIS 命令,包括获取当前工程、读取图层、查看字段、选择要素、编辑属性、运行处理工具和导出数据。

背景
QGIS Python控制台内置在 QGIS 桌面软件中,底层调用的是 PyQGIS,也就是 QGIS 提供给 Python 使用的应用程序接口。你可以把它理解为一个可以直接访问当前 QGIS 工程、图层、地图画布和处理工具箱的 Python 环境。
常见使用场景包括:
- 快速查看当前加载了哪些图层。
- 批量读取字段名、要素数量和几何类型。
- 选择符合条件的要素。
- 批量修改属性字段。
- 调用缓冲区、裁剪、叠加分析等 QGIS 处理工具。
- 测试一段 PyQGIS 代码,确认可用后再写成脚本或插件。
如果只是偶尔做一次制图或数据浏览,图形界面足够用。但只要遇到重复操作、批量处理、多图层检查或标准化流程,QGIS Python控制台就会明显提高效率。
原理
QGIS Python控制台的核心对象主要有三个:当前工程、当前图层和处理算法。
当前工程通常通过 QgsProject.instance() 获取。它代表你正在打开的 QGIS 项目,可以访问项目中的所有图层。
当前图层通常通过 iface.activeLayer() 获取。这里的 iface 是 QGIS 提供的界面对象,可以访问当前地图画布、图层面板和活动图层。
处理算法通过 processing.run() 调用。它对应 QGIS 处理工具箱里的各种工具,例如缓冲区、融合、裁剪、重投影等。
理解这三个入口后,大多数 QGIS Python控制台常用命令都可以归纳为以下流程:
- 获取当前工程或当前图层。
- 检查图层字段、坐标系、几何类型和要素数量。
- 读取、筛选或修改要素。
- 必要时调用处理工具生成新图层。
- 把结果添加到 QGIS 工程或导出为文件。
步骤
步骤一:打开 QGIS Python控制台
在 QGIS 主界面中,依次点击菜单:
插件 → Python 控制台
也可以在部分版本中通过快捷按钮打开。打开后通常会看到一个命令输入区和输出区。如果要写多行代码,建议点击控制台中的“显示编辑器”按钮,在编辑器中编写完整代码后再运行。
步骤二:查看当前 QGIS 版本
学习 PyQGIS 时,先确认 QGIS 版本很重要,因为不同版本的 API 细节可能略有差异。
Qgis.QGIS_VERSION
如果控制台返回版本号,说明控制台可正常执行命令。
步骤三:获取当前活动图层
在图层面板中点击一个矢量图层,然后在 QGIS Python控制台输入:
layer = iface.activeLayer()
layer.name()
这两行代码的含义是:先获取当前选中的图层,再输出图层名称。如果返回的是图层名,说明已经成功连接到当前图层。
步骤四:查看图层基本信息
下面这些是 QGIS Python控制台常用命令,适合用来快速检查数据。
layer = iface.activeLayer()
print(layer.name())
print(layer.featureCount())
print(layer.crs().authid())
print(layer.geometryType())
各命令含义如下:
layer.name():查看图层名称。layer.featureCount():查看要素数量。layer.crs().authid():查看坐标参考系统,例如EPSG:4326。layer.geometryType():查看几何类型,返回值通常需要结合 QGIS 类型枚举理解。
步骤五:查看字段列表
检查字段名是属性处理前的必做步骤,尤其是字段名包含中文、空格或特殊字符时。
layer = iface.activeLayer()
for field in layer.fields():
print(field.name(), field.typeName())
这段代码会输出字段名称和字段类型。后续写表达式、筛选条件或属性更新时,应以这里输出的字段名为准。
步骤六:遍历要素并读取属性
如果想查看图层前几条记录,可以使用下面的命令:
layer = iface.activeLayer()
for i, feature in enumerate(layer.getFeatures()):
print(feature.id(), feature.attributes())
if i >= 4:
break
如果只想读取某一个字段,例如字段名为 name:
layer = iface.activeLayer()
for feature in layer.getFeatures():
print(feature["name"])
如果字段不存在,会报错。因此在读取字段前,建议先用字段列表命令确认字段名。
步骤七:按条件选择要素
QGIS Python控制台可以用表达式选择要素。例如选择 type 字段等于 road 的要素:
layer = iface.activeLayer()
expression = ""type" = 'road'"
layer.selectByExpression(expression)
如果要清除选择:
layer.removeSelection()
选择表达式的写法和 QGIS 属性表里的“按表达式选择”基本一致。字段名通常用双引号,文本值用单引号。
步骤八:编辑属性字段
修改属性前,需要确认图层支持编辑,并且你知道要修改的字段索引。下面示例把所有要素的 status 字段改为 checked。
layer = iface.activeLayer()
field_index = layer.fields().indexFromName("status")
layer.startEditing()
for feature in layer.getFeatures():
layer.changeAttributeValue(feature.id(), field_index, "checked")
layer.commitChanges()
如果操作有误,可以在提交前使用:
layer.rollBack()
属性编辑是 QGIS Python控制台中最容易误操作的部分。正式运行前,建议先备份数据,或者先对少量要素测试。
步骤九:新增字段并计算值
下面示例新增一个名为 area_m2 的字段,并写入要素面积。这个操作适合面图层。
from qgis.PyQt.QtCore import QVariant
from qgis.core import QgsField
layer = iface.activeLayer()
layer.startEditing()
layer.dataProvider().addAttributes([QgsField("area_m2", QVariant.Double)])
layer.updateFields()
field_index = layer.fields().indexFromName("area_m2")
for feature in layer.getFeatures():
area = feature.geometry().area()
layer.changeAttributeValue(feature.id(), field_index, area)
layer.commitChanges()
注意:面积单位取决于图层坐标系。如果图层是经纬度坐标系,例如 EPSG:4326,直接计算面积通常不是平方米。应先重投影到合适的投影坐标系。
步骤十:调用 QGIS 处理工具
QGIS Python控制台不仅能操作图层,还能调用处理工具箱中的算法。例如对当前图层做缓冲区:
import processing
layer = iface.activeLayer()
result = processing.run("native:buffer", {
"INPUT": layer,
"DISTANCE": 100,
"SEGMENTS": 8,
"END_CAP_STYLE": 0,
"JOIN_STYLE": 0,
"MITER_LIMIT": 2,
"DISSOLVE": False,
"OUTPUT": "memory:"
})
buffer_layer = result["OUTPUT"]
QgsProject.instance().addMapLayer(buffer_layer)
这里的 "native:buffer" 对应 QGIS 原生缓冲区工具。"OUTPUT": "memory:" 表示结果先生成临时内存图层。
步骤十一:保存图层为 GeoPackage
如果想把处理结果保存为文件,可以使用 QgsVectorFileWriter。下面示例把当前图层导出为 GeoPackage。
from qgis.core import QgsVectorFileWriter, QgsCoordinateTransformContext
layer = iface.activeLayer()
output_path = "D:/gis/output.gpkg"
options = QgsVectorFileWriter.SaveVectorOptions()
options.driverName = "GPKG"
options.layerName = "export_layer"
QgsVectorFileWriter.writeAsVectorFormatV3(
layer,
output_path,
QgsCoordinateTransformContext(),
options
)
Windows 路径建议使用正斜杠,或使用原始字符串,避免反斜杠被 Python 当作转义字符。
常见坑
坑一:iface.activeLayer() 返回空
如果没有在图层面板中选中图层,iface.activeLayer() 可能返回空对象。解决方法是先点击目标图层,再运行命令。
坑二:字段名写错导致报错
很多错误来自字段名拼写不一致。例如属性表里显示的是 Name,代码中写成 name,就可能无法读取。建议先运行:
for field in layer.fields():
print(field.name())
坑三:面积和长度结果不符合预期
QGIS Python控制台中使用 geometry().area() 或 geometry().length() 时,结果单位与图层坐标系有关。经纬度坐标系下直接计算面积和长度,通常不适合作为工程结果。
正确做法是先确认坐标系,必要时把图层重投影到米制投影坐标系,再计算面积或长度。
坑四:忘记 startEditing 和 commitChanges
修改属性或几何时,如果没有进入编辑状态,修改可能不会生效。典型流程应是:
layer.startEditing()
# 修改属性或几何
layer.commitChanges()
如果不想保存修改,使用:
layer.rollBack()
坑五:直接在原始数据上批量修改
Python 控制台执行速度很快,但撤销并不总是像手工编辑那样直观。批量修改前应备份数据,特别是 Shapefile、GeoPackage、数据库图层和生产项目数据。
坑六:处理工具参数不知道怎么写
如果不知道某个处理工具的参数名称,可以在 QGIS 处理工具箱中先手动运行一次,然后查看处理历史。也可以使用:
processing.algorithmHelp("native:buffer")
这会输出算法说明和参数名称,是学习 QGIS Python控制台常用命令时非常有用的办法。
方法比较
| 方法 | 适合场景 | 优点 | 限制 |
|---|---|---|---|
| QGIS 图形界面 | 单次操作、可视化检查、制图调整 | 直观,上手快,不需要写代码 | 重复操作效率低,不易复现完整流程 |
| QGIS Python控制台 | 快速测试命令、批量检查图层、简单自动化 | 直接访问当前工程和图层,反馈快 | 代码不易长期管理,误操作风险较高 |
| QGIS 处理模型 | 固定处理流程、无代码自动化 | 流程可视化,适合重复运行 | 复杂逻辑不如 Python 灵活 |
| 独立 PyQGIS 脚本 | 批处理、定期任务、工程化流程 | 便于版本管理和自动运行 | 环境配置比控制台更复杂 |
| QGIS 插件 | 给团队或用户封装工具 | 交互友好,可复用性强 | 开发成本较高,需要理解插件结构 |
初学阶段建议从 QGIS Python控制台开始。等命令稳定后,再整理为脚本;如果流程需要给别人长期使用,再考虑做成处理模型或插件。
检查清单
在 QGIS Python控制台运行代码前,可以按下面清单检查:
- 是否已经保存或备份原始数据?
- 是否选中了正确的活动图层?
- 是否确认字段名、字段类型和大小写?
- 是否确认图层坐标系,尤其是面积和长度计算?
- 是否先在少量要素上测试代码?
- 修改属性前是否使用了
startEditing()? - 确认结果无误后是否执行了
commitChanges()? - 调用处理工具时,参数名称是否来自算法帮助或处理历史?
- 输出文件路径是否存在,是否有写入权限?
- 临时图层是否需要另存为 GeoPackage、Shapefile 或其他格式?
FAQ
QGIS Python控制台怎么打开?
在 QGIS 菜单中点击 插件 → Python 控制台 即可打开。打开后可以直接输入单行命令,也可以展开编辑器运行多行 PyQGIS 代码。
QGIS Python控制台常用命令有哪些?
常用命令包括 iface.activeLayer() 获取当前图层,QgsProject.instance() 获取当前工程,layer.fields() 查看字段,layer.getFeatures() 遍历要素,layer.selectByExpression() 按表达式选择要素,以及 processing.run() 调用处理工具。
QGIS Python控制台和普通 Python 有什么区别?
普通 Python 默认不能直接访问 QGIS 当前工程和图层。QGIS Python控制台已经加载了 QGIS 环境,可以直接使用 iface、QgsProject、图层对象和处理工具,更适合在 QGIS 内部做自动化操作。
为什么我运行 iface.activeLayer() 没有结果?
通常是因为当前没有选中图层,或者选中的不是有效图层。先在图层面板中点击目标图层,再运行 layer = iface.activeLayer()。
QGIS Python控制台可以批量处理多个图层吗?
可以。可以通过 QgsProject.instance().mapLayers() 获取当前工程中的所有图层,然后用循环逐个处理。例如检查每个图层的名称和要素数量:
project = QgsProject.instance()
for layer_id, layer in project.mapLayers().items():
print(layer.name(), layer.featureCount())
用 QGIS Python控制台修改数据安全吗?
它本身是安全的,但批量修改数据时容易因为字段名、筛选条件或坐标系判断错误而产生错误结果。建议先备份数据,并在少量样本上测试代码。
QGIS Python控制台可以替代 ArcPy 吗?
不能简单说替代。QGIS Python控制台使用 PyQGIS,主要服务于 QGIS 工作流;ArcPy 服务于 ArcGIS Pro 和 Esri 生态。如果你的项目主要在 QGIS 中完成,PyQGIS 更直接;如果项目依赖 ArcGIS Pro 工具箱、企业地理数据库或 Esri 服务,ArcPy 更合适。
QGIS Python控制台适合初学者吗?
适合,但建议从读取图层、查看字段、选择要素这类低风险命令开始。等熟悉对象和流程后,再尝试属性修改、几何编辑和批量处理。
结论
QGIS Python控制台的学习重点不是背很多命令,而是理解“工程、图层、要素、字段、处理工具”之间的关系。掌握 iface.activeLayer()、QgsProject.instance()、layer.getFeatures()、layer.selectByExpression() 和 processing.run() 这几类常用命令后,就可以解决大多数日常 QGIS 自动化问题。
如果你刚开始使用 QGIS Python控制台,建议按本文顺序练习:先查看图层信息,再读取字段和属性,最后尝试选择、编辑和处理工具调用。每一步都确认结果,再进入下一步,这样最稳妥。