Python でアドインを作ってみよう!:コンボ ボックス編

今回の記事で「Python でアドインを作ってみよう」シリーズは最終回となります。前回までの記事が気になる方は、最下部の「関連リンク」をご参照ください。

最終回では、コンボ ボックスを作成し、コンボ ボックス内で選択した文字列(今回は県名)を使用してレイヤにフィルタ設定を行います。

サンプル データとして以下のデータを使用します。

ESRIジャパン – 全国市区町村界データ

上記のデータを使用してアドインの作成を試す場合は、あらかじめダウンロードをお願いいたします。

アドイン プロジェクトの作成
これまで同様に新規にアドインを作成する場合、そのアドインに関連するファイル群を格納するプロジェクト フォルダが必要です。 アドイン プロジェクトの作成方法については、以前のブログ記事をご参照ください。

プロジェクトの基本設定
1. 作成したプロジェクトに対し、名称や作成者などのプロパティを設定していきます。項目の詳細は以下のようになります。
※入力する値は適宜変更してください。

・Select Product : ArcMap (対象アプリケーション)
・Name : SampleAddin5 (ツール名/カテゴリ名)
・Version : 0.1 (バージョン)
・Company : Esri Japan (会社/組織)
・Description : サンプル コンボ ボックス (説明)
・Author : Esri Japan (作成者)
・Image : ※デフォルト画像のままで構いません。 (アドインに関連づけられた画像)

01

2. [Save] をクリックし、プロジェクトを保存します。

コンボ ボックスの作成

コンボ ボックスはツールバーに格納する必要があります。そのため、まずはツールバーの作成を行います。

1. [Python Add-In Wizard] の [Add-In Contents] タブをクリックします。
2. [TOOLBARS] を右クリックし、[New Toolbar] を選択します。
3. 以下の項目を設定します。

・Caption : Python ツールバー3 (表示名)
・ID : デフォルトのままで構いません (アドインを識別するための一意の名前)
・Show Initially : チェックあり (アプリケーション起動時に表示/非表示)

ツールバーが作成できましたら、ツールバーに格納するコンボ ボックスの作成を行います。

4. [ArcGIS Python Add-In Wizard] ダイアログの左側のウィンドウから、追加された [Toolbar] を右クリックし、[New Combo Box] を選択します。
5. 以下の項目を設定します。

・Caption : 県名でフィルタ設定 (コンボ ボックス名)
・Class Name : SetFilter (コンボ ボックスのクラス名)
・ID : SampleAddin5_addin.combobox (アドインを識別するための一意の名前)
・Tooltip : これはツールチップです。 (ツールチップ)
・Message : これはツールの説明です。 (説明)
・Help Headling : これは見出しです。 (ヘルプ コンテンツの見出し)
・Help Content : これはヘルプ コンテンツです。(ヘルプ コンテンツ)

6. [Save] をクリックします。
7. [Open Folder] をクリックします。

[Save] ボタンをクリックした時点で、コンボ ボックスを作成するためのファイル群がプロジェクト フォルダ内に作成されます。次のステップでは、コンボ ボックスの動作を記述します。

コードの記述
1. 開かれたプロジェクト フォルダから「Install」フォルダを開きます。
2. フォルダ内から「<プロジェクト フォルダ名>_addin.py」スクリプト ファイルを任意の Python エディタで開きます。

Python アドイン ウィザードは、作成するコマンドの種類によって、そのコマンドを使用して行われた操作に対する処理を記述するブロックが自動的に追加されるようになっています。今回は、コンボ ボックスを作成したので、コンボ ボックスの初期設定を記述するとブロックや「onSelChange」(コンボ ボックス内に格納されている文字列が選択された場合)、「OnEnter」(キーボードの Enter キーが押下された場合)といったコンボ ボックスに対する動作に呼応した関数が用意されています。これらは「イベント」と呼ばれ、ユーザーがコンボ ボックスに対する動作に合わせて、イベント内で記述したコードが実行されます。

02


3. import arcpy の上に以下のコードを追加します。 

#coding:cp932

03


今回は、初期状態ではコンボ ボックスには何も表示させず、[コンテンツ] ウィンドウで選択したレイヤの属性値を読み取り、動的に選択項目をコンボ ボックスへ追加するコードを記述していきます。 


4. 初期状態でコンボ ボックスに何も表示させないために、「__init__」ブロック内の「self.items」文を削除します。

04


5. 「OnEnter」ブロック内に以下のコードを記述します。
※Python ではインデント(空白)も言語を構成する一部です。下図を参考に、インデント数に気を付けながら記述してください。 


def onEnter(self):
lyr = pythonaddins.GetSelectedTOCLayerOrDataFrame()
vals = {}
cur = arcpy.da.SearchCursor(lyr,”KEN”)
for row in cur:
vals[row[0]] = “a”
self.items = vals.keys()

05


上記のコードは、コンボ ボックス上でキーボードの Enter キーを押すことで、[コンテンツ] ウィンドウ上で選択しているレイヤの「県名」フィールドに格納されている属性値の一覧を取得し、コンボ ボックスの選択項目として追加する内容となります。 


6. 「onSelChange」ブロック内に以下のコードを記述します。
※Python ではインデント(空白)も言語を構成する一部です。下図を参考に、インデント数に気を付けながら記述してください。

def onSelChange(self, selection):
lyr = pythonaddins.GetSelectedTOCLayerOrDataFrame()
lyr.definitionQuery = ‘”KEN” = ‘ + “‘” + selection + “‘”
arcpy.RefreshActiveView()

06

上記のコードは、コンボ ボックスで選択された文字列を使用して、選択レイヤに対してフィルタ設定を行っています。(選択した文字列は関数で定義されている「selection」変数に自動的に格納されます。)また、最後に ArcMap の再描画を行っています。 

7.  「<プロジェクト フォルダ名>_addin.py」を上書き保存し、Python エディタを閉じます。 

アドイン ファイルの作成

Python アドインは、プロジェクト フォルダ内にある「makeaddin.py」をダブルクリックするだけで、先ほど記述したコードなどを基に、自動でアドイン ファイルが作成されます。

1. プロジェクトフォルダに移動し「makeaddin.py」ファイルをダブルクリックします。
2. しばらくすると、プロジェクトフォルダ内に「<プロジェクト名>.esriaddin」ファイルが作成されます。

アドインの検証

作成したアドインが正常に動作するかを検証しましょう。
1. プロジェクトフォルダ内の「<プロジェクト名>.esriaddin」ファイルをダブルクリックします。
2. [Esri ArcGIS Add-In Installation Utility] の [Install Add-In] をクリックします。
3. 「Installation succeeded」メッセージが表示されたら、[OK] をクリックします。
4. ArcMap を起動し、[ArcMap – はじめに] ダイアログが表示される場合は、[キャンセル] をクリックします。
5. [Python ツールバー3] ツールバーが表示されていることを確認します。
※ もし表示されてない場合は、ArcMap の [カスタマイズ] メニューから [ツールバー] → [Python ツールバー3] を選択してください。

07

6. ダウンロードした「japan_ver72.shp」シェープファイルをマップに追加します。 

7. 現在 [県名でフィルタ設定] コンボ ボックスには、何も追加されていないことを確認します。(ボックス クリックすると選択項目が表示されます。)

08

8. [コンテンツ] ウィンドウで「japan_ver72」レイヤが選択されていることを確認し、コンボ ボックスを選択後、キーボードの Enter キーを押します。再度コンボ ボックスを開くと県名の一覧が追加されています。

09


9. 県名の一覧からどれでもいいので選択しますと、選択した文字列を使用してレイヤにフィルタ設定が適用されます。つまりは、選択した県のみが表示されます。


今回は、レイヤにフィルタ設定を行う内容でしたが、選択レイヤに対し、コンボ ボックスで選択した数値を用いてバッファ処理を実行するなど、ジオプロセシング ツールと組み合わせた利用方法も考えられます。

以上で Python アドイン シリーズは終了となります。Python アドインを用いることで、より対話的な機能を実現できます。ブログ記事では基本的な機能の実装をご紹介しましたが、是非とも Python アドインを今後も活用し、業務に役立ててみてください! 


■関連リンク
ArcGIS for Desktop ヘルプ
Python Add-In Wizard
Python アドインとは

ArcGIS ブログ
Python でアドインを作ってみよう!:概要編
Python でアドインを作ってみよう!:ボタン編
Python でアドインを作ってみよう!:ツール編
Python でアドインを作ってみよう!:エクステンション編
Python を使って ArcGIS での作業効率を上げよう!

フォローする