コンテンツへスキップ
QGIS
チュートリアル

PyQGISとは?QGISをPythonで自動化する方法

公開日

PyQGISとは、PythonコードでQGISを操作するための仕組みです。QGISでクリックして行える操作は、レイヤの読み込み、ツールの実行、スタイルの変更、地図のエクスポートなど、数行のPythonでも書けます。100個のファイルに同じ処理をかけるときも、100回クリックする必要はありません。PyQGISはQGISに最初から入っているので、追加でインストールするものはありません。

バリ島デンパサール中心部の地図の下にPythonコンソールを開いたQGIS。右側のエディタには、学校を再投影し、周囲100mのバッファを作成して、その内側の建物を選択するschool_zones.pyというスクリプトが入っている。左側の出力は「864 of 7015 buildings are within 100 m of a school」に続けて、yes 818、school 19、commercial 15、college 5。地図では学校のバッファが青い円、選択された建物がオレンジ色で表示されている。
QGISのPythonコンソール。このスクリプトは、学校から100m以内にある建物を見つけます。デンパサール中心部では7,015棟中864棟でした。

PyQGIS Developer Cookbookによると、PyQGISのPythonツールはQGIS本体の開発に使われているものとほぼ同じなので、できることはほとんど何でもあります。QGISのプラグインの多くは、当社のものも含めて、PyQGISで書かれています。

自分でコードを書く必要も、いまはなくなりつつあります。チャットボットにコードの下書きを頼めますし、エージェントならコードそのものを省けます。当社が開発しているのがAI Agentです。この記事の後半で、同じ6つのタスクを使って両方を試します。

PyQGISを実行できる場所

実行できる場所は4つあり、向いている作業がそれぞれ違います。

場所開き方向いている用途
Pythonコンソール「プラグイン」→「Pythonコンソール」(Ctrl+Alt+P)開いているプロジェクトに対する手早い修正
プロセシングスクリプト「プロセシングツールボックス」→「スクリプト」→「テンプレートから新規スクリプトを作成」独自の入力を持つ再利用可能なツール。ツールボックスの標準ツールと同じように使えます
プラグインQGISプロファイル内のフォルダ専用のボタンを持ち、他の人と共有できるツール
スタンドアロンスクリプト通常のPython、またはqgis_processコマンドサーバーなど、QGISのウィンドウなしで動かす処理

コンソールでは、QGISのウィンドウを操作するオブジェクトifaceが使えます。QGISの外には存在しないため、NameError: name 'iface' is not definedはGIS Stack ExchangeでPyQGISに関して特によく見かける質問の1つです。

プロセシングスクリプトは、QGISが用意するテンプレートから始めます。入力と、処理を行う数行を書き換えるだけで、標準ツールと同じようにツールボックスに表示されます。

QGISのプロセシングスクリプトエディタに表示されたテンプレートの冒頭。ベクタレイヤを受け取って同じレイヤを作成することを説明するコメント付きのExampleProcessingAlgorithmというクラスがあり、定数INPUTとOUTPUT、myscriptを返すnameメソッドが並んでいる。
「テンプレートから新規スクリプトを作成」を選ぶと、動作する例が開きます。

最初のPyQGISスクリプト

Pythonコンソールを開いて「エディタを表示」をクリックし、レイヤパネルで建物のレイヤを選択してから、次のコードを貼り付けます。建物の種類ごとに件数を数えます。

from collections import Counter

layer = iface.activeLayer()  # the layer selected in the Layers panel
counts = Counter(f["building"] for f in layer.getFeatures())

for kind, n in counts.most_common(5):
    print(kind, n)
print("Total:", layer.featureCount(), "features in", layer.crs().authid())

主に使うオブジェクトは3つです。QgsProject.instance()がプロジェクト、QgsVectorLayerとQgsRasterLayerがそのレイヤ、ifaceがウィンドウです。すべてのクラスはAPIリファレンスに載っています。

PythonからQGISのツールを実行する

プロセシングツールボックスのツールは、どれもprocessing.run()の1行でPythonから実行できます。設定項目もツールのウィンドウと同じです。

import processing

result = processing.run("native:buffer", {
    "INPUT": "buildings.gpkg",
    "DISTANCE": 50,
    "OUTPUT": "buffered.gpkg",
})

設定項目の名前を推測する必要はありません。まずツールのウィンドウで一度設定を入力し、下部の「高度」→「Pythonコマンドとしてコピー」を選びます。スクリプトにそのまま貼り付けられる正確な1行が得られます。

ポリゴンにkelurahan、ポイントにschoolsを指定したQGISの「ポリゴン内のポイント数」ツールのウィンドウ。下部の「高度」メニューが開き、「Pythonコマンドとしてコピー」が選択されている。その下に「qgis_processコマンドとしてコピー」「JSONとしてコピー」「設定を貼り付け」が並んでいる。
「Pythonコマンドとしてコピー」を使うと、手作業で設定したツールがそのままコードの1行になります。

同じツールは、QGISを開かずにターミナルからqgis_process run native:bufferで実行することもできます。サーバーで定期実行するときはこの方法を使います。

QGIS 4でPyQGISはどう変わったか

2026年3月6日にリリースされたQGIS 4.0は、ウィンドウやボタンの土台となるツールキット、Qtの新しいバージョンに移行しました。QGISの関数はほとんど変わっていません。動かなくなるのはQtを直接扱うコードで、原因の大半は次の3つの変更です。

QGIS 3QGIS 4
Qt.AlignLeftのような短い名前Qt.AlignmentFlag.AlignLeftのような完全な名前
QRegExpQRegularExpression
ダイアログのexec_()exec()

QGISには、これらの大半を自動で書き換えるpyqt5_to_pyqt6.pyというスクリプトが付属しており、残りはpyqgis4-checkerで見つけられます。QGISのツールとprocessing.run()だけを使うスクリプトは、たいていそのまま動きます。

ChatGPTやClaudeにPyQGISを書かせられるか

プロジェクトの情報を伝えれば、たいていは書けます。ChatGPTのようなチャットボットであるClaude Sonnetで試したところ、6つのタスクすべてでエラーなく実行できました。レイヤ、フィールド、ファイルパスを説明したときは、6つとも結果が正しいものでした。レイヤ名だけを伝えたときは、6つのうち1つが気づかないうちに誤っていました。スクリプトは動き、警告も出ないまま、標高地図の936ピクセル中396ピクセルを、存在しない高さ0mで埋めていたのです。

エラーなく実行正しい結果
チャットボット、プロンプトでプロジェクトを説明6/66/6
チャットボット、レイヤ名のみ6/65/6
QGIS内のAIエージェント、タスクの1文のみ6/66/6

ここから分かることは単純です。チャットボットにはプロジェクトの中身が見えないため、コードの質は説明の質に左右され、誤った結果が正しい結果とまったく同じに見えることがあります。QGIS 4にも落とし穴がありました。チャットボットが書いた印刷レイアウトのスクリプト2本は、どちらも上の表にある短いQt名を使っていて、QGIS 4では途中で止まります。

検証方法:2026年9月26日、QGIS 3.44.7で、バリ島デンパサール中心部の地図データを使いました。建物の集計から印刷レイアウトのエクスポートまで日常的な6つのタスクを、1回ずつ試しています。結果が正しいとみなしたのは、実行前に書いておいた別の検証スクリプトに合格した場合だけです。6タスクは小さなサンプルです。

コードを書かない方法:手順を実行するエージェント

ここからは、当社のプラグインAI Agentの話です。QGIS内のチャットパネルにタスクを入力すると、プロジェクトを読み取り、ツールを実行して、結果を確認します。貼り付けるコードも、プロジェクトの説明も要りません。

同じ6つのタスク文を、プロジェクトの説明なしで渡しました。6つすべて正解で、1タスクあたり6.4秒から42.8秒、6つ合計で148.8秒でした。ファイルを書き込む前の確認で2回止まり、「許可」をクリックしています。チャットボットがつまずいた標高のタスクでは、先にレイヤを読み取り、空のピクセルを正しく設定しました。

右側にAI Agentパネルを開いたQGIS。buildingフィールドで建物レイヤを色分けするよう依頼している。commercialは赤、schoolは青、hotelは緑、houseは紫、それ以外の値は薄いグレー。エージェントは建物のスタイルを設定し、各カテゴリを確認したと返答している。デンパサールの地図では、グレーの建物の中に赤い商業施設、緑のホテル、紫の住宅が見え、レイヤパネルには5つのカテゴリが並んでいる。
1文で、建物が種類別に色分けされます。読むコードも貼り付けるコードもありません。

無料の方法も十分に使えます。コンソール、「Pythonコマンドとしてコピー」、チャットボットを組み合わせれば、結果を確認する限り、かなり遠くまで行けます。やりたいことを文章で伝えてレイヤを受け取りたいなら、エージェントが手順を代わりに実行します。

QGISでAI Agentを無料で試す(カード不要)

つまずきやすいポイント

YouTubeのQGISチュートリアルに寄せられた質問を数えました。コメントのある1,692本の動画のうち、245本の動画に寄せられた391件のコメントが、Pythonや自動化についての質問でした。同じ3つの問題が繰り返し出てきます。

  • レイヤが見つからない:mapLayersByName("roads")は、名前が1文字、あるいはスペース1つ違うだけで何も見つけられません。
  • 距離が度単位になる:EPSG:4326のレイヤに50mのバッファを作ると、この座標系は度で数えるため、50度のバッファになります。先に再投影してください。方法はCRSとはで解説しています。
  • QGISの外でのiface:ウィンドウの外で動かすスクリプトにはifaceがありません。代わりにQgsProjectとprocessing.run()を使います。

この記事のまとめ

PyQGISは、QGISのPythonインターフェースです。Pythonコンソール、プロセシングスクリプト、プラグインのほか、qgis_processを使えばQGISの外でも動きます。

processing.run()を使うと、QGISのツールをコードから実行できます。ツールのウィンドウから「Pythonコマンドとしてコピー」を選べば、正確な1行が手に入ります。

QGIS 4では、Qt.AlignLeftなど一部のQt名が変わりました。独自のウィンドウを作るコードは、小さな修正が必要になることがあります。

6タスクの検証では、チャットボットのコードは常に実行できたものの、プロジェクトを説明しなかったときは1回誤りました。QGIS内で動くAI Agentのようなエージェントは、タスクの1文だけで6つすべて正解でした。

よくある質問

PyQGISは何に使いますか?

PythonでQGISを自動化するために使います。レイヤの読み込みと編集、多数のファイルへのツール実行、地図のスタイル設定、印刷レイアウトの作成、他の人も使えるプラグインやスクリプトの作成などです。QGISのウィンドウの外でも動くので、サーバー上の処理にも使えます。

PyQGISとPythonは同じですか?

PyQGISは、Pythonから使うQGISの機能群です。書くのは普通のPythonで、PyQGISがQgsVectorLayerやprocessing.run()などを追加します。QGISに付属していて、QGISがインストールするPythonを使います。

QGISでPythonコンソールを開くにはどうしますか?

「プラグイン」→「Pythonコンソール」、またはCtrl+Alt+Pです。長いスクリプトは「エディタを表示」をクリックして書き、.pyファイルとして保存し、緑の矢印で実行します。

QGIS 4でもPyQGISのスクリプトは動きますか?

QGISのツールとprocessing.run()だけを使うスクリプトは、たいてい動きます。独自のウィンドウを作るスクリプトは、Qt.AlignLeftの代わりにQt.AlignmentFlag.AlignLeftと書くなど、小さな修正が必要になることが多いです。公式のpyqt5_to_pyqt6.pyスクリプトで、大半を修正できます。

PythonなしでQGISを自動化できますか?

できます。グラフィカルモデラーを使えばツールを視覚的につなげられますし、バッチ処理ならツール1つを多数のファイルに実行できます。AIエージェントのプラグインなら、さらに進んで、やりたいことを普通の言葉で入力するだけで、プロジェクト内でツールを実行してくれます。当社のAI Agentには無料プランがあります。

さらに詳しく知りたい方へ。QGISのAIエージェントとはでは、エージェントの仕組みと選び方を解説しています。AI Agentは無料で試せます。CRSとはでは、多くのスクリプトが最初に必要とする再投影を扱っています。Claude CodeやCursorを使う方は、QGIS MCPとはで別の方法を紹介しています。

関連記事

2つに分割された1947年のUSGSサンフランシスコ地形図。左は普通のスキャン、右は同じ地図をジオレファレンスしてOpenStreetMapに重ねたもので、ベイブリッジが地図の端を越えて続いており、Georeferencing in QGISというタイトルが付いている。
AI AgentQGISチュートリアル

QGISで地図や画像をジオレファレンスする方法

まず Layer > ジオレファレンサーを開いてコントロールポイントをいくつか正確に配置し、変換方式には多項式1、座標参照系には投影CRSを選択します。すべての設定が終わったら、RMSE をメートル単位で読み取り、精度をしっかりと確認しましょう。この手順は、1947年のUSGS地図を使って実際に検証したものです。

Yvann BarbotYvann Barbot
·
ブラジル・クリスタリナ近郊のセンターピボット農場。2026年7月7日のSentinel-2画像を左右に分割し、左がトゥルーカラー、右が赤から緑のNDVI。タイトルはSentinel-2 in QGIS。
AI AgentQGISチュートリアル

QGISでSentinel-2画像をダウンロードする方法

アカウント登録なしでSentinel-2のデータをSTAC経由でQGISに直接ストリーミングする方法、またはCopernicus BrowserからL2Aプロダクトをダウンロードする手順をわかりやすく解説。バンドの選択、雲のマスク、NDVIの計算をブラジルの実データで検証したQGISハウツー記事。

Yvann BarbotYvann Barbot
·
ケニア、Kisumu中心部を二分割:左がOpenStreetMapベースマップ、右が同じ街路を読み込んだデータで、4,572棟の建物をフットプリント面積で色分けし、128本の主要道路を暗い背景に表示している。
AI AgentQGISチュートリアル

QGISでOpenStreetMapデータをダウンロードする方法

QGISでのデータ入手方法を実務目線で解説します。町のデータならQuickOSM、国単位ならGeofabrikの.pbf、カスタムクエリならOverpass Turboを使います。Kisumuで実際に試した手順をもとに、つまずきやすいタイムアウト設定やODbLのクレジット表記まで、順を追ってわかりやすくまとめました。

Yvann BarbotYvann Barbot
·