ジオメトリ演算子Public Preview
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を含み、その内部に少なくとも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を返します。これは、接続性を検出するのに便利です。
例
不動産 parcels の地図があり、重複することなく公共の公園に直接隣接するすべての parcels を見つけたい場合。
# 境界でラインストリングにのみ接触するジオメトリを見つけるためのフィルター式。
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)"