以前、GeoNet ブログで 2019/8/23 (金) に弊社永田町オフィスにて開催した「 ArcGIS 開発者のための最新アプリ開発塾 2019 」のハンズオン資料を公開しました。本連載では、そのハンズオンで活用した、「 Data Collection for .NET 」アプリが持つ主要な機能について解説を、前半/後半2回にわたりご紹介しています。
このアプリが持つ主要な機能は以下の4つで、前回の記事では 「 1.認証 」,「 2.オフラインデータの作成 」 について解説を行いましたが、本記事では 「 3. (オフライン)データの編集 」,「 4.オフラインデータとオンラインデータの同期 」 について解説を行います。
1.認証
2.オフラインデータの作成
3.(オフライン)データの編集
4.オフラインデータとオンラインデータの同期
以下のイメージでは、街路樹ポイント データの属性を編集しています。
今回使用している Web マップ では、属性値:「 Condition 」 を使用してポイントのシンボルを定義しているため、「 Condition 」 項目の値を変更するとポイントのシンボルが変更されます。
データ編集時は以下3点が実装のポイントとなります。それぞれの処理概要を説明します。
1.フィーチャの選択
2.属性画面の表示
3.データの更新
GeoView クラスの IdentifyLayersAsync メソッドを使用してクリックした地点にフィーチャがあるかどうか確認することができます。フィーチャが存在する場合、FeatureLayer クラスの SelectFeature メソッドでそのフィーチャを選択します。
※ ソースファイル:DataCollection.Shared\Binding Support\IdentifyController.cs
DataCollection.Shared\ViewModels\MainViewModel.cs
// クリックした地点にフィーチャがあるか確認
var identifyLayersTask = mapView.IdentifyLayersAsync(tapScreenPoint, pixelTolerance, returnPopupsOnly, maxResultCount);
// クリックした地点にフィーチャがある場合
if (identifyLayersTask.Result.Count > 0)
{
// フィーチャを取得
var feature = identifyLayerResult.GeoElements[0] as ArcGISFeature;
// フィーチャを選択
var featureLayer = feature.FeatureTable.FeatureLayer;
featureLayer.SelectFeature(feature);
}
PopupManager と Popup クラスを使用して属性画面を表示させます。そして、StartEditing メソッドで編集開始、FinishEditingAsync メソッドで編集を終了します。
※ ソースファイル:DataCollection.Shared\ViewModels\IdentifiedFeatureViewModel.cs
public PopupManager PopupManager { get; set; }
// 属性画面を表示
PopupManager = new PopupManager(new Popup(feature, featureTable.PopupDefinition));
// 編集開始
PopupManager.StartEditing();
// 編集終了
PopupManager.FinishEditingAsync();
Popup クラスの GeoElement プロパティを使用して編集対象フィーチャを取得します。そして、FeatureTable クラスの UpdateFeatureAsync メソッドを使用してフィーチャの更新を行います。
※ ソースファイル:DataCollection.Shared\ViewModels\EditViewModel.cs
// 編集対象フィーチャの取得
var editedFeature = popupManager.Popup.GeoElement as ArcGISFeature;
// フィーチャの更新
table.UpdateFeatureAsync(editedFeature);
以下のイメージでは、編集したオフラインデータをオンラインデータに同期させています。
オフラインデータとオンラインデータの同期は 「 Esri.ArcGISRuntime.Tasks.Offline 」 ネームスペースにあるクラスやプロパティを使用することによって実現することができます。以下に詳細を記載します。
1.同期用のインスタンス作成
OfflineMapSyncTask クラスの CreateAsync メソッドを使用します。
2.同期用のパラメータ作成
OfflineMapSyncParameters クラスで同期用のパラメータを作成します。パラメータの詳細は以下に記載します。
・SyncDirection ⇒ 同期方法の指定
・RollbackOnFailure ⇒ 処理失敗時にロールバックするかの指定
3.同期用のジョブ作成
OfflineMapSyncJob クラスの SyncOfflineMap メソッドを使用します。
4.同期処理実行
OfflineMapSyncJob クラスの Start メソッドを使用します。
※ ソースファイル:DataCollection.Shared\ViewModels\SyncViewModel.cs
// 1.同期用のインスタンス作成
var syncTask = await OfflineMapSyncTask.CreateAsync(map);
// 2.同期用のパラメータ作成
var taskParams = new OfflineMapSyncParameters()
{
SyncDirection = SyncDirection.Bidirectional,
RollbackOnFailure = true
};
// 3.同期用のジョブ作成
internal OfflineMapSyncJob OfflineMapSyncJob { get; private set; }
OfflineMapSyncJob = syncTask.SyncOfflineMap(taskParams);
// 4.同期処理実行
OfflineMapSyncJob.Start();
いかがでしたでしょうか。本記事では、Data Collection for .NET に実装されている 「 (オフライン)データの編集 」 や 「 オフラインデータとオンラインデータの同期 」 について簡単ですが、機能の解説を行いました。 Web マップを活用してオフラインで使用するアプリの開発を行う際には、本記事の内容を参考にしていただければと思います。また、Data Collection for .NET は 参照するWeb マップを変更するだけで、汎用的にご利用いただけますので、現在業務でお使いのデータでアプリを使用してみてください。
Data Collection for .NET の機能を解説 (前半)