介绍¶

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 检查他们的代码。

在python控制台中编写脚本

QGIS为脚本编写提供了一个集成的python控制台。可以从菜单打开( Plugins ‣ Python Console ):

../../_images/console.png

QGIS python控制台

上面的屏幕截图说明了如何获取图层列表中当前选定的图层,显示其ID,如果是矢量图层,还可以选择显示功能计数。对于与QGIS环境的交互,有一个 iface 变量,它是 QgisInterface . 此界面允许访问地图画布、菜单、工具栏和QGIS应用程序的其他部分。

为了方便用户,在控制台启动时执行以下语句(以后可以设置更多初始命令)

from qgis.core import *
import qgis.utils

对于那些经常使用控制台的用户,设置触发控制台的快捷方式(在 Settings ‣ Configure shortcuts...

Python插件

可以使用插件扩展qgis的功能。现在还可以使用用Python编写的插件。C++插件的主要优点是分布简单(没有对每个平台编译)和更容易开发。

自引入Python支持以来,已经编写了许多涵盖各种功能的插件。插件安装程序允许用户轻松获取、升级和删除python插件。见 Python Plugins 有关插件和插件开发的详细信息,请参见第页。

在python中创建插件很简单,请参见 开发python插件 详细说明。

注解

python插件也可用于qgis服务器( QGIS作为OGC数据服务器QGIS服务器python插件 更多详情。

在qgis启动时运行python代码

每次QGIS启动时,有两种不同的方法来运行python代码。

  1. 创建startup.py脚本
  2. 设置 PYQGIS_STARTUP 现有python文件的环境变量

这个 startup.py 文件

每次qgis启动时,用户的python主目录

  • Linux: .local/share/QGIS/QGIS3/profiles/default/python
  • 窗户: AppDataRoamingQGISQGIS3profilesdefault/python
  • 马科斯: Library/Application Support/QGIS/QGIS3/profiles/default

搜索名为 startup.py . 如果该文件存在,则由嵌入的Python解释器执行。

pyqgis_startup环境变量

通过设置 PYQGIS_STARTUP 现有python文件路径的环境变量。

此代码将在QGIS初始化完成之前运行。此方法对于清理可能具有不需要的路径的sys.path非常有用,或者在不需要虚拟环境的情况下隔离/加载初始环境,例如在Mac上安装自制或MacPorts。

python应用程序

创建用于自动化流程的脚本通常很方便。有了Pyqgis,这是完全可能的---导入 qgis.core 模块,初始化它,就可以进行处理了。

或者您可能希望创建一个使用GIS功能的交互式应用程序——执行测量、将地图导出为PDF或任何其他功能。这个 qgis.gui 模块提供了各种GUI组件,尤其是地图画布小部件,可以集成到应用程序中,支持缩放、平移和/或任何进一步的自定义地图工具。

必须配置pyqgis自定义应用程序或独立脚本以定位qgis资源,例如投影信息、用于读取矢量和栅格图层的提供程序等。通过在应用程序或脚本的开头添加几行来初始化qgis资源。为自定义应用程序和独立脚本初始化qgis的代码类似。下面提供了每种方法的示例。

注解

not 使用 qgis.py 作为测试脚本的名称,python将无法导入绑定,因为脚本的名称将隐藏绑定。

在独立脚本中使用pyqgis

要启动独立脚本,请在脚本开头初始化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 自定义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安装路径:

  • Linux上: export PYTHONPATH=/<qgispath>/share/qgis/python
  • 在Windows上: set PYTHONPATH=c:\<qgispath>\python
  • 关于MaOS: export PYTHONPATH=/<qgispath>/Contents/Resources/python

Pyqgis模块的路径现在已知,但是它们依赖于 qgis_coreqgis_gui 库(python模块仅用作包装器)。这些库的路径对于操作系统来说通常是未知的,因此您会再次收到导入错误(消息可能因系统而异)::

>>> import qgis.core
ImportError: libqgis_core.so.3.2.0: cannot open shared object file:
  No such file or directory

通过将qgis库所在的目录添加到动态链接器的搜索路径来解决此问题:

  • Linux上: export LD_LIBRARY_PATH=/<qgispath>/lib
  • 在Windows上: set PATH=C:\<qgispath>\bin;C:\<qgispath>\apps\<qgisrelease>\bin;%PATH% 在哪里? <qgisrelease> 应替换为您的目标版本类型(例如, qgis-ltrqgisqgis-dev

这些命令可以放入一个引导脚本中,该脚本将负责启动。使用Pyqgis部署自定义应用程序时,通常有两种可能性:

  • 要求用户在安装应用程序之前在其平台上安装QGIS。应用程序安装程序应查找qgis库的默认位置,如果找不到,则允许用户设置路径。这种方法的优点是更简单,但是它需要用户执行更多的步骤。
  • 将QGIS与应用程序打包在一起。释放应用程序可能更具挑战性,软件包也会更大,但用户将从下载和安装额外软件的负担中解脱出来。

这两种部署模型可以混合使用——在Windows和MacOS上部署独立的应用程序,对于Linux,将QGIS的安装留给用户和他的包管理器。

Pyqt和SIP技术说明

我们已经决定使用Python,因为它是最受欢迎的脚本语言之一。qgis 3中的pyqgis绑定依赖于sip和pyqt5。使用sip而不是更广泛使用的swig的原因是qgis代码依赖于qt库。用于qt(pyqt)的python绑定也使用sip完成,这允许pyqgis与pyqt无缝集成。