フィルターは、指定された条件に一致しないジオイベントをフィルタリングする (ストリーミング データから削除する) ジオイベント サービスの構成可能なコンポーネントです。通常、フィルターは属性フィルター、空間フィルター、または属性と空間を組み合わせたフィルターですが、GeoEvent Server 製品の $DEFINITION_NAME などのマクロは、プロパティ (現在のジオイベントに関連付けられたジオイベント定義の名前など) によるジオイベントのフィルタリングを可能にします。
属性フィルター
ジオイベント サービスで属性フィルターを使用すると、属性条件に基づいてイベントをフィルタリングできます。1 つ以上の属性式を使用して属性フィルターを構成できます。これらの式を論理的に組み合わせると、ジオイベントがフィルターを通過するために満たす必要のある条件が作成されます。
以下の属性演算子がサポートされています。
- 等しい (=) - この演算子は、指定された値と同じ属性値を持つジオイベントを維持します。例: IdString = 3XAB891。
- 等しくない (!=) - この演算子は、指定された値と異なる属性値を持つジオイベントを維持します。例: StatusString != Err。
注意:
「等しい」および「等しくない」演算子を、浮動小数点値に適用しないでください。たとえば、「Radius = 3.14159」のようなフィルター式を構成せず、代わりに、「より大きい」、「より小さい」などの演算子を使用します。
- より大きい (>) - この演算子は、指定された値よりも大きい属性値を持つジオイベントを維持します。例: Speed > 50。
- 以上 (>=) - この演算子は、指定された値以上の属性値を持つジオイベントを維持します。例: Speed >= 50。
- より小さい (<) - この演算子は、指定された値よりも小さい属性値を持つジオイベントを維持します。例: Altitude < 1000。
- 以下 (<=) - この演算子は、指定された値以下の属性値を持つジオイベントを維持します。例: Altitude <= 1000。
注意:
「より大きい」、「より小さい」などの演算子を文字列値に適用しないでください。たとえば、「Company > ABC」のようなフィルター式を構成せず、代わりに、「等しい」または「等しくない」演算子を使用して文字列全体を式に組み込みます。
- IN - この演算子は、指定されたフィールドの値がカンマ区切りの値のリスト内に存在するジオイベントを維持します。例: StatusCode IN HK1,HK3,HK5。
- MATCHES - この演算子は、指定されたフィールドの値が正規表現と一致するジオイベントを維持します。例: StatusCode MATCHES ^HK[135]。
注意:
指定した正規表現は、イベントのフィールド値全体と一致する、または一致しないのいずれかとして評価されます。部分一致はサポートされていません。上の例では、1 桁の数字の後に文字列が追加された値が StatusCode に格納されている場合、その属性値の末尾の任意の文字列と一致させるには、式に「.*」を含める必要があります。
- EXISTS - この演算子は、指定されたフィールドが受信したイベントのスキーマ内に存在するジオイベントを維持します。例: Geometry EXISTS。
- ISNULL - この演算子は、指定されたフィールドに NULL 値が格納されているジオイベントを維持します。例: Geometry ISNULL。
注意:
NULL 文字列のチェックには対応していません。ジオイベントでは、文字列が NULL オブジェクトではなく空の文字列 (長さゼロの文字列) として定義されます。
空間フィルター
ジオイベント サービスの空間フィルターは、ジオフェンスとの空間リレーションシップに基づいてジオイベントをフィルタリングします。空間フィルターを構成する前に、ジオフェンスを指定するジオメトリを、公開されているフィーチャ サービスから GeoEvent Server にインポートしておく必要があります。
以下の空間演算子がサポートされています。
- INSIDE - ジオイベントのジオメトリがジオフェンスで定義されたエリアに完全に含まれている場合、そのジオメトリはジオフェンスの内部にあると見なされます。この演算子は、ジオイベントに関連付けられたポイントが対象地域内にあるかどうかを判別できます。
- OUTSIDE - ジオイベント ジオメトリ全体がジオフェンスで定義されたエリアの外にある場合、そのジオメトリはジオフェンスの外部にあると見なされます。この演算子は、ジオイベントに関連付けられたポイントが対象地域外にあるかどうかを判別できます。
- ENTER - ジオイベント位置が以前はジオフェンスの外部にあった場合、同じトラックのジオイベントのジオメトリが、現在、ジオフェンスで定義されたエリア内にあれば、そのジオメトリはジオフェンスに入っていると見なされます。ENTER 条件が検出され、ジオイベントがフィルターを通過できるようになった場合、別の ENTER 条件が認識されるには、まずジオフェンスの外側に 1 つ以上のイベントがあることがトラック オブジェクトから報告される必要があります。
- EXIT - ジオイベントの位置が以前はジオフェンスの内部にあった場合、同じトラックのジオイベントのジオメトリが、現在、ジオフェンスで定義されたエリアの外側にあれば、そのジオメトリはジオフェンスを出ていると見なされます。EXIT 条件が検出され、ジオイベントがフィルターを通過できるようになった場合、別の EXIT 条件が認識されるには、まずジオフェンスの内側に 1 つ以上のイベントがあることがトラック オブジェクトから報告される必要があります。
注意:
上の EXISTS 属性演算子と ISNULL 属性演算子は、Geometry フィールドを空間フィルターの式の一部として指定した場合にも適用できます。
通常、一連のジオフェンスは、対象地域を定義し、またポリゴン フィーチャを提供するフィーチャ サービスからインポートされます。ジオフェンスは、必ずしもポリゴン エリアを表している必要はありません。ポイント フィーチャやライン フィーチャからジオフェンスをインポートすることもできます。
以下の空間演算子は、さまざまなタイプのジオメトリとともに使用することができます。これらの空間演算子は、ブール値を返し、記述されたリレーションシップがジオフェンスとジオイベントのジオメトリとの間に存在するかどうかを示します。一部のリレーションシップは、ジオイベントのジオメトリが、比較対象のジオフェンスと同じ次元を持っていることを要求します。その他のリレーションシップは、より柔軟な次元制約を持っています。以下の多くの空間演算子は、同時に使用することができない Clementini の演算子です。
- CONTAINS - ジオフェンスがイベントのジオメトリのサブセットであり、それら 2 つのジオメトリの交差が空でない場合、イベントのジオメトリはジオフェンスを含みます。CONTAINS は、WITHIN とは論理的に逆の演算です。ポイント ジオメトリにポリラインまたはポリゴンを含めることはできません。そのため、イベントに関連付けられているポイントに、ジオフェンスとしてインポートされたラインまたはエリアを含めることはできません。ポイントにポイント、ラインにラインを含めることはできますが、そのような空間リレーションシップのテストはお勧めしません。投影法によるジオメトリのわずかな差異によって、ジオフェンスと一致すると想定されるポイントまたはラインが実際には完全一致しない場合があります (この場合、CONTAINS リレーションシップは FALSE と評価されます)。
CONTAINS 演算子の詳細については、『ArcObjects API Reference for .NET』の「IRelationalOperator.Contains Method」をご参照ください。
- CROSSES - 次元が小さい方のジオメトリに交差が存在する場合、イベントのジオメトリはジオフェンスとクロスします。2 つのポリラインが 1 つ以上のポイントで交差し、少なくとも 1 つのポイントが端点でない場合、それらのポリラインはクロスします。ポリラインとポリゴンが、そのポリラインと完全には同じではないポリゴンの内部のポリラインまたはポイントを共有している場合、それらのポリラインとポリゴンはクロスしています。CROSSES は、ポリライン/ポリライン、ポリライン/ポリゴン、またはポリゴン/ポリラインの関係にのみ適用されます。ジオメトリの 1 つが空の場合、ジオメトリはクロスしません。
CROSSES 演算子の詳細については、『ArcObjects API Reference for .NET』の「IRelationalOperator.Crosses Method」をご参照ください。
- DISJOINT - 2 つのジオメトリが交差しない場合、イベントのジオメトリはジオフェンスと一致しないと見なされます。イベントのジオメトリは、別のジオフェンスと交差しながら、ジオフェンスと一致しない可能性があるので注意してください。空間条件式を指定する場合は注意してください。条件式は、イベントのジオメトリだけでなく、スコープ、any または all、および正規表現のパターン マッチ (例: SomeCategory/.*) を使用して特定された一連のジオフェンスも指定します。
DISJOINT 演算子の詳細については、『ArcObjects API Reference for .NET』の「IRelationalOperator.Disjoint Method」をご参照ください。
- EQUALS - イベントのジオメトリとジオフェンスのジオメトリは、対称差が空のセットである場合、等しいです。2 つのジオメトリ内の各セグメントで反復してセグメントのタイプと座標を比較し (座標の一致を判別するために、空間参照のクラスター許容値を使用)、それらがすべて同じだった場合、2 つのジオメトリは等しいと見なされます。
EQUALS 演算子の詳細については、『ArcObjects API Reference for .NET』の「IRelationalOperator.Equals Method」をご参照ください。
- INTERSECTS - 2 つのジオメトリが一致していない場合、イベントのジオメトリはジオフェンスは交差しています。INTERSECTS は、DISJOINT とは論理的に逆の演算です。ジオフェンスのエリア (ポリゴン) 内にあるイベントのポイントもジオフェンスと交差します。イベントのポリラインまたはポリゴンは、ジオフェンス内に完全に含まれていなくても、ジオフェンスと交差する場合があります。イベントのジオメトリは、一連のジオフェンス内にある 1 つのジオフェンスと交差しながら、DISJOINT ANY (例: 1 つ以上と一致しない) である場合があります。イベントのジオメトリは、セット内の少なくとも 1 つのジオフェンスと交差しているため、DISJOINT ALL ではありません。
- OVERLAPS - 対象のジオメトリと次元が同じ交差が存在し、その交差がイベントのジオメトリまたはジオフェンスと同じではない場合、イベントのジオメトリはジオフェンスと重複しています。OVERLAPS は、ポリライン/ポリライン、ポリゴン/ポリゴン、またはマルチポイント/マルチポイントの関係にのみ適用されます。ジオメトリの 1 つが空の場合、ジオメトリは重複しません。
* ポイント ジオメトリは等価条件を満たさないため、イベントのポイント位置は、ジオメトリがポイントであるジオフェンスと重複できません。
- TOUCHES - 交差が存在し、交差の内側が空の場合、イベントのジオメトリはジオフェンスと接しています。これは、2 つのジオメトリが、ジオメトリを定義する頂点のみで接し、頂点間のポイントでは接していないことを意味します。TOUCHES はポイント/ポイントの関係には定義されません。ジオメトリの 1 つが空の場合、ジオメトリはタッチしません。
TOUCHES 演算子の詳細については、『ArcObjects API Reference for .NET』の「IRelationalOperator.Touches Method」をご参照ください。
- WITHIN -イベントのジオメトリがジオフェンスのジオメトリと交差しており、それらの内部の交差が空でない場合、イベントのジオメトリはジオフェンス内にあると見なされます。WITHIN 演算子は、CONTAINS とは論理的に逆の演算子です。
WITHIN 演算子の詳細については、『ArcObjects API Reference for .NET』の「IRelationalOperator.Within Method」をご参照ください。
関係演算子の詳細については、『ArcObjects API Reference for .NET』の「IRelationalOperator Interface」をご参照ください。
GeoEvent Server でのジオフェンスの操作方法の詳細については、「ジオフェンスの管理」をご参照ください。
ジオイベント プロパティ フィルター
GeoEvent Server 内のすべてのジオイベントは、ジオイベントの作成に使用されるジオイベント定義など、関連付けられた一連のプロパティを持っています。ジオイベント定義が、そのジオイベントのデータに関する属性フィールドとデータ型 (Date、String、Integer など) を識別するスキーマであることを思い出してください。ジオイベント定義などのプロパティに基づいてジオイベントをフィルタリングするようにフィルターを構成できます。
フィルター式を構成する際に、フィールド パラメーターのドロップダウンには、使用できるジオイベント定義のフィールド名のリストが表示されます。このリストの上部には、以下のような複数の GeoEvent Server プロパティがあります。
- $OWNER_ID
- $OWNER_URI
- $DEFINITION_NAME
- $DEFINITION_GUID
- $RECEIVED_TIME
次の式を使用してフィルターを作成すると、Flights-TcpTextIn というジオイベント定義名を含んでいないすべてのジオイベントが除外されます: $DEFINITION_NAME = Flights-TcpTextIn ジオイベント定義プロパティに基づくこのようなフィルターを、必要なスキーマに従っていないすべてのジオイベントをフィルタリングするために使用できます。
タグを使用してフィルターを設定
タグはジオイベント定義の特定のフィールドに配置されるラベルです。タグはフィールド エイリアスに似ています。異なるフィールド名を持つジオイベント定義同士を類似データとして関連付ける場合に、表現における一貫性をサポートします。特定の組み込みタグは、TRACK_ID や GEOMETRY などの情報を含む重要なGeoEvent Server フィールドを識別します。
タグを作成し、そのタグをジオイベント定義の特定のフィールドに適用したら、フィルターを使用して、フィールドの名前ではなくタグでフィールドを参照することができます。この処理により 1 つの属性フィルターでまったく同じ属性に基づく条件を複数のイベント タイプに適用できるようになるため、この処理は属性フィルターを設定する場合に特に有用です。
GeoEvent Server でのタグの使用方法の詳細は、「タグの管理」をご参照ください。
正規表現を使用してフィルターを設定
MATCHES 演算子 (属性フィルターを設定する際に使用できる) では、正規表現を使用してターゲット フィールド内のパターンを検索できます。正規表現のパターン マッチングは、データの整合性をチェックするための強力なツールになります。正規表現の適用範囲と構文は本書内ですべて扱いきれないため、ジオイベント フィルター内で使用する場合に特に役立つ例を次に挙げてあります。
注意:
正規表現は、文字列型の属性フィールドにしか適用できません。
注意:
指定したパターンは文字列全体に一致します。「California」と入力しても、そのサブ文字列を含む文字列との一致が見つかりません。パターン を指定します。「*California.*」というパターンを指定すると、フィルターで検索されるサブ文字列の前後両方にゼロ以上の文字があることが考慮されます。
フィールド値 | RegEx パターン | 結果 |
---|---|---|
SWA2382 |
| キャレット記号 (^) はパターンが文字列の先頭にあることを示し、ドル記号 ($) はパターンが文字列の末尾にあることを示します。パターンの [0-9]+ 部分は、文字列の末尾に 0 〜 9 の数字が 1 つ以上あることを示します。 ターゲット フィールド内の値が SWA (その後にフライト番号を表す数値が続く) で始まっていない場合は、その値がフィルターで破棄されます。 |
02/15/1973 |
| 0 〜 1、0 〜 3、0 〜 9 などの数値範囲は、予想される mm/dd/yy 日付文字列の値を示します。2 桁の月とその後の 2 桁の日および 4 桁の年がスラッシュ (/) で区切られていない値はすべて、フィルターで破棄されます。 |
3.14159 |
| このパターンでは、ターゲット フィールド内の文字列が数値として解釈されるかどうかが検証されます。RegEx パターン内のアスタリスク (*) は先行文字のゼロ以上のインスタンスと一致し、 疑問符 (?) はゼロまたは 1 つのインスタンスと一致します。バックスラッシュは、「.」が、ワイルドカード (*) ではなく小数点リテラルであることを示します。このパターンでは、プラス記号 (+) またはマイナス記号 (-) が浮動小数点値の整数部分になり、小数点リテラルがオプションになります (出現回数がゼロの可能性がある)。 |