anorithのブログ

主にGIS系の記事を書く。

QGISプラグイン開発の勉強(2)

概要

参考

  • ChatGPT
    • GPT-4を使用しました。
    • 記事の最後に少しコメントを記載しています。

アイコン設定とショートカット設定

前回のプラグインフォルダをそのまま使用します。フォルダにアイコン用の画像を格納します。

アイコンには以下の画像を使用しました。DALL·E3に白背景のアイコンを描いてもらい、ノイズ除去のためvectorizer.aiで一度ベクター化&pngで再保存して、白背景部分をPythonで透過に処理してアイコンにしました(AIに頼りすぎでは・・・?)。

まずインポート部分にアイコン設定用のモジュールを追加します。

from PyQt5.QtWidgets import QAction
from PyQt5.QtGui import QIcon

次に__init__.pyinitGuiの箇所を以下のように書き換えます。

    def initGui(self):
        self.action = QAction('MyPluginAction', self.iface.mainWindow())

        icon_path = os.path.join(os.path.dirname(__file__), "icon.png")        
        self.action.setIcon(QIcon(icon_path))
        self.action.setShortcut("Ctrl+T")

        self.action.triggered.connect(self.run)
        self.iface.addToolBarIcon(self.action)

以下のようにアイコンが反映されました。オリジナルのアイコンだと一気にプラグイン作ってる感じが出ますね。

またショートカットCtrl+Tも使用してrunの処理が行えるようになっています。

画像保存プラグインの作成

インポート部分に必要なモジュールを追加します。

import os
from PyQt5.QtWidgets import QAction
from PyQt5.QtGui import QIcon
from qgis.core import QgsProject, QgsMapRendererParallelJob

runの中身を以下の内容をに書き換えます(ChatGPTの出力そのままです)。

    def run(self):
        # 現在のプロジェクトのファイルパスを取得
        project_path = QgsProject.instance().fileName()
        if not project_path:
            # プロジェクトが保存されていない場合は、処理を中止
            return
        
        # プロジェクトのディレクトリパスを取得
        project_directory = os.path.dirname(project_path)
        image_path = os.path.join(project_directory, "map_image.png")

        # 現在の地図の設定を取得
        map_settings = self.iface.mapCanvas().mapSettings()

        # レンダリングジョブを作成して地図を画像として保存
        job = QgsMapRendererParallelJob(map_settings)
        job.start()
        job.waitForFinished()
        image = job.renderedImage()

        image.save(image_path)

以下の状態でプラグインを実行します(アイコンクリックorCtrl+T)。

以下の画像がQGISプロジェクトと同じ箇所に保存されます。

思ったより簡単にできました。 画像保存の話は以前も書きましたが、こういう書き方もあるのだと勉強になりました(以前の記事:https://anorith.hatenablog.com/entry/2023/01/15/213632)。

ChatGPTについて

今回はChatGPT使って勉強してみましたが、ぶっちゃけブログ記事書く(見る)よりChatGPTに聞いた方がよくない?という気がしてきますね・・・。

チャットのログ:https://chat.openai.com/share/c5fea02b-6009-4b05-8317-bc11d9b643e7

ログの途中のショートカットのやりとりは別原因だったためスルーして下さい。