際際滷

際際滷Share a Scribd company logo
QGIS プログラミング秘T
2016 Osaka 
臼今祇仇輹衒住疉/OSGeo 眸娜蕉Р 劾晩丐o
asahi@hcc.co.jp
waigania13@gmail.com
1/45
朕肝
1 云晩の坪否........................................................................................................................................3
2 云}に秘る念の児A岑R.................................................................................................................4
2.1QGIS とは................................................................................................................................4
2.2Qt とは.....................................................................................................................................4
2.3Python とは..............................................................................................................................4
3Python の児云議な猟隈.....................................................................................................................5
3.1 篳への旗秘............................................................................................................................6
3.2 Mみzみ侏とQい.....................................................................................................................6
3.3 崙囮フロ`.................................................................................................................................9
3.4 v方..........................................................................................................................................10
3.5 クラス........................................................................................................................................11
3.6 パッケ`ジ................................................................................................................................13
4Python コンソ`ルから荷恬..............................................................................................................14
4.1 すべての児云は QgisInterface から........................................................................................14
4.2 ユ`ザインタフェ`ス..........................................................................................................16
4.3 ベクトル(輟里縫▲セス)....................................................................................................18
4.4 ベクトル(宙鮫O協)..............................................................................................................20
4.5Canvas イベント.....................................................................................................................21
5Plugin の児云...................................................................................................................................22
5.1Plugin の児云撹...................................................................................................................22
5.2Plugin Builder...........................................................................................................................23
5.3metadata.txt...............................................................................................................................28
5.4__init__.py................................................................................................................................28
5.5 I尖云悶がdされたファイル..............................................................................................30
5.6 ダイアログの筝.....................................................................................................................32
6 デバッグh廠...................................................................................................................................37
7 プロセッシング秘T.........................................................................................................................38
7.1 プロセッシングとは...............................................................................................................38
7.2Python コンソ`ルからプロセッシング......................................................................................38
7.3 v方を旋喘する.......................................................................................................................41
7.4 プロセッシングスクリプト...........................................................................................................42
8 歌深Y創.........................................................................................................................................45
2/45
1 云晩の坪否
 このセッションでは、
? QGIS コアライブラリの撹といった念戻岑Rのh苧
? gな Python 猟隈v
? QGIS Python コンソ`ルからの CUI による QGIS 荷恬
? QGIS Plugin 撹のh苧
? gな Plugin の恬撹
までを佩います。
 rgをながら、プロセッシングにも乾れてみたいと房います。
 QGIS 2.0 から API が筝されており、參念のバ`ジョンと慌宥で聞喘竃栖ない何蛍があります。云セッショ
ンでは、QGIS 2.8 で嘛編^を佩った坪否で佩います。聞喘していただく QGIS は 2.8 參週のものを聞喘し
てください。
 云セッションで聞喘するデ`タは、Public Domain でデ`タを戻工している NaturalEarth のものを聞喘して
います。
http://www.naturalearthdata.com
3/45
2 云}に秘る念の児A岑R
2.1 QGIS とは
 匯違議なh苧はiきにします。
 QGIS は C++でかれており、インタフェ`ス何蛍については Qt ライブラリを聞喘しています。QGIS の撹
は、コアライブラリ、アプリケ`ション云悶、プラグインに寄e竃栖ます。コアライブラリは、
? QGIS Core Library
? QGIS GUI Library
? QGIS Analysis Library
? Map Composer
? QGIS Network Analysis Library
? QGIS Server Library
に蛍かれています。Python コンソ`ルから QGIS にアクセスするH、Plugin から QGIS にアクセスするHは、
これらのライブラリを宥して、QGIS のC嬬を聞喘することになります。また、これらのライブラリをeに聞喘して、
eなアプリケ`ションを恬撹することも辛嬬となります。
 C++でかれている QGIS ですが、SIP というツ`ルを聞喘して、Python 喘インタフェ`スも戻工されていま
す。Qt についても揖に Python 喘のインタフェ`スが戻工されています。これにより、プラグインを_kする
栽、C++でく、Python でく、の2宥りの圭隈をxk竃栖ます。ただし、Python については畠てのC嬬を聞
喘竃栖るUではなく、Python 喘インタフェ`スが戻工されているC嬬のみ聞喘竃栖るという泣で廣吭が駅勣で
す。箭として、デ`タハンドリングの功ヨにvするプラグインについては、アプリケ`ション畠悶のg佩堀業に唹
を嚥えるため Python での恬撹は竃栖なくなっています。C++、Python の聞い蛍けとしては、
? Python はコンパイルの駅勣がoいが、C++ではコンパイルが駅勣
? QGIS のどの何蛍にアクセスするのか
? 塘下枠の OS を深]した栽に、C++では OS にあったライブラリの恬撹が駅勣
といった泣を深]してQめる駅勣があります。とはいえ、どちらで_kするのがお返Xかといえば、Python を聞
喘する栽になります。
2.2 Qt とは
 C++でかれたアプリケ`ション?ユ`ザ`インタフェ`スのフレ`ムワ`クです。GoogleEarth や Skype が
Qt で恬られています。Qt の蒙罿g匯のソ`スで、Windows、Linux、Mac Os といった?なプラット
フォ`ム貧で嘛するアプリケ`ションが_k辛嬬なことです。また?な冱Zのバインディングが喘吭されて
おり、Python からも聞喘することが竃栖ます。_kh廠として QtCreater、GUI _kh廠として Qt Designer
といったh廠が戻工されており、_kが儻堀に佩えることも蒙罿任后
2.3 Python とは
 Python はプログラムのg佩念にコンパイルを駅勣としないスクリプト冱ZまたはX楚冱Zと柵ばれるNのプ
ログラミング冱Zです。麿の冱Zに曳べて猟隈がシンプルで誼がしやすい冱Zとなっています。また、lが
いても揖じような峰になるような垢健がされています。その匯つとしてインデント(忖和げ)が嶷勣という泣が
げられます。箭えばル`プを燕すHに、Python ではル`プ坪のブロックのインデントをBえることで燕します。
4/45
 QGIS のプラグイン_kにも旋喘竃栖ますし、ArcGIS の ArcPy での駻胆もありますので、仇尖秤鵑Qう
室g宀としては兀さえておきたいプログラミング冱Zです。
3 Python の児云議な猟隈
 この瘁の荷恬をスム`ズにするため、Python の児云議な猟隈を兀さえておきます。嘛の_Jは QGIS の
Python コンソ`ルから佩います。
QGIS 2.8 の Python コンソ`ル
5/45
3.1 篳への旗秘
 Python では篳の侏をあらかじめ峺協しておく駅勣はなく、
篳兆 = 旗秘する。▲ブジェクトなど
を峺協したHに篳が恬撹されます。篳兆をタイプすると、篳に旗秘されている?クラスを_J竃栖ます。
>>>test = 'foss4g'
>>>test
'foss4g'
 恬撹gみではない篳がタイプされたHは、エラ`となります。
>>>test2
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: name 'test2' is not defined
3.2 Mみzみ侏とQい
a) 方ミ
 方ミ佑屁方侏、検嗤(泣侏、}殆方侏が喘吭されています。ただし、ここでは}殆方侏は聞喘しないの
で、h苧は福きます。
 方、没磴靴討蓮+々仝-々仝*々仝/々仝%々仝**々といった處麻徨を聞喘して麻を佩えます。廣吭しておく泣としては、
麻Y惚は方、両業を隠とうとして卦されることがあげられます。箭として屁方/屁方の麻Y惚は屁方となり
ます。
>>>15/7
2
 匯圭の方、検嗤(泣侏の栽は、検嗤(泣侏のY惚が卦されます。
>>>15.0/7
2.142857142857143
麻の枠了は、怎し麻?哈き麻より、譴泳?護り麻が枠されるというように、宥械の膨t處麻と揖です。
枠了を苧幣する栽は、仝(々仝)々でくくります。
>>>1+2*3
7
>>>(1+2)*3
9
b) 猟忖双
 Python では猟忖双は仝'┘轡鵐哀襯芥`テ`ション)々もしくは仝 ̄(ダブルコ`テ`ション)々で譴辰同蹶Fします。
宥械はシングルコ`テ`ションを聞喘します。猟忖双嶄のコ`テ`ション催や、蒙歩催はバックスラッシュで
エスケ`プします。
6/45
>>> 'foss4g'
'foss4g'
>>>'foss4g '2013' tokyo'
^foss4g '2013' tokyo ̄
>>>a = 'foss4g ntokyo'
>>>print a
foss4g
tokyo
 3 嶷のコ`テ`ション催を聞うと、}方佩にまたがった猟忖双を燕F竃栖ます。
>>>a = '''foss4g
...2013
...tokyo'''
>>>print a
 猟忖双は耶忖燕で匯何を歌孚することが辛嬬です。恷兜の猟忖のインデックスが 0 になります。
>>>a = 'foss4g'
>>>a[0]
'f'
>>>a[1:2]
'o'
 ただし猟忖双の匯何をきQえることは竃栖ないので、廣吭しておいて和さい。和のI尖はエラ`になりま
す。
>>> a = 'foss4g'
>>>a[1] = 'b'
 Python の猟忖双侏は方?アルファベットといった ASCII 猟忖をQうための猟忖双侏(string)と、マルチバイ
ト猟忖双をQうためのユニコ`ド猟忖双(unicode string)侏があります。h忖、ひらがなといった晩云ZをQう
栽、枠^のコ`テ`ション催の念に'u'を原けて和さい。和コ`ドのg佩Y惚を曳べてみて和さい。
>>>a = 'とってもg'
>>>a
>>>print a
>>>a = u'とってもg'
>>>a
>>>print a
 猟忖双は ̄+ ̄處麻徨でBYすることが竃栖ます。
>>>a = 'foss4g' + 'osaka'
>>>print a
7/45
foss4gosaka
c) リスト
 Python ではe?のデ`タを1まとめにして聞う栽の}栽侏がいくつか喘吭されています。そのうちもっとも
喘議なのがリストになります。カンマで曝俳られた、髻[々仝]々叔凄察で譴鵑捻蹐靴泙后N鍔崛个藩に耶忖
で光勣殆にアクセスすることが竃栖ます。
>>>a = ['osaka', 2016, u'寄梳', u'偏寄']
>>>a
['osaka', 2016, u'u5927u5742', u'u5e02u5927']
>>>a[1]
2016
>>>a[0:2]
['osaka', 2016]
 リストはBYすることも竃栖ますし、勣殆を峺協して秘れ紋えることも竃栖ます。
>>>a = ['osaka', 'city'] + [2016]
>>>a
['osaka', 'city', 2016]
>>>a[2] = 'university'
>>>a
['osaka', 'city', 'university']
d) 看
 看は麿の冱Zにおいて、 ̄B訶篩弌韻箸靴g廾されているものです。看はキ`と、離撻△亮栽になりま
す。キ`、離撻△鬟ンマで曝俳り、仝{々仝}々襖凄察で譴鵑捻蹐靴泙后
>>>a = {'place':'osaka', 'year':2016}
>>>a['place']
'osaka'
 看嶄に蒙協のキ`が贋壓しているかを{べる栽は、in を聞喘します。
>>>'place' in a
True
8/45
3.3 崙囮フロ`
a) if 猟
 麿の冱Zと揖の if 猟が喘吭されています。インデント(忖和げ)には櫃鬚弔韻討ださい。
訳周猟
g佩するI尖 1
g佩するI尖 2
>>>x = 130
>>>if x < 130:
´ print 'small'
´elif x == 130:
´ print 'equal'
...else:
´ print 'big'
´
b) for 猟
 Python の for 猟が麿の冱Zと`うところとして、販吭のシ`ケンス(リスト、猟忖双)にわたって郡甠鯰个い泙后
>>>a = ['osaka', 'city', 2016]
>>>for x in a:
´ print x
´
osaka
city
2016
 方双にわたって郡甠鯰个栽は、range()を聞喘します。range(10)は 0 から兵まり、0 から兵まる 10 の
からなるリストを伏撹します。_兵方、鰆原┐靴燭蝓紗方(p富方)を峺協することも竃栖ます。
>>>range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>for i in range(2,10,2):
´ print i
´
9/45
スペ`スの方をBえる
2
4
6
8
c) while 猟
 while 猟の聞喘圭隈は麿の冱Zと笋錣蠅泙擦鵝V原┐量周を困燭拷gI尖をRり卦します。
>>>cnt = 0
>>>while cnt < 10:
´ print cnt
´ cnt += 1
´
3.4 v方
a) v方を旋喘する
 for 猟ですでに竃てきていますが、range()は覆排智發気譴討い觸Mみzみv方です。v方を聞喘する
栽は、v方兆にAき仝(々仝)々来凄察で哈き方を耶えてv方を柵び竃します。參和は哈き方として猟忖双を局すと、
猟忖方を卦す len()の箭になります。
>>>len('foss4g')
6
b) v方を恬る
 v方の協xは def の瘁にv方兆と哈き方を来凄察で譴鵑俳个い泙后iv方のI尖云悶は、佩を笋┐謄ぅ鵐
ントをして峰します。
>>>def test(a):
´ print a
´
>>>test(10)
10
 v方にり、ある栽は、I尖云悶坪で return の瘁に峰します。
>>>def test(a):
´ return a+10
´
>>>test(10)
20
 哈き方に福待辛嬬なデフォルト、鰆原┐靴討くことも竃栖ます。
10/45
>>>def test(a=0):
´ print a
´
>>>test()
0
c) 篳のスコ`プ
 Python ではv方坪で協xされた篳はv方の坪何でしか聞喘竃栖ません。和の箭ではv方の坪何で
方 a を、v方の翌で篳 a が協xされていますが、eなものになります。
>>>def test(a):
´ a += 10
´ print a
´
>>>a = 100
>>>test(10)
20
>>>a
100
 リストや看のようなきQえ辛嬬なオブジェクトを哈き方として局す栽は歌孚局しになりますので、廣吭が
駅勣になります。
>>>def test(a):
´ a += ['osaka]
´ print a
´
>>>b = ['foss4g']
>>>test(b)
['foss4g', 'osaka']
>>>b
['foss4g', 'osaka']
3.5 クラス
a) クラスを恬る
 クラスの協xは class の瘁にクラス兆を峰して佩います。ラクスの坪何にはv方協x、クラス篳を峰しま
す。
>>>class test:
11/45
´ def output(self):
´ print 10
´
>>>a = test()
>>>a.output()
10
  インスタンス伏撹rにg佩される蒙eなメソッドとして__init__()を協xしておくことが竃栖ます。
>>>class test():
´ def __init__(self):
´ self.a = 10
´ def output(self, c):
´ print self.a + c
´
>>>b = test()
>>>b.output(10)
20
12/45
b) self
 a)クラスを恬るで恬撹したクラス嶄に協xされているv方の及匯哈方には ̄self ̄が峺協されています。self を
峺協しておくと、光v方坪から徭附のインスタンスへのアクセスが辛嬬となります。
c) @覚
 あるクラスをベ`スとして塗伏クラスを恬撹する栽は、和のような峰をします。
>>>class 塗伏クラス兆(ベ`スクラス兆):
´ クラスの峰
 謹嶷@覚も佩え、その栽はベ`スクラスを双い靴泙后
>>>class 塗伏クラス兆(ベ`スクラス兆 1, ベ`スクラス兆2):
´ クラスの峰
3.6 パッケ`ジ
a) パッケ`ジ
 プログラムがLくなってきた栽、また壅旋喘辛嬬な何瞳に蛍けて砿尖しておく栽、ファイルに蛍護しておき
ます。そのHに、ドット原きのモジュ`ル兆を聞って夛晒しておきます。A.B というモジュ`ル兆は、A という
パッケ`ジの B というモジュ`ルを燕します。モジュ`ル兆とg悶のディレクトリ、ファイルのvSは和のように
なります。
A/ ------ ディレクトリ A
B.py --- ファイル B
b) import
 import の猟として 1 パタ`ンだけB初しておきます。
from A.B import *
 貧の猟は、A/B.py からファイル坪のクラス、v方畠てを import することになります。
 
13/45
4 Python コンソ`ルから荷恬
4.1 すべての児云は QgisInterface から
 QGIS を軟咾靴董Python コンソ`ルを羨ちあげて和さい。
## しい秤鵑肇瓮愁奪匹離螢好箸駅勣な栽は help(iface)とタイプして和さい.
という峰が恷兜にかれています。iface が QgisInterface クラスのインスタンスになります。QgisInterface ク
ラスは、Python コンソ`ルや、Plugin から QGIS アプリケ`ションにアクセスするHに笥になるクラスです。こ
こから、光 GUI パ`ツ、iみzみgみのレイヤ吉にアクセスすることになります。
 クラスの協xはドキュメントが巷_されていますので、_Jしましょう。
QGIS API Documentation http://www.qgis.org/api/index.html
14/45
 ドキュメントのバ`ジョンには廣吭してください。 ̄QGIS API Documentation ̄の鬉垢襯乂`ジョンがか
れています。恷仟(_k井)のドキュメントになっていますので、鬉垢襯乂`ジョンをxkして歌孚するようにし
てください。
 QgisInterface クラスの協xをてみましょう。2.8 井のドキュメントはこちらになります。
http://qgis.org/api/2.8/classQgisInterface.html
  signal と slot という峰が竃てきます。これは Qt の蒙L議なC嬬になります。メニュ`がxkされる、ファイ
ルがxkされるといったある嘛(signalがk伏したHに、その嘛にvB原けられてg佩されるv方が slot
になります。プログラム嶄では、signal と slot のvB原けは和のような峰で佩います。
QObject.connect(イベントk伏圷インスタンス、SIGNAL('メソッド兆')、イベント鞭け函り枠インスタン
ス、SLOT('メソッド兆'))
 では、gHに荷恬を佩なって佩きましょう。 
15/45
こちらをxk
4.2 ユ`ザインタフェ`ス
 QGIS のユ`ザインタフェ`スを、そのクラスから寄eしてみます。
1. 光メニュ`は QMenu クラスで竃栖ています
箭えば、 ̄プラグイン ̄メニュ`にアクセスして燕幣させることは、
>>>pluginMenu =iface.pluginMenu()
>>>pluginMenu.show()
のように佩えます。また、 ̄プラグイン ̄メニュ`へのメニュ`弖紗/茅メソッドとして、
QgisInterface.addPluginToMenu()
QgisInterface.removePluginMenu()
が喘吭されていることが、ドキュメントからわかります。すでに喘吭されているメニュ`にvしては、喘吭さ
れているメソッドを宥して荷恬を佩えます。
2. 光ツ`ルバ`は QToolBar クラスで竃栖ています。
箭えば、 ̄プラグイン ̄ツ`ルバ`にアクセスして、燕幣/掲燕幣を俳り紋えることは、
>>>pluginToolBar = iface.pluginToolBar()
>>>pluginToolBar.hide()
>>>pluginToolBar.show()
のように佩えます。また、 ̄プラグイン ̄ツ`ルバ`へのアイコン弖紗/茅メソッドとして、
QgisInterface.addToolBarIcon()
16/45
2
3
4
1
QgisInterface.removeToolBarIcon()
が喘吭されていることが、ドキュメントからわかります。
3. iみzみgみのレイヤ`匯Eには QgisLegendInterface クラスのインスタンスからアクセス竃栖ます。
>>>legend = iface.legendInterface()
>>>legend.layers()
[]
デ`タのiみzみがされていない彜Bでは腎のリストが「ってきます。メニュ`から返咾如△いつかベ
クトルデ`タを弖紗してみて和さい。弖紗瘁に QgisLegendInterface にアクセスしてみると、レイヤが
弖紗されていることが_J竃栖ます。和の箭では、ベクトルレイヤを 1 つだけ弖紗してあります。
>>>legend.layers()
[<qgis.core.QgsVectorLayer object at 0x0CC376A8>]
リストの恷兜のレイヤについて、燕幣/掲燕幣を俳り紋えてみましょう。
>>>layers = legend.layers()
>>>legend.setLayerVisible(layers[0], False)
>>>legend.setLayerVisible(layers[0], True)
4. QMapCanvas クラスのインスタンスからアクセス竃栖ます。スケ`ルを筝してみましょう。
>>>canvas = iface.mapCanvas()
>>>canvas.zoomScale(100000000)
17/45
4.3 ベクトル(輟里縫▲セス)
 ne_50m_admin_0_countries.shp をiみzみ、光勣殆にアクセスしてみましょう。
C:workne_50m_admin_0_countries.shp
 をiみzむことを覿┐靴泙后
1. ベクトルデ`タのiみzみ
>>>iface.addVectorLayer(r'C:workne_50m_admin_0_countries.shp', 'countries',
'ogr')
恷兜の哈き方はiみzむファイル兆、2 桑朕はレイヤ兆各として聞喘されます、3 桑朕の哈き方は聞喘
する QgisDataProvider へのキ`になります。QgisDataProvider はデ`タソ`スからのiみzみ、
きzみ、ハンドリング畠違を佩うクラスです。宥械、ベクトルデ`タをQう栽は ogr を聞喘することで怎
りるはずです。もしオリジナルのデ`タフォ`マット吉に鬉靴 QgisDataProvider を喘吭した栽な
どは峺協が駅勣になります。
2. xkされているレイヤを函誼します。いまは 1 つのレイヤしか_いていませんので、枠ほどiみzんだ
レイヤが卦ってきます。
>>>layer = iface.activeLayer()
兆各を燕幣して_Jしてみましょう。
>>>layer.name()
3. 畠ての輟厘殆に肝アクセスしてみます。
QgsFeatureIterator クラスを宥して光輟里枕肝アクセス竃栖るようになっています。
>>>features = layer.getFeatures()
>>>for feature in features:
´ feature.geometry()
...
箭では、光ベクトル勣殆に肝アクセスを佩い、その輟離ラス(QgsGeometry)をき竃しています。
4. 肝に蒙協の奉來をもったベクトル勣殆をxkしましょう。忽兆は'name'奉來に秘っていることがわかって
いるとします。和のように光輟里慂來兆を峺協して岷俊歌孚できます。
>>>feature['name']
レイヤ坪の輟里枕肝アクセスを佩い、奉來をきだしてみます。
>>>features = layer.getFeatures()
>>>for feature in features:
´ feature['name']
...
5. 肝に奉來'name'が'Japan'のベクトル勣殆をxkして、その勣殆の譴縫懇`ムしてみましょう。
>>>features = layer.getFeatures()
>>>for feature in features:
18/45
´ if feature['name'] == u'Japan':
´ break
´
>>>canvas = iface.mapCanvas()
>>>canvas.setExtent(feature.geometry().boundingBox())
>>>canvas.refresh()
19/45
4.4 ベクトル(宙鮫O協)
 レイヤ畠悶の宙鮫O協を筝してみましょう。宙鮫でO協する弼やTりつぶしNeの峺協に、PyQt のクラスが
駅勣になるので、iみzみます。
>>>from PyQt4.QtCore import *
>>>from PyQt4.QtGui import *
Python コンソ`ルの ̄クラスのインポ`ト ̄から秘薦することもできます。
 QgsSymbolV2 というシンボルO協を恬撹しておき、それを layer の宙鮫峺協(renderer)に秘れてあげるという返
で佩います。
>>>layer = iface.activeLayer()
>>>symbol = QgsSymbolV2.defaultSymbol(QGis.Polygon)
>>>fillLayer = QgsSimpleFillSymbolLayerV2(QColor(255, 0, 0), Qt.SolidPattern)
>>>symbol.appendSymbolLayer(fillLayer)
>>>renderer = QgsSingleSymbolRendererV2(symbol)
>>>layer.setRendererV2(renderer)
>>>iface.mapCanvas().refresh()
 宙鮫O協については、GUI と曳べながらクラスを冥していくと、わかりやすいと房います。
20/45
4.5 Canvas イベント
 canvas 貧でk伏するイベントを憤ってみましょう。canvas 貧でクリックされた了崔と、その了崔の仇尖恙砲
QGIS で喘吭しているメッセ`ジビュ`ワに燕幣します。QMapCanvas クラスではマウスクリックのイベントを憤
うことが竃栖ません。QgsMapTool というクラスを@覚した仟しいクラスを恬撹しておき、イベントk伏rの嘛
を弖紗します。仟しく恬撹したクラスを QMapCanvas クラスにO協することでイベントに鬉気擦泙后
>>>from qgis.gui import *
>>>class QgsMapToolClick(QgsMapTool):
... def canvasPressEvent(self, event):
´ dPos = event.pos()
´ mPos = self.toMapCoordinates(dPos)
´ view = qgis.gui.QgsMessageViewer()
´ view.setMessageAsHtml('<p>' + str(dPos.x()) + ',' + str(dPos.y()) + '</p><p>' +
str(mPos.x()) + ',' + str(mPos.y()) + '</p>')
´ view.showMessage(True)
´
>>>canvas = iface.mapCanvas()
>>>toolClick = QgsMapToolClick(canvas)
>>>canvas.setMapTool(toolClick)
21/45
5 Plugin の児云
 この嫗では Python コンソ`ルから匯稀xれて、Plugin に駅勣なファイルをテキストエディタを聞喘してシし
てきます。
5.1 Plugin の児云撹
 QGIS の軟rにiみzまれる python プラグインは、
QGIS インスト`ルディレクトリ/python/plugins
ユ`ザ`のホ`ムディレクトリ/.qgis2/python/plugins
に秘れておきます。宥械、オリジナルのプラグインを恬撹した栽は、瘁宀に塘崔することになります。windows
を覿┐靴泙垢、
C:Usersユ`ザ兆.qgispythonpluginstest
というような侘で、plugin 阿離妊レクトリを恬撹することになります。
 QGIS は plugins ディレクトリ坪の光ディレクトリをていき、
metadata.txt
というファイルからプラグインの秤鵑鰌iみ函ります。また、光プラグインの qgis への弖紗は、
__init__.py
から佩われます。__init__.py 坪には、I尖云悶が峰されたクラスを卦すv方をdしておきます。宥械、I
尖云悶はeなファイルに峰する圭が登りやすいので、兆念はなんでもいいですが、恷詰もう1ファイル恬撹す
ることになります。
22/45
5.2 Plugin Builder
 プラグインに駅勣なファイルをeに喘吭していくことも辛嬬ですが、 ̄Plugin Builder ̄プラグインを聞喘する
と、恷詰浣慴な坪否をBえてくれるので宴旋です。仝プラグイン々仝プラグインの砿尖とインスト`ル々か
ら ̄Plugin Builder ̄をインスト`ルしましょう。
23/45
 インスト`ルがK阻したら、壼堀 plugin builder を軟咾靴泙靴腓Α1慴な秤鵑鯣襪譴襪函▲廛薀哀ぅ鵑鈴r侘を
恬撹してくれます。
 
  まずはプラグインの児云秤鵑箸靴董
Class name:
プラグインのクラス兆です。python ファイル坪で聞喘されます。キャメルケ`ス(}栽ZをひとY
りとして、勣殆Zの恷兜を寄猟忖)で峰します。
Plugin name: プラグインマネ`ジャ`吉で燕幣されるプラグイン兆
Description: プラグインマネ`ジャ`吉で燕幣されるプラグインのh苧猟
Module name: python のモジュ`ル兆
Version number: プラグインのバ`ジョン
Minimum QGIS version: プラグインが嘛する QGIS の恷詰バ`ジョン
Author/Company: プラグイン恬宀兆
Email address: 恬宀メ`ルアドレス
を秘薦します。
24/45
 Aいてプラグインのなh苧を峰します。ここではm輝な猟を秘れておくだけにしましょう。
 
 恬撹するプラグインのテンプレ`トとして 3 N喘吭されています。 ̄Tool Button with dialog ̄をxkしてお
いてください。UI としてプラグインg佩rに燕幣される dialog も匯wに恬撹してくれます。メニュ`へ燕幣する
猟忖双と、どのメニュ`に燕幣するかもO協しておきます。
25/45
 謹冱Z鬉筌悒襯弋箸鈴r侘も匯wに恬撹することができます。ただし、ここでは恷弌泙離廛薀哀ぅ鵑鰈撹
してみることを朕議としますので、すべてのチェックを翌しておきましょう。
  プラグインの音醤栽鷂耋箸鮹_にしておくため、Bug tracker、Repository の Url 秘薦を箔められます。
ここではm輝な猟忖双を秘れておくだけにしましょう。ただし、きちんとしたプラグインを巷_する栽は、github
吉で巷_することが容Xされていることはえておくべきです。
26/45
 ここまでの秘薦がKわると、プラグインき竃し枠のディレクトリの峺協になります。
ユ`ザ`のホ`ムディレクトリ/.qgis2/python/plugins
にき竃してください。
ユ`ザ`のホ`ムディレクトリ/.qgis2/python/plugins/PluginTest
を_き、plugin buider によりファイルが恬撹されていることを_Jしてください。
 さて、きだされたプラグインをg佩してみたいところですが、その念にもう匯返g駅勣です。メニュ`、ツ`ル
バ`で燕幣されるアイコン鮫颪蓮 icon として聞喘する鮫颯侫.ぅ襪悗離僖垢鰉峰した、Qt のリソ`スファイ
ルの嶄にファイル兆が峰されています。ファイル兆は、
resources.qrc
となっています。リソ`スファイルは xml で峰されており、坪否は和になります。
 このファイル を Python のコ`ドへQしておく駅勣がありますので、pyrcc4 コマンドでQを佩います。
Windows で OSGeo4W を聞喘している栽、OSGeo4W の command shell を軟咾靴董▲廛薀哀ぅ鵑鰈撹
しているディレクトリに卞咾靴討ださい。卞咾靴吹瓠
> pyrcc4 -o resources.py resources.qrc
をg佩して resources.py が恬撹されたことを_Jします。
27/45
<RCC>
<qresource prefix="/plugins/PluginTest" >
<file>icon.png</file>
</qresource>
</RCC>
 これで恷弌泙離廛薀哀ぅ黐撹はK阻です。qgis を羨ち貧げてみましょう。仝プラグイン々仝プラグインの砿尖とイ
ンスト`ル々の嶄から ̄plugin test ̄を冥してインスト`ルしてみてください。
 腎の dialog が燕幣されるだけのプラグインですが、g佩を_Jできます。
5.3 metadata.txt
 駅となるラつかのファイルの坪否をていきましょう。metadata.txt はプラグインにvする秤鵑dされて
います。テキストエディタで_いてみましょう。
 Qめられた篳に ̄= ̄で、い、魎秘していることがわかります。plugin builder で秘れた秤鵑dされ
ていますが、駅勣に鬉犬きQえることができます。
5.4 __init__.py
 プラグインiみzみのHに恷兜にiみzまれるファイルです。classFactory()というv方をdしておきます。
この嶄でI尖の云悶となるモジュ`ルをiみzみ、駅勣なインスタンスを卦しています。 QgisInterface のイン
スタンスである iface が局されていることを_Jしておきましょう。プラグイン坪でも iface を宥して qgis を荷恬す
ることになります。
28/45
[general]
name=plugin test
qgisMinimumVersion=2.0
description= てすとです
version=0.1
author=asahi
email=waigania13@gmail
  
29/45
def classFactory(iface): # pylint: disable=invalid-name
"""Load PluginTest class from file PluginTest.
:param iface: A QGIS interface instance.
:type iface: QgsInterface
"""
#
from .plugin_test import PluginTest
return PluginTest(iface)
5.5 I尖云悶がdされたファイル
 I尖がdされたクラスが恷詰浤屬脹慴があるメソッドは、
initGui(): プラグインが聞喘辛になった栽にg佩されるメソッド
unload(): プラグインが聞喘音辛になった栽にg佩されるメソッド
の2つになります。
 plugin_test.py の坪否をてみましょう。まずは initGui()です。
 メニュ`やツ`ルバ`へのプラグインの弖紗徭悶は、self.add_action()で佩われています。add_action()の
嶄の和の佩をてみましょう。
 QAction は、メニュ`やツ`ルバ`に弖紗されるユ`ザインタフェ`ス何瞳になります。action の triggerd が
callback(哈方で self.run が局されています)に connect されています。
 恬撹された QAction がツ`ルバ`とメニュ`に弖紗されているのがわかります。
 gHに佩われるI尖は、run()にかれています。
 ここでは、恬撹gみのダイアログの燕幣を佩っているだけになります。もし採かg匯のI尖をメニュ`/ツ`ル
バ`からxkされたHに佩いたいだけであえば、ダイアログの燕幣何蛍を茅して、この嶄にI尖をけばい
いことになります。self.iface から qgis にアクセスもできます。
30/45
def initGui(self):
"""Create the menu entries and toolbar icons inside the QGIS GUI."""
icon_path = ':/plugins/PluginTest/icon.png'
self.add_action(
icon_path,
text=self.tr(u'plugin test'),
callback=self.run,
parent=self.iface.mainWindow())
action = QAction(icon, text, parent)
action.triggered.connect(callback)
if add_to_toolbar:
self.toolbar.addAction(action)
if add_to_menu:
self.iface.addPluginToMenu(
self.menu,
action)
def run(self):
"""Run method that performs all the real work"""
# show the dialog
self.dlg.show()
# Run the dialog event loop
result = self.dlg.exec_()
# See if OK was pressed
if result:
# Do something useful here - delete the line containing pass and
# substitute with your code.
pass
 unload()もてみましょう。 
 initGui()、add_action()で恬撹した QAction をツ`ルバ`、メニュ`から茅しています。
31/45
def unload(self):
"""Removes the plugin menu item and icon from QGIS GUI."""
for action in self.actions:
self.iface.removePluginMenu(
self.tr(u'&plugin test'),
action)
self.iface.removeToolBarIcon(action)
# remove the toolbar
del self.toolbar
5.6 ダイアログの筝
 plugin builder を聞喘すると、腎のダイアログは恬撹してくれます。このダイアログを筝する圭隈をてみま
しょう。
 ダイアログの恬撹/筝には、QtCreator を旋喘します。qt のホ`ムペ`ジ(http://www.qt.io/download/ )
から、h廠にあった Qt Creator のダウンロ`ドを佩い、インスト`ルを佩います。
 Commercial 井と OpenSource 井がありますので、OpenSource 井にMんでください。 ̄Get Started ̄をxk
します。
 駅勣なのは QtCreater になりますので、Qt Offline Installer から ̄Qt Creator ̄をxkしてください。h廠に
あった Qt Creator のダウンロ`ドを佩い、インスト`ル佩ってください。
32/45
 インスト`ルが屎械に佩われると、QtCreator が windows のスタ`トメニュ`に紗わっています。
 QtCreator を軟咾靴討ださい。仝ファイル々仝ファイル/プロジェクトを_く々から plugin builder で恬撹された
plugin_test_dialog_base.ui を_きます。
 鮫中恣のウィジェットボックスから、 ̄Text Edit ̄をドラッグしながら、Dialog 貧に塘崔してください。 塘崔し
た ̄Text Edit ̄にプログラムからアクセスする栽には、プロパティに燕幣される ̄objectName ̄でReします。
登りやすいものに笋┐討いた圭が措いですが、書指は恬撹rに秘れられる兆念のままでMみます。
33/45
 Dialog 徭悶の寄きさも筝して、m輝な寄きさにしておきましょう。
 
 レイアウトを屁えたら、肝にボタンの signal が、どの slot に connect されているか_Jしておきましょう。和粁
の ̄Signals & Slots Editor ̄から_Jすることができます。
 
button_box からの accepted() (OK ボタンの signal)が、dialog の accept()に、rejected()が dialog の
reject()に、それぞれ connect されていることがわかります。button_box からの signal をeな slot に connect
する、もしくは dialog の slot を貧きしてあげればI尖を筝することができます。
 恬撹のK阻したダイアログは、仝Save ^plugin_test_dialog_base.ui ̄々で貧きしておきましょう。
 dialog の accept()をきQえれば、 ̄OK ̄ボタンが兀されたHにI尖を弖紗することができることがわかりまし
た。plugin builder できだされている ̄plugin_test_dialog.py ̄をきQえてI尖を紗えましょう。
34/45
  PluginTestDialog クラスは、枠ほど筝した plugin_test_dialog_base.ui を@覚しています。 PluginTestDialog
で accept()を協xして貧きしましょう。ここでは富し指りくどいやり圭ですが、accept()の坪否を腎にしてしまいま
す。
 肝に、plugin_test.py の坪否をきQえます。dialog を恬撹したHに、dialog の button_box の accepted()
にeなI尖を connect してしまいます。connect されたメソッドには、レイヤ方を dialog の textEdit にき竃す
I尖を峰してあります。
35/45
FORM_CLASS, _ = uic.loadUiType(os.path.join(
os.path.dirname(__file__), 'plugin_test_dialog_base.ui'))
class PluginTestDialog(QtGui.QDialog, FORM_CLASS):
def __init__(self, parent=None):
"""Constructor."""
super(PluginTestDialog, self).__init__(parent)
# Set up the user interface from Designer.
# After setupUI you can access any designer object by doing
# self.<objectname>, and you can use autoconnect slots - see
# http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html
# #widgets-and-dialogs-with-auto-connect
self.setupUi(self)
FORM_CLASS, _ = uic.loadUiType(os.path.join(
os.path.dirname(__file__), 'plugin_test_dialog_base.ui'))
class PluginTestDialog(QtGui.QDialog, FORM_CLASS):
def __init__(self, parent=None):
"""Constructor."""
super(PluginTestDialog, self).__init__(parent)
# Set up the user interface from Designer.
# After setupUI you can access any designer object by doing
# self.<objectname>, and you can use autoconnect slots - see
# http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html
# #widgets-and-dialogs-with-auto-connect
self.setupUi(self)
def accept(self):
pass
36/45
class PluginTest:
"""QGIS Plugin Implementation."""
def __init__(self, iface):
C 福待 -
# Create the dialog (after translation) and keep reference
self.dlg = PluginTestDialog()
self.dlg.button_box.accepted.connect(self.set_text)
C 福待 -
def set_text(self):
self.dlg.textEdit.setText(str(self.iface.mapCanvas().layerCount()))
  プラグインをg佩して、ダイアログにレイヤ方が燕幣されるか_Jしてみましょう。
6 デバッグh廠
 スクリプトが玉いうちは、エラ`のHに燕幣されるメッセ`ジをながら俐屎を佩なっていくことも辛嬬です。た
だし}jなI尖になってくると、スクリプトをg佩させながらのデバックが之かせなくなります。Eclipse+PyDev
でデバッグに駅勣なh廠をBすることが竃栖ます。
 h廠のBはrgがかかるためここでは佩いませんが、歌深Y創だけあげておきます。バ`ジョン吉硬くなっ
ていますので、mriみ紋えてください。
? http://www.areanine.gr.jp/~banjo/QGIS/plugin/lesson3.html
? http://linfiniti.com/2011/12/remote-debugging-qgis-python-plugins-with-pydev/
? QGIS でアプリケ`ションを恬撹する/QGIS でプラグインを恬撹する
http://d.hatena.ne.jp/waigani/20101130
http://d.hatena.ne.jp/waigani/20101229
37/45
7 プロセッシング秘T
7.1 プロセッシングとは
 プロセッシングは QGIS で聞える?な盾裂C嬬をまとめるためのフレ`ムワ`クです。GRASS,SAGA な
どで戻工される盾裂C嬬を、プロセッシングを宥してy栽してシ`ムレスに聞喘することが竃栖ます。廣吭する
泣としては、プロセッシング徭悶はフレ`ムワ`クなので、光?の盾裂C嬬(SAGA など)はeにインスト`ルさ
れている駅勣があります。
 
 兜豚彜Bで仝プロセッシングツ`ルボックス々が燕幣されています。燕幣されていない栽は、メニュ`の仝プロ
セッシング々から仝ツ`ルボックス々をxkすることで燕幣させることができます。宥械はこの仝ツ`ルボックス々から
プロセッシングのC嬬を聞います。
7.2 Python コンソ`ルからプロセッシング
 プロセッシングは喘吭されているC嬬參翌にも、Python で峰したスクリプトを弖紗鞠hすることが竃栖ます。
まずは Python コンソ`ルからプロセッシングを聞喘して、どのような峰を佩うのか、その碧Mみを僥してみ
ましょう。
 ne_50m_admin_0_countries.shp のみ 1 レイヤがiみzまれており、ここから ̄name ̄奉來 = ^Japan ̄の
侘を select、select した輟里eファイルとしてきzみという匯Bの送れを佩なってみます。
 Python コンソ`ルを_いて和さい。恷兜に佩うおこなうことはプロセッシングの import です。
>>>import processing
Python コンソ`ルの ̄クラスのインポ`ト ̄から秘薦することもできます。
38/45
 
聞喘竃栖るC嬬の匯Eを燕幣してみましょう。
>>>processing.alglist()
をg佩すると、C嬬のh苧----->C嬬兆というフォ`マットでC嬬の匯Eが燕幣されます。
 processing.alglist()は猟忖双を哈方として局すことも竃栖ます。この栽、C嬬のh苧にして峺協した猟
忖双でフィルタ`をかけることができます。 ̄select ̄を根むC嬬を冥しているとして、
>>>processing.alglist('select')
をg佩してみて和さい。qgis:selectbyattribute というC嬬をつけることが竃栖ます。
39/45
 このC嬬の聞喘圭隈を_Jします。
>>>processing.alghelp('qgis:selectbyattribute')
 
 燕幣された聞喘圭隈から、哈方が4つ駅勣なこと(恷瘁の哈方 OUTPUT は卦り、量轅屬魃蹐靴討い襪里盃
協の駅勣はありません。)がわかります。
INPUT : 秘薦するベクトルレイヤ(QgsVectorLayer もしくはファイル兆)
FIELD : 奉來フィ`ルド兆
OPERATOR : 曳^處麻徨
VALUE : 曳^
を哈方で峺協します。OPERATOR に峺協できる曳^處麻徨のリストも燕幣されます。曳^處麻徨はこの嶄か
ら、鬉垢詈忖で峺協することになります。
 qgis:selectbyattribute をg佩してみましょう。
>>>layer = iface.activeLayer()
>>>selectedResult = processing.runalg('qgis:selectbyattribute', layer, 'name', 0, 'Japan')
 g佩には processing.runalg()を聞喘します。恷兜の哈方としてC嬬兆を、肝の哈方からはC嬬阿鳳慴とさ
れる哈方を双い靴泙后7気、蓮g佩Y惚を郡啌したファイル兆が秘った看になります。
>>>selectedResult
{'OUTPUT': u'C:workne_50m_admin_0_countries.shp',}
 qgis:selectbyattribute の栽、仟しいファイルは恬らず秘薦として峺協したファイルを荷恬するC嬬ですの
で、秘薦ファイル兆がそのまま卦ってきます。
 肝に、gdal のC嬬を旋喘してベクトルデ`タを、フォ`マットを峺協して隠贋してみましょ
う。 ̄gdalogr:convertformat ̄の Help を_Jします。
40/45
>>>processing.alghelp('gdalogr:convertformat')
 
 秘薦するベクトルレイヤ(もしくファイル兆)とフォ`マットを峺協することがわかります。ただしオプション、竃薦
ファイルは ̄None ̄としておいてください。竃薦ファイルはテンポラリファイルとして恬撹してくれます。g佩して、
恬撹されたテンポラリファイルをiみzみます。
>>>saveResult = processing.runalg('gdalogr:convertformat', selectedResult['OUTPUT'], 1,
None, None)
>>>processing.load(saveResult['OUTPUT_LAYER'])
 
 このようにプロセッシングを聞うことで、qgis 云悶のC嬬、その麿のライブラリ?アプリケ`ションで喘吭されたC
嬬といった、e?に戻工された盾裂C嬬を揖匯のインタフェ`スから聞喘することが竃栖るようになります。
7.3 v方を旋喘する
 プロセッシングは盾裂C嬬をy匯の返で聞えるようにしたフレ`ムワ`クですが、その^殻で喘吭された光
N宴旋クラスも聞喘することが竃栖ます。箭えば、QGIS を OSGeo4W でインスト`ルしたとして、
C:OSGeo4Wappsqgispythonpluginsprocessingtoolsdataobjects.py
をいてみましょう。
 レイヤへのアクセスクラスなどが喘吭されていて、QGIS Python API の聞喘圭隈としてとても歌深になります。
iみzみgみのラスタレイヤ匯Eを誼るv方は、
41/45
のように喘吭されています。匯業てみることをおすすめします。
7.4 プロセッシングスクリプト
 プロセッシングにはQまったル`ルで秘薦?竃薦を協xしてあげることで、徭蛍でいたスクリプトを弖紗するこ
とができます。また、ネットで巷_されているスクリプトをダウンロ`ドしてきて弖紗することもできます。
 スクリプトの嶄附をることが竃栖ますので、てみましょう。仝スクリプト々仝ツ`ル々の仝オンラインスクリプト鹿から
スクリプトを秘返々をxkします。
 
42/45
def getRasterLayers(sorting=True):
layers = QgsProject.instance().layerTreeRoot().findLayers()
raster = []
for layer in layers:
mapLayer = layer.layer()
if mapLayer.type() == QgsMapLayer.RasterLayer:
if mapLayer.providerType() == 'gdal': # only gdal file-based layers
raster.append(mapLayer)
if sorting:
return sorted(raster, key=lambda layer: layer.name().lower())
else:
return raster
 ^Hex grid from layer bounds ̄をダウンロ`ドしてみましょう。
 仝スクリプト々仝Polygons々に弖紗されますので、嘔クリックして仝スクリプトをシ々をxkします。スクリプトの坪否
が燕幣され、和の坪否となっています。
 C嬬を Excute したHのダイアログと曳^すると、丹^の ̄## ̄の何蛍で秘薦/竃薦にvするフォ`ムを峺協し
ていることがわかります。このようなgな峺協でフォ`ムを恬撹することが竃栖ますので、議な荷恬が駅勣
になるC嬬參翌は、プロセッシングを旋喘してMみzむ並が書瘁覆砲覆襪繁爾錣譴泙后
43/45
##Polygons=group
##input=vector
##cellsize=number 1000.0
##grid=output vector
input = processing.getObject(input)
extent = input.extent()
extent = '%f,%f,%f,%f' %(input.extent().xMinimum()-cellsize/2, input.extent().xMaximum()+cellsize/2,
input.extent().yMinimum()-cellsize/2, input.extent().yMaximum()+cellsize/2)
processing.runalg('qgis:creategrid', 3, extent, cellsize, cellsize, input.crs().authid(),grid)
44/45
8 歌深Y創
 わからないクラス、v方が竃てきたら、児云は QGIS API Documentation から{べます。
http://www.qgis.org/api/
 PyQt も駅勣な岑Rになります。
http://pyqt.sourceforge.net/Docs/PyQt4/classes.html
 巷塀なテキストとして cookbook があります。
  http://www.qgis.org/pyqgis-cookbook/
 プロセッシングにvする秤鵑蓮▲泪縫絅▲襪鰌iむことが児云です。
https://docs.qgis.org/2.8/en/docs/user_manual/processing/console.html
 
和の汐もとても歌深になります。
https://www.packtpub.com/application-development/qgis-python-programming-cookbook
 晩云Zで誼られる秤鵑呂泙世泙隻戮覆い任后
埖の凝垢型 http://mf-atelier.sakura.ne.jp/
waigani's dialy http://waigani.hatenablog.jp/
栽揖氏芙 vIT並嬲 http://midoriit.com/blog.html
寔弥垢婬 http://blog.livedoor.jp/sanakazu/
だら∞らいぶらりぃ゛ http://www.areanine.gr.jp/~banjo/QGIS/plugin/index.html
45/45

More Related Content

QGISプログラミング秘T 2016Osaka

  • 1. QGIS プログラミング秘T 2016 Osaka 臼今祇仇輹衒住疉/OSGeo 眸娜蕉Р 劾晩丐o asahi@hcc.co.jp waigania13@gmail.com 1/45
  • 2. 朕肝 1 云晩の坪否........................................................................................................................................3 2 云}に秘る念の児A岑R.................................................................................................................4 2.1QGIS とは................................................................................................................................4 2.2Qt とは.....................................................................................................................................4 2.3Python とは..............................................................................................................................4 3Python の児云議な猟隈.....................................................................................................................5 3.1 篳への旗秘............................................................................................................................6 3.2 Mみzみ侏とQい.....................................................................................................................6 3.3 崙囮フロ`.................................................................................................................................9 3.4 v方..........................................................................................................................................10 3.5 クラス........................................................................................................................................11 3.6 パッケ`ジ................................................................................................................................13 4Python コンソ`ルから荷恬..............................................................................................................14 4.1 すべての児云は QgisInterface から........................................................................................14 4.2 ユ`ザインタフェ`ス..........................................................................................................16 4.3 ベクトル(輟里縫▲セス)....................................................................................................18 4.4 ベクトル(宙鮫O協)..............................................................................................................20 4.5Canvas イベント.....................................................................................................................21 5Plugin の児云...................................................................................................................................22 5.1Plugin の児云撹...................................................................................................................22 5.2Plugin Builder...........................................................................................................................23 5.3metadata.txt...............................................................................................................................28 5.4__init__.py................................................................................................................................28 5.5 I尖云悶がdされたファイル..............................................................................................30 5.6 ダイアログの筝.....................................................................................................................32 6 デバッグh廠...................................................................................................................................37 7 プロセッシング秘T.........................................................................................................................38 7.1 プロセッシングとは...............................................................................................................38 7.2Python コンソ`ルからプロセッシング......................................................................................38 7.3 v方を旋喘する.......................................................................................................................41 7.4 プロセッシングスクリプト...........................................................................................................42 8 歌深Y創.........................................................................................................................................45 2/45
  • 3. 1 云晩の坪否  このセッションでは、 ? QGIS コアライブラリの撹といった念戻岑Rのh苧 ? gな Python 猟隈v ? QGIS Python コンソ`ルからの CUI による QGIS 荷恬 ? QGIS Plugin 撹のh苧 ? gな Plugin の恬撹 までを佩います。  rgをながら、プロセッシングにも乾れてみたいと房います。  QGIS 2.0 から API が筝されており、參念のバ`ジョンと慌宥で聞喘竃栖ない何蛍があります。云セッショ ンでは、QGIS 2.8 で嘛編^を佩った坪否で佩います。聞喘していただく QGIS は 2.8 參週のものを聞喘し てください。  云セッションで聞喘するデ`タは、Public Domain でデ`タを戻工している NaturalEarth のものを聞喘して います。 http://www.naturalearthdata.com 3/45
  • 4. 2 云}に秘る念の児A岑R 2.1 QGIS とは  匯違議なh苧はiきにします。  QGIS は C++でかれており、インタフェ`ス何蛍については Qt ライブラリを聞喘しています。QGIS の撹 は、コアライブラリ、アプリケ`ション云悶、プラグインに寄e竃栖ます。コアライブラリは、 ? QGIS Core Library ? QGIS GUI Library ? QGIS Analysis Library ? Map Composer ? QGIS Network Analysis Library ? QGIS Server Library に蛍かれています。Python コンソ`ルから QGIS にアクセスするH、Plugin から QGIS にアクセスするHは、 これらのライブラリを宥して、QGIS のC嬬を聞喘することになります。また、これらのライブラリをeに聞喘して、 eなアプリケ`ションを恬撹することも辛嬬となります。  C++でかれている QGIS ですが、SIP というツ`ルを聞喘して、Python 喘インタフェ`スも戻工されていま す。Qt についても揖に Python 喘のインタフェ`スが戻工されています。これにより、プラグインを_kする 栽、C++でく、Python でく、の2宥りの圭隈をxk竃栖ます。ただし、Python については畠てのC嬬を聞 喘竃栖るUではなく、Python 喘インタフェ`スが戻工されているC嬬のみ聞喘竃栖るという泣で廣吭が駅勣で す。箭として、デ`タハンドリングの功ヨにvするプラグインについては、アプリケ`ション畠悶のg佩堀業に唹 を嚥えるため Python での恬撹は竃栖なくなっています。C++、Python の聞い蛍けとしては、 ? Python はコンパイルの駅勣がoいが、C++ではコンパイルが駅勣 ? QGIS のどの何蛍にアクセスするのか ? 塘下枠の OS を深]した栽に、C++では OS にあったライブラリの恬撹が駅勣 といった泣を深]してQめる駅勣があります。とはいえ、どちらで_kするのがお返Xかといえば、Python を聞 喘する栽になります。 2.2 Qt とは  C++でかれたアプリケ`ション?ユ`ザ`インタフェ`スのフレ`ムワ`クです。GoogleEarth や Skype が Qt で恬られています。Qt の蒙罿g匯のソ`スで、Windows、Linux、Mac Os といった?なプラット フォ`ム貧で嘛するアプリケ`ションが_k辛嬬なことです。また?な冱Zのバインディングが喘吭されて おり、Python からも聞喘することが竃栖ます。_kh廠として QtCreater、GUI _kh廠として Qt Designer といったh廠が戻工されており、_kが儻堀に佩えることも蒙罿任后 2.3 Python とは  Python はプログラムのg佩念にコンパイルを駅勣としないスクリプト冱ZまたはX楚冱Zと柵ばれるNのプ ログラミング冱Zです。麿の冱Zに曳べて猟隈がシンプルで誼がしやすい冱Zとなっています。また、lが いても揖じような峰になるような垢健がされています。その匯つとしてインデント(忖和げ)が嶷勣という泣が げられます。箭えばル`プを燕すHに、Python ではル`プ坪のブロックのインデントをBえることで燕します。 4/45
  • 5.  QGIS のプラグイン_kにも旋喘竃栖ますし、ArcGIS の ArcPy での駻胆もありますので、仇尖秤鵑Qう 室g宀としては兀さえておきたいプログラミング冱Zです。 3 Python の児云議な猟隈  この瘁の荷恬をスム`ズにするため、Python の児云議な猟隈を兀さえておきます。嘛の_Jは QGIS の Python コンソ`ルから佩います。 QGIS 2.8 の Python コンソ`ル 5/45
  • 6. 3.1 篳への旗秘  Python では篳の侏をあらかじめ峺協しておく駅勣はなく、 篳兆 = 旗秘する。▲ブジェクトなど を峺協したHに篳が恬撹されます。篳兆をタイプすると、篳に旗秘されている?クラスを_J竃栖ます。 >>>test = 'foss4g' >>>test 'foss4g'  恬撹gみではない篳がタイプされたHは、エラ`となります。 >>>test2 Traceback (most recent call last): File "<input>", line 1, in <module> NameError: name 'test2' is not defined 3.2 Mみzみ侏とQい a) 方ミ  方ミ佑屁方侏、検嗤(泣侏、}殆方侏が喘吭されています。ただし、ここでは}殆方侏は聞喘しないの で、h苧は福きます。  方、没磴靴討蓮+々仝-々仝*々仝/々仝%々仝**々といった處麻徨を聞喘して麻を佩えます。廣吭しておく泣としては、 麻Y惚は方、両業を隠とうとして卦されることがあげられます。箭として屁方/屁方の麻Y惚は屁方となり ます。 >>>15/7 2  匯圭の方、検嗤(泣侏の栽は、検嗤(泣侏のY惚が卦されます。 >>>15.0/7 2.142857142857143 麻の枠了は、怎し麻?哈き麻より、譴泳?護り麻が枠されるというように、宥械の膨t處麻と揖です。 枠了を苧幣する栽は、仝(々仝)々でくくります。 >>>1+2*3 7 >>>(1+2)*3 9 b) 猟忖双  Python では猟忖双は仝'┘轡鵐哀襯芥`テ`ション)々もしくは仝 ̄(ダブルコ`テ`ション)々で譴辰同蹶Fします。 宥械はシングルコ`テ`ションを聞喘します。猟忖双嶄のコ`テ`ション催や、蒙歩催はバックスラッシュで エスケ`プします。 6/45
  • 7. >>> 'foss4g' 'foss4g' >>>'foss4g '2013' tokyo' ^foss4g '2013' tokyo ̄ >>>a = 'foss4g ntokyo' >>>print a foss4g tokyo  3 嶷のコ`テ`ション催を聞うと、}方佩にまたがった猟忖双を燕F竃栖ます。 >>>a = '''foss4g ...2013 ...tokyo''' >>>print a  猟忖双は耶忖燕で匯何を歌孚することが辛嬬です。恷兜の猟忖のインデックスが 0 になります。 >>>a = 'foss4g' >>>a[0] 'f' >>>a[1:2] 'o'  ただし猟忖双の匯何をきQえることは竃栖ないので、廣吭しておいて和さい。和のI尖はエラ`になりま す。 >>> a = 'foss4g' >>>a[1] = 'b'  Python の猟忖双侏は方?アルファベットといった ASCII 猟忖をQうための猟忖双侏(string)と、マルチバイ ト猟忖双をQうためのユニコ`ド猟忖双(unicode string)侏があります。h忖、ひらがなといった晩云ZをQう 栽、枠^のコ`テ`ション催の念に'u'を原けて和さい。和コ`ドのg佩Y惚を曳べてみて和さい。 >>>a = 'とってもg' >>>a >>>print a >>>a = u'とってもg' >>>a >>>print a  猟忖双は ̄+ ̄處麻徨でBYすることが竃栖ます。 >>>a = 'foss4g' + 'osaka' >>>print a 7/45
  • 8. foss4gosaka c) リスト  Python ではe?のデ`タを1まとめにして聞う栽の}栽侏がいくつか喘吭されています。そのうちもっとも 喘議なのがリストになります。カンマで曝俳られた、髻[々仝]々叔凄察で譴鵑捻蹐靴泙后N鍔崛个藩に耶忖 で光勣殆にアクセスすることが竃栖ます。 >>>a = ['osaka', 2016, u'寄梳', u'偏寄'] >>>a ['osaka', 2016, u'u5927u5742', u'u5e02u5927'] >>>a[1] 2016 >>>a[0:2] ['osaka', 2016]  リストはBYすることも竃栖ますし、勣殆を峺協して秘れ紋えることも竃栖ます。 >>>a = ['osaka', 'city'] + [2016] >>>a ['osaka', 'city', 2016] >>>a[2] = 'university' >>>a ['osaka', 'city', 'university'] d) 看  看は麿の冱Zにおいて、 ̄B訶篩弌韻箸靴g廾されているものです。看はキ`と、離撻△亮栽になりま す。キ`、離撻△鬟ンマで曝俳り、仝{々仝}々襖凄察で譴鵑捻蹐靴泙后 >>>a = {'place':'osaka', 'year':2016} >>>a['place'] 'osaka'  看嶄に蒙協のキ`が贋壓しているかを{べる栽は、in を聞喘します。 >>>'place' in a True 8/45
  • 9. 3.3 崙囮フロ` a) if 猟  麿の冱Zと揖の if 猟が喘吭されています。インデント(忖和げ)には櫃鬚弔韻討ださい。 訳周猟 g佩するI尖 1 g佩するI尖 2 >>>x = 130 >>>if x < 130: ´ print 'small' ´elif x == 130: ´ print 'equal' ...else: ´ print 'big' ´ b) for 猟  Python の for 猟が麿の冱Zと`うところとして、販吭のシ`ケンス(リスト、猟忖双)にわたって郡甠鯰个い泙后 >>>a = ['osaka', 'city', 2016] >>>for x in a: ´ print x ´ osaka city 2016  方双にわたって郡甠鯰个栽は、range()を聞喘します。range(10)は 0 から兵まり、0 から兵まる 10 の からなるリストを伏撹します。_兵方、鰆原┐靴燭蝓紗方(p富方)を峺協することも竃栖ます。 >>>range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>>for i in range(2,10,2): ´ print i ´ 9/45 スペ`スの方をBえる
  • 10. 2 4 6 8 c) while 猟  while 猟の聞喘圭隈は麿の冱Zと笋錣蠅泙擦鵝V原┐量周を困燭拷gI尖をRり卦します。 >>>cnt = 0 >>>while cnt < 10: ´ print cnt ´ cnt += 1 ´ 3.4 v方 a) v方を旋喘する  for 猟ですでに竃てきていますが、range()は覆排智發気譴討い觸Mみzみv方です。v方を聞喘する 栽は、v方兆にAき仝(々仝)々来凄察で哈き方を耶えてv方を柵び竃します。參和は哈き方として猟忖双を局すと、 猟忖方を卦す len()の箭になります。 >>>len('foss4g') 6 b) v方を恬る  v方の協xは def の瘁にv方兆と哈き方を来凄察で譴鵑俳个い泙后iv方のI尖云悶は、佩を笋┐謄ぅ鵐 ントをして峰します。 >>>def test(a): ´ print a ´ >>>test(10) 10  v方にり、ある栽は、I尖云悶坪で return の瘁に峰します。 >>>def test(a): ´ return a+10 ´ >>>test(10) 20  哈き方に福待辛嬬なデフォルト、鰆原┐靴討くことも竃栖ます。 10/45
  • 11. >>>def test(a=0): ´ print a ´ >>>test() 0 c) 篳のスコ`プ  Python ではv方坪で協xされた篳はv方の坪何でしか聞喘竃栖ません。和の箭ではv方の坪何で 方 a を、v方の翌で篳 a が協xされていますが、eなものになります。 >>>def test(a): ´ a += 10 ´ print a ´ >>>a = 100 >>>test(10) 20 >>>a 100  リストや看のようなきQえ辛嬬なオブジェクトを哈き方として局す栽は歌孚局しになりますので、廣吭が 駅勣になります。 >>>def test(a): ´ a += ['osaka] ´ print a ´ >>>b = ['foss4g'] >>>test(b) ['foss4g', 'osaka'] >>>b ['foss4g', 'osaka'] 3.5 クラス a) クラスを恬る  クラスの協xは class の瘁にクラス兆を峰して佩います。ラクスの坪何にはv方協x、クラス篳を峰しま す。 >>>class test: 11/45
  • 12. ´ def output(self): ´ print 10 ´ >>>a = test() >>>a.output() 10   インスタンス伏撹rにg佩される蒙eなメソッドとして__init__()を協xしておくことが竃栖ます。 >>>class test(): ´ def __init__(self): ´ self.a = 10 ´ def output(self, c): ´ print self.a + c ´ >>>b = test() >>>b.output(10) 20 12/45
  • 13. b) self  a)クラスを恬るで恬撹したクラス嶄に協xされているv方の及匯哈方には ̄self ̄が峺協されています。self を 峺協しておくと、光v方坪から徭附のインスタンスへのアクセスが辛嬬となります。 c) @覚  あるクラスをベ`スとして塗伏クラスを恬撹する栽は、和のような峰をします。 >>>class 塗伏クラス兆(ベ`スクラス兆): ´ クラスの峰  謹嶷@覚も佩え、その栽はベ`スクラスを双い靴泙后 >>>class 塗伏クラス兆(ベ`スクラス兆 1, ベ`スクラス兆2): ´ クラスの峰 3.6 パッケ`ジ a) パッケ`ジ  プログラムがLくなってきた栽、また壅旋喘辛嬬な何瞳に蛍けて砿尖しておく栽、ファイルに蛍護しておき ます。そのHに、ドット原きのモジュ`ル兆を聞って夛晒しておきます。A.B というモジュ`ル兆は、A という パッケ`ジの B というモジュ`ルを燕します。モジュ`ル兆とg悶のディレクトリ、ファイルのvSは和のように なります。 A/ ------ ディレクトリ A B.py --- ファイル B b) import  import の猟として 1 パタ`ンだけB初しておきます。 from A.B import *  貧の猟は、A/B.py からファイル坪のクラス、v方畠てを import することになります。   13/45
  • 14. 4 Python コンソ`ルから荷恬 4.1 すべての児云は QgisInterface から  QGIS を軟咾靴董Python コンソ`ルを羨ちあげて和さい。 ## しい秤鵑肇瓮愁奪匹離螢好箸駅勣な栽は help(iface)とタイプして和さい. という峰が恷兜にかれています。iface が QgisInterface クラスのインスタンスになります。QgisInterface ク ラスは、Python コンソ`ルや、Plugin から QGIS アプリケ`ションにアクセスするHに笥になるクラスです。こ こから、光 GUI パ`ツ、iみzみgみのレイヤ吉にアクセスすることになります。  クラスの協xはドキュメントが巷_されていますので、_Jしましょう。 QGIS API Documentation http://www.qgis.org/api/index.html 14/45
  • 15.  ドキュメントのバ`ジョンには廣吭してください。 ̄QGIS API Documentation ̄の鬉垢襯乂`ジョンがか れています。恷仟(_k井)のドキュメントになっていますので、鬉垢襯乂`ジョンをxkして歌孚するようにし てください。  QgisInterface クラスの協xをてみましょう。2.8 井のドキュメントはこちらになります。 http://qgis.org/api/2.8/classQgisInterface.html   signal と slot という峰が竃てきます。これは Qt の蒙L議なC嬬になります。メニュ`がxkされる、ファイ ルがxkされるといったある嘛(signalがk伏したHに、その嘛にvB原けられてg佩されるv方が slot になります。プログラム嶄では、signal と slot のvB原けは和のような峰で佩います。 QObject.connect(イベントk伏圷インスタンス、SIGNAL('メソッド兆')、イベント鞭け函り枠インスタン ス、SLOT('メソッド兆'))  では、gHに荷恬を佩なって佩きましょう。  15/45 こちらをxk
  • 16. 4.2 ユ`ザインタフェ`ス  QGIS のユ`ザインタフェ`スを、そのクラスから寄eしてみます。 1. 光メニュ`は QMenu クラスで竃栖ています 箭えば、 ̄プラグイン ̄メニュ`にアクセスして燕幣させることは、 >>>pluginMenu =iface.pluginMenu() >>>pluginMenu.show() のように佩えます。また、 ̄プラグイン ̄メニュ`へのメニュ`弖紗/茅メソッドとして、 QgisInterface.addPluginToMenu() QgisInterface.removePluginMenu() が喘吭されていることが、ドキュメントからわかります。すでに喘吭されているメニュ`にvしては、喘吭さ れているメソッドを宥して荷恬を佩えます。 2. 光ツ`ルバ`は QToolBar クラスで竃栖ています。 箭えば、 ̄プラグイン ̄ツ`ルバ`にアクセスして、燕幣/掲燕幣を俳り紋えることは、 >>>pluginToolBar = iface.pluginToolBar() >>>pluginToolBar.hide() >>>pluginToolBar.show() のように佩えます。また、 ̄プラグイン ̄ツ`ルバ`へのアイコン弖紗/茅メソッドとして、 QgisInterface.addToolBarIcon() 16/45 2 3 4 1
  • 17. QgisInterface.removeToolBarIcon() が喘吭されていることが、ドキュメントからわかります。 3. iみzみgみのレイヤ`匯Eには QgisLegendInterface クラスのインスタンスからアクセス竃栖ます。 >>>legend = iface.legendInterface() >>>legend.layers() [] デ`タのiみzみがされていない彜Bでは腎のリストが「ってきます。メニュ`から返咾如△いつかベ クトルデ`タを弖紗してみて和さい。弖紗瘁に QgisLegendInterface にアクセスしてみると、レイヤが 弖紗されていることが_J竃栖ます。和の箭では、ベクトルレイヤを 1 つだけ弖紗してあります。 >>>legend.layers() [<qgis.core.QgsVectorLayer object at 0x0CC376A8>] リストの恷兜のレイヤについて、燕幣/掲燕幣を俳り紋えてみましょう。 >>>layers = legend.layers() >>>legend.setLayerVisible(layers[0], False) >>>legend.setLayerVisible(layers[0], True) 4. QMapCanvas クラスのインスタンスからアクセス竃栖ます。スケ`ルを筝してみましょう。 >>>canvas = iface.mapCanvas() >>>canvas.zoomScale(100000000) 17/45
  • 18. 4.3 ベクトル(輟里縫▲セス)  ne_50m_admin_0_countries.shp をiみzみ、光勣殆にアクセスしてみましょう。 C:workne_50m_admin_0_countries.shp  をiみzむことを覿┐靴泙后 1. ベクトルデ`タのiみzみ >>>iface.addVectorLayer(r'C:workne_50m_admin_0_countries.shp', 'countries', 'ogr') 恷兜の哈き方はiみzむファイル兆、2 桑朕はレイヤ兆各として聞喘されます、3 桑朕の哈き方は聞喘 する QgisDataProvider へのキ`になります。QgisDataProvider はデ`タソ`スからのiみzみ、 きzみ、ハンドリング畠違を佩うクラスです。宥械、ベクトルデ`タをQう栽は ogr を聞喘することで怎 りるはずです。もしオリジナルのデ`タフォ`マット吉に鬉靴 QgisDataProvider を喘吭した栽な どは峺協が駅勣になります。 2. xkされているレイヤを函誼します。いまは 1 つのレイヤしか_いていませんので、枠ほどiみzんだ レイヤが卦ってきます。 >>>layer = iface.activeLayer() 兆各を燕幣して_Jしてみましょう。 >>>layer.name() 3. 畠ての輟厘殆に肝アクセスしてみます。 QgsFeatureIterator クラスを宥して光輟里枕肝アクセス竃栖るようになっています。 >>>features = layer.getFeatures() >>>for feature in features: ´ feature.geometry() ... 箭では、光ベクトル勣殆に肝アクセスを佩い、その輟離ラス(QgsGeometry)をき竃しています。 4. 肝に蒙協の奉來をもったベクトル勣殆をxkしましょう。忽兆は'name'奉來に秘っていることがわかって いるとします。和のように光輟里慂來兆を峺協して岷俊歌孚できます。 >>>feature['name'] レイヤ坪の輟里枕肝アクセスを佩い、奉來をきだしてみます。 >>>features = layer.getFeatures() >>>for feature in features: ´ feature['name'] ... 5. 肝に奉來'name'が'Japan'のベクトル勣殆をxkして、その勣殆の譴縫懇`ムしてみましょう。 >>>features = layer.getFeatures() >>>for feature in features: 18/45
  • 19. ´ if feature['name'] == u'Japan': ´ break ´ >>>canvas = iface.mapCanvas() >>>canvas.setExtent(feature.geometry().boundingBox()) >>>canvas.refresh() 19/45
  • 20. 4.4 ベクトル(宙鮫O協)  レイヤ畠悶の宙鮫O協を筝してみましょう。宙鮫でO協する弼やTりつぶしNeの峺協に、PyQt のクラスが 駅勣になるので、iみzみます。 >>>from PyQt4.QtCore import * >>>from PyQt4.QtGui import * Python コンソ`ルの ̄クラスのインポ`ト ̄から秘薦することもできます。  QgsSymbolV2 というシンボルO協を恬撹しておき、それを layer の宙鮫峺協(renderer)に秘れてあげるという返 で佩います。 >>>layer = iface.activeLayer() >>>symbol = QgsSymbolV2.defaultSymbol(QGis.Polygon) >>>fillLayer = QgsSimpleFillSymbolLayerV2(QColor(255, 0, 0), Qt.SolidPattern) >>>symbol.appendSymbolLayer(fillLayer) >>>renderer = QgsSingleSymbolRendererV2(symbol) >>>layer.setRendererV2(renderer) >>>iface.mapCanvas().refresh()  宙鮫O協については、GUI と曳べながらクラスを冥していくと、わかりやすいと房います。 20/45
  • 21. 4.5 Canvas イベント  canvas 貧でk伏するイベントを憤ってみましょう。canvas 貧でクリックされた了崔と、その了崔の仇尖恙砲 QGIS で喘吭しているメッセ`ジビュ`ワに燕幣します。QMapCanvas クラスではマウスクリックのイベントを憤 うことが竃栖ません。QgsMapTool というクラスを@覚した仟しいクラスを恬撹しておき、イベントk伏rの嘛 を弖紗します。仟しく恬撹したクラスを QMapCanvas クラスにO協することでイベントに鬉気擦泙后 >>>from qgis.gui import * >>>class QgsMapToolClick(QgsMapTool): ... def canvasPressEvent(self, event): ´ dPos = event.pos() ´ mPos = self.toMapCoordinates(dPos) ´ view = qgis.gui.QgsMessageViewer() ´ view.setMessageAsHtml('<p>' + str(dPos.x()) + ',' + str(dPos.y()) + '</p><p>' + str(mPos.x()) + ',' + str(mPos.y()) + '</p>') ´ view.showMessage(True) ´ >>>canvas = iface.mapCanvas() >>>toolClick = QgsMapToolClick(canvas) >>>canvas.setMapTool(toolClick) 21/45
  • 22. 5 Plugin の児云  この嫗では Python コンソ`ルから匯稀xれて、Plugin に駅勣なファイルをテキストエディタを聞喘してシし てきます。 5.1 Plugin の児云撹  QGIS の軟rにiみzまれる python プラグインは、 QGIS インスト`ルディレクトリ/python/plugins ユ`ザ`のホ`ムディレクトリ/.qgis2/python/plugins に秘れておきます。宥械、オリジナルのプラグインを恬撹した栽は、瘁宀に塘崔することになります。windows を覿┐靴泙垢、 C:Usersユ`ザ兆.qgispythonpluginstest というような侘で、plugin 阿離妊レクトリを恬撹することになります。  QGIS は plugins ディレクトリ坪の光ディレクトリをていき、 metadata.txt というファイルからプラグインの秤鵑鰌iみ函ります。また、光プラグインの qgis への弖紗は、 __init__.py から佩われます。__init__.py 坪には、I尖云悶が峰されたクラスを卦すv方をdしておきます。宥械、I 尖云悶はeなファイルに峰する圭が登りやすいので、兆念はなんでもいいですが、恷詰もう1ファイル恬撹す ることになります。 22/45
  • 23. 5.2 Plugin Builder  プラグインに駅勣なファイルをeに喘吭していくことも辛嬬ですが、 ̄Plugin Builder ̄プラグインを聞喘する と、恷詰浣慴な坪否をBえてくれるので宴旋です。仝プラグイン々仝プラグインの砿尖とインスト`ル々か ら ̄Plugin Builder ̄をインスト`ルしましょう。 23/45
  • 24.  インスト`ルがK阻したら、壼堀 plugin builder を軟咾靴泙靴腓Α1慴な秤鵑鯣襪譴襪函▲廛薀哀ぅ鵑鈴r侘を 恬撹してくれます。     まずはプラグインの児云秤鵑箸靴董 Class name: プラグインのクラス兆です。python ファイル坪で聞喘されます。キャメルケ`ス(}栽ZをひとY りとして、勣殆Zの恷兜を寄猟忖)で峰します。 Plugin name: プラグインマネ`ジャ`吉で燕幣されるプラグイン兆 Description: プラグインマネ`ジャ`吉で燕幣されるプラグインのh苧猟 Module name: python のモジュ`ル兆 Version number: プラグインのバ`ジョン Minimum QGIS version: プラグインが嘛する QGIS の恷詰バ`ジョン Author/Company: プラグイン恬宀兆 Email address: 恬宀メ`ルアドレス を秘薦します。 24/45
  • 25.  Aいてプラグインのなh苧を峰します。ここではm輝な猟を秘れておくだけにしましょう。    恬撹するプラグインのテンプレ`トとして 3 N喘吭されています。 ̄Tool Button with dialog ̄をxkしてお いてください。UI としてプラグインg佩rに燕幣される dialog も匯wに恬撹してくれます。メニュ`へ燕幣する 猟忖双と、どのメニュ`に燕幣するかもO協しておきます。 25/45
  • 26.  謹冱Z鬉筌悒襯弋箸鈴r侘も匯wに恬撹することができます。ただし、ここでは恷弌泙離廛薀哀ぅ鵑鰈撹 してみることを朕議としますので、すべてのチェックを翌しておきましょう。   プラグインの音醤栽鷂耋箸鮹_にしておくため、Bug tracker、Repository の Url 秘薦を箔められます。 ここではm輝な猟忖双を秘れておくだけにしましょう。ただし、きちんとしたプラグインを巷_する栽は、github 吉で巷_することが容Xされていることはえておくべきです。 26/45
  • 27.  ここまでの秘薦がKわると、プラグインき竃し枠のディレクトリの峺協になります。 ユ`ザ`のホ`ムディレクトリ/.qgis2/python/plugins にき竃してください。 ユ`ザ`のホ`ムディレクトリ/.qgis2/python/plugins/PluginTest を_き、plugin buider によりファイルが恬撹されていることを_Jしてください。  さて、きだされたプラグインをg佩してみたいところですが、その念にもう匯返g駅勣です。メニュ`、ツ`ル バ`で燕幣されるアイコン鮫颪蓮 icon として聞喘する鮫颯侫.ぅ襪悗離僖垢鰉峰した、Qt のリソ`スファイ ルの嶄にファイル兆が峰されています。ファイル兆は、 resources.qrc となっています。リソ`スファイルは xml で峰されており、坪否は和になります。  このファイル を Python のコ`ドへQしておく駅勣がありますので、pyrcc4 コマンドでQを佩います。 Windows で OSGeo4W を聞喘している栽、OSGeo4W の command shell を軟咾靴董▲廛薀哀ぅ鵑鰈撹 しているディレクトリに卞咾靴討ださい。卞咾靴吹瓠 > pyrcc4 -o resources.py resources.qrc をg佩して resources.py が恬撹されたことを_Jします。 27/45 <RCC> <qresource prefix="/plugins/PluginTest" > <file>icon.png</file> </qresource> </RCC>
  • 28.  これで恷弌泙離廛薀哀ぅ黐撹はK阻です。qgis を羨ち貧げてみましょう。仝プラグイン々仝プラグインの砿尖とイ ンスト`ル々の嶄から ̄plugin test ̄を冥してインスト`ルしてみてください。  腎の dialog が燕幣されるだけのプラグインですが、g佩を_Jできます。 5.3 metadata.txt  駅となるラつかのファイルの坪否をていきましょう。metadata.txt はプラグインにvする秤鵑dされて います。テキストエディタで_いてみましょう。  Qめられた篳に ̄= ̄で、い、魎秘していることがわかります。plugin builder で秘れた秤鵑dされ ていますが、駅勣に鬉犬きQえることができます。 5.4 __init__.py  プラグインiみzみのHに恷兜にiみzまれるファイルです。classFactory()というv方をdしておきます。 この嶄でI尖の云悶となるモジュ`ルをiみzみ、駅勣なインスタンスを卦しています。 QgisInterface のイン スタンスである iface が局されていることを_Jしておきましょう。プラグイン坪でも iface を宥して qgis を荷恬す ることになります。 28/45 [general] name=plugin test qgisMinimumVersion=2.0 description= てすとです version=0.1 author=asahi email=waigania13@gmail
  • 29.    29/45 def classFactory(iface): # pylint: disable=invalid-name """Load PluginTest class from file PluginTest. :param iface: A QGIS interface instance. :type iface: QgsInterface """ # from .plugin_test import PluginTest return PluginTest(iface)
  • 30. 5.5 I尖云悶がdされたファイル  I尖がdされたクラスが恷詰浤屬脹慴があるメソッドは、 initGui(): プラグインが聞喘辛になった栽にg佩されるメソッド unload(): プラグインが聞喘音辛になった栽にg佩されるメソッド の2つになります。  plugin_test.py の坪否をてみましょう。まずは initGui()です。  メニュ`やツ`ルバ`へのプラグインの弖紗徭悶は、self.add_action()で佩われています。add_action()の 嶄の和の佩をてみましょう。  QAction は、メニュ`やツ`ルバ`に弖紗されるユ`ザインタフェ`ス何瞳になります。action の triggerd が callback(哈方で self.run が局されています)に connect されています。  恬撹された QAction がツ`ルバ`とメニュ`に弖紗されているのがわかります。  gHに佩われるI尖は、run()にかれています。  ここでは、恬撹gみのダイアログの燕幣を佩っているだけになります。もし採かg匯のI尖をメニュ`/ツ`ル バ`からxkされたHに佩いたいだけであえば、ダイアログの燕幣何蛍を茅して、この嶄にI尖をけばい いことになります。self.iface から qgis にアクセスもできます。 30/45 def initGui(self): """Create the menu entries and toolbar icons inside the QGIS GUI.""" icon_path = ':/plugins/PluginTest/icon.png' self.add_action( icon_path, text=self.tr(u'plugin test'), callback=self.run, parent=self.iface.mainWindow()) action = QAction(icon, text, parent) action.triggered.connect(callback) if add_to_toolbar: self.toolbar.addAction(action) if add_to_menu: self.iface.addPluginToMenu( self.menu, action) def run(self): """Run method that performs all the real work""" # show the dialog self.dlg.show() # Run the dialog event loop result = self.dlg.exec_() # See if OK was pressed if result: # Do something useful here - delete the line containing pass and # substitute with your code. pass
  • 31.  unload()もてみましょう。   initGui()、add_action()で恬撹した QAction をツ`ルバ`、メニュ`から茅しています。 31/45 def unload(self): """Removes the plugin menu item and icon from QGIS GUI.""" for action in self.actions: self.iface.removePluginMenu( self.tr(u'&plugin test'), action) self.iface.removeToolBarIcon(action) # remove the toolbar del self.toolbar
  • 32. 5.6 ダイアログの筝  plugin builder を聞喘すると、腎のダイアログは恬撹してくれます。このダイアログを筝する圭隈をてみま しょう。  ダイアログの恬撹/筝には、QtCreator を旋喘します。qt のホ`ムペ`ジ(http://www.qt.io/download/ ) から、h廠にあった Qt Creator のダウンロ`ドを佩い、インスト`ルを佩います。  Commercial 井と OpenSource 井がありますので、OpenSource 井にMんでください。 ̄Get Started ̄をxk します。  駅勣なのは QtCreater になりますので、Qt Offline Installer から ̄Qt Creator ̄をxkしてください。h廠に あった Qt Creator のダウンロ`ドを佩い、インスト`ル佩ってください。 32/45
  • 33.  インスト`ルが屎械に佩われると、QtCreator が windows のスタ`トメニュ`に紗わっています。  QtCreator を軟咾靴討ださい。仝ファイル々仝ファイル/プロジェクトを_く々から plugin builder で恬撹された plugin_test_dialog_base.ui を_きます。  鮫中恣のウィジェットボックスから、 ̄Text Edit ̄をドラッグしながら、Dialog 貧に塘崔してください。 塘崔し た ̄Text Edit ̄にプログラムからアクセスする栽には、プロパティに燕幣される ̄objectName ̄でReします。 登りやすいものに笋┐討いた圭が措いですが、書指は恬撹rに秘れられる兆念のままでMみます。 33/45
  • 34.  Dialog 徭悶の寄きさも筝して、m輝な寄きさにしておきましょう。    レイアウトを屁えたら、肝にボタンの signal が、どの slot に connect されているか_Jしておきましょう。和粁 の ̄Signals & Slots Editor ̄から_Jすることができます。   button_box からの accepted() (OK ボタンの signal)が、dialog の accept()に、rejected()が dialog の reject()に、それぞれ connect されていることがわかります。button_box からの signal をeな slot に connect する、もしくは dialog の slot を貧きしてあげればI尖を筝することができます。  恬撹のK阻したダイアログは、仝Save ^plugin_test_dialog_base.ui ̄々で貧きしておきましょう。  dialog の accept()をきQえれば、 ̄OK ̄ボタンが兀されたHにI尖を弖紗することができることがわかりまし た。plugin builder できだされている ̄plugin_test_dialog.py ̄をきQえてI尖を紗えましょう。 34/45
  • 35.   PluginTestDialog クラスは、枠ほど筝した plugin_test_dialog_base.ui を@覚しています。 PluginTestDialog で accept()を協xして貧きしましょう。ここでは富し指りくどいやり圭ですが、accept()の坪否を腎にしてしまいま す。  肝に、plugin_test.py の坪否をきQえます。dialog を恬撹したHに、dialog の button_box の accepted() にeなI尖を connect してしまいます。connect されたメソッドには、レイヤ方を dialog の textEdit にき竃す I尖を峰してあります。 35/45 FORM_CLASS, _ = uic.loadUiType(os.path.join( os.path.dirname(__file__), 'plugin_test_dialog_base.ui')) class PluginTestDialog(QtGui.QDialog, FORM_CLASS): def __init__(self, parent=None): """Constructor.""" super(PluginTestDialog, self).__init__(parent) # Set up the user interface from Designer. # After setupUI you can access any designer object by doing # self.<objectname>, and you can use autoconnect slots - see # http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html # #widgets-and-dialogs-with-auto-connect self.setupUi(self) FORM_CLASS, _ = uic.loadUiType(os.path.join( os.path.dirname(__file__), 'plugin_test_dialog_base.ui')) class PluginTestDialog(QtGui.QDialog, FORM_CLASS): def __init__(self, parent=None): """Constructor.""" super(PluginTestDialog, self).__init__(parent) # Set up the user interface from Designer. # After setupUI you can access any designer object by doing # self.<objectname>, and you can use autoconnect slots - see # http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html # #widgets-and-dialogs-with-auto-connect self.setupUi(self) def accept(self): pass
  • 36. 36/45 class PluginTest: """QGIS Plugin Implementation.""" def __init__(self, iface): C 福待 - # Create the dialog (after translation) and keep reference self.dlg = PluginTestDialog() self.dlg.button_box.accepted.connect(self.set_text) C 福待 - def set_text(self): self.dlg.textEdit.setText(str(self.iface.mapCanvas().layerCount()))
  • 37.   プラグインをg佩して、ダイアログにレイヤ方が燕幣されるか_Jしてみましょう。 6 デバッグh廠  スクリプトが玉いうちは、エラ`のHに燕幣されるメッセ`ジをながら俐屎を佩なっていくことも辛嬬です。た だし}jなI尖になってくると、スクリプトをg佩させながらのデバックが之かせなくなります。Eclipse+PyDev でデバッグに駅勣なh廠をBすることが竃栖ます。  h廠のBはrgがかかるためここでは佩いませんが、歌深Y創だけあげておきます。バ`ジョン吉硬くなっ ていますので、mriみ紋えてください。 ? http://www.areanine.gr.jp/~banjo/QGIS/plugin/lesson3.html ? http://linfiniti.com/2011/12/remote-debugging-qgis-python-plugins-with-pydev/ ? QGIS でアプリケ`ションを恬撹する/QGIS でプラグインを恬撹する http://d.hatena.ne.jp/waigani/20101130 http://d.hatena.ne.jp/waigani/20101229 37/45
  • 38. 7 プロセッシング秘T 7.1 プロセッシングとは  プロセッシングは QGIS で聞える?な盾裂C嬬をまとめるためのフレ`ムワ`クです。GRASS,SAGA な どで戻工される盾裂C嬬を、プロセッシングを宥してy栽してシ`ムレスに聞喘することが竃栖ます。廣吭する 泣としては、プロセッシング徭悶はフレ`ムワ`クなので、光?の盾裂C嬬(SAGA など)はeにインスト`ルさ れている駅勣があります。    兜豚彜Bで仝プロセッシングツ`ルボックス々が燕幣されています。燕幣されていない栽は、メニュ`の仝プロ セッシング々から仝ツ`ルボックス々をxkすることで燕幣させることができます。宥械はこの仝ツ`ルボックス々から プロセッシングのC嬬を聞います。 7.2 Python コンソ`ルからプロセッシング  プロセッシングは喘吭されているC嬬參翌にも、Python で峰したスクリプトを弖紗鞠hすることが竃栖ます。 まずは Python コンソ`ルからプロセッシングを聞喘して、どのような峰を佩うのか、その碧Mみを僥してみ ましょう。  ne_50m_admin_0_countries.shp のみ 1 レイヤがiみzまれており、ここから ̄name ̄奉來 = ^Japan ̄の 侘を select、select した輟里eファイルとしてきzみという匯Bの送れを佩なってみます。  Python コンソ`ルを_いて和さい。恷兜に佩うおこなうことはプロセッシングの import です。 >>>import processing Python コンソ`ルの ̄クラスのインポ`ト ̄から秘薦することもできます。 38/45
  • 40.  このC嬬の聞喘圭隈を_Jします。 >>>processing.alghelp('qgis:selectbyattribute')    燕幣された聞喘圭隈から、哈方が4つ駅勣なこと(恷瘁の哈方 OUTPUT は卦り、量轅屬魃蹐靴討い襪里盃 協の駅勣はありません。)がわかります。 INPUT : 秘薦するベクトルレイヤ(QgsVectorLayer もしくはファイル兆) FIELD : 奉來フィ`ルド兆 OPERATOR : 曳^處麻徨 VALUE : 曳^ を哈方で峺協します。OPERATOR に峺協できる曳^處麻徨のリストも燕幣されます。曳^處麻徨はこの嶄か ら、鬉垢詈忖で峺協することになります。  qgis:selectbyattribute をg佩してみましょう。 >>>layer = iface.activeLayer() >>>selectedResult = processing.runalg('qgis:selectbyattribute', layer, 'name', 0, 'Japan')  g佩には processing.runalg()を聞喘します。恷兜の哈方としてC嬬兆を、肝の哈方からはC嬬阿鳳慴とさ れる哈方を双い靴泙后7気、蓮g佩Y惚を郡啌したファイル兆が秘った看になります。 >>>selectedResult {'OUTPUT': u'C:workne_50m_admin_0_countries.shp',}  qgis:selectbyattribute の栽、仟しいファイルは恬らず秘薦として峺協したファイルを荷恬するC嬬ですの で、秘薦ファイル兆がそのまま卦ってきます。  肝に、gdal のC嬬を旋喘してベクトルデ`タを、フォ`マットを峺協して隠贋してみましょ う。 ̄gdalogr:convertformat ̄の Help を_Jします。 40/45
  • 41. >>>processing.alghelp('gdalogr:convertformat')    秘薦するベクトルレイヤ(もしくファイル兆)とフォ`マットを峺協することがわかります。ただしオプション、竃薦 ファイルは ̄None ̄としておいてください。竃薦ファイルはテンポラリファイルとして恬撹してくれます。g佩して、 恬撹されたテンポラリファイルをiみzみます。 >>>saveResult = processing.runalg('gdalogr:convertformat', selectedResult['OUTPUT'], 1, None, None) >>>processing.load(saveResult['OUTPUT_LAYER'])    このようにプロセッシングを聞うことで、qgis 云悶のC嬬、その麿のライブラリ?アプリケ`ションで喘吭されたC 嬬といった、e?に戻工された盾裂C嬬を揖匯のインタフェ`スから聞喘することが竃栖るようになります。 7.3 v方を旋喘する  プロセッシングは盾裂C嬬をy匯の返で聞えるようにしたフレ`ムワ`クですが、その^殻で喘吭された光 N宴旋クラスも聞喘することが竃栖ます。箭えば、QGIS を OSGeo4W でインスト`ルしたとして、 C:OSGeo4Wappsqgispythonpluginsprocessingtoolsdataobjects.py をいてみましょう。  レイヤへのアクセスクラスなどが喘吭されていて、QGIS Python API の聞喘圭隈としてとても歌深になります。 iみzみgみのラスタレイヤ匯Eを誼るv方は、 41/45
  • 42. のように喘吭されています。匯業てみることをおすすめします。 7.4 プロセッシングスクリプト  プロセッシングにはQまったル`ルで秘薦?竃薦を協xしてあげることで、徭蛍でいたスクリプトを弖紗するこ とができます。また、ネットで巷_されているスクリプトをダウンロ`ドしてきて弖紗することもできます。  スクリプトの嶄附をることが竃栖ますので、てみましょう。仝スクリプト々仝ツ`ル々の仝オンラインスクリプト鹿から スクリプトを秘返々をxkします。   42/45 def getRasterLayers(sorting=True): layers = QgsProject.instance().layerTreeRoot().findLayers() raster = [] for layer in layers: mapLayer = layer.layer() if mapLayer.type() == QgsMapLayer.RasterLayer: if mapLayer.providerType() == 'gdal': # only gdal file-based layers raster.append(mapLayer) if sorting: return sorted(raster, key=lambda layer: layer.name().lower()) else: return raster
  • 43.  ^Hex grid from layer bounds ̄をダウンロ`ドしてみましょう。  仝スクリプト々仝Polygons々に弖紗されますので、嘔クリックして仝スクリプトをシ々をxkします。スクリプトの坪否 が燕幣され、和の坪否となっています。  C嬬を Excute したHのダイアログと曳^すると、丹^の ̄## ̄の何蛍で秘薦/竃薦にvするフォ`ムを峺協し ていることがわかります。このようなgな峺協でフォ`ムを恬撹することが竃栖ますので、議な荷恬が駅勣 になるC嬬參翌は、プロセッシングを旋喘してMみzむ並が書瘁覆砲覆襪繁爾錣譴泙后 43/45 ##Polygons=group ##input=vector ##cellsize=number 1000.0 ##grid=output vector input = processing.getObject(input) extent = input.extent() extent = '%f,%f,%f,%f' %(input.extent().xMinimum()-cellsize/2, input.extent().xMaximum()+cellsize/2, input.extent().yMinimum()-cellsize/2, input.extent().yMaximum()+cellsize/2) processing.runalg('qgis:creategrid', 3, extent, cellsize, cellsize, input.crs().authid(),grid)
  • 44. 44/45
  • 45. 8 歌深Y創  わからないクラス、v方が竃てきたら、児云は QGIS API Documentation から{べます。 http://www.qgis.org/api/  PyQt も駅勣な岑Rになります。 http://pyqt.sourceforge.net/Docs/PyQt4/classes.html  巷塀なテキストとして cookbook があります。   http://www.qgis.org/pyqgis-cookbook/  プロセッシングにvする秤鵑蓮▲泪縫絅▲襪鰌iむことが児云です。 https://docs.qgis.org/2.8/en/docs/user_manual/processing/console.html   和の汐もとても歌深になります。 https://www.packtpub.com/application-development/qgis-python-programming-cookbook  晩云Zで誼られる秤鵑呂泙世泙隻戮覆い任后 埖の凝垢型 http://mf-atelier.sakura.ne.jp/ waigani's dialy http://waigani.hatenablog.jp/ 栽揖氏芙 vIT並嬲 http://midoriit.com/blog.html 寔弥垢婬 http://blog.livedoor.jp/sanakazu/ だら∞らいぶらりぃ゛ http://www.areanine.gr.jp/~banjo/QGIS/plugin/index.html 45/45