2. プロジェクトをロードする

ヒント

pyqgisコンソールの外部にいる場合、このページのコードスニペットでは以下のインポートが必要になります:

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

プラグインや、スタンドアローンのQGIS Pythonアプリケーションから、既存のプロジェクトをロードする必要のあることがあります(参照: Python アプリケーション )。

プロジェクトを現在のQGISアプリケーションにロードするには、 QgsProject クラスのインスタンスを作成する必要があります。これはシングルトンクラスなので、それを行うには instance() メソッドを使わなければなりません。 read() メソッドを呼び出して、読み込むプロジェクトのパスを渡すことができます。

 1# If you are not inside a QGIS console you first need to import
 2# qgis and PyQt classes you will use in this script as shown below:
 3from qgis.core import QgsProject
 4# Get the project instance
 5project = QgsProject.instance()
 6# Print the current project file name (might be empty in case no projects have been loaded)
 7# print(project.fileName())
 8
 9# Load another project
10project.read('testdata/01_project.qgs')
11print(project.fileName())
testdata/01_project.qgs

プロジェクトに変更(たとえばレイヤの追加や削除)を加え、その変更を保存する必要がある場合は、プロジェクトインスタンスの write() メソッドを呼び出します。 write() メソッドにパスを指定すれば、プロジェクトを新しい場所に保存することもできます。

# Save the project to the same
project.write()
# ... or to a new file
project.write('testdata/my_new_qgis_project.qgs')

read()write() の両方の関数は操作が成功したかどうかをチェックするために使用できるブール値を返します。

注釈

QGISスタンドアロンアプリケーションを作成している場合は、ロードされたプロジェクトをキャンバスと同期させるために、 QgsLayerTreeMapCanvasBridge を以下の例のようにインスタンス化する必要があります:

bridge = QgsLayerTreeMapCanvasBridge( \
         QgsProject.instance().layerTreeRoot(), canvas)
# Now you can safely load your project and see it in the canvas
project.read('testdata/my_new_qgis_project.qgs')

2.1. 正しくないパスを解決する

プロジェクトにロードされたレイヤが別の場所に移動されることがあります。プロジェクトが再びロードされたとき、全てのレイヤのパスが壊れてしまいます。QgsPathResolver クラスは、プロジェクト内のレイヤパスを書き換える手助けをします。

setPathPreprocessor() メソッドは、ファイル参照やレイヤソースのパスやデータソースを解決する前にそれを操作する、カスタムパスプリプロセッサ関数を設定することを可能にします。

プロセッサ関数は、1つの文字列引数(元のファイルパスまたはデータソースを表す)を受け取り、このパスの処理済みバージョンを返します。パスプリプロセッサ関数は、不正レイヤハンドラの 前に 呼ばれます。複数のプリプロセッサが設定されている場合、それらは最初に設定された順序に基づいて順番に呼び出されます。

使用例:

  1. 旧パスを置き換え:

    def my_processor(path):
        return path.replace('c:/Users/ClintBarton/Documents/Projects', 'x:/Projects/')
    
    QgsPathResolver.setPathPreprocessor(my_processor)
    
  2. データベースのホストアドレスを新しいもので置き換え:

    def my_processor(path):
        return path.replace('host=10.1.1.115', 'host=10.1.1.116')
    
    QgsPathResolver.setPathPreprocessor(my_processor)
    
  3. 保存されているデータベースのクレデンシャルを新しいものに置き換え:

    1def my_processor(path):
    2    path= path.replace("user='gis_team'", "user='team_awesome'")
    3    path = path.replace("password='cats'", "password='g7as!m*'")
    4    return path
    5
    6QgsPathResolver.setPathPreprocessor(my_processor)
    

同様に、パスライタ機能として setPathWriter() メソッドが利用可能です。

パスを変数で置き換える例:

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

QgsPathResolver.setPathWriter(my_processor)

どちらのメソッドも id を返し、追加されたプリプロセッサやライタを削除するために使うことができます。removePathPreprocessor()removePathWriter() を参照してください。

2.2. フラグで速度を向上させる

In some instances where you may not need to use a fully functional project, but only want to access it for a specific reason, flags may be helpful. A full list of flags is available under ReadFlag. Multiple flags can be added together.

例として、実際のレイヤやデータには興味がなく、単にプロジェクトにアクセスしたい場合(例えばレイアウトや3Dビューの設定など)、FlagDontResolveLayers を使ってデータ検証のステップをバイパスし、不正レイヤダイアログが表示されないようにできます。以下のようにすることができます:

readflags = QgsProject.ReadFlags()
readflags |= QgsProject.FlagDontResolveLayers
project = QgsProject()
project.read('C:/Users/ClintBarton/Documents/Projects/mysweetproject.qgs', readflags)

さらにフラグを追加するには、PythonのBitwise OR演算子(|)を使用する必要があります。