このドキュメントはチュートリアルとリファレンスガイドの両方の役割を意図して書かれています。すべてのユースケースを満たしてはいませんが、主要な機能の良い概要となるでしょう。
0.9リリースからQGISはPythonを使ったスクリプト処理をサポートしました。Pythonはスクリプト処理でもっとも好まれている言語の一つだと思います。PyQGISバインディングはSIPとPyQt4に依存しています。これはSIPはSWIGの代わりに広く使われていて、QGISのコードはQtライブラリに依存しています。QtのPythonバインディング(PyQt)もSIPを使っていて、これによりPyQtによるPyQGISの実装がシームレスに実現しています。
PyQGISが動かせるまで(マニュアルの補完、トラブルシューティング)
QGIS python バインディングを使う方法はいくつかあり、ここでは次の内容をカバーします:
QGIS の中の Python コンソールのコマンドについて
Pythonでプラグインを作り、使う方法
QGIS APIベースのカスタムアプリケーションの作成
QGIS ライブラリのクラスのドキュメントは`完全な QGIS API <http://doc.qgis.org/>`_ のリファレンスにあります。PythonのQGIS APIは C++ のAPIとほぼ同じです。
QGIS blog にPyQGIS を使ったプログラミングのいくつかのリソースがあります。Python 版 QGIS チュートリアル にいくつかサードパーティアプリのサンプルを見つけることができます。プラグインを取り扱うのに良いリソースは、いくつかのプラグインを プラグインレポジトリ からダウンロードして、それらのソースコードを参考にすることです。また、インストールした QGIS の python/plugins/ フォルダに含まれるいくつかのプラグインもプラグインの開発方法や多くの共通のタスクがどのように動作するのかを学ぶのに使うことができます。
スクリプト処理をする上で、(QGISに)統合されているPython コンソールから多くの利点を得られるでしょう。これはメニューの :menuselection:`プラグイン –> Pythonコンソール`から開くことができます。コンソールはモーダルではないユーティリティウィンドウに開きます:
上記のスクリーンショットはレイヤーのリストから現在選択中のレイヤーを取得して、IDや他の情報を表示してるところを見せていて、もしベクターレイヤーであれば、フューチャーの数を表示することができます。QGIS環境とやりとりするには QgisInterface のインスタンスである qgis.utils.iface 変数を使います。このインターフェイスはマップキャンバス、メニュー、ツールバーやその他のQGISアプリケーションのパーツにアクセスすることができます。
利便性を上げるためには、コンソールがスタートしたときに次の命令を入力してください(将来的には初期実行されるコマンドになるかもしれません):
from qgis.core import *
import qgis.utils
このコンソールをたびたび使うなら、ショートカットを設定しておくとよいでしょう(メニューの 設定 ‣ ショートカットの構成... から行えます)
QGIS はプラグインによる機能拡張が可能です。元々はC++でのみ可能でした。QGISにPythonサポートを追加したことで、Pythonでもプラグインを書く事ができるようになりました。C++プラグインよりもよりよい利点は簡単な配布(プラットフォームごとのコンパイルする必要がありません)ができ、また簡単に開発ができます。
様々な機能をカバーする多くのプラグインはPythonサポートが導入されてから書かれました。プラグインのインストーラはPythonプラグインの取得、アップグレード、削除を簡単に行えます。様々なプラグインのソースが `Python Plugin Repositories <http://www.qgis.org/wiki/Python_Plugin_Repositories>`_から見つけることができます。
Pythonでプラグインを作るのはとても簡単です。詳細は:ref:`plugins`を見てください。
GISデータを処理するときは、繰り返し同じタスクを実行するのに簡単なスクリプトを書いて自動化することがたびたびあります。PyQGISなら完璧に行えます — qgis.core モジュールを import すれば、初期化が行われて処理を行う準備が完了します。
もしくはいくつかのGISの機能 — いくつかのデータの距離を測ったり、地図をPDFに変換したり、または他の機能など – を使ったインタラクティブなアプリケーションを作りたいのかもしれません。 qgis.gui モジュールは様々なGUIコンポーネントを追加することができ、とりわけマップキャンバスのwidgetはズームやパンや他のマップを制御するツールと一緒にアプリケーションに簡単に組み込むことができます。
注意: qgis.py という名前をあなたのテストスクリプトで*使わないでください* — このスクリプトの名前がバインディングを隠蔽してしまってpythonでimportできなくなるでしょう。
まずはじめに、qgisモジュールをimportする必要があります。リソース - プロジェクションのデータベースやプロバイダなど — を読み込めるようにQGISのパスを通します。もし set prefix path の2つ目の引数に True をセットしたら、QGISは prefix ディレクトリの下の全てのパスを初期化するでしょう。 initQgis() 関数を呼ぶことは QGIS が存在するプロバイダを探すのにとても重要な事です。
from qgis.core import *
# supply path to where is your qgis installed
QgsApplication.setPrefixPath("/path/to/qgis/installation", True)
# load providers
QgsApplication.initQgis()
これでQGIS API — レイヤーを読み込んだり、処理を行ったり、マップキャンバスと共にGUIを起動したり - を動かす事ができます。可能性は無限です :-)
QGISライブラリを使い終わったら、 exitQgis() を呼んで全て終了 (例えばマップレイヤのレジストリをクリアにしてレイヤーを削除したり) することができます。
QgsApplication.exitQgis()
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
これでPyQGISモジュールのパスがわかるようになりました。一方これらは qgis_core と ``qgis_gui``ライブラリに依存します(Pythonライブラリはラッパーとして振る舞うだけです)。これらのライブラリのパスがOSで読み込めないものであれば、またもやimportエラーが発生するでしょう(このメッセージはシステムにかなり依存していることを示します):
>>> import qgis.core
ImportError: libqgis_core.so.1.5.0: cannot open shared object file: No such file or directory
これを修正するにはQGISライブラリが存在するディレクトリを動的リンカのパスに追加するをします:
Linuxでは: export LD_LIBRARY_PATH=/qgispath/lib
Windowsでは: set PATH=C:\qgispath;%PATH%
これらのコマンドはブートストラップスクリプトに入れておくことができます。PyQGISを使ったカスタムアプリケーションを配布するには、これらの二つの方法が可能でしょう:
QGISを対象となるプラットフォームにインストールするのをユーザに要求します。アプリケーションのインストーラはQGISライブラリの標準的な場所を探すことができ、もし見つからなければユーザがパスをセットできるようにします。この手段はシンプルである利点がありますが、しかしながらユーザに多くの手順を要求します。
アプリケーションと一緒にQGISのパッケージを配布する方法です。アプリケーションのリリースにはいろいろやることがあるし、パッケージも大きくなりますが、ユーザを追加ソフトウェアをダウンロードをしてインストールする負荷から避けられるでしょう。
これらのモデルは組み合わせることができます - Windows と Mac OS Xではスタンドアローンアプリケーションとして配布をして、LinuxではQGISのインストールをユーザとユーザが使っているパッケージマネージャに任せるとか。