跳转至

本节的代码片段需要导入以下模块:

1
2
3
4
5
6
7
8
9
from qgis.core import (
    Qgis,
    QgsProject,
    QgsPathResolver
)

from qgis.gui import (
    QgsLayerTreeMapCanvasBridge,
)

2 加载项目⚓︎

有时你需要从插件加载现有项目,或者(更常见)在开发独立的QGIS Python应用程序时加载(请参阅:Python应用程序)。

将项目加载到当前QGIS应用程序中,需要创建QgsProject类的实例。这是一个单例类,因此你必须使用其instance()方法来执行此操作。你可以调用read()方法,传递加载项目的路径:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 如果你不在QGIS控制台内运行,首先需要导入qgis和PyQt类,如下所示:
from qgis.core import QgsProject
# 获取项目实例
project = QgsProject.instance()
# 打印当前项目的文件名(可能为空,因为没有项目加载)
# print(project.fileName())

# 加载另一个项目
project.read('testdata/01_project.qgs')
print(project.fileName())
# testdata/01_project.qgs

如果你需要对项目进行修改(例如添加或删除某些图层)并保存更改,调用write()方法。该方法还支持将项目保存到新的位置:

1
2
3
4
# 将项目保存到同一个文件
project.write()
# ...或新文件
project.write('testdata/my_new_qgis_project.qgs')

read()write()函数都返回一个布尔值,你可以使用它来检查操作是否成功。

提示

如果你正在编写QGIS独立应用程序,为了将加载的项目与画布同步,你需要实例化QgsLayerTreeMapCanvasBridge,如下所示:

1
2
3
bridge = QgsLayerTreeMapCanvasBridge(QgsProject.instance().layerTreeRoot(), canvas)
# 现在你可以安全地加载项目,并在画布上看到它
project.read('testdata/my_new_qgis_project.qgs')

2.1 解决错误路径⚓︎

在项目中加载的图层可能被移动到另一个位置。当项目再次加载时,所有的图层路径都被破坏。QgsPathResolver类帮助你在项目中重写图层路径。

setPathPreprocessor()方法允许设置一个自定义的路径预处理函数,它允许在将路径和数据源解析为文件引用或图层源之前对它们进行操作。

该处理函数必须接受一个单一的字符串参数(代表原始文件路径或数据源),并返回该路径的处理版本。

路径预处理器函数在任何错误图层处理程序之前被调用。如果设置了多个预处理器,将根据最初设置的顺序依次调用它们。

一些应用案例:

  1. 替换过时的路径:
1
2
3
4
def my_processor(path):
    return path.replace('c:/Users/ClintBarton/Documents/Projects', 'x:/Projects/')

QgsPathResolver.setPathPreprocessor(my_processor)
  1. 用一个新的数据库主机地址来替换:
1
2
3
4
def my_processor(path):
    return path.replace('host=10.1.1.115', 'host=10.1.1.116')

QgsPathResolver.setPathPreprocessor(my_processor)
  1. 替换新的数据库证书:
1
2
3
4
5
6
def my_processor(path):
    path= path.replace("user='gis_team'", "user='team_awesome'")
    path = path.replace("password='cats'", "password='g7as!m*'")
    return path

QgsPathResolver.setPathPreprocessor(my_processor)

同样,路径编写器函数也可以使用setPathWriter()方法。

使用变量替换路径的示例:

1
2
3
4
def my_processor(path):
  return path.replace('c:/Users/ClintBarton/Documents/Projects', '$projectdir$')

QgsPathResolver.setPathWriter(my_processor)

这两种方法都返回一个id,可用于删除它们添加的预处理器或写入程序。查看removePathPreprocessor()removePathWriter()

2.2 使用标识符⚓︎

在某些情况下,你可能不需要使用功能齐全的项目,而只是出于特定原因想要访问它,标识可能会有所帮助。完整的标识列表可在ProjectReadFlag下找到。可以将多个标志添加在一起。

例如,如果我们不关心实际的图层和数据,而只是想访问项目(例如布局或3D视图设置),则可以使用DontResolveLayers标识绕过数据验证步骤并防止出现无效图层对话框。可以执行以下操作:

1
2
3
4
readflags = Qgis.ProjectReadFlags()
readflags |= Qgis.ProjectReadFlag.DontResolveLayers
project = QgsProject().instance()
project.read('C:/Users/ClintBarton/Documents/Projects/mysweetproject.qgs', readflags)

添加更多标志,必须使用 python 按位或运算符 (|)。