データ ソース(Data source)

出典:ArcGIS Experience Builder - Guide - Data sources

データ ソース(Data source)

データ ソースは、ウィジェットがどのようにデータにアクセスするかを定義します。例えば、データがリモートサーバーからのものである場合、ウィジェットはクライアント側にクエリーするために、データ ソース クラスを使用します。ウィジェットでデータが生成された場合、それ自身をデータ ソース クラスに入れることで、別のウィジェットで使用することができます。

高レベルでは、データ ソースはスキーマといくつかのレコードを持ち、子/親データ ソースを持つ場合があります。さらに、すべてのデータ ソースは、それを識別するのに役立つ型、ID、ステータスがあります。 DataSource インターフェイスは jimu-core パッケージで定義されており、これは以下のメソッドとプロパティのいくつかを定義しています。

  • id: データ ソースID。
  • type: どのタイプのデータ ソースを使っているかチェックするため、ウィジェットで使っているプロパティ。
  • fetchSchema: すべてのデータ ソースは、スキーマを返すためにこのメソッドを実装しなければなりません。これは、リモート データ サービスで定義されたスキーマです。例えば、ユーザーがExperience Builder でデータ ソースを追加した場合、データ ソースのスキーマはアプリ構成に保存されません。代わりに、最新のデータ ソース スキーマを取得するために fetchSchema メソッドが呼び出されます。
  • getSchema: ウィジェットがデータ ソースのスキーマとフィールドにアクセスするために使用するメソッドです。
  • getRecords: ウィジェットがデータ ソースのデータ レコードにアクセスするために使用するメソッドです。
  • getStatus: ウィジェットはこのメソッドを使用してデータ ソースのステータスを取得します。これらのステータスには、NotReadyUnloadedLoadingLoaded および LoadError があります。NotReady はウィジェットの出力データ ソース専用です。出力データ ソースのインスタンスが作成されても、そのインスタンスは使用する準備ができていません。出力データ ソースを生成するウィジェットはデータ ソースを使用可能な状態にするアクション (DataSourceChanged) を送る必要があります。データ ソースのステータスが準備できていない場合、クエリーは空の結果を返します。その他のクエリー可能なデータ ソースでは、既定のステータスは Unloaded です。データが要求されると Loading に変更され、最後に Loaded または LoadError に変更されます。

データ ソースは DataSourceManager によって管理され、作成および取得できます。

データ ソースの使用を簡単にするために、DataSourceComponent コンポーネントが定義されています。これは useDataSource プロパティを受け取り、コールバックを通じてデータ ソース オブジェクトとそのステータス情報を返します。また、子要素として関数を受け取ることで、その関数を使ってデータ ソース オブジェクトとデータ ソース内のデータをレンダリングするための情報を取得することができます。DataSourceComponent コンポーネントは、オプションの query プロパティを受け入れることもでき、クエリーが変更されたときにデータを再読み込みします。

多くの一般的なデータ サービスはデータのクエリーをサポートしているため、API では QueriableDataSource インターフェイスが定義されています。このインターフェイスには、urlloadquery などのプロパティがあります。loadquery の違いは、load はレコードのプロパティとデータ ソースのステータスを更新し、query はレコードのみをクエリーして返すことです。

一部の ArcGIS サービスもデータのクエリーをサポートしており、同様のクエリー動作を持っています。そのため、これらのサービスの共通操作をサポートするために、ArcGISQueriableDataSource インターフェイスが定義されています。また、FeatureLayerDataSourceSceneLayerDataSource など、これらのサービスの特定の操作をサポートするためのサブ インターフェイスも定義されています。

より具体的には、Experience Builder で FeatureLayerDataSource データ ソースを定義して、フィーチャ レイヤーにアクセスします。FeatureLayerDataSource を通じて ArcGIS Maps SDK for JavaScript の FeatureLayer オブジェクトを取得するには、createJSAPILayerByDataSource() メソッドを呼び出します。FeatureLayerDataSource の実際のデータは、リモート データベースからのものと、クライアント側のフィーチャのコレクションからのものがあり、どちらもクエリーをサポートしています。

一般的にデータ ソースは 2 つの場所に保存されます。データ ソース オブジェクトは DataSourceManager に管理され、データ ソース情報は redux アプリ ストアに保存されます。DataSourceComponent を使う場合、コンポーネントは DataSourceManager を呼び出してオンデマンドでデータ ソースを作成し、コールバック プロップを使ってデータ ソース オブジェクトとdataSourceInfo を返します。dataSourceInfo では、データ ソースの instanceStatusstatusselectedIds などを返すことができます。

ArcGIS Server サービスの多くは、MapServiceDataSourceFeatureServiceDataSource など、アクセスしやすいようにデータ ソースにマッピングされています。 ArcGIS Maps SDK for JavaScript の WebMapWebScene は、jimu-arcgis パッケージ内で WebMapDataSourceWebSceneDataSource としてラップされています。

データ ソース セット(Data Source Set)

データ ソースは子データ ソースを持つことができます。そのため、使いやすいように複数のデータ ソースを含めることが可能です。このようなデータ ソースを DataSourceSet と呼ばれます。WebMapDataSourceDataSourceSet の一つです。DataSourceSet はデータ ソースの一種ですが、isDataSourceSet プロパティが true に設定されています。親データ ソースから子データ ソースを取得するには getChildDataSources を使用し、子データ ソースから親データ ソースを取得するには parentDataSource を使用します。子データ ソースは必要に応じて作成され、createDataSouceById(dsId) を使って ID に基づいて子 データ ソースを作成することもできます。

データ ビュー(Data View)

複数のウィジェットが 1 つのデータ ソースに接続している場合、ウィジェットがそのデータ ソースのローカル ビューを参照したい場合があります。このような場合には、データ ビューを使用します。データ ビューとデータ ソースの関係は、リレーショナル データベースのビューとテーブルの関係によく似ています。Experience Builder のデータ ソースは、クライアント側の実際のリモート データ ソースのビューですが、データ ソースはテーブル、データ ビューはビューと考えることができます。アプリ作成者は、データ ソースからデータ ビューを作成し、ビルダー内のデータビューにウィジェットを接続することができます。API レベルでは、データ ビューは DataSource クラスを使用して管理されているため、データ ビューは、いくつかのプロパティの違いがあるだけで、データ ソースと同じインターフェイスと動作を持っています。データ ビューのベースとなるデータ ソースはメイン データ ソースと呼ばれ、getMainDataSource を使ってデータ ビューからデータ ソースを取得したり、getDataViews を使ってメイン データ ソースのすべてのビューを取得することができます。

選択状態は、メイン データ ソースとそのすべてのデータ ビューの間で共有されます。選択されたレコードはデータ ソースの選択ビューに保存され、選択されたレコード ID は redux app store のデータ ソース ID の下に保存されます。選択ビューは、メイン データ ソースの特別なデータビューで、${mainDataSourceId}-sclection で識別されます。

ローカル データ ソースとデータ ビュー(Local data source and data view)

複数のウィジェットが異なるデータを取得するために異なるデータ ビューを使用することは可能ですが、同じデータ ソースまたは同じデータ ビューに接続しながら、ウィジェット毎に異なるデータを取得する必要があるケースもあります。例えば、ウィジェット内のドロップ ダウン リストなどです。このような場合、ウィジェットはローカル データ ソースまたはデータ ビューを作成することができます。ローカル データ ソースまたはデータ ビューに適用されたフィルターは、関連する元のデータ ソースまたはデータ ビューに影響を与えません。ローカル データ ソースやデータ ビューを使用するには、DataSourceComponent を使用して localId を渡すか、DataSourceManager().getinstance().createLocalDataSource を使用します。

データ ソース内のソース レコード(Source records in data source)

ほとんどの場合、データはリモート データベースにあるので、データ ソース インスタンスはリモートからデータを取得してデータ ソース インスタンスに保存するだけです。しかし、一部のデータ ソースでは、ウィジェットの出力データ ソースや選択ビューのデータ ソースのように、データがクライアント側で生成される場合があります。これらのシナリオでは、データ ソースのデータは、データ ソース インスタンスの DsourceRecords に格納されます。getSourceRecordssetSourceRecords を使用して、それを取得および更新することができます。

ウィジェット出力データ ソース(Widget output data source)

ウィジェットはデータ ソースを使用するだけでなく、データ ソースを生成することもできます。生成されたデータ ソースをウィジェット出力データ ソースと呼びます。ウィジェットは、他のウィジェットがその出力データ ソースを使用できるように、設定ページで this.props.onSettingChange を呼び出して、出力データ ソースをアプリの設定に保存する必要があります。出力データ ソースは、アプリの設定の dataSources に保存されます。他のウィジェットは、出力データ ソースを使用する場合でも、ユーザーが追加したデータ ソースを使用する場合でも、違いを意識する必要はありません。

内部的には、ウィジェットが出力データ ソースを生成し、ウィジェットがレンダリングされるときに、出力データ ソースと出力データ ビューが作成されます。出力データ ビューは ${outputDataSourceId}-output という ID で識別されます。出力データ ソースを使用するウィジェットは出力ビューを使用しています。出力データ ソースが作成されると、そのステータスは NotReady になります。出力データ ソースを生成するウィジェットは、データが準備できたらデータ ソースを更新し、データ ソースのステータスを Unloaded に変更して、他のウィジェットが使用できるようにする必要があります。出力データ ソースのデータを更新する方法は、出力データ ソースがどのように生成されたかによります。ウィジェットがリモート サービスに接続するサーバー サイドの出力データ ソースを生成する場合、outputDs.updateQueryParams(queryParams, widgetId)outputDs.load(queryParams, { widgetId }) または <DataSourceComponent useDataSource={Immutable({ dataSourceId: outputDsId, mainDataSourceId: outputDsId })} query={queryParams}> を使用してデータ ソースを更新できます。ウィジェットがクライアント サイドにデータを保存するクライアント サイドの出力データ ソースを生成する場合、生成されたデータの種類に応じて、outputDs.setSourceFeatures(features, options) または outputDs.setSourceRecords(records) を使用してデータを更新できます。ウィジェットが生成したデータにジオメトリがある場合、setSourceFeatures を使用することをお勧めします。この方法では、フィーチャのレンダラーを指定できるためです。ウィジェットが生成したデータにジオメトリがない場合、どちらの方法でも問題ありません。

出力データソース JSON の originDataSources は、元のデータ ソースと出力データ ソースの関係を維持するために使用されます。例えば、ウィジェットの出力データ ソースにスキーマが定義されていない場合、元のデータ ソースのスキーマが使用されます。ウィジェットは、このプロパティと idtype などの一般的なプロパティを更新する必要があります。クエリー ウィジェットとチャート ウィジェットの両方が出力データ ソースを生成します。これらのウィジェットの出力データ ソース JSON を参考にすると、出力データ ソース JSON に必要なプロパティを確認できます。

データのクエリーとフィルター(Query and filter data)

ウィジェットがデータを読み込む必要がある場合、推奨される方法は <DataSourceComponent> コンポーネントまたは dataSource.load() を使用することです。なぜなら、データ ソース フレームワークはデータ キャッシュとページネーションの問題を管理するのに役立つからです。データを読み込むのではなく、フィルタリングしたいだけの場合は、dataSource.updateQueryParams() を使用できます。

クエリー フィールド(Query fields)

フィーチャ レイヤーには多くのフィールドが含まれている場合がありますが、ほとんどの場合、ウィジェットはそれらのフィールドのうちのいくつかのデータのみを必要とします。多くの場合、ウィジェットは多くのデータ レコードをクエリーして表示する必要があります。この種のウィジェットに推奨される方法は、設定で構成されたフィールドを onSettingChange メソッドを介して useDataSources に保存し、その後 <DataSourceComponent> を使用してデータをクエリーおよびレンダリングすることです。この方法を取ると、保存されたフィールドのみがクエリーされます。複数のウィジェットが同じデータ ソースを使用する場合、すべての保存されたフィールドが一緒にクエリーされます。しかし、一部のウィジェットは1つのレコードと多くのフィールドを表示する必要がある場合があります。この場合、推奨される方法は、record ID を使用して dataSource.query() を使用してレコードをクエリーし、複数のウィジェットが同じデータ ソースに接続する際に過剰なフィールドをクエリーしないようにすることです。dataSource.query(queryParam) を使用してデータをクエリーする場合、queryParam オブジェクトの outFields プロパティを設定してクエリーしたいフィールドを指定できます。

クライアント サイド クエリー(Client-side query)

URL から作成されたデータ ソースがデータをクエリーする必要がある場合、データ ソースはクエリーをリモート サーバーに送信します。しかし、データ ソースがマップ レイヤーから作成され、マップ ウィジェットがクライアント サイド クエリーを有効にしている場合、データソースはバックエンド サービスにクエリーを送信する代わりに、MapView からデータをクエリーしようとします。MapView または対応する LayerView がクライアント サイド クエリーの準備ができていない場合、データ ソースは依然としてクエリーをリモート サーバーに送信します。MapView または LayerView が準備できていない理由はいくつかあります。例えば、クエリー内のジオメトリが現在のマップ範囲にない場合や、LayerView にすべてのフィーチャが含まれていない場合です。クライアント サイド クエリーを実行する前に、LayerView はクエリー パラメーター内の outFieldsLayerView のフィールドに追加し、その後クエリーを実行します。LayerView にフィールドを追加しすぎるとパフォーマンスの問題が発生する可能性があるため、notAddFieldsToClient を使用して LayerView にフィールドを追加しないようにすることができます。

データアクション(Data action)

データアクションの参照

リピート データ ソース(Repeated Data source)

RepeatedDataSourceProvider が提供するデータ ソースをリピートデータ ソースと呼びます。データ ソースを提供するウィジェットのすべての子ウィジェットは、リピート データ ソースを受け取ります。これは React’s Context と似ています。ウィジェットは this.props.repetedDataSource でリピート データ ソースにアクセスできます。リピート データ ソースは、データ ソースの idrecordrecordIndx を取得します。 どのウィジェットでも、RepeatedDataSourceProvider を使用してリピート データ ソースを提供することができます。Experience Builder の List ウィジェットは、リピート データ ソースを提供する良い例です。リピート データ ソースを使用するには、ウィジェットのマニフェストファイルに supportRepeat プロパティを追加します。