Data Collection for .NET の機能を解説 (前半)

1297
0
02-13-2020 08:55 PM

Data Collection for .NET の機能を解説 (前半)

はじめに

以前、GeoNet ブログで 2019/8/23 (金) に弊社永田町オフィスにて開催した「 ArcGIS 開発者のための最新アプリ開発塾 2019 」のハンズオン資料を公開しました。

その中には、米国 Esri社が、開発者向けにオープンソースとして提供している、Open Source Apps の中から「 Data Collection for .NET 」というデータ収集アプリを活用して行った  「 ArcGIS_プラットフォームを活用した街路樹調査アプリケーション構築までのハンズオン  」の情報も含まれています。

※「 ArcGIS_プラットフォームを活用した街路樹調査アプリケーション構築までのハンズオン 」 で予習しておくと、本シリーズをよりスムーズに理解できると思います。

今回は、そのハンズオンで活用した、「 Data Collection for .NET 」アプリが持つ主要な機能について解説を行い、前半/後半2回にわたりご紹介したいと思います。

Data Collection for .NET の機能

まず、機能をご紹介する前に、このアプリは ArcGIS Online / ArcGIS Enterprise (Portal for ArcGIS) に公開されている Web マップとデータセットを使用して、オンラインや、オフラインの状態でデータの収集 を行うことができる汎用的なアプリです。ArcGIS for Developers のアカウント をお持ちであれば、独自の Web マップとデータセットを使用してご自身の環境で試すことができると思いますので、お試しいただければと思います。

※今回ご紹介するアプリを試す場合は、ArcGIS Developer Subscription の無償の Essentials でも可能です。アプリのご利用方法についてはアプリ起動までの手順をご覧ください。

このアプリが持つ主要 な機能は以下の4つになります。

1. 認証
2. オフラインデータの作成
3. (オフライン)データの編集
4. オフラインデータとオンライン データの同期

前半では 1. 認証、 2. オフラインデータの作成 について機能の解説を行います。

1. 認証

下のイメージでは、アプリを起動して ArcGIS Online  へログインを行っています。

このアプリでは、ArcGIS の指定ユーザーアカウントを利用して、ログイン認証を行うことで保護されたリソース (アクセス範囲が限定された Web マップなど) にアクセスして利用することができます。

以下のイメージは、認証の流れになります。

1. 保護されたリソースに対して要求が行われます。
2. ポータルは不正アクセスエラーで応答します。
3. チャレンジハンドラー* に 、ポータルの認証に必要な情報を要求します。
4. ユーザー認証 UI が表示され、ユーザーはユーザー名とパスワードの入力を求められます。
5. ユーザーが正常に認証されると、保護されたリソース へトークンを使ってアクセス要求します。
6. ポータルはトークンを保管し、 保護されたリソース に対するすべての要求に応答します。

* チャレンジハンドラー は保護されたリソースにアクセス要求した場合に、アクセスに必要なトークンを自動で作成したり、あらかじめサーバに設定した認証方法に従ってログイン情報を要求する仕組みです。

上記の認証は、アプリの起動処理時に「 AuthenticationManager  」クラスを使用することで実現することができます。

AuthenticationManager による ChallengeHandler の実装

AuthenticationManager は、アプリの起動時に設定を行い、チャレンジハンドラー を作成します。以下コードでチャレンジハンドラーを作成しています。

※ ソースファイル:DataCollection.Shared\ViewModels\AuthViewModel.cs

// Define the server information for ArcGIS Online
var portalServerInfo = new ServerInfo
{
    ServerUri = new Uri(_arcGISOnlineURL),
    TokenAuthenticationType = TokenAuthenticationType.OAuthAuthorizationCode,
    OAuthClientInfo = new OAuthClientInfo
    {
        ClientId = _appClientID,
        RedirectUri = new Uri(_redirectURL)
    },
};

// Register the ArcGIS Online server information with the AuthenticationManager
Security.AuthenticationManager.Current.RegisterServer(portalServerInfo);

// Create a new ChallengeHandler that uses a method in this class to challenge for credentials
Security.AuthenticationManager.Current.ChallengeHandler = new ChallengeHandler(CreateCredentialAsync);‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

認証に失敗するとあらかじめ設定しておいたリダイレクト URL を使用してユーザー認証 UI を表示します。以下コードでリダイレクト URL を取得しています。

※ ソースファイル:DataCollection.WPF\ViewModels\LoginWindowViewModel.cs

public Task<IDictionary<string, string>> AuthorizeAsync(Uri serviceUri, Uri authorizeUri, Uri callbackUri)
{
    if (_tcs?.Task.IsCompleted == false)
        throw new Exception("Task in progress");

    _tcs = new TaskCompletionSource<IDictionary<string, string>>();

    // Store the authorization and redirect URLs
    WebAddress = authorizeUri;
    _callbackUrl = callbackUri.AbsoluteUri;

    // Return the task associated with the TaskCompletionSource
    return _tcs.Task;
}‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

ユーザーが正常に認証されると、トークンを使って保護されたリソースに再度アクセス要求を行います。

※チャレンジハンドラーを使った認証のコードサンプルもあるので詳しくはこちらをご覧ください。

2. オフラインデータの作成

以下のイメージでは、Web マップからオフラインマップをダウンロードしています。

このアプリでは、現在の表示範囲からオフラインで使用するマップを切り出して作成することができます。 

オフラインマップの作成は 「 GenerateOfflineMapJob  」 クラスを使用することで実現することができます。

GenerateOfflineMapJob によるオフラインマップ作成

オフラインマップ を作成する前に、オフラインにしたい範囲をマップ上で指定する必要があります。範囲指定後に GenerateOfflineMapJob を実行するのに必要なパラメータが作成されます。

パラメータの詳細は以下に記載します。 

※ ソースファイル:DataCollection.Shared\ViewModels\DownloadViewModel.cs

private async Task DownloadPackageAsync(Envelope extent)
{
	// ...
	// set extent based on screen
    var parameters = await syncTask.CreateDefaultGenerateOfflineMapParametersAsync(extent);
    
    // retrieve only records related to the features being taken offline
    parameters.DestinationTableRowFilter = DestinationTableRowFilter.RelatedOnly;

    // set the job to generate the offline map
    GenerateOfflineMapJob = syncTask.GenerateOfflineMap(parameters, DownloadPath);
    // ...
}‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

パラメータ

・Extent ⇒ 表示範囲 (Map View の Extent)
・Downloadpath ⇒ ユーザーが指定する保存先フォルダ

オフラインマップのダウンロードに成功すると、保存先のフォルダにモバイル マップ パッケージ  (*.mmpk)  としてデータが保存されます。

まとめ

いかがでしたでしょうか。本記事では、Data Collection for .NET に実装されている「 認証 」 や 「 オフラインデータの作成 」   について簡単ですが、機能の解説を行いました。 Web マップを活用してオフラインで使用するアプリの開発を行う際には、本記事の内容を参考にしていただければと思います。また、Data Collection for .NET は 参照するWeb マップを変更するだけで、汎用的にご利用いただけますので、現在業務でお使いのデータでアプリを使用してみてください。

次回

次回は 3.(オフライン)データの編集、4.オフラインデータとオンラインデータの同期 について解説を行います。

関連リンク

Data Collection

Data Collection .NET (GitHub)

Data Collection iOS (GitHub)

ArcGIS Runtime SDK for .NET (ArcGIS for Developers)  

ArcGIS for Developer 開発リソース集 

Version history
Last update:
‎12-12-2021 03:36 AM
Updated by: