はじめに
本シリーズ記事では、クエリ レイヤーの公開方法・ ArcGIS Maps SDK for .NET でクエリ レイヤーを利用する方法を2部構成でご説明いたします。前回の記事ではエンタープライズ ジオデータベースを用いたクエリ レイヤーの概要と公開方法に関してご紹介しました。今回は公開されたレイヤーを ArcGIS Maps SDK for .NET で開発するクライアント アプリケーションにてマップ表示する方法、参照元 DB を更新する方法に関してご説明していきます。
本記事では前回の構成に加え、下記の構成で作業を実施していきます。
※ArcGIS Maps SDK for .NET の利用方法はこちらのサイトをご参照ください。
作業環境
SDK | ArcGIS Maps SDK for .NET 200.3 |

レイヤーのマップ表示
公開されているレイヤーを呼び出し、クライアント アプリケーションに表示させます。
公開からマップ表示までの一連の処理は通常のフィーチャ レイヤーと同一となります。
手順としては、まずレイヤーを公開したサーバーのサービスにアクセスし、サービスの URL をレイヤー ID まで含む形で取得します。

次に ArcGIS Maps SDK for .NET を用いてコーディングしていきます。
先ほど取得したサービスの URLを基にフィーチャ サービスの URL(_featureLayerPath) を指定して、フィーチャ テーブル (ServiceFeatureTable) オブジェクトを作成します。次にフィーチャ テーブルからフィーチャ レイヤー (FeatureLayer) オブジェクトを作成します。最後にMap オブジェクトの操作レイヤー (OperationalLayers) にフィーチャ レイヤーを追加することで下図のようにマップにレイヤーが表示されます。
//サービス URL
public string _featureLayerPath = <サービスURL>;
//フィーチャテーブル
public ServiceFeatureTable serviceFeatureTable;
//フィーチャレイヤー
public FeatureLayer featureLayer;
serviceFeatureTable = new ServiceFeatureTable(new Uri(_featureLayerPath));
featureLayer = new FeatureLayer(serviceFeatureTable);
MyMapView.Map.OperationalLayers.Add(featureLayer);

クエリ レイヤー内の各テーブルの追加・更新処理
クエリ レイヤーにて結合したテーブル自体には追加・更新できないため、結合元のテーブルに対し個々に追加・更新を行います。その際、レイヤーとスタンドアロン テーブルでサービスの参照先が一部異なります。また、テーブルへの追加と更新では処理内容が異なります。
サービスの参照先(レイヤーの場合)
公開したレイヤーのサービスの URL をレイヤー ID まで含む形で取得します。

サービスの参照先(スタンドアロン テーブル の場合)
レイヤーの場合と異なり、空のレイヤーがレイヤー ID の 0 番目に格納され 1 番以降にスタンドアロン テーブルが格納されます。
該当のスタンドアロン テーブルを確認し、 URL をレイヤー ID まで含む形で取得します。

追加・更新処理
追加と更新ではコーディングの仕方が異なります。
まず、追加・更新の共通処理として、サービスの URL を基にフィーチャ サービスの URL(_featureLayerPath) を指定して、フィーチャ テーブル (ServiceFeatureTable) オブジェクトを作成します。
//サービス URL
private string _ featureLayerPath = <サービス URL>
//フィーチャテーブル
public ServiceFeatureTable serviceFeatureTable;
serviceFeatureTable = new ServiceFeatureTable(new Uri(_featureLayerPath));
次にデータ追加の場合とデータ更新の場合の記述方法をそれぞれご説明いたします。
データ追加の場合
データ追加用の空のフィーチャを作成します。作成したフィーチャを読み込み、データをフィールドに設定します。最後にテーブルへ今回作成したフィーチャを追加し、変更をフィーチャ サービスにアップロードします。
Feature Feature_Geo = serviceFeatureTable.CreateFeature();
await (Feature_Geo as ArcGISFeature).LoadAsync();
Feature_Geo.SetAttributeValue(<フィールド名>, <値>);
await serviceFeatureTable.AddFeatureAsync(Feature_Geo);
await serviceFeatureTable.ApplyEditsAsync();
以下の動画はデータを追加した際の例となります。
本例では東京都の公園をシンボル表示しています。
今回はジオコーディングで千代田区の ESRIジャパン本社の住所に公園シンボルを追加し、レイヤーの表示が切り替わることを確認しました。
データ更新の場合
クエリにて更新対象のデータを取得します。まずパラメーター クラスのインスタンスを作成し、更新対象を探索するクエリの条件句を設定します。クエリを実行し、結果を取得します。取得したデータに対し繰り返し処理を実施します。繰り返し処理内にて、個々のフィーチャを読み込みフィールドごとに値を設定し、テーブルへ今回更新したフィーチャを追加、変更をフィーチャ サービスにアップロードします。
QueryParameters param = new QueryParameters();
param.WhereClause = <SQLのWhere句の内容を記述>;
FeatureQueryResult featureResult = await serviceFeatureTable.QueryFeaturesAsync(param);
foreach (Feature feature in featureResult)
{
await(feature as ArcGISFeature).LoadAsync();
feature.SetAttributeValue(<フィールド名>, <値>);
await serviceFeatureTable.UpdateFeatureAsync(feature);
await serviceFeatureTable.ApplyEditsAsync();
}
以下の動画はデータを更新した際の例となります。
本例では東京都の区毎の平均家賃をクラス分けし表示しています。
今回は千代田区の平均家賃を 110000 円から 4000 円に変え、レイヤーの表示が切り替わることを確認しました。
最後に
本記事では、公開されたレイヤーを ArcGIS Maps SDK for .NET で開発するクライアント アプリケーションにてマップ表示する方法、参照元 DB を更新する方法をご説明しました。参照元 DB を追加・更新することにより、同じ DB を利用している他システムと連携できます。連携により、レイヤー情報のリアルタイム変更や他システムへのデータの反映等できますので、是非お試しください。
参考資料
・クエリ レイヤー
・ArcGIS Enterprise
・エンタープライズ ジオデータベース セットアップガイド (SQLServer)
・ArcGIS Maps SDK for .NET Library Reference
・ArcGIS Developers 開発リソース集
・ArcGIS Maps SDK for .NET
・サンプルコード