Docs in progress for 'QGIS testing'. Visit https://docs.qgis.org/3.4 for QGIS 3.4 docs and translations.
本文档旨在作为教程和参考指南。虽然它没有列出所有可能的用例,但它应该对主要功能有一个很好的概述。
在QGIS 0.9中首次引入了Python支持。现在,有几种方法可以在QGIS桌面中使用python,这些方法将在以下部分中介绍:
python绑定也可用于qgis服务器,包括python插件(请参见 QGIS服务器python插件 )以及可以用于将QGIS服务器嵌入到Python应用程序中的Python绑定。
有一个 complete QGIS API 记录来自qgis库的类的引用。 The Pythonic QGIS API (pyqgis) 与C++ API几乎相同。
学习如何执行常见任务的一个好资源是从 plugin repository 检查他们的代码。
QGIS为脚本编写提供了一个集成的python控制台。可以从菜单打开(
):上面的屏幕截图说明了如何获取图层列表中当前选定的图层,显示其ID,如果是矢量图层,还可以选择显示功能计数。对于与QGIS环境的交互,有一个 iface
变量,它是 QgisInterface
. 此界面允许访问地图画布、菜单、工具栏和QGIS应用程序的其他部分。
为了方便用户,在控制台启动时执行以下语句(以后可以设置更多初始命令)
from qgis.core import *
import qgis.utils
对于那些经常使用控制台的用户,设置触发控制台的快捷方式(在
)可以使用插件扩展qgis的功能。现在还可以使用用Python编写的插件。C++插件的主要优点是分布简单(没有对每个平台编译)和更容易开发。
自引入Python支持以来,已经编写了许多涵盖各种功能的插件。插件安装程序允许用户轻松获取、升级和删除python插件。见 Python Plugins 有关插件和插件开发的详细信息,请参见第页。
在python中创建插件很简单,请参见 开发python插件 详细说明。
注解
python插件也可用于qgis服务器( QGIS作为OGC数据服务器 见 QGIS服务器python插件 更多详情。
每次QGIS启动时,有两种不同的方法来运行python代码。
PYQGIS_STARTUP
现有python文件的环境变量startup.py
文件¶每次qgis启动时,用户的python主目录
.local/share/QGIS/QGIS3/profiles/default/python
AppDataRoamingQGISQGIS3profilesdefault/python
Library/Application Support/QGIS/QGIS3/profiles/default
搜索名为 startup.py
. 如果该文件存在,则由嵌入的Python解释器执行。
通过设置 PYQGIS_STARTUP
现有python文件路径的环境变量。
此代码将在QGIS初始化完成之前运行。此方法对于清理可能具有不需要的路径的sys.path非常有用,或者在不需要虚拟环境的情况下隔离/加载初始环境,例如在Mac上安装自制或MacPorts。
创建用于自动化流程的脚本通常很方便。有了Pyqgis,这是完全可能的---导入 qgis.core
模块,初始化它,就可以进行处理了。
或者您可能希望创建一个使用GIS功能的交互式应用程序——执行测量、将地图导出为PDF或任何其他功能。这个 qgis.gui
模块提供了各种GUI组件,尤其是地图画布小部件,可以集成到应用程序中,支持缩放、平移和/或任何进一步的自定义地图工具。
必须配置pyqgis自定义应用程序或独立脚本以定位qgis资源,例如投影信息、用于读取矢量和栅格图层的提供程序等。通过在应用程序或脚本的开头添加几行来初始化qgis资源。为自定义应用程序和独立脚本初始化qgis的代码类似。下面提供了每种方法的示例。
注解
做 not 使用 qgis.py
作为测试脚本的名称,python将无法导入绑定,因为脚本的名称将隐藏绑定。
要启动独立脚本,请在脚本开头初始化qgis资源,类似于以下代码:
from qgis.core import *
# supply path to qgis install location
QgsApplication.setPrefixPath("/path/to/qgis/installation", True)
# create a reference to the QgsApplication, setting the
# second argument to False disables the GUI
qgs = QgsApplication([], False)
# load providers
qgs.initQgis()
# Write your code here to load some layers, use processing
# algorithms, etc.
# When your script is complete, call exitQgis() to remove the
# provider and layer registries from memory
qgs.exitQgis()
我们从进口 qgis.core
模块,然后配置前缀路径。前缀路径是QGIS安装在系统上的位置。在脚本中通过调用 setPrefixPath
方法。第二个论点 setPrefixPath
设置为 True
,控制是否使用默认路径。
QGIS安装路径因平台而异;为您的系统找到它的最简单方法是使用 在python控制台中编写脚本 从qgis中查看运行时的输出 QgsApplication.prefixPath()
.
配置前缀路径后,我们保存对 QgsApplication
变量中 qgs
. 第二个参数设置为 False
这表明我们不打算使用GUI,因为我们正在编写一个独立的脚本。与 QgsApplication
配置后,我们通过调用 qgs.initQgis()
方法。初始化了qgis之后,我们就可以编写脚本的其余部分了。最后,我们打电话结束 qgs.exitQgis()
从内存中删除数据提供程序和层注册表。
唯一的区别是 在独立脚本中使用pyqgis 自定义Pyqgis应用程序是实例化 QgsApplication
. 通过 True
而不是 False
表示我们计划使用一个GUI。
from qgis.core import *
# supply path to qgis install location
QgsApplication.setPrefixPath("/path/to/qgis/installation", True)
# create a reference to the QgsApplication
# setting the second argument to True enables the GUI, which we need
# to do since this is a custom application
qgs = QgsApplication([], True)
# load providers
qgs.initQgis()
# Write your code here to load some layers, use processing
# algorithms, etc.
# When your script is complete, call exitQgis() to remove the
# provider and layer registries from memory
qgs.exitQgis()
现在,您可以使用qgis api——加载层并进行一些处理,或者使用地图画布启动GUI。可能性是无限的:—)
如果qgis库和适当的python模块不在知名的位置,您需要告诉系统在哪里搜索它们---否则python会抱怨:
>>> import qgis.core
ImportError: No module named qgis.core
这可以通过设置 PYTHONPATH
环境变量。在以下命令中, <qgispath>
应替换为实际的QGIS安装路径:
Pyqgis模块的路径现在已知,但是它们依赖于 qgis_core
和 qgis_gui
库(python模块仅用作包装器)。这些库的路径对于操作系统来说通常是未知的,因此您会再次收到导入错误(消息可能因系统而异)::
>>> import qgis.core
ImportError: libqgis_core.so.3.2.0: cannot open shared object file:
No such file or directory
通过将qgis库所在的目录添加到动态链接器的搜索路径来解决此问题:
<qgisrelease>
应替换为您的目标版本类型(例如, qgis-ltr
, qgis
, qgis-dev
)这些命令可以放入一个引导脚本中,该脚本将负责启动。使用Pyqgis部署自定义应用程序时,通常有两种可能性:
这两种部署模型可以混合使用——在Windows和MacOS上部署独立的应用程序,对于Linux,将QGIS的安装留给用户和他的包管理器。
我们已经决定使用Python,因为它是最受欢迎的脚本语言之一。qgis 3中的pyqgis绑定依赖于sip和pyqt5。使用sip而不是更广泛使用的swig的原因是qgis代码依赖于qt库。用于qt(pyqt)的python绑定也使用sip完成,这允许pyqgis与pyqt无缝集成。