重要
翻訳は あなたが参加できる コミュニティの取り組みです。このページは現在 97.56% 翻訳されています。
1. はじめに
この文書は、チュートリアルとリファレンスガイドの両方を意図して書かれています。可能な事例をすべて網羅しているわけではありませんが、主要な機能を概観するには役に立つはずです。
Free Software Foundationにより発行された、GNU Free Documentation License, Version 1.3またはより新しいバージョンの条件の下で、この文書を複製、頒布、改変することが許可されます。ただし、変更不可部分、表紙テキスト、裏表紙テキストは含まれません。
利用許諾契約書の複製は GNUフリー文書利用許諾契約書 のセクションに含まれています。
ライセンスは本ドキュメントにあるすべてのコードとスニペッツにも適用されます。
PythonのサポートはQGIS 0.9で初めて導入されました。デスクトップ版QGISでPythonを利用するのにはいくつかの方法があります(この後のセクションで説明します)。
QGISに付属するPytonコンソールでのコマンドの実行
プラグインの作成と利用
QGIS起動時のPythonコードの自動実行
プロセシングアルゴリズムの作成
QGISの「式」で使用する関数の作成
QGIS APIを利用するカスタムアプリケーションの作成
QGISサーバでもPythonプラグインを含むPythonバインディングが提供されています(参照 QGIS ServerとPython) そしてPythonバインディングを使うことによってPythonアプリケーションにQGSサーバを埋め込むこともできます。
QGISライブラリのクラスのドキュメントである 完全なQGIS C++ API リファレンスがあります。 Python用の QGIS API(pyqgis) はC ++ APIとほぼ同じです。
頻出タスクの実行方法を学習するには、 プラグインのリポジトリ から既存のプラグインをダウンロードして、そのコードを研究するのもよい方法です。
1.1. Pythonコンソールでのスクリプティング
QGIS はスクリプティングのための Python console を内蔵しています。 メニューから開くことができます。
図 1.11 QGIS Python コンソール
上のスクリーンショットは、レイヤリストで現在選択されているレイヤを取得し、その ID を表示し、オプションでベクタレイヤの場合は地物数を表示する方法を示しています。QGIS 環境とのやりとりのために、 QgisInterface のインスタンスである iface 変数があります。このインタフェースにより、地図 キャンバス、メニュー、ツールバー、および QGIS アプリケーションのその他の部分へのアクセスが可能になります。
ユーザーの便宜のために、コンソールの起動時に次のステートメントが実行されます(将来的にはさらに初期コマンドを設定できるようになります)
from qgis.core import *
import qgis.utils
コンソールを頻繁に使用する場合は、コンソールを起動するためのショートカットを設定すると便利な場合があります( 内)
1.2. Python プラグイン
QGISの機能はプラグインを使って拡張することができます。プラグインはPythonで書くことができます。C++プラグインに比較しての主要な利点は配布の単純さ(プラットフォームごとにコンパイルする必要がありません)と開発の容易さです。
様々な機能をカバーする多くのプラグインがPythonサポートが導入されてから書かれました。プラグインのインストーラはPythonプラグインの取得、アップグレード、削除を簡単に行えます。プラグインとプラグイン開発の詳細については、 Pythonプラグイン ページを参照してください。
Pythonでプラグインを作るのはとても簡単です。詳細は Pythonプラグインを開発する を見てください。
注釈
PythonプラグインはQGISサーバーでも使うことができます。より詳しくは QGIS ServerとPython をご覧ください。
1.2.1. プロセシングプラグイン
Processing Plugins can be used to process data. They are easier to develop, more specific and more lightweight than Python Plugins. プロセシングプラグインを書く explains when the use of Processing algorithms is appropriate and how to develop them.
1.3. QGIS起動時にPythonコードを実行する
QGISが起動する度にPythonコードを実行する方法は複数あります。
startup.py スクリプトを作る
既存のPythonファイルを
PYQGIS_STARTUP環境変数に設定する--code init_qgis.pyパラメータを使って起動スクリプトを指定する。
1.3.1. startup.py ファイル
QGISが起動する度、ユーザのPythonホームディレクトリとシステムパスのリストに :file:startup.py を探します。そのファイルがあれば、埋め込みPythonインタプリタを使って実行されます。
通常、ユーザーのホームディレクトリにあるパスは、以下のようになります:
Linux:
.local/share/QGIS/QGIS3Windows:
AppData\Roaming\QGIS\QGIS3macOS:
Library/Application Support/QGIS/QGIS3
デフォルトのシステムパスは、オペレーティングシステムに依存します。自分に合ったパスを見つけるには、Pythonコンソールを開いて QStandardPaths.standardLocations(QStandardPaths.AppDataLocation) を実行すると、デフォルトディレクトリのリストが表示されます。
startup.py スクリプトは、QGISでpythonを初期化した直後、アプリケーション起動の初期に実行されます。
1.3.2. PYQGIS_STARTUP環境変数
既存のPythonファイルのパスを PYQGIS_STARTUP 環境変数に設定すると、QGISの初期化が完了する直前にPythonコードを実行することができます。
This code will run before QGIS initialization is complete. This method is very useful for cleaning sys.path, which may have undesirable paths, or for isolating/loading the initial environment without requiring a virtual environment, e.g. homebrew or MacPorts installs on Mac.
1.3.3. --code パラメータ
QGISの起動パラメータとして実行するカスタムコードを提供することができます。そのためには、例えば qgis_init.py のような Python ファイルを作成し、qgis --code qgis_init.py を用いてコマンドラインから QGIS を実行・起動するようにします。
--code で提供されるコードは、アプリケーションのコンポーネントがロードされた後、QGISの初期化フェーズの後半に実行されます。
1.3.4. Pythonの追加引数
スクリプト --code や実行される他の Python コードに追加の引数を与えるには、 --py-args 引数を使用することができます。--py-args の後で(もしあれば) -- argの前に来る引数は、Pythonに渡されますが、QGISアプリケーション自体では無視されます。
以下の例では、myfile.tif は Python の sys.argv で利用できますが、QGIS では読み込まれません。一方、otherfile.tif はQGISによってロードされますが、sys.argv には存在しません。
qgis --code qgis_init.py --py-args myfile.tif -- otherfile.tif
Pythonから全てのコマンドラインパラメータにアクセスしたい場合は、 QCoreApplication.arguments() を使用することができます。
QgsApplication.instance().arguments()
1.4. Python アプリケーション
多くの場合、プロセスを自動化するためのスクリプトを作成すると便利です。 PyQGISを使用すると、これは完全に可能です--- qgis.core モジュールをインポートし、初期化すると、処理の準備が整います。
または、GIS機能を使用するインタラクティブなアプリケーションを作成することもできます---測定を実行し、地図をPDFとしてエクスポートします...。 qgis.gui モジュールではさまざまなGUIコンポーネントを提供します。特に地図キャンバスウィジェットは、ズーム、パン、その他のカスタムの地図ツールをサポートしてアプリケーションに組み込むことができます。
PyQGISカスタムアプリケーションやスタンドアロンスクリプトは、ベクタレイヤとラスタレイヤを読み取るための投影情報やプロバイダーなどのQGISリソースを見つけるように構成する必要があります。 QGISリソースは、アプリケーションまたはスクリプトの先頭に数行を追加することで初期化されます。カスタムアプリケーションとスタンドアロンスクリプトのQGISを初期化するコードは似ています。それぞれの例を以下に示します。
注釈
スクリプトの名前に qgis.py を使用しないでください。スクリプトの名前が隠すのでPython はバインディングをインポートできなくなります。
1.4.1. スタンドアロンスクリプトでPyQGISを使用する
スタンドアロンスクリプトを始めるには、スクリプトの初めにQGISリソースを初期化します:
1from qgis.core import *
2
3# Supply path to qgis install location
4QgsApplication.setPrefixPath("/path/to/qgis/installation", True)
5
6# Create a reference to the QgsApplication. Setting the
7# second argument to False disables the GUI.
8qgs = QgsApplication([], False)
9
10# Load providers
11qgs.initQgis()
12
13# Write your code here to load some layers, use processing
14# algorithms, etc.
15
16# Finally, exitQgis() is called to remove the
17# provider and layer registries from memory
18qgs.exitQgis()
まず、 qgis.core モジュールをインポートし、プレフィックスパスを設定します。プレフィックスパスは、QGISがシステムにインストールされている場所です。 setPrefixPath() メソッドを呼び出すことでスクリプトで構成されます。 setPrefixPath() の2番目の引数は True に設定されます。これはデフォルトのパスが使用されることを指定しています。
QGISのインストールパスはプラットフォームによって異なります。お手元のシステムに対するインストールパスを見つける最も簡単な方法は、QGIS内から Pythonコンソールでのスクリプティング を使用し、実行からの出力を見ることです:
QgsApplication.prefixPath()
プレフィックスパスを設定した後、 QgsApplication への参照を変数 qgs に保存します。 2番目の引数は False に設定され、スタンドアロンスクリプトを記述しているため、GUIを使用する予定がないことを指定します。 QgsApplication を設定した状態で、 initQgis() メソッドを呼び出してQGISデータプロバイダとレイヤーレジストリをロードします。
qgs.initQgis()
QGISが初期化されたら、残りのスクリプトを書く準備ができています。最後に、 exitQgis() を呼び出して、データプロバイダとレイヤーレジストリをメモリから削除して終了します。
qgs.exitQgis()
1.4.2. カスタムアプリケーションでPyQGISを使用する
スタンドアロンスクリプトでPyQGISを使用する とカスタムPyQGISアプリケーションが違うのは、 QgsApplication <qgis.core.QgsApplication> ` をインスタンス化するときの2番目の引数だけです。 :const:`False の代わりに True を渡して、GUIを使用する予定であることを示します。
1from qgis.core import *
2
3# Supply the path to the qgis install location
4QgsApplication.setPrefixPath("/path/to/qgis/installation", True)
5
6# Create a reference to the QgsApplication.
7# Setting the second argument to True enables the GUI. We need
8# this since this is a custom application.
9
10qgs = QgsApplication([], True)
11
12# load providers
13qgs.initQgis()
14
15# Write your code here to load some layers, use processing
16# algorithms, etc.
17
18# Finally, exitQgis() is called to remove the
19# provider and layer registries from memory
20qgs.exitQgis()
これでQGIS APIを使用して、レイヤをロードして処理を行ったり、マップキャンバスを使用してGUIを起動したりすることができるようになりました。可能性は無限大です:-)
1.4.3. カスタムアプリケーションを実行する
QGISライブラリと適切な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
macOSでは: export PYTHONPATH=/<qgispath>/Contents/Resources/python
これで、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ライブラリが存在するディレクトリを追加することで修正します:
Linuxでは: export LD_LIBRARY_PATH=/<qgispath>/lib
Windowsでは: set PATH=C:\<qgispath>\bin;C:\<qgispath>\apps\<qgisrelease>\bin;%PATH%
<qgisrelease>はターゲットにしているリリースのタイプで置き換えてください(例qgis-ltr,qgis,qgis-dev)
これらのコマンドはブートストラップスクリプトに入れておくことができます。PyQGISを使ったカスタムアプリケーションを配布するには、これらの二つの方法が可能でしょう:
アプリケーションをインストールする前に、ユーザーにQGISをインストールするように要求します。アプリケーションインストーラーはQGISライブラリのデフォルトの場所を探し、見つからない場合はユーザーがパスを設定できるようにする必要があります。このアプローチには、より単純であるという利点がありますが、ユーザーはより多くの手順を実行する必要があります。
アプリケーションと一緒にQGISのパッケージを配布する方法です。アプリケーションのリリースにはいろいろやることがあるし、パッケージも大きくなりますが、ユーザーが追加ソフトウェアをダウンロードしてインストールするという負荷を避けられるでしょう。
2つの展開モデルを混在させることができます。 WindowsとmacOSでスタンドアロンアプリケーションを提供できますが、Linuxの場合、GISのインストールはユーザーとそのパッケージマネージャに任せます。
1.5. PYQtとSIPの技術メモ
Pythonが選ばれたのは、それがスクリプト作成に最も好まれる言語の1つであるためです。 QGIS 3のPyQGISバインディングは、SIPとPyQt5に依存しています。より広く使用されているSWIGの代わりにSIPを使用する理由は、QGISコードがQtライブラリに依存しているためです。 Qt (PyQt)のPythonバインディングはSIPを使用して行われ、これによりPyQGISとPyQtのシームレスな統合が可能になります。