- カテゴリ:
ST_INTERSECTION¶
2つの入力 GEOGRAPHY オブジェクトを与えると、入力オブジェクトの両方に共通なポイントのセット(つまり、2つのオブジェクトの交点)を含んだ形状を表す GEOGRAPHY オブジェクトを返します。
- こちらもご参照ください。
ST_INTERSECTION_AGG , ST_UNION , ST_DIFFERENCE , ST_SYMDIFFERENCE
構文¶
ST_INTERSECTION( <geography_expression_1> , <geography_expression_2> )
引数¶
geography_expression_1
GEOGRAPHY オブジェクトです。
geography_expression_2
GEOGRAPHY オブジェクトです。
戻り値¶
この関数は、 GEOGRAPHY 型の値を返します。
使用上の注意¶
ある入力オブジェクトのいずれかの頂点が別の入力オブジェクトの境界上にある(頂点を除く)と、出力に頂点が含まれる場合と含まれない場合が生じます。
たとえば、
geography_expression_1
がPOINT(1 1)
で、geography_expression_2
がLINESTRING(1 0, 1 2)
であるとします。この場合、geography_expression_1
はgeography_expression_2
の境界上にありますが、その頂点にはありません。この例では、期待される出力は
POINT(1 1)
ですが、実際の出力では空のgeography(NULL で表される)になる可能性があります。これらのケースを検出して回避するために考えられる1つのアイデアは、 ST_DWITHIN を使用して、2つの入力オブジェクト間の最小距離が
0
であるかどうかを判断することです。たとえば、2つのオブジェクト間の最小距離がゼロかどうかを確認することで、ポイントが LineString の上にあるかどうかを確認できます。SELECT TO_GEOGRAPHY('POLYGON((0 0, 1 0, 2 1, 1 2, 2 3, 1 4, 0 4, 0 0))') AS polygon, TO_GEOGRAPHY('POINT(0 2)') AS point, ST_DWITHIN(polygon, point, 0) AS point_is_on_top_of_polygon, ST_INTERSECTION(polygon, point);
このステートメントは、次の出力を生成します。
+--------------------------------------------+------------+----------------------------+---------------------------------+ | POLYGON | POINT | POINT_IS_ON_TOP_OF_POLYGON | ST_INTERSECTION(POLYGON, POINT) | |--------------------------------------------+------------+----------------------------+---------------------------------| | POLYGON((0 0,1 0,2 1,1 2,2 3,1 4,0 4,0 0)) | POINT(0 2) | True | NULL | +--------------------------------------------+------------+----------------------------+---------------------------------+
この関数は、正規化された結果や最小限の結果を生成することが保証されていません。たとえば、出力は、実際には単一の直線セグメントを形成する複数のポイントを含んだ、 LineString で構成されている可能性があります。
例¶
次の例では、2つの入力 GEOGRAPHY オブジェクトの共通部分を表す GEOGRAPHY オブジェクトを返します。
ALTER SESSION SET GEOGRAPHY_OUTPUT_FORMAT = 'WKT'; SELECT ST_INTERSECTION( TO_GEOGRAPHY('POLYGON((0 0, 1 0, 2 1, 1 2, 2 3, 1 4, 0 4, 0 0))'), TO_GEOGRAPHY('POLYGON((3 0, 3 4, 2 4, 1 3, 2 2, 1 1, 2 0, 3 0))')) AS intersection_of_objects;
この例では、次の出力が生成されます。
+-----------------------------------------------------------------------------------------------------------------------------------------+ | INTERSECTION_OF_OBJECTS | |-----------------------------------------------------------------------------------------------------------------------------------------| | MULTIPOLYGON(((1.5 0.5000571198,2 1,1.5 1.500171359,1 1,1.5 0.5000571198)),((1.5 2.500285599,2 3,1.5 3.500399839,1 3,1.5 2.500285599))) | +-----------------------------------------------------------------------------------------------------------------------------------------+
次の画像は、入力オブジェクトと出力オブジェクトを表す領域の差異を示しています。
入力 |
出力 |
---|---|