はじめに
「ArcGIS Runtime SDK で実現できるオフラインワークフロー」シリーズブログでは、オフラインアプリの開発を始める方の第一歩として、ArcGIS Runtime で実現できるオフラインワークフロー、データの準備、ポイントとなるコードについてご紹介しています。
- ArcGIS Runtime で実現できるオフラインワークフロー ~概要編~
- ArcGIS Runtime で実現できるオフラインワークフロー ~デスクトップ パターン~
- ArcGIS Runtime SDK で実現できるオフラインワークフロー ~サービス パターン~
前回の記事では、オフラインワークフローの 2 つのパターン(デスクトップ パターン、サービス パターン)について、それぞれの特徴をご紹介しました。シリーズ第 2 回目となる今回は、デスクトップ パターンを実現するために必要なデータの作成方法とデータを読み込むためのコードをご紹介します。
デスクトップ パターン実現に必要な手順
①モバイル マップ パッケージの作成
②モバイル マップ パッケージの読込
①モバイル マップ パッケージの作成
デスクトップ パターンではモバイル マップ パッケージやモバイル シーン パッケージを読み取り専用のオフラインデータとして使用します(本記事ではモバイル マップ パッケージを使用します)。モバイル マップ パッケージを読み込むだけでArcGIS Pro で作成したマップをアプリでもそのまま表示することができるので、レイヤーを追加したり、レイヤーのスタイルを設定したりする機能のコーディングが不要になります。そのため、開発コストを抑えることができます。
モバイル マップ パッケージの作成手順
モバイル マップ パッケージの作成手順は以下になりますが、詳細はこちらをご参照ください。
- ArcGIS Pro でマップを作成
- マップにレイヤーを追加/スタイル設定
- ジオプロセシング ツールを使用してモバイル マップ パッケージを作成
②モバイル マップ パッケージの読込
モバイル マップ パッケージの読込は以下の手順で実行します。
- MobileMapPackage クラスの OpenAsync メソッドでモバイル マップ パッケージ のディレクトリを指定してパッケージの読込
- 「1」で読込んだパッケージをMapview クラスの Map プロパティに格納
// モバイル マップ パッケージの読込
MobileMapPackage offlineMapPackage = await MobileMapPackage.OpenAsync(pathToUnpackedPackage);
// モバイルマップパッケージに格納されているデータをマップに展開する
var map = offlineMapPackage.Maps.First();
MyMapView.Map = map;
// ベースマップ読込
MyMapView.Map.Basemap = Basemap.CreateImagery();
こちらはESRIジャパンが Githubに公開しているサンプルのモバイル マップ パッケージとベースマップを読み込んだものです。上記サンプルコードを試される際にご使用ください。
チャレンジ①:有効期限付きのモバイル マップ パッケージの読込
ArcGIS Pro 2.4 以降では作成するモバイル マップ パッケージに対してマップの有効期限を設定することができます(ArcGIS Publisher エクステンションが必要です)。そして、MobileMapPackage クラスの Expiration プロパティを使用することで、アプリ起動時にモバイル マップ パッケージの有効期限を読み込んでマップの使用可否の判定や有効期限までの日数のリマインドをすることなどができます。
// モバイル マップ パッケージを読み込む
MobileMapPackage offlineMapPackage = await MobileMapPackage.OpenAsync(data);
// モバイル マップ パッケージの有効期限を読み込む.
Expiration expirationDetails = offlineMapPackage.Expiration;
System.Text.StringBuilder messageBuilder = new System.Text.StringBuilder();
// モバイル マップ パッケージの有効期限が過ぎているか判定する
if (expirationDetails.IsExpired)
{
messageBuilder.AppendLine("モバイル マップ パッケージの有効期限が過ぎています:");
// 有効期限が過ぎていても使用可能かどうかを判定する.
switch (expirationDetails.Type)
{
case ExpirationType.AllowExpiredAccess:
messageBuilder.AppendLine("このマップは使用することができますが、有効期限が過ぎていないものに取り換えてください。");
MessageBox.Show(messageBuilder.ToString());
break;
case ExpirationType.PreventExpiredAccess:
messageBuilder.AppendLine("このマップは使用することができません。");
MessageBox.Show(messageBuilder.ToString());
return;
}
}
// モバイル マップ パッケージの有効期限が過ぎていない場合
else
{
// 有効期限まであと何日かを出力
System.DateTimeOffset expirationDate = expirationDetails.DateTime;
double daysLeft = expirationDate.Subtract(System.DateTime.Today).TotalDays;
messageBuilder.AppendLine(string.Format("このマップの有効期限はあと {0} 日です", Math.Ceiling(daysLeft)));
// 有効期限が過ぎたら使えなくなるモバイル マップ パッケージの場合
if (expirationDetails.Type == ExpirationType.PreventExpiredAccess)
{
messageBuilder.AppendLine("有効期限を過ぎたらこのマップは使用できなくなります");
}
MessageBox.Show(messageBuilder.ToString());
}
有効期限の設定は、定期的に最新のモバイル マップ パッケージを作成するためのリマインダーとして、また、データを委託先の開発会社に渡す際などに役に立ちます。
チャレンジ②:編集用データとしてシェープファイルの読込
上述したように、デスクトップ パターンではモバイル マップ パッケージやモバイル シーン パッケージを読み取り専用のオフラインデータとして使用します。しかし、業務によってはデータの編集が必要になる場合もあるかと思います。その際は、読み取り専用データに加えて、シェープファイルや GeoPackage などをローカルデータとして保持し、それらに対してデータの編集を行う必要があります。
※シェープファイルや GeoPackageの読込/編集を行うためには Standard ライセンス以上が必要です。詳細はこちらをご確認ください。
シェープファイルの読込は以下の手順で実行します。
- ShapefileFeatureTable クラスの OpenAsync メソッドを使用してシェープファイルをオープン
- 「1」でオープンしたシェープファイルを FeatureLayer としてマップに追加
// ベースマップの読込
MyMapView.Map = new Map(Basemap.CreateImagery());
// シェープファイルのディレクトリ
string filepath = @"";
// シェープファイルをオープン
ShapefileFeatureTable myShapefile = await ShapefileFeatureTable.OpenAsync(filepath);
// オープンしたシェープファイルをレイヤーに格納
FeatureLayer newFeatureLayer = new FeatureLayer(myShapefile);
// レンダリング
Symbol sym = null;
SimpleLineSymbol lineSym = new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, Color.Black, 0.5);
sym = new SimpleFillSymbol(SimpleFillSymbolStyle.Solid, Color.Pink, lineSym);
newFeatureLayer.Renderer = new SimpleRenderer(sym);
// 上記レイヤーマップに追加
MyMapView.Map.OperationalLayers.Add(newFeatureLayer);
// ズーム
await MyMapView.SetViewpointGeometryAsync(newFeatureLayer.FullExtent, 50);
こちらはESRIジャパンが公開している全国市区町村界データ(シェープファイル)を読み込んだものです。上記サンプルコードを試される際にご使用ください。
まとめ
いかがでしたでしょうか。今回は、ArcGIS Runtime SDK を使って実現できるオフライン ワークフローのデスクトップ パターンについて説明しました。ArcGIS Pro でモバイル マップ パッケージを作成することによって、簡単にオフラインデータを用意することができます。また、シェープファイルなどを読み込むことによって、ローカルデータの編集を伴うアプリの開発も簡単に行うことができます。次回の連載では、ArcGIS Runtime で実現できるオフラインワークフローのサービス パターンを実現するための、データの準備方法、ポイントとなるコードについて紹介します。
次回
ArcGIS Runtime で実現できるオフラインワークフロー ~サービス パターン~
関連リンク
・ArcGIS 関連ページ
・ArcGIS Runtime SDK for .NET (ESRIジャパン製品ページ)
・ArcGIS for Developers (ESRIジャパン製品ページ)
・ArcGIS Online (ESRIジャパン製品ページ)
・ArcGIS Enterprise (ESRIジャパン製品ページ)
・ArcGIS for Developer 開発リソース集
・ArcGIS Runtime SDK for .NET (米国Esriページ (英語) )
・シリーズブログ関連ページ
・デスクトップ地図アプリ開発 シリーズ