ST_Geometry 用の空間リレーションシップ関数
Esri と IBM による ST_Geometry の実装では、一対のジオメトリ間に特定のリレーションシップがあるかどうかを判断する述語が採用されています。述語は、テストに合格すると TRUE という意味での 1 または t を返し、不合格だと FALSE という意味での 0 または f を返す関数です。
トピック「ST_Geometry タイプにおける SQL 実装の違い」に記載されているように、IBM Informix Spatial DataBlade Module と PostgreSQL の場合、これらの関数で返される値はブール値です(TRUE の場合は t、FALSE の場合は f)。Oracle の ST_Geometry タイプと IBM DB2 Spatial Extender の場合、TRUE であれば 1、FALSE であれば 0(ゼロ)という値が返されます。
これ以外にも、空間リレーションシップの結果として値を返す関数もあります。たとえば、ST_Distance 関数の場合、2 つのジオメトリが離れている空間を表す倍精度数値が結果として返されます。また、ST_Intersection といった関数の場合は、2 つのジオメトリを組み合わせた結果として 1 つのジオメトリが返されます。
このトピックでは、さまざまなタイプの空間リレーションシップの評価方法について説明します。これらの評価では、次の間のリレーションシップが比較されます。
- ジオメトリによって占有されていないすべての空間である、ジオメトリ外部(E)
- ジオメトリによって占有されているすべての空間である、ジオメトリ内部(I)
- ジオメトリの内部と外部の境界である、ジオメトリ境界(B)
これらの比較にあたっては、述語が使用されます。
リレーションシップは述語によって評価されます。比較結果が関数の条件を満たす場合は、1 または t(TRUE)が返され、それ以外の場合は 0 または f(FALSE)が返されます。空間リレーションシップを評価する述語は、一対のジオメトリを比較します。これらは異なるタイプやディメンションであってもかまいません。
述語によって比較されるのは、送信されたジオメトリの X 座標と Y 座標です。Z 座標とメジャー値がある場合でも、これらは無視されます。Z 座標とメジャーをもつジオメトリを、Z 座標とメジャーをもたないジオメトリと比較することもできます。
Clementini らによって開発された Dimensionally Extended 9 Intersection Model(DE-9IM)は、Egenhofer と Herring の 9 Intersection Model をディメンション的に拡張したものです。DE-9IM は、タイプやディメンションが異なるジオメトリ間のペアワイズ空間リレーションシップを定義する数学的手法です。このモデルは、あらゆる種類のジオメトリ間の空間リレーションシップを、結果として得られる交差のディメンションを考慮した、内部、境界、および外部のペアワイズ交差として表現します。
ジオメトリ a とジオメトリ b があり、a の内部、境界、外部がそれぞれ I(a)、B(a)、E(a)、b の内部、境界、外部がそれぞれ I(b)、B(b)、E(b) であるとします。I(a)、B(a)、E(a) と I(b)、B(b)、E(b) の間の交差によって、3 x 3 のマトリックスが生成されます。それぞれの交差によってディメンションの異なるジオメトリが生じることがあります。たとえば、2 つのポリゴンの境界の交差が 1 つのポイントと 1 本のライン ストリングで構成されることが考えられます。この場合に dim(ディメンション)関数を使用すると、最大ディメンションとして 1 が返されます。
dim 関数は -1、0、1、または 2 の値を返します。値 -1 は NULL セットに対応しており、交差が見つからない場合または dim(Ø) の場合に返されます。
内部 |
境界 |
外部 | |
---|---|---|---|
内部 |
dim(I(a) intersects I(b)) |
dim(I(a) intersects B(b)) |
dim(I(a) intersects E(b)) |
境界 |
dim(B(a) intersects I(b)) |
dim(B(a) intersects B(b)) |
dim(B(a) intersects E(b)) |
外部 |
dim(E(a) intersects I(b)) |
dim(E(a) intersects B(b)) |
dim(E(a) intersects E(b)) |
空間リレーションシップの述語の結果は、DE-9IM の許容値を表すパターン マトリックスと比較することによって理解および確認できます。
パターン マトリックスには、各交差マトリックス セルの許容値が格納されます。考えられるパターン値は次のとおりです。
T: 交差が存在する。dim = 0、1、または 2
F: 交差が存在しない。dim = -1
*: 交差が存在していても存在していなくてもよい。dim = -1、0、1、または 2
0: 交差が存在し、最大ディメンションが 0 である。dim = 0
1: 交差が存在し、最大ディメンションが 1 である。dim = 1
2: 交差が存在し、最大ディメンションが 2 である。dim = 2
それぞれの述語には少なくとも 1 つのパターン マトリックスがあります。述語によっては、さまざまなジオメトリ タイプを組み合わせたリレーションシップを説明するために 2 つ以上必要な場合もあります。
ジオメトリの組み合わせについての述語 ST_Within のパターン マトリックスには、次の形式があります。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
T |
* |
F |
|
a |
境界 |
* |
* |
F |
外部 |
* |
* |
* |
簡単に言うと、述語 ST_Within は、a の内部と b の内部が交差し、かつ a の内部も境界も b の外部と交差していない場合に TRUE を返します。これ以外の条件はいずれも影響しません。
以下のセクションでは、空間リレーションシップについて使用するさまざまな述語について説明します。各セクションの図では、第 1 の入力ジオメトリが黒で、第 2 の入力ジオメトリがオレンジで示されています。
ST_Contains
ST_Contains は、第 2 のジオメトリが第 1 のジオメトリに完全に包含されている場合に 1 または t(TRUE)を返します。述語 ST_Contains が返す結果は、述語 ST_Within とはまったく逆になります。
述語 ST_Contains のパターン マトリックスには、両方のジオメトリの内部が交差しており、かつ第 2 のジオメトリ(ジオメトリ b)の内部と境界が第 1 のジオメトリ(ジオメトリ a)の外部に交差していない必要があると記載されています。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
T |
* |
* |
|
a |
境界 |
* |
* |
* |
外部 |
F |
F |
* |
ST_Within または ST_Contains を使用した場合は、別のジオメトリ内に完全に収まるジオメトリだけを検索できます。これにより、結果に歪みを生じさせる可能性のあるフィーチャを選択から排除できます。以下の例では、アイスクリームの移動販売者が、移動ルートを該当する地区に限定するために、子供(潜在顧客)が最も多い地区を知りたいと思っています。販売者は、指定した地区のポリゴンを、16 歳未満の子供の合計数という属性を持つ国勢調査地区と比較します。
国勢調査地区 1 と国勢調査地区 3 に住むすべての子供が Westside 地区に重なっている細長い部分に住んでいない限り、これらの国勢調査地区を選択に含めると、Westside 地区内の子供の人数が誤って多くなってしまう可能性があります。各地区に完全に収まっている国勢調査地区だけを含めるよう指定する(ST_Within = 1)ことにより、アイスクリーム販売者は前述した Westside 地区の該当部分で時間を浪費するリスクを回避できます。
構文と例については、「ST_Contains」をご参照ください。
ST_Crosses
ST_Crosses は、交差により 2 つのソース ジオメトリの最大ディメンションよりも 1 段階小さいディメンションを持つジオメトリとなり、その交差セットが両方のソース ジオメトリの内部にある場合に、1 または t(TRUE)を返します。1 または t(TRUE)が返されるのは、ST_MultiPoint/ST_Polygon、ST_MultiPoint/ST_LineString、ST_Linestring/ST_LineString、ST_LineString/ST_Polygon、および ST_LineString/ST_MultiPolygon の比較に ST_Crosses に使用した場合だけです。
次の述語 ST_Crosses のパターン マトリックスは、ST_MultiPoint/ST_LineString、ST_MultiPoint/ST_MultiLineString、ST_MultiPoint/ST_Polygon、ST_MultiPoint/ST_MultiPolygon、ST_LineString/ST_Polygon、および ST_LineString/ST_MultiPolygon に適用されます。マトリックスには、内部が交差しており、かつ少なくとも第 1 のジオメトリ(ジオメトリ a)の内部が第 2 のジオメトリ(ジオメトリ b)の外部に交差している必要があると記載されています。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
T |
* |
T |
|
a |
境界 |
* |
* |
* |
外部 |
* |
* |
* |
次の述語 ST_Crosses のマトリックスは、ST_LineString/ST_LineString、ST_LineString/ST_MultiLineString、および ST_MultiLineString/ST_MultiLineString に適用されます。マトリックスには、内部の交差のディメンションが 0(ポイントでの交差)でなければならないと記載されています。この交差のディメンションが 1(ラインストリングでの交差)の場合、述語 ST_Crosses によって FALSE が返されます。ただし、この場合に述語 ST_Overlaps を使用すると、TRUE が返されます。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
0 |
* |
* |
|
a |
境界 |
* |
* |
* |
外部 |
* |
* |
* |
構文と例については、「ST_Crosses」をご参照ください。
ST_Disjoint
Disjoint では、2 つのジオメトリの交差が空のセットの場合に 1 または t(TRUE)が返されます。これはつまり、互いに交差していない分断されているジオメトリです。
述語 ST_Disjoint のパターン マトリックスには、いずれのジオメトリの内部も境界も交差しないと記載されています。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
F |
F |
* |
|
a |
境界 |
F |
F |
* |
外部 |
* |
* |
* |
構文と例については、「ST_Disjoint」をご参照ください。
ST_Equals
ST_Equals は、同じタイプの 2 つのジオメトリの X 座標と Y 座標が同じである場合に 1 または t(TRUE)を返します。オフィス ビルの 1 階と 2 階であっても、X 座標と Y 座標が同じ、つまり等価となる場合があります。ST_Equals では、2 つのフィーチャが誤って互いに上下に配置されていないかどうかも特定することができます。
等価性についての DE-9IM パターン マトリックスでは、内部どうしが交差しており、一方のジオメトリの内部や境界に他方のジオメトリの外部に交差する部分のない状態を保証しています。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
T |
* |
F |
|
a |
境界 |
* |
* |
F |
外部 |
F |
F |
* |
構文と例については、「ST_Equals」をご参照ください。
ST_Intersects
ST_Intersects は、交差が空のセットにならない場合に 1 または t(TRUE)を返します。ST_Intersects は、ST_Disjoint とは正反対の結果を返します。
述語 ST_Intersects は、次のパターン マトリックスのいずれかの条件が TRUE を返した場合に、TRUE を返します。
述語 ST_Intersects は、両方のジオメトリの内部どうしが交差する場合に TRUE を返します。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
T |
* |
* |
|
a |
境界 |
* |
* |
* |
外部 |
* |
* |
* |
述語 ST_Intersects は、第 1 のジオメトリの内部が第 2 のジオメトリの境界に交差している場合に TRUE を返します。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
* |
T |
* |
|
a |
境界 |
* |
* |
* |
外部 |
* |
* |
* |
述語 ST_Intersects は、第 1 のジオメトリの境界が第 2 のジオメトリの内部に交差している場合に TRUE を返します。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
* |
* |
* |
|
a |
境界 |
T |
* |
* |
外部 |
* |
* |
* |
述語 ST_Intersects は、一方のジオメトリの境界が交差している場合に TRUE を返します。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
* |
* |
* |
|
a |
境界 |
* |
T |
* |
外部 |
* |
* |
* |
構文と例については、「ST_Intersects」をご参照ください。
ST_Overlaps
ST_Overlaps は、同じディメンションの 2 つのジオメトリを比較して、結果の交差セットが、ディメンションが等しくかつどちらとも異なるジオメトリになる場合に、1 または t(TRUE)を返します。
ST_Overlaps は、ディメンションが同じジオメトリであり、かつ交差セットが、同じディメンションのジオメトリを生じさせる場合にのみ、1 または t(TRUE)を返します。つまり、2 つの ST_Polygons の交差が 1 つの ST_Polygon になる場合、Overlap は 1 または t(TRUE)を返します。
次のパターン マトリックスは、ST_Polygon/ST_Polygon、ST_MultiPoint/ST_MultiPoint、および ST_MultiPolygon/ST_MultiPolygon overlays のオーバーレイに適用されます。これらの組み合わせである場合、述語 Overlap は、両方のジオメトリの内部が他方の内部と外部に交差する場合に TRUE を返します。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
T |
* |
T |
|
a |
境界 |
* |
* |
* |
外部 |
T |
* |
* |
次のパターン マトリックスは ST_LineString/ST_LineString と ST_MultiLineString/ST_MultiLineString の重なりに適用されます。この場合、ジオメトリの交差はディメンションが 1 のジオメトリ(別の ST_LineString または ST_MultiLineString)になる必要があります。内部の交差のディメンションが 0(ポイント)になる場合、述語 ST_Overlaps は FALSE を返しますが、ST_Crosses は TRUE を返します。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
1 |
* |
T |
|
a |
境界 |
* |
* |
* |
外部 |
T |
* |
* |
構文と例については、「ST_Overlaps」をご参照ください。
ST_Relate
ST_Relate は、パターン マトリックスによって指定される空間リレーションシップが有効な場合に 1 または t(TRUE)を返します。1 または t(TRUE)という値は、ジオメトリ間に何らかの空間リレーションシップがあることを示します。
ジオメトリ a とジオメトリ b の内部または境界に何らかの関係がある場合には、ST_Relate が TRUE になります。一方のジオメトリの外部が他方のジオメトリの内部または境界に交差しているかどうかは関係ありません。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
T |
T |
* |
|
a |
境界 |
T |
T |
* |
外部 |
* |
* |
* |
構文と例については、「ST_Relate」をご参照ください。
ST_Touches
ST_Touches は、両方のジオメトリに共通するポイントがどれも両方のジオメトリの内部に交差していない場合に 1 または t(TRUE)を返します。少なくとも 1 つのジオメトリが ST_LineString、ST_Polygon、ST_MultiLineString、または ST_MultiPolygon でなければなりません。
パターン マトリックスには、述語 ST_Touches が TRUE を返すのは、ジオメトリの内部に交差がなく、一方のジオメトリの境界が他方のジオメトリの内部または境界に交差している場合であると記載されています。
述語 ST_Touches は、ジオメトリ b の境界がジオメトリ a の内部に交差している一方で、内部どうしは交差していない場合に TRUE を返します。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
F |
T |
* |
|
a |
境界 |
* |
* |
* |
外部 |
* |
* |
* |
述語 ST_Touches は、ジオメトリ a の境界がジオメトリ b の内部に交差している一方で、内部どうしは交差していない場合に TRUE を返します。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
F |
* |
* |
|
a |
境界 |
T |
* |
* |
外部 |
* |
* |
* |
述語 ST_Touches は、両方のジオメトリの境界が交差している一方で、内部が交差していない場合に TRUE を返します。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
F |
* |
* |
|
a |
境界 |
* |
T |
* |
外部 |
* |
* |
* |
構文と例については、「ST_Touches」をご参照ください。
ST_Within
ST_Within は、第 1 のジオメトリが完全に第 2 のジオメトリ内にある場合に 1 または t(TRUE)を返します。ST_Within は、ST_Contains の結果とは正反対の状態についての評価です。
述語 ST_Within のパターン マトリックスには、両方のジオメトリの内部が交差しており、かつ第 1 のジオメトリ(ジオメトリ a)の内部と境界が第 2 のジオメトリ(ジオメトリ b)の外部に交差していない必要があると記載されています。
b |
||||
内部 |
境界 |
外部 |
||
内部 |
T |
* |
F |
|
a |
境界 |
* |
* |
F |
外部 |
* |
* |
* |
構文と例については、「ST_Within」をご参照ください。