QGISプラグイン開発入門

QGISプラグインを自作すれば、業務に最適化したツールが作れます。

QGISプラグイン開発入門【基礎編】

この記事では、QGISプラグイン開発の基礎を解説します。

プラグインとは

QGISプラグインの概要

QGISプラグインは、Pythonで書かれた拡張機能です。

できること

  • カスタム処理ツールの追加
  • 新しいUI(ダイアログ)の作成
  • 外部サービスとの連携
  • 業務特化の機能実装

既存プラグインの例

プラグイン 機能
QuickMapServices 背景地図の簡単追加
qgis2web Webマップ出力
Profile tool 縦断面図作成
Semi-Automatic Classification 衛星画像分類

開発環境の準備

必要なもの

必要なもの

  • QGIS(開発対象バージョン)
  • テキストエディタ(VS Code推奨)
  • Qt Designer(UI作成用、QGISに同梱)
  • Python基礎知識

VS Codeの設定

おすすめ拡張機能

  • Python(Microsoft)
  • Qt for Python

プラグインフォルダの場所

Windows
C:\Users\{ユーザー名}\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins

Mac
/Users/{ユーザー名}/Library/Application Support/QGIS/QGIS3/profiles/default/python/plugins

プラグインの構成

最小構成

my_plugin/
├── __init__.py          # プラグイン初期化
├── my_plugin.py         # メイン処理
├── metadata.txt         # プラグイン情報
└── icon.png             # アイコン(オプション)

一般的な構成

my_plugin/
├── __init__.py          # プラグイン初期化
├── my_plugin.py         # メインクラス
├── my_plugin_dialog.py  # ダイアログクラス
├── my_plugin_dialog_base.ui  # UI定義(Qt Designer)
├── metadata.txt         # プラグイン情報
├── icon.png             # アイコン
├── resources.qrc        # リソースファイル
└── resources.py         # コンパイル済みリソース

metadata.txt

ini
[general]
name=My Plugin
description=プラグインの説明
version=1.0.0
qgisMinimumVersion=3.0
author=作者名
email=email@example.com
homepage=https://example.com
repository=https://github.com/example/my_plugin
tracker=https://github.com/example/my_plugin/issues
category=Plugins

Plugin Builderで雛形作成

インストール

プラグイン → プラグインの管理とインストール
→ 「Plugin Builder」を検索
→ インストール

雛形の作成

手順

  • プラグイン → Plugin Builder → Plugin Builder
  • 基本情報を入力(Class name, Plugin name, Description, Module name, Version, Author, Email)
  • テンプレートを選択:Tool button with dialog
  • 出力先を指定
  • Generate

生成後の作業

手順

  • 生成されたフォルダをプラグインフォルダにコピー
  • QGISを再起動
  • プラグイン → プラグインの管理とインストール → 「インストール済み」タブ → プラグインにチェックを入れて有効化

基本的なプラグインの作成

最小限のプラグイン

__init__.py:

python
def classFactory(iface):
    from .my_plugin import MyPlugin
    return MyPlugin(iface)

my_plugin.py:

python
from qgis.PyQt.QtWidgets import QAction, QMessageBox
from qgis.core import QgsProject

class MyPlugin:
    def __init__(self, iface):
        self.iface = iface
        self.action = None

    def initGui(self):
        # メニューにアクションを追加
        self.action = QAction("My Plugin", self.iface.mainWindow())
        self.action.triggered.connect(self.run)
        self.iface.addToolBarIcon(self.action)
        self.iface.addPluginToMenu("My Plugin", self.action)

    def unload(self):
        # プラグイン削除時の処理
        self.iface.removeToolBarIcon(self.action)
        self.iface.removePluginMenu("My Plugin", self.action)

    def run(self):
        # メイン処理
        layer = self.iface.activeLayer()
        if layer:
            count = layer.featureCount()
            QMessageBox.information(
                None,
                "結果",
                f"レイヤ '{layer.name()}' のフィーチャ数: {count}"
            )
        else:
            QMessageBox.warning(
                None,
                "警告",
                "レイヤが選択されていません"
            )

metadata.txt:

ini
[general]
name=My Plugin
description=フィーチャ数を表示する簡単なプラグイン
version=0.1
qgisMinimumVersion=3.0
author=作者名
email=email@example.com

ダイアログ付きプラグイン

UIファイル(Qt Designer)の作成:

1. Qt Designerを起動
   Windows: C:\Program Files\QGIS 3.x\apps\Qt5\bin\designer.exe

2. 「Dialog with Buttons Bottom」を選択

3. ウィジェットを配置:
   - QLineEdit(入力欄)
   - QLabel(ラベル)
   - QPushButton(ボタン)

4. 保存(.ui形式)

ダイアログクラス:

python
from qgis.PyQt import uic
from qgis.PyQt.QtWidgets import QDialog
import os

# UIファイルを読み込み
FORM_CLASS, _ = uic.loadUiType(os.path.join(
    os.path.dirname(__file__), 'my_dialog.ui'))

class MyDialog(QDialog, FORM_CLASS):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

メインクラスでの使用:

python
from .my_dialog import MyDialog

def run(self):
    dialog = MyDialog(self.iface.mainWindow())
    result = dialog.exec_()

    if result:
        # OKが押された場合の処理
        input_value = dialog.lineEdit.text()
        # 処理を実行

デバッグ方法

print出力

python
# Pythonコンソールに出力
print(f"変数の値: {variable}")

QgsMessageLog

python
from qgis.core import QgsMessageLog, Qgis

# ログパネルに出力
QgsMessageLog.logMessage(
    "デバッグメッセージ",
    "MyPlugin",
    Qgis.Info
)

メッセージバー

python
self.iface.messageBar().pushMessage(
    "タイトル",
    "メッセージ内容",
    Qgis.Warning,
    duration=5  # 5秒間表示
)

プラグインのリロード

開発中の変更を反映するには:

手順

  • Plugin Reloaderプラグインをインストール
  • プラグイン → Plugin Reloader → Configure → 開発中のプラグインを選択
  • Ctrl + F5 でリロード

配布方法

ZIP化

1. プラグインフォルダをZIP化
   - フォルダ名 = プラグイン名

2. 構成例:
   my_plugin.zip
   └── my_plugin/
       ├── __init__.py
       ├── my_plugin.py
       ├── metadata.txt
       └── ...

社内配布

手順

  • ZIPファイルを共有
  • インストール方法:プラグイン → プラグインの管理とインストール → 「ZIPからインストール」 → ZIPファイルを選択

公式リポジトリへの公開

手順

  • plugins.qgis.org でアカウント作成
  • プラグインをアップロード
  • 審査を通過すると公開
  • QGIS内から検索・インストール可能に

開発のヒント

よく使うQtウィジェット

ウィジェット 用途
QLineEdit テキスト入力
QComboBox ドロップダウン
QCheckBox チェックボックス
QSpinBox 数値入力
QFileDialog ファイル選択

レイヤ選択コンボボックス

python
from qgis.gui import QgsMapLayerComboBox
from qgis.core import QgsMapLayerProxyModel

# ベクターレイヤのみ表示
layer_combo = QgsMapLayerComboBox()
layer_combo.setFilters(QgsMapLayerProxyModel.VectorLayer)

ファイル選択

python
from qgis.PyQt.QtWidgets import QFileDialog

file_path, _ = QFileDialog.getOpenFileName(
    None,
    "ファイルを選択",
    "",
    "シェープファイル (*.shp);;すべて (*.*)"
)

まとめ

プラグイン開発の流れ

開発の流れ

  • Plugin Builderで雛形作成
  • metadata.txtを編集
  • メイン処理を実装
  • (必要に応じて)UIを作成
  • テスト・デバッグ
  • 配布

次のステップ

関連記事

お問い合わせ

QGISプラグイン開発についてのご相談は、お気軽にお問い合わせください。

  • プラグイン開発相談
  • 開発支援
  • GIS開発コンサルティング

お問い合わせはこちら

最終更新: 2025年1月