ArcGIS Explorer のカスタマイズ Part4:アドインの実装

Part 3 では、アドインを作成する方法を学ぶためのリソースを紹介しました。今回は、アドインを作成する方法をシナリオに沿ってご紹介します。
シナリオは、ユーザがマップ上にポリゴンを描画することでレイヤに対して空間検索を実行し、結果を新たなレイヤとしてマップに追加するというものです。
このソース コードは、ArcGIS Online から取得できます。このサンプルではアメリカのデータを使用していますが、本ブログでは “Japan” という名前のデータを使用します。また、日本語化している個所もあります。

Agx1_3

最初のステップは、どのタイプのアドインが適切なのか決めることです。今回のアドインではユーザによってポリゴンがマップに描画されるので、ボタン アドインが適しています。

Agx2_4

ボタン アドイン クラスは、ユーザがリボン上のアドインをクリックすることで応答するコードをボタンに実装する OnClick メソッドを持っています。その中に記述する最初のコードで ActiveMapDisplay を取得します。これは、Visual Studio で ArcGIS Explorer SDK が提供する activeMapDisplay のスニペットを介して簡単に行うことができます。

Agx3_6

次に、MapDisplay クラスの TrackPolygon() メソッドを使用します。このメソッドはアプリケーションをデジタイズ モードに設定し、ユーザがマップを 2 回以上クリックし、最後にダブルクリックすると TrackPolygon から返されたポリゴンが作成されます。

Agx4_6

Japan レイヤに対して空間検索を実行するためには、マップ上でそのレイヤを見つける必要があります。これは Map オブジェクト(MapDisplay 経由でアクセスします)の FindByName() メソッドを使用して簡単に実行できます。今回の場合、戻り値のタイプが FeatureLayer であることが確実に分かっているので、以下のように問題なく FeatureLayer へキャストすることができます。FeatureLayer には、FeatureLayer の基になる実際のデータを含む Table オブジェクトへのアクセスを提供する Table プロパティがあります。
そして Table.Search() メソッドを使用してテーブル内のデータを検索します。Search() メソッドを正しく使用するには、Filter オブジェクトを指定する必要があります。Filter オブジェクトを作成するためのオプションの 1 つとして、空間フィルタとして機能するジオメトリを渡します。今回の場合、入力 Geometry としてユーザが定義したポリゴンが、FilterSearchOption として、Intersects 定数が渡されます。これにより、ユーザがマップに描いたポリゴンに交差する “Japan” レイヤのフィーチャを返します。

Agx5_4

Search() メソッドは状況に応じて様々な処理を行える RowCollection を返します。しかし、新しい QueryDefinition プロパティ経由で直接 FeatureLayers のフィルタリングを行う バージョン 1500 の API の新しい方法を見てみます。今回のシナリオでは、RowCollection 内のすべての行をループし、ObjectIDs をカンマで区切った文字列を作成し、QueryDefinition プロパティに設定する文字列検索内で SQL 演算子 “IN” と共に使用します。

Agx6_3

QueryDefinition プロパティが FeatureLayer にいったん設定されると、レイヤがマップにどのように表示されるかを定義するために SetSymbol() メソッドを使用します。今回はシンプルな赤のアウトラインを選択します。最後に、基となるデータ ソースの接続に成功するかチェックするために FeatureLayer の Connect() メソッドを使用します。戻り値が true ならマップに新しいレイヤを追加でき、レイヤはコンテンツ ウィンドウの最上位に追加されます。

Agx7_3

今回は、目的に適した正しいタイプの Visual Studio アドイン プロジェクトを選び、エントリ ポイントとして OnClick メソッドをオーバーライドしたコード(ArcGIS Explorer API で一般に行われる処理を示すコード)を書くことで ArcGIS Explorer アドインを実装する流れをご紹介しました。API に関する詳細は SDK ヘルプをご参照ください。