QGIS を用いたプラグインツールの作成手法について
エンジニアリング本部 国土基盤情報部 建設情報グループ

内田 照久
１. はじめにス GIS を利用した簡単なプラグインツール開発の手法について紹介することとした。

総務省では、災害発生時にも行政情報の業務を継続するため、効率的で災害に強い電子自治体の実現に向けて取り組んでいる。自治体におけ２. 開発環境の整備る地理情報システム（以降 GIS と記す）の整備状

２．１ 使用ソフトウェアについて
GIS はオープンソース GIS としては最も有名な

況は、平成 27 年 4 月１日現在、都道府県では 46

QGIS を使用する。

団体（97.9％）、市区町村では 1402 団体（80.5％）

開発言語は広く普及していて、記述や理解、維で整備済みである（1）。都道府県では１団体を除いて全国で整備済であるが、市区町村では未だ持、配布が簡単である Python にて行う。

20％が未整備である。その主な原因は「財政状況」

統合開発環境は Eclipse を使用する。

である。
一般的な有償型 GIS を導入するには、１ライセ

２．２ インストール（１） QGIS のインストール

ンスあたり、ソフトのライセンス費用が数十万円、ソQGIS の イ ン ス ト ー ル は OSGeo4W サ イ ト

フト年間保守料が数万円必要となる。さらに専用シ（ https://trac.osgeo.org/osgeo4w/wiki/OSGeo4W

ステム開発となると仕様によっては、数百万は必要_jp）よりダウンロードしてインストールを行う。
通常「C:\OSGeo4W\」フォルダにインストールさであり、財政規模の小さな自治体には相当な負担になる。
一方、オープンソース GIS は有償型 GIS と比べると高度な解析機能では劣るが、一般的な操作をれ 、 「 C:\OSGeo4W\bin\qgis.bat 」 を 実 行 す る と
QGIS が起動する。
（２） Eclipse のインストールするには十分な機能を備えている。また簡単なプ

Eclipse は pleiades 版（http:// meｒgedoc.osdn.

ラグインを作成することで複雑な処理を少ない操.jp/）を使用する。また、Python にて開発を行うた作にて実現することも可能である。最近では、過去

め、プラグインとして Pydev のインストールも行う。に作成した GIS のリプレースにあたり、少しでも費用を抑えるため、オープンソース GIS にてシステム

３. プラグインツールの概要構築したいという要望も増えてきている。

３．１ ツールの基本機能
本稿では以下の２つのプラグインツールを作成

上記の状況を踏まえて、本稿ではオープンソーした。その作成方法について紹介する。
− 29 −

1/6

４. プラグインツールの開発手法（１） 情報表示機能
１つ目として専用ツールを作成するにあたり、よ４．１ プラグインモジュールの開発準備についてく見受けられる専用画面を使用した情報表示機能

QGIS のプラグインは保存場所が以下の 2 カ所（以降：情報表示機能と記す）を作成した。
これは、図形を選択すると、関連する情報が専に決まっており、そのフォルダにソースを置くことでプラグインとして認識する。

用画面に表示される機能である。

・共通プラグイン保存先
C:\OSGeo4W\apps\qgis\python\plugins
・ユーザープラグイン保存先
C:\Users\ユーザー名\.qgis2\python\plugins
また、プラグインの雛形は「Plugin Builder」を使用して生成することができる。QGIS を起動後、プラグインメニューより「Plugin Builder」をクリックすると設定 画 面 が 表 示 さ れ る 。 メ ニ ュ ー バ ー に 「 PluginBuilder」が表示されない場合は、「プラグインの管図 1 情報表示機能画面イメージ理とインストール」より新規に追加する。

（２） 図形拡縮機能２つ目としては現時点では QGIS の基本機能にない図形編集の機能で、選択した図形の縦または横のどちらか一方向のみにドラッグすると図形が合わせて拡縮する機能（以降：図形拡縮機能と記す）を作成した。
これは、選択したポリゴンの外接矩形の辺上の表示される点（□）を縦または横のどちらか一方向のみにドラッグすると図形が合わせて拡縮される機能である。
ABba

図 2 図形拡縮機能画面イメージ

図 3 Plugin Builder 設定画面

− 30 −

2/6

Plugin Builder 設定画面にて必要な項目を入力を行うための新規 UI（ogiPlugin_InfoView.ui と命名、（プラグイン名：ogiPluginTest と設定）すると、プラ

以降：情報表示画面と記す）を追加し、写真を表示

グイン保存場所にフォルダ（C:\OSGeo4W\apps\するための Label コントロールと、属性情報を表示qgis\python\plugins\ogiPluginTest）とモジュールする TableWidget コントロールを配置する。

一式が生成される

図 6 QT Desigｎer
図 4 Plugin フォルダ

新規に作成した情報表示画面は py 形式に変次 に フ ォ ル ダ 内 に あ る 「 resource.qrc 」 よ り換する。「C:\OSGeo4W\OSGeo4W.bat」を実行後、「resource.py」を生成する。「C:\OSGeo4W\OSG-「ogiPluginTest」フォルダに移動し、「pyuic4ogiPl-eo4W.bat」を実行後、「ogiPluginTest」フォルダに

ugin_InfoView.ui -o ogiPlugin__InfoView.py」と実行移動し、「Make」と実行すると「resource.py」が作成すると、「ogiPlugin_InfoView.py」ファイルが作成さされる。

れる。

図 7 コマンドプロンプト画面
図 5 コマンドプロンプト画面（２） コードの作成

以上で開発を行う準備が整った。

Eclipse を起動し、「ogiPluginTest」フォルダ内の「ogiPuginTest_dialog.py」を表示し、必要なモジュ４．２ 情報表示機能の作成ールをインポートする。

（１） 表示画面（GUI）の作成
はじめに画面の作成を行う。Python では QT
Designer というツールが用意されていて、それを使用して画面を作成する。「C:\OSGeo4W\\bin\designer.exe」を実行すると QT Designer が起動する。先ほど作成したフォルダより、「ogiＰｌｕginTest_dialog_base.ui」を開く。「ogiPluginTest_dialog_base.ui」（以降：メニュー画面と記す）は２つの機能を呼図 7 Eclipse

び出すためのボタンを配置する。続いて情報表示− 31 −

3/6

●ダイアログ表示用のクラス
class InfoViewDialog(QDialog, Ui_InfoView):●属性情報の取得方法
feature.attributes()[ﾌｨ-ﾙﾄﾞ番号)]●tableWidget への表示方法
self.ui.tableWidget.setItem(行番号,列番号
QTableWidgetItem(表示する文字列))●Label に画像を設定する方法
self.pixmap = QPixmap(ファイルパス)
self.ui.label.setPixmap(self.pixmap)

メイン画面に配置した２つのボタン押下時の関数を生成し、呼び出すよう設定する。
●情報表示ボタンクリック時の関数
def ButtonInfoView_Set(self):●図形編集ボタンクリック時の関数
def ZukeiKakuShuku_Set (self):●ボタン押下時に呼び出す方法
self.ButtonMenu1.clicked.connect(self.ButtonInfoView_Set)

表示用クラスを呼び出すよう設定することで、選択次に地図上の図形情報を取得するため、「Qgｓした図形の情報が表示される。以上で情報表示機

MapTool」クラスを継承したクラスを作成する（2）。作能のコード生成が完了する。今回は情報を画面上成したクラス内に選択した図形情報を取得するたに表示するだけであったが、Excel などの帳票にめの「canvasPressEvent（マウスクリック）」関出力する機能も作成可能である。

数を生成し、選択した図形情報を取得するコードを記述する。
＜canvasPressEvent 関数＞

４．３ 図形拡縮機能の作成（１） コードの作成① クリックした座標（ピクセル値）を取得し、地理座

指 定 し た 図 形 を 拡 縮 す る た め 新 し く 「 Qg ｓ標に変換② 座標と重なる図形（空間検索）を取得●図形選択用クラスとマウスクリック関数
class ogiSelectTool(QgsMapTool):def canvasPressEvent(self, event):●クリック座標を地理座標に変換する方法
self.canvas.getCoordinateTransform().
toMapCoordinates(event.pos())●空間検索の方法
QgsFeatureRequest().setFilterRect(検索範囲)

MapTool」クラスを作成する（2）。作成したクラスは選択した図形に対して拡縮を行うため、「情報表示機能」時に作成した図形選択クラス内の「canvasPressEvent」関数より呼び出すようにした。
●図形拡縮を行うクラス
class ZukeiKakuShukuSet (QgsMapTool):●canvasPressEvent 内に以下を記述する
tool = ZukeiKakuShukuSet (self.canvas)
self.iface.mapCanvas().setMapTool(tool)

続いてダイアログ表示用のクラスを生成し、選択した図形情報を表示するコードを生成した。

次に選択した図形の外接矩形とその辺上に表＜ダイアログ表示用のクラス＞①

選択図形より属性情報を取得②

取得した属性情報を tableWidget に表示③

Label に画像を設定示される点（□）を表示するコードを生成した。
表示図形は、一時的な図形であるため外接矩形は 「 QgsRubberBand 」 ク ラ ス を 点 （ □ ） は「QgsVertexMarker」クラスを使用した（2）。

最後に「canvasPressEvent」関数内にダイアログ− 32 −

4/6

以上で図形拡縮機能のコード生成が完了した。
●外接矩形を行う QgsRubberBand クラス●選択座標を取得し、共通変数に保存

self.rubberBand.reset(QGis.Polygon)
self.rubberBand.setLineStyle(線種を指定)
self.rubberBand.setColor(色を指定)
self.rubberBand.addPoint(左下座標値, False)
self.rubberBand.addPoint(左上座標値, False)
self.rubberBand.addPoint(右上座標値, False)
self.rubberBand.addPoint(右下座標値, True)
self.rubberBand.show()

def canvasPressEvent(self, event):
選択座標 = self.toMapCoordinates(event.pos())●移動座標を取得
def canvasMoveEvent(self, event):
移動座標 = self.toMapCoordinates(event.pos())●図形の変更方法（X 座標変更の時）
移動距離＝移動座標.x - 選択座標.x●点（□）を表示す QgsVertexMarker クラス

変更座標値 = QgsPoint(x + 移動距離, y)vMarker.setIconType(QgsVertexMarker.ICON_BOX)
vMarker.setColor(色を指定)
vMarker.setCenter(点の座標値)

pr = Layer.dataProvider()pr.changeGeometryValues({feature.id() :変更座標値)
Layer.commitChanges()●外接矩形及び点（□）の変更
外接矩形は QgsRubberBand クラス、点（□）はQgsVertexMarker クラスを用いて、変更座標値にて以下のような外接矩形と点（□）が表示される。

再作成を行う４．４ インストール及び動作確認（１） インストール
QGIS を起動後、プラグインメニューより「プラグインの管理とインストール」を選択するとプラグイン設定画面が表示される。「ogiPluginTest」を選択す
続いて図形拡縮クラス内に「canvaｓPressEvenｔ」

ると、プラグインメニュー及びツールバーアイコン関数を生成し、選択した点（□）の座標を取得し共に「ogiPluginTest」が追加される。

通変数に保存しておく。移動距離に合わせて図形を変更することから「canvasMoveEvent」関数を生成し、図形を変更するコードを生成した。
＜canvasMoveEvent 関数＞① 移動座標を取得② 選択した点（□）との移動距離を算出③ 選択図形の各座標に移動距離を加味する。
※横方向に移動した場合は各 X 座標を縦方向に移動した場合は各 Y 座標のみを変更する。
④ 外接矩形及び点（□）も移動距離に合わせて再作成を行う

図 8 プラグインメニュー及びプラグイン設定画面− 33 −

5/6

（２） 動作確認

５. まとめ① 情報表示機能の動作確認

最後に有償型 GIS とオープンソース GIS の開発における、それぞれの長所と短所を述べる。

メニューまたはアイコンより「ogiPluginTest」を選択すると、メニュー画面が起動する。「情報表① 有償型 GIS の長所
有償ではあるが、開発サポートが充実している。

示」ボタンを選択後、情報表示したい図形を選択すると、情報表示画面が正しく表示されたこ② サンプルソースが充実している。とを確認した。

③ 有償型 GIS の短所
初期導入費用がかかる。
開発サポートを受けるためには別途、年間サポート料が発生する。
④ オープンソース GIS の長所
初期導入費用、年間サポート料が無償。他のユーザーが作成したツールのソースが公開されているため、参考にできる。
⑤ オープンソース GIS の短所不明箇所の調査に時間を要する。
サンプルソースが体系だってまとめられていないため、検索に時間を要する。

② 図形拡縮機能の動作確認※なお、以前は英語の解説サイトがほとんどで、メニュー画面より「図形編集（拡縮）」ボタンを選

日本語の解説サイトはあまりなかったが、最近択後、編集したいポリゴン図形を選択すると、では日本語のサイトもいくつか見受けられるよ
うになり、今回作成した２つの機能は、その日外接矩形とその辺上に点（□）が表示される。

本語の解説サイトを参考（2）（3）（4）にすることで、移動したい点を指定後、拡縮したい方向にマほとんどがカバーできた。

ウスを移動すると図形が変更されることを当社では今後、技術をさらに磨きオープンソー確認した。

ス GIS 分野のツール開発にも積極的に取り組んでいく予定である。

＜参考文献＞
1）「地方自治情報管理概要～電子自治体の推進状
況（平成 27 年 4 月１日現在）～」 （総務省）
http://www.soumu.go.jp/denshijiti/060213_02.html

2）「月の杜工房 - QGIS 豆知識」
http://mf-atelier.sakura.ne.jp/mf- atelier/modules/tips/software/qgis/

3）「だら＄らいぶらりぃ～／QGIS はじめてのプラグイン作成」
http://www.areanine.gr.jp/~banjo/QGIS/plugin/index.html

4）「PyQGIS 開発者用 Cookbook」
http://docs.qgis.org/2.2/ja/docs/pyqgis_developer
cookbook/− 34 −

6/6