跳转到内容
QGIS
教程

PyQGIS 是什么?QGIS Python 脚本入门,可免代码

发布于

PyQGIS 是用 Python 代码控制 QGIS 的接口。在 QGIS 中能点击完成的操作,都可以写成几行 Python:加载图层、运行工具、修改样式、导出地图。这样,同一项工作要处理一百个文件时,就不必点击一百次。PyQGIS 随每个 QGIS 一起安装,无需另外添加。

QGIS 中打开了 Python 控制台,上方是巴厘岛登巴萨市中心的地图。右侧编辑器里是名为 school_zones.py 的脚本,它先对学校做重投影,再生成 100 m 缓冲区,并选出缓冲区内的建筑物。左侧输出显示:7015 栋建筑物中有 864 栋位于学校 100 m 范围内,其中 yes 818 栋、school 19 栋、commercial 15 栋、college 5 栋。地图上学校缓冲区为蓝色圆圈,选中的建筑物为橙色。
QGIS 中的 Python 控制台。这段脚本找出距学校 100 m 以内的建筑物:登巴萨市中心 7,015 栋中有 864 栋。

PyQGIS Developer Cookbook 指出,这些 Python 工具与构建 QGIS 本身所用的工具“几乎相同”,所以几乎什么都能做。大多数 QGIS 插件(包括我们的)都是用它编写的。

如今您不必再亲手写代码:聊天机器人可以起草代码,智能体甚至可以完全跳过代码。我们开发了一个智能体,AI Agent。下文会用同样的六项任务测试这两种方式。

PyQGIS 可以在哪里运行

有四个地方,各自适合不同的工作。

位置打开方式适用场景
Python 控制台插件 > Python 控制台(Ctrl+Alt+P)对当前打开的工程做快速修改
处理脚本工具箱 > 脚本 > 从模板创建新脚本带自有输入参数的可复用工具,和工具箱里的其他工具一样
插件QGIS 配置文件夹中的一个文件夹带自有按钮、可分享给他人的工具
独立脚本纯 Python,或 qgis_process 命令无需 QGIS 窗口即可运行的任务,例如在服务器上

在控制台里可以使用 iface,这个对象用来控制 QGIS 窗口。在 QGIS 之外它并不存在,所以 NameError: name 'iface' is not defined 是 GIS Stack Exchange 上被问得最多的 PyQGIS 问题之一。

处理脚本从 QGIS 为您填好的模板开始。您只需修改输入参数和真正干活的几行代码,脚本就会像内置工具一样出现在工具箱中。

QGIS 处理脚本编辑器,显示模板的开头部分:一个名为 ExampleProcessingAlgorithm 的类,注释说明它读取一个矢量图层并创建一个相同的图层,另有常量 INPUT 和 OUTPUT,以及返回 myscript 的 name 方法。
“从模板创建新脚本”会打开一个可以直接修改的完整示例。

第一个 PyQGIS 脚本

打开 Python 控制台,点击 显示编辑器,在图层面板中选中一个建筑物图层,然后粘贴下面的代码。它会统计每种类型的建筑物数量:

from collections import Counter

layer = iface.activeLayer()  # the layer selected in the Layers panel
counts = Counter(f["building"] for f in layer.getFeatures())

for kind, n in counts.most_common(5):
    print(kind, n)
print("Total:", layer.featureCount(), "features in", layer.crs().authid())

主要靠三个对象完成工作:QgsProject.instance() 是您的工程,QgsVectorLayer 和 QgsRasterLayer 是工程里的图层,iface 是窗口。API 参考文档列出了所有的类。

用 Python 运行任意 QGIS 工具

处理工具箱中的每个工具,都可以用一行 Python 运行,即 processing.run(),参数与工具窗口里的设置相同:

import processing

result = processing.run("native:buffer", {
    "INPUT": "buildings.gpkg",
    "DISTANCE": 50,
    "OUTPUT": "buffered.gpkg",
})

不必猜测参数名称。先在工具窗口里填好一次设置,再打开底部的 高级 > 复制为 Python 命令(Advanced > Copy as Python Command)。QGIS 会给出可直接粘贴进脚本的完整一行代码。

QGIS“按多边形统计点数”工具窗口,多边形为 kelurahan,点为学校。底部的“高级”菜单已展开,“复制为 Python 命令”高亮显示,其下依次是“复制为 qgis_process 命令”“复制为 JSON”和“粘贴设置”。
“复制为 Python 命令”可以把您手动设置好的任何工具变成一行代码。

同样的工具也可以不打开 QGIS,直接在终端里用 qgis_process run native:buffer 运行。需要在服务器上定时执行任务时,就走这条路。

QGIS 4 对 PyQGIS 做了哪些改动

2026 年 3 月 6 日发布的 QGIS 4.0 升级到了更新版本的 Qt,也就是 QGIS 窗口和按钮所用的界面工具包。QGIS 自身的函数几乎没有变化。出问题的是直接调用 Qt 的代码,其中三处改动造成了大部分问题:

QGIS 3QGIS 4
简写名称,如 Qt.AlignLeft完整名称,如 Qt.AlignmentFlag.AlignLeft
QRegExpQRegularExpression
对话框的 exec_()exec()

QGIS 自带脚本 pyqt5_to_pyqt6.py,可以替您改写其中大部分内容,其余的可以用 pyqgis4-checker 查出。只使用 QGIS 工具和 processing.run() 的脚本通常无需修改即可运行。

ChatGPT 或 Claude 能帮您写 PyQGIS 吗?

大多数情况下可以,前提是把您的工程告诉它。我测试了 Claude Sonnet(和 ChatGPT 一样的聊天机器人),它的脚本在六项任务中全部无报错运行。当我描述了图层、字段和文件路径时,六个结果全部正确。当我只给出图层名称时,六个里有一个悄悄出错:脚本照常运行,没有任何异常提示,却在一张高程图的 936 个像素中,把 396 个像素填成了不存在的 0 m 高度。

无报错运行结果正确
聊天机器人,提示中描述了工程6 项中的 6 项6 项中的 6 项
聊天机器人,只给图层名称6 项中的 6 项6 项中的 5 项
QGIS 内的 AI 智能体,只给一句任务描述6 项中的 6 项6 项中的 6 项

道理很简单。聊天机器人看不到您的工程,所以代码质量取决于您描述得有多清楚,而且错误的结果可能和正确的结果看上去完全一样。此外还有一个 QGIS 4 的坑:聊天机器人写的两个打印布局脚本都用了上表中的 Qt 简写名称,在 QGIS 4 中会运行到一半就停止。

我们是怎么测的。 2026 年 9 月 26 日,在 QGIS 3.44.7 中,使用巴厘岛登巴萨市中心的地图数据:六项日常任务,从统计建筑物数量到导出打印布局,每项只尝试一次。只有在运行前就写好的独立检查脚本通过时,结果才算正确。六项任务的样本量很小。

或者免写代码:让智能体替您执行步骤

我们开发了 AI Agent,所以本节讲的是我们自己的插件。它是 QGIS 内的一个对话面板:您输入任务,它读取您的工程、运行工具并检查结果。无需粘贴代码,也无需描述工程。

我给它同样的六句任务描述,没有介绍任何工程情况。它六项全部做对,每项耗时 6.4 到 42.8 秒,六项合计 148.8 秒。它有两次在写入文件前停下来询问,我点击了“允许”。在难倒聊天机器人的那项高程任务上,它先读取图层,再正确设置了空像素。

右侧是 AI Agent 面板的 QGIS。请求内容是按 building 字段为建筑物图层设置样式:commercial 为红色,school 为蓝色,hotel 为绿色,house 为紫色,其余取值为浅灰色。智能体回复说已设置样式并逐类检查过。登巴萨地图上,灰色建筑物之间有红色的商业建筑、一栋绿色的酒店和一栋紫色的住宅,图层面板列出了这五个类别。
一句话,建筑物就按类型设置好了样式。无需阅读或粘贴代码。

免费的路线依然很好:控制台、复制为 Python 命令加一个聊天机器人,只要您检查结果,就能走得很远。如果您更愿意直接描述任务并得到图层,智能体可以替您完成这些步骤。

在 QGIS 中免费试用 AI Agent,无需信用卡

大家常卡在哪里

我们统计了 YouTube 上 QGIS 教程的评论:在 1,692 个有评论的教程中,245 个教程下共有 391 条评论是在求助 Python 或自动化问题。总是这三个问题反复出现:

  • 找不到图层。 名称只差一个字母或一个空格,mapLayersByName("roads") 就什么也找不到。
  • 距离单位是度。 对 EPSG:4326 的图层做 50 m 缓冲区,实际是 50 度的缓冲区,因为这个坐标系以度为单位。请先重投影,详见什么是 CRS。
  • 在 QGIS 之外使用 iface。 在窗口之外运行的脚本没有 iface,请改用 QgsProject 和 processing.run()。

要点回顾

PyQGIS 是 QGIS 的 Python 接口。它可以在 Python 控制台、处理脚本、插件中运行,也可以用 qgis_process 在 QGIS 之外运行。

processing.run() 可以通过代码运行任何 QGIS 工具,而 复制为 Python 命令 能从工具窗口直接给出准确的一行代码。

QGIS 4 重命名了一些 Qt 名称,例如 Qt.AlignLeft。自己构建窗口的代码可能需要做小的修改。

在我们的六项任务测试中,聊天机器人的代码总能运行,但在没有描述工程时有一次结果是错的。QGIS 内的智能体,例如 AI Agent,只凭一句任务描述就六项全对。

常见问题

PyQGIS 有什么用?

用 Python 自动化 QGIS:加载和编辑图层、对多个文件批量运行工具、设置地图样式、制作打印布局,以及编写可供他人复用的插件或脚本。它也可以在 QGIS 窗口之外运行,用于服务器上的任务。

PyQGIS 就是 Python 吗?

PyQGIS 是一套可以在 Python 中调用的 QGIS 工具。您写的是普通的 Python,PyQGIS 额外提供 QgsVectorLayer 和 processing.run() 之类的内容。它随 QGIS 一起提供,使用的是 QGIS 安装的那个 Python。

如何在 QGIS 中打开 Python 控制台?

插件 > Python 控制台,或按 Ctrl+Alt+P。点击 显示编辑器 可以编写较长的脚本,把它们保存为 .py 文件,并用绿色箭头运行。

我的 PyQGIS 脚本在 QGIS 4 中还能用吗?

只使用 QGIS 工具和 processing.run() 的脚本通常可以。自己构建窗口的脚本往往需要小的改动,例如用 Qt.AlignmentFlag.AlignLeft 代替 Qt.AlignLeft。官方的 pyqt5_to_pyqt6.py 脚本能修复其中大部分问题。

不用 Python 能自动化 QGIS 吗?

可以。图形建模器能以可视化方式串联工具,批处理模式可以对多个文件运行同一个工具。AI 智能体插件则更进一步:您用日常的话输入任务,它在您的工程中运行相应工具。我们的 AI Agent 有免费套餐。

想进一步了解,QGIS 中的 AI 智能体是什么介绍了智能体的工作方式以及如何选择,AI Agent 是我们的插件,可免费试用。什么是 CRS 讲解了大多数脚本都需要先做的重投影,什么是 QGIS MCP 则介绍了适合 Claude Code 和 Cursor 用户的方式。