リアルタイムのデータ ストリームを提供するデータ ソースの数が増加するにつれて、アプリケーションがこのイベント データを取り込み、即座に表示できることがより重要になります。 イベント データをエンタープライズ ジオデータベースのフィーチャ レイヤーに保存して、クライアントがフィーチャ サービスを定期的にポーリングし、データを取得して表示していましたが、これによって待ち時間が発生します。特に、大量のデータ ストリームを処理する場合に問題が生じます。
そして、このような状況を変える必要性が生じていました。 イベント データがリアルタイムでクライアントに反映されるように、アーカイブのタスクを並行して実行することで、データ持続性の問題に対処する必要があります。 ArcGIS Server サービスの一種であるストリーム サービスを使用することをお勧めします。
ストリーム サービスの概要
ストリーム サービスは、クライアント/サーバー間のデータ フローにおいて、低遅延でリアルタイムのデータ配布を実現します。 ストリーム サービスに接続しているクライアントは、サービスに接続すると、直ちにデータの受信を開始します。 クライアントは、空間的な制限事項や属性の制限事項を指定したりするときでも、接続をやめてサービスに再接続する必要がありません。
ストリーム サービスを利用するには、GeoEvent Server のライセンスを取得し、それをエンタープライズ GIS にインストールする必要があります。 ストリーム サービスのコンテンツを ArcGIS Online および Portal for ArcGIS の Web マップや ArcGIS Pro に組み込んだり、ArcGIS API for JavaScript を使用して開発されたクライアントを通じて公開したりすることができます。
ストリーム サービスは、WebSocket テクノロジを利用します。このテクノロジは、双方向同時通信をサポートしています。 これにより、クライアントは、サービスへの登録を解除して接続を再確立しなくても、受信したいデータを指定することができます。 クライアントは、空間制限か属性制限のいずれかを指定して、ストリーム サービスのデータをフィルタリングできます。
リアルタイムのデータ フィードを受信するためにストリーム サービスに接続すると、イベントを即座に表示する基本的なニーズとデータベースのデータを維持するニーズとを区別することができます。 ストリーム サービスを通じてイベント データをブロードキャストするよう GeoEvent Server の出力を構成すると、エンタープライズ リレーショナル データ ストアまたはビッグ データ ストアにイベント データを保存できます。ただし、これは、データの表示に必須というわけではありません。
以下の図では、フィーチャ データがこれまで、受信、処理、および利用されていた仕組みとリアルタイム データがストリーム サービスを使用して受信およびブロードキャストされる仕組みを比較しています。
図の上部では、ストリーム サービス以前では、リアルタイムのデータをまずフィーチャクラスに格納する必要があり、これには、エンタープライズ ジオデータベースが必要だったことが示されています。 データを表示するには、クライアント アプリケーションが定期的にフィーチャ サービスをポーリングして、新規フィーチャと更新済みフィーチャを取得する必要がありました。
図の下の部分では、ストリーム サービスによって、リアルタイムのデータを受信し、WebSocket を通じてクライアントに即座に送信できることが示されています。
GeoEvent Server でのストリーム サービスの操作の詳細については、「GeoEvent Server チュートリアル」にあるストリーム サービスのチュートリアルをご参照ください。
ストリーム サービスの公開
GeoEvent Manager でワークフローの一部としてストリーム サービスを作成および公開し、フィーチャをストリーム サービスに送信出力コネクタを構成します。
フィーチャをストリーム サービスに送信出力コネクタを構成する場合、GeoEvent Server でデフォルトとして登録されている ArcGIS Server または Portal for ArcGIS 接続を使用することをお勧めします。
GeoEvent Server インスタンスの一部として構成および実行されているフィーチャをストリーム サービスに送信出力コネクタは、同じ GeoEvent Server で構成および実行されているジオイベント サービスに組み込まれている必要があります。
ArcGIS REST Services Directory のストリーム サービス
ストリーム サービスは、他の ArcGIS Server サービスと同様に、ArcGIS REST Services Directory にリスト表示されます ストリーム サービスのプロパティを確認することに加え、コントロールを使用してイベント データをブロードキャストし、イベント データをストリーム サービスから受信するために登録します。
- [Broadcast] をクリックすると、Web ページが開きます。この Web ページから、1 つ以上のフィーチャの Esri フィーチャ JSON 表現を入力し、ストリーム サービスに接続するクライアントにフィーチャを送信することができます。
- [Subscribe] をクリックすると、Web ページが開きます。この Web ページから、ストリーム サービスに接続し、フィーチャがストリームされていることを確認できます。 データのストリームが大量である場合、このページのフォームはすぐに過負荷状態になる可能性があります。このページを使用してストリーム サービスに登録しているクライアントがデータを受信していることを確認する場合、使用時間は短時間にとどめてください。
ArcGIS REST API でのストリーム サービスの詳細については、「ストリーム サービス」をご参照ください。
ストリーム サービスの使用
ArcGIS REST Services Directory のストリーム サービスのプロパティ ページで、[ArcGIS JavaScript] をクリックして HTML ページをリアルタイムに生成します。この HTML ページで、ストリーム サービスからブロードキャストされているデータを視覚化することができます。
[ArcGIS JavaScript] を右クリックして [ソースの表示] をクリックすることで、JavaScript コードを確認します。 開発者は、このコードを使用したりカスタマイズしたりして、ストリーム サービスを利用する Web アプリケーションを作成できます。
ストリーム サービスは、Web マップおよび ArcGIS Pro に取り込んで利用することもできます。
ArcGIS Pro でストリーム サービスを利用する方法の詳細については、「ストリーム レイヤー」をご参照ください。
ストリーム サービスのフィルタリング
ストリーム サービスでは、クライアントごとのフィルタリングが可能です。 各クライアントは、データがストリーム サービスから送信される前に、フィルターがデータに適用されるようリクエストできます。 このフィルターは、他のクライアントへのデータ フローには影響しません。 フィルターの指定は、接続が確立されるとき、または接続が確立された後にできます。
これらの設定や他の設定は、WebSocket 接続を開いて接続を確立するときに適用できます。
データ ストリームの空間参照の設定
ストリーム サービスにはデフォルトの空間参照があります。これは、ArcGIS Server Manager のサービスの説明ページにあります。 クライアントがデフォルト以外の空間参照のデータを受信したい場合は、接続時に設定する必要があります。 空間参照はいったん設定すると、接続が続く間は変更できません。 空間参照を変更するには、新しい WebSocket 接続を作成する必要があります。 デフォルトの空間参照を変更するには、キーワード outSR を使用し、目的の空間参照の well-known ID (WKID) を使用して、「outSR=<WKID>」を URL に追加します。 たとえば、デフォルトの空間参照を WKID が 3857 の WGS 1984 Web メルカトル (球体補正) に設定するには、「outSR=3857」を URL に追加します (例: ws://HOSTNAME:6180/arcgis/services/Vehicles/StreamService/0/subscribe?outSR=3857)。
フィルターの構成
ストリーム サービスのフィルターには、空間コンポーネント、SQL に類似したクエリ コンポーネント、outFields コンポーネントを含めることができます。 フィルターはそれぞれ個別に設定と設定解除ができるため、任意の時点で一部を有効にしたり、すべてを有効にしたり、いずれも無効にしたりすることができます。 フィルターの一部を設定するには、その部分を指定し、残りはそのままにします。 フィルターの残りの部分は変更されません。
ジオメトリ フィルター
フィルターのジオメトリ部分は、ArcGIS REST API が返す JSON ジオメトリ オブジェクトの構造と同じです。 ストリーム サービスのパフォーマンスを維持するために、エンベロープのみをジオメトリ タイプとして受け入れます。
フィルターには、キーワード spatialRel で特定された空間リレーションシップを含めることもできます。 これは、クエリの実行中に入力ジオメトリに適用される空間リレーションシップを表します。 空間リレーションシップとしてはインターセクト (esriSpatialRelIntersects) が唯一サポートされており、これがデフォルトです。
ジオメトリ フィルターは、接続と同じ空間参照にあることが前提であり、接続時にのみ変更できます。 ジオメトリの一部として別の空間参照を指定すると、エンベロープが接続の空間参照に投影変換され、データ ストリームからフィーチャをフィルタリングする際に使用されます。
where フィルター
where フィルターは SQL に類似した式で、指定された Where 句に属性が一致するかどうかを確認することで、データ ストリームからフィーチャをフィルタリングします。 式は、JSON 文字列値を引用符で囲んだものです。 サポートされている演算子は、AND、OR、NOT、=、!=、<、<=、>、>=、IS NULL、IS NOT NULL、IN、および LIKE です。 フィールドとリテラル値間の比較 ('field1 > 1' など)、または 2 つのあいまい検索フィールド間の比較 ('field1 > field2') が可能です。 演算順序を明確に優先させるには、括弧を使用します。
- 数値比較 - フィールド (Altitude) と数値の比較例: "Altitude < 1000"。
- フィールド比較 - 2 つのフィールドの比較例: "speed > maxSpeed"。
- 文字列比較 - 文字列も比較できます。 比較では大文字小文字が区別され、リテラル値を一重引用符で囲む必要があります (例: "Departure_Airport='KZSE'")。
- LIKE ステートメント - LIKE ステートメントを使用しワイルドカードを使用して、文字列を比較できます。 パーセント記号は任意の文字数、アンダースコアは任意の 1 文字を表します。 次の例では、Samantha や James など、名前の 2 番目と 3 番目の文字が am である名前を検索しています: "name LIKE '_am%'"。
- IN ステートメント - IN ステートメントでは、リテラル値のリストが指定できます。 フィールドがリスト内の値に一致すると、フィーチャがストリームを通過します。
- 文字列のリストの例を示します: "name IN ('Bob','Jane','Henry')"。
- 数値のリストを使用した IN ステートメントの例を示します: "alertCode IN (404,500,505)"。
- ブール式の代わりにブール型フィールドを使用することもできます。 たとえば、フィーチャにブール型の active というフィールドが含まれる場合、active フィールドを True に設定してフィーチャを通過させる Where 句を書き込むことができます ("active" など)。
out fields フィルター
キーワード outFields で特定された out fields フィルターを使用して、データ ストリーム内のフィールドを個別にフィルタリングできます。 フィールド名のリストをカンマで区切って、目的のフィールドを定義します。