※本記事は、連載記事「.NET SDK アプリ構築」の第 7 回目の記事です。
前回 (第6回) の記事では、地図上に表示したフィーチャ サービスの物件データの属性情報をマップチップ(地図上に表示されるポップアップ情報)として表示する手順を紹介しました。今回は地図上に表示している物件データを物件の築年数を使用してフィルター表示する方法を紹介します。
ServiceFeatureTable.Where プロパティ
第5回 (アプリケーション認証と主題図の追加) では ArcGIS Online にアップロードした物件データのフィーチャサービスを表示するために Map クラスに FeatureLayer クラスを追加し、FeatureLayer の FeatureTable プロパティに ServiceFeatureTable を設定しました。ServiceFeatureTable はフィーチャ サービスなどのオンラインデータを読み込むためのクラスであり、ServiceFeatureTable.ServiceUri プロパティにデータソースとなるサービスの URL (REST エンドポイント)を指定することでデータを読み込むことができます。
[MainWindow.xaml]
<!--マップビュー--> <esri:MapView Grid.Column="1" x:Name="mainMapView" Loaded="mainMapView_Loaded"> <!--マップ--> <esri:Map InitialViewpoint="15539982.3500528, 4257132.45180773, 15545386.0541707, 4262306.70411199"> <!--背景地図レイヤ--> <esri:ArcGISTiledMapServiceLayer ID="BaseMap" ServiceUri="http://services.arcgisonline.com/arcgis/rest/services/World_Topo_Map/MapServer " /> <!--物件フィーチャレイヤ--> <esri:FeatureLayer ID="BuildingLayer"> <esri:FeatureLayer.FeatureTable> <esri:ServiceFeatureTable OutFields="*" ServiceUri="{StaticResource BuildingLayerURL}" /> </esri:FeatureLayer.FeatureTable> </esri:FeatureLayer> <!--住所検索結果表示用グラフィックスレイヤ--> <esri:GraphicsLayer ID="GeocodingResultLayer" Renderer="{StaticResource redMarkerRenderer}" /> </esri:Map> </esri:MapView>今回は、この ServiceFeatureTable の Where プロパティに条件文を設定することで、ArcGIS Online のフィーチャ サービスから特定の条件を満たすレコードのみを読み込む機能を追加します。
ServiceFeatureTable.Where プロパティに設定できる条件文
ArcGIS Online にホストした物件フィーチャサービスは内部的には表形式のデータであり、各物件を 1行としてその 1行に物件の位置データ(座標値)と物件の属性データ(物件名、住所、築年数など)が格納されています。ServiceFeatureTable.Where プロパティに設定できる条件文はこの表形式のデータに対して実行する SQL 文の Where 句に相当し、一般的な SQL 構文を使用することができます。物件フィーチャ サービスの表形式データとしての定義は、フィーチャ サービスのREST エンドポイントのページで確認することができます(※ REST エンドポイントの表示方法は第4回 (フィーチャ サービスの公開) を参照してください)。

物件の築年数は、物件フィーチャ サービスの「Age」フィールドに格納されているので、今回実装する築年数のフィルタには以下の SQL 構文を使用します。
| 条件 | 使用する SQL 構文 |
|---|
| フィルタ無し | [条件文なし] |
| 築5年未満 | Age<5 |
| 築5年以上10年未満 | Age>=5 AND Age<10 |
| 築10年以上 | Age>=10 |
REST エンドポイントのページではフィーチャ サービスに対して実行できるクエリなどの操作を確認することもできます。ページ下部の「Supported Operations」セクションの 「Query」をクリックし、Query 実行ページに移動することができます。

Query ページの Where セクションにSQL構文を入力して「Query (GET)」ボタンをクリックし、結果がページ下部に表示されれば SQL 構文が正しいことを確認することができます。

フィルタ機能を実装するための手順の概要
ServiceFeatureTable.Where プロパティに条件文を設定して、築年数によるフィルタ機能を実装するための手順は以下の通りです。
- 表示する物件の築年数を指定するためのドロップダウンメニューの追加
- 築年数ドロップダウンメニューのアイテムが選択された際のイベントハンドラの追加
- 選択された築年数と一致する物件を表示するための条件文を ServiceFeatureTable.Where プロパティに設定する処理をイベントハンドラに追加
- 物件フィーチャレイヤを再読み込みし、条件に一致する物件レコードのみをフィーチャ サービスから取得
1. ドロップダウンメニューの追加
条件分岐を指定するためのドロップダウンメニューはサンプル ソースコードの画面レイアウトにすでに追加されています。ComboBox クラスを使用し、メニューに表示される項目として「フィルタ無し」、「築5年未満」、「築5年以上10年未満」、「築10年以上」の 4 つの ComboBoxItem が追加されています。
[MainWindow.xaml]
<!--築年数フィルタメニュー--> <TextBlock Grid.Column="0" Grid.Row="0" Text="築年数:" VerticalAlignment="Center" HorizontalAlignment="Right" /> <StackPanel Grid.Column="1" Grid.Row="0" Orientation="Horizontal"> <ComboBox x:Name="yearComboBox" Width="160" Height="25" HorizontalAlignment="Left" VerticalContentAlignment="Center" SelectedIndex="0"> <ComboBoxItem Content="フィルタ無し" /> <ComboBoxItem Content="築5年未満" /> <ComboBoxItem Content="築5年以上10年未満" /> <ComboBoxItem Content="築10年以上" /> </ComboBox> </StackPanel>
2. フィルタが選択された場合のイベントハンドラの追加
上記で確認した ComboBox の SelectionChanged イベントにイベントハンドラを設定します。
[MainWindow.xaml]
<ComboBox x:Name="yearComboBox" Width="160" Height="25" HorizontalAlignment="Left" VerticalContentAlignment="Center" SelectedIndex="0" SelectionChanged="yearComboBox_SelectionChanged">
[MainWindow.xaml.cs]
/// <summary> /// 築年数フィルタコンボボックス変更時の処理 /// </summary> private void yearComboBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { }3. イベントハンドラにフィルタ設定処理の追加
追加した yearComboBox_SelectionChanged イベントハンドラ内に、選択された築年数に応じた条件文を ServiceFeatureTable の Where プロパティに設定する処理を記述することで、ドロップダウンメニューの選択された築年数と一致する物件のみを表示することができます。
[MainWindow.xaml.cs]
/// <summary> /// 築年数フィルタコンボボックス変更時の処理 /// </summary> private void yearComboBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { //マップが準備できていなければ処理を行わない if (!isMapReady) return; //選択されたコンボボックスによりWhere句文字列を設定 string whereString; switch (yearComboBox.SelectedIndex) { case 1: whereString = "Age<5"; break; case 2: whereString = "Age>=5 AND Age<10"; break; case 3: whereString = "Age>=10"; break; default: whereString = string.Empty; break; } //物件フィーチャレイヤのフィーチャテーブルにWhere句を設定 ServiceFeatureTable serviceFeatureTable = buildingLayer.FeatureTable as ServiceFeatureTable; serviceFeatureTable.Where = whereString; }switch 文を使用して選択されたドロップダウンメニュー(ComboBox)のアイテムのインデックスに応じた Where プロパティに適切な条件文を選択し、すでに定義されている物件フィーチャ レイヤのメンバ変数である buildingLayer の FeatureTable(ServiceFeatureTable) プロパティの Where プロパティに選択された条件文を設定します。
4. 物件フィーチャ サービスの再描画
ServiceFeatureTable の Where プロパティに設定した条件文を反映させて条件に一致したレコードのみを表示させるために、物件フィーチャ サービスを再描画します。
[MainWindow.xaml.cs]
/// <summary> /// 築年数フィルタコンボボックス変更時の処理 /// </summary> private void yearComboBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) { ・・・[中略]・・・ //物件フィーチャレイヤを再描画 serviceFeatureTable.RefreshFeatures(false); }ServiceFeatureTable.RefreshFeatures メソッドを使用すると、ArcGIS Online からデータを再度読み込んで物件フィーチャ レイヤを再描画することができます。データを読み込む際にイベントハンドラ内で設定した Where 句の条件文が適用され、条件と一致する物件レコードのみが ArcGIS Online の物件フィーチャ サービスから読み込まれます。
以上で築年数によるフィルタ機能の実装は完了です。アプリケーションを実行し築年数フィルタのドロップダウンメニューを変更することで表示される物件のポイントがフィルタされることを確認してください。
[築5年未満のフィルタ適用時]

[築10年以上のフィルタ適用時]

本記事では地図上に表示している物件データを物件の築年数を使用してフィルター表示する方法を紹介しました。第8回の記事では、道路ネットワークを使用した到達圏解析の機能を実装する方法を紹介します。
関連リンク
ArcGIS Runtime SDK for .NET サンプル アプリ構築:
ESRIジャパン Web サイト:
Esri 社(米国) Web サイト: