ジオメトリ演算子
Zilliz Cloudは、GEOMETRYフィールドでの空間フィルタリングのための演算子セットをサポートしており、ジオメトリデータの管理と分析に不可欠です。これらの演算子を使用すると、オブジェクト間のジオメトリ関係に基づいてエンティティを取得できます。
すべてのジオメトリ演算子は、2つのジオメトリ引数を受け取ることで機能します。これは、コレクションスキーマで定義されたGEOMETRYフィールドの名前と、Well-Known Text(WKT)形式で表されるターゲットジオメトリオブジェクトです。
使用構文
GEOMETRYフィールドでフィルタリングを行うには、式内でジオメトリ演算子を使用します。
-
一般:
{operator}(geo_field, '{wkt}') -
距離ベース:
ST_DWITHIN(geo_field, '{wkt}', distance)
ここで:
-
operatorはサポートされているジオメトリ演算子のいずれかです(例:ST_CONTAINS,ST_INTERSECTS)。演算子名はすべて大文字またはすべて小文字である必要があります。サポートされている演算子のリストについては、サポートされているジオメトリ演算子を参照してください。 -
geo_fieldはGEOMETRYフィールドの名前です。 -
'{wkt}'はクエリするジオメトリのWKT表現です。 -
distanceはST_DWITHINに特化したしきい値です。
Zilliz CloudのGEOMETRYフィールドの詳細については、ジオメトリフィールドを参照してください。
サポートされているジオメトリ演算子
以下の表は、Zilliz Cloudで利用可能なジオメトリ演算子をリストアップしています。
演算子名はすべて大文字またはすべて小文字でなければなりません。同じ演算子名内で大文字小文字を混在させないでください。
演算子 | 説明 | 例 |
|---|---|---|
| 2つのジオメトリが空間的に同一である場合にTRUEを返します。つまり、同じ点の集合と次元を持ちます。 | 2つのジオメトリ(AとB)が空間的に完全に同じですか? |
| ジオメトリAがジオメトリBを完全に包含し、 interiorsが少なくとも1つの点を共有している場合にTRUEを返します。 | 都市境界(A)が特定の公園(B)を包含していますか? |
| ジオメトリAとBが部分的に交差しているが、お互いを完全には包含していない場合にTRUEを返します。 | 2つの道路(AとB)が交差点で交差していますか? |
| ジオメトリAとBが少なくとも1つの共通点を持つ場合にTRUEを返します。これは最も一般的で広く使われている空間クエリです。 | 検索エリア(A)が店舗の場所(B)と交差していますか? |
| ジオメトリAとBが同じ次元を持ち、部分的に重複しており、どちらも完全に他方を包含していない場合にTRUEを返します。 | 2つの土地(AとB)が重複していますか? |
| ジオメトリAとBが共通の境界を共有しているが、その内部が交差していない場合にTRUEを返します。 | 2つの隣接する敷地(AとB)が境界線を共有していますか? |
| ジオメトリAがジオメトリB内に完全に包含されており、その内部が少なくとも1つの共通点を持つ場合にTRUEを返します。 | 特定の地点(A)が定義された検索範囲(B)内にありますか? |
| ジオメトリAとジオメトリBの間の距離が指定された距離以下である場合にTRUEを返します。 注釈: ジオメトリBは現在ポイントのみをサポートしています。距離の単位はメートルです。 | 特定のポイント(B)から5000メートル以内のすべてのポイントを検索します。 |
ST_EQUALS / st_equals
ST_EQUALS演算子は、2つのジオメトリが空間的に同一である場合にTRUEを返します。つまり、同じ点の集合と次元を持ちます。これは、2つの保存されたジオメトリオブジェクトが正確に同じ場所と形状を表しているかどうかを確認するのに便利です。
例
保存されたジオメトリ(ポイントやポリゴンなど)がターゲットジオメトリと正確に同じであるかどうかを確認するとします。たとえば、保存されたポイントを特定の関心ポイントと比較できます。
# 特定のポイントと一致するジオメトリをチェックするためのフィルター式
filter = "ST_EQUALS(geo_field, 'POINT(10 20)')"
ST_CONTAINS / st_contains
ST_CONTAINS演算子は、最初のジオメトリが2番目のジオメトリを完全に包含している場合にTRUEを返します。これは、ポリゴン内にポイントがあるか、より小さなポリゴンがより大きなポリゴン内にあるかを調べるのに便利です。
例
都市地区のコレクションがあり、特定のレストランなどの関心のある地点が与えられた地区の境界内にあるかどうかを知りたいとします。
# 特定のポリゴン内に完全に含まれるジオメトリを検索するためのフィルター式。
filter = "ST_CONTAINS(geo_field, 'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')"
ST_CROSSES / st_crosses
ST_CROSSES演算子は、2つのジオメトリの交差が元のジオメトリよりも低い次元のジオメトリを形成する場合にTRUEを返します。これは通常、ラインがポリゴンまたは別のラインを交差する場合に適用されます。
例
特定の境界線(別のラインストリング)を横切るまたは保護区域内(ポリゴン)に入るすべてのハイキングトレイル(ラインストリング)を検索したいとします。
# ラインストリングを横切るジオメトリを検索するためのフィルター式。
filter = "ST_CROSSES(geo_field, 'LINESTRING(5 0, 5 10)')"
ST_INTERSECTS / st_intersects
ST_INTERSECTS演算子は、2つのジオメトリが境界または内部のいずれかに共通点を持つ場合にTRUEを返します。これは空間的な重複を検出するための汎用演算子です。
例
道路のコレクションがあり、提案された新しい道路を表す特定のラインストリングと交差または接触するすべての道路を検索したい場合は、ST_INTERSECTSを使用できます。
# 特定のラインストリングと交差するジオメトリを検索するためのフィルター式。
filter = "ST_INTERSECTS(geo_field, 'LINESTRING (1 1, 2 2)')"
ST_OVERLAPS / st_overlaps
ST_OVERLAPS演算子は、同じ次元の2つのジオメトリが部分的に交差し、交差が元のジオメトリと同じ次元を持つがそれらのいずれにも等しくならない場合にTRUEを返します。
例
重複するセールス地域のセットがあり、新しい提案されたセールスゾーンと部分的に重複するすべての地域を検索したいとします。
# ポリゴンと部分的に重複するジオメトリを検索するためのフィルター式。
filter = "ST_OVERLAPS(geo_field, 'POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))')"
ST_TOUCHES / st_touches
ST_TOUCHES演算子は、2つのジオメトリの境界が接触しているが、内部が交差していない場合にTRUEを返します。これは隣接性を検出するのに便利です。
例
敷地の地図があり、公園との重複なしに公共の公園に直接隣接するすべての敷地を検索したいとします。
# 境界でラインストリングと接触するジオメトリを検索するためのフィルター式。
filter = "ST_TOUCHES(geo_field, 'LINESTRING(0 0, 1 1)')"
ST_WITHIN / st_within
ST_WITHIN演算子は、最初のジオメトリが2番目のジオメトリの内部または境界に完全に含まれている場合にTRUEを返します。これはST_CONTAINSの逆です。
例
大きな指定された公園区域内に完全に位置するすべての小さな住宅地を検索したいとします。
# 大きなポリゴン内に完全に含まれるジオメトリを検索するためのフィルター式。
filter = "ST_WITHIN(geo_field, 'POLYGON((110 38, 115 38, 115 42, 110 42, 110 38))')"
GEOMETRYフィールドの使用方法の詳細については、ジオメトリフィールドを参照してください。
ST_DWITHIN / st_dwithin
ST_DWITHIN演算子は、ジオメトリAとジオメトリBの間の距離が指定された値(メートル単位)以下である場合にTRUEを返します。現在、ジオメトリBはポイントである必要があります。
例
店舗の場所のコレクションがあり、特定の顧客の位置から5,000メートル以内のすべての店舗を検索したいとします。
# ポイント(120 30)から5000メートル以内のすべての店舗を検索
filter = "ST_DWITHIN(geo_field, 'POINT(120 30)', 5000)"