最良のパフォーマンスを得るためには、ST_Within または ST_Touches などのメソッドを常に使用して、ジオメトリ間の単一の特定の関係をテストします。ただし、複数の関係をテストする場合、一度に複数の関係をテストできる ST_Relate メソッドの方が適しています。ST_Relate は、述部の異なる解釈をテストする場合にも役に立ちます。
ST_Relate の最も一般的な使用法は、テストする関係を厳密に指定して、述部として使用する方法です。ただし、ST_Relate を使用して、2 つのジオメトリ間で可能なすべての関係を判別することもできます。
ST_Relate は、内部、境界、外部の「交差テスト」を実行することによって、ジオメトリ間の関係を評価します。ジオメトリ間の関係は、DE-9IM (Dimensionally Extended 9 Intersection Model) フォーマットの 9 文字の文字列で記述されます。この文字列の各文字は、交差テストの結果の次元を表します。
ST_Relate を述部として使用する場合、テストする交差の結果を示した DE-9IM 文字列を渡します。指定した DE-9IM 文字列の条件をジオメトリが満たしている場合、ST_Relate は 「1」 を返します。条件が満たされない場合は、「0」 を返します。片方のジオメトリ、または両方が NULL の場合、「NULL」 を返します。
9 文字の DE-9IM 文字列は、内部、境界、外部間の交差テストのペアごとのマトリックスをフラットにした表現です。次の表に、実行される順序 (左から右、上から下) で 9 つの交差テストを示します。
「g2 内部」 | 「g2 境界」 | 「g2 外部」 | |
「g1 内部」 | Interior(g1) ∩ Interior(g2) |
Interior(g1) ∩ Boundary(g2) |
Interior(g1) ∩ Exterior(g2) |
「g1 境界」 | Boundary(g1) ∩ Interior(g2) |
Boundary(g1) ∩ Boundary(g2) |
Boundary(g1) ∩ Exterior(g2) |
「g1 外部」 | Exterior(g1) ∩ Interior(g2) |
Exterior(g1) ∩ Boundary(g2) |
Exterior(g1) ∩ Exterior(g2) |
DE-9IM 文字列を指定する場合、9 文字の各文字に *、0、1、2、T、または F を指定できます。これらの値は、交差によって作成されるジオメトリの次元数を表しています。
指定する文字 | 交差テストが返す結果 |
---|---|
T | 次のいずれか:0、1、2 (任意の次元の交差) |
F | -1 |
* | -1、0、1、2 (任意の値) |
0 | 0 |
1 | 1 |
2 | 2 |
ST_Relate と Within 述部用のカスタム DE-9IM 文字列を使用して、ジオメトリが別のジオメトリ内にあるかどうかをテストするとします。
SELECT new ST_Polygon('Polygon(( 2 3, 8 3, 4 8, 2 3 ))').ST_Relate( new ST_Polygon('Polygon((-3 3, 3 3, 3 6, -3 6, -3 3))'), 'T*F**F***' ); |
これは、交差テストを実行するときに、ST_Relate に次の条件で検索するように問い合わせるのと同じです。
g2 内部 | g2 境界 | g2 外部 | |
g1 内部 | 次のいずれか:0、1、2 0, 1, 2 | 次のいずれか:0、1、2、-1 0, 1, 2, -1 | 「-1」 |
g1 境界 | 次のいずれか:0、1、2、-1 0, 1, 2, -1 | 次のいずれか:0、1、2、-1 0, 1, 2, -1 | 「-1」 |
g1 外部 | 次のいずれか:0、1、2、-1 0, 1, 2, -1 | 次のいずれか:0、1、2、-1 0, 1, 2, -1 | 次のいずれか:0、1、2、-1 0, 1, 2, -1 |
クエリを実行すると、ST_Relate は最初のジオメトリが 2 番目のジオメトリ内にないことを示す 0 を返します。
2 つのジオメトリを表示して、その形状をテストしている内容と比較するには、次の文を Interactive SQL の空間ビューアー ([ツール] » [空間ビューアー]) で実行します。
SELECT NEW ST_Polygon('Polygon(( 2 3, 8 3, 4 8, 2 3 ))') UNION ALL SELECT NEW ST_Polygon('Polygon((-3 3, 3 3, 3 6, -3 6, -3 3))'); |
述部以外で ST_Relate を使用すると、2 つのジオメトリ間のすべての関係が返されます。
たとえば、前の例で使用したものと同じ 2 つのジオメトリがあり、それらの関係を知りたいとします。次の文を Interactive SQL で実行すると、ジオメトリ間の関係を定義した DE-9IM 文字列が返されます。
SELECT new ST_Polygon('Polygon(( 2 3, 8 3, 4 8, 2 3 ))').ST_Relate(new ST_Polygon('Polygon((-3 3, 3 3, 3 6, -3 6, -3 3))')); |
ST_Relate は DE-9IM 文字列 212111212
を返します。
この値をマトリックス表示すると、多くの交差ポイントがあることがわかります。
g2 内部 | g2 境界 | g2 外部 | |
g1 内部 | 2 | 1 | 2 |
g1 境界 | 1 | 1 | 1 |
g1 外部 | 2 | 1 | 2 |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |