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

ヒント

pyqgisコンソールを使わない場合、このページにあるコードスニペットは次のインポートが必要です:

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

プラグインや、スタンドアローンの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. フラグで速度を向上させる

完全に機能するプロジェクトを使う必要はなく、特定の理由でのみアクセスしたい場合、フラグを使うと便利な場合があります。フラグの完全なリストは ProjectReadFlag の下にあります。複数のフラグを一緒に追加することができます。

例として、実際のレイヤやデータを気にせず、単にプロジェクトにアクセスしたい場合(例 レイアウトや3Dビューの設定など)、DontResolveLayers フラグを使ってデータ検証ステップをバイパスし、不良レイヤダイアログが表示されないようにすることができます。次のようにすることができます:

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

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