カテゴリ:

地理空間関数

ST_INTERSECTION

2つの入力 GEOGRAPHY オブジェクトを与えると、入力オブジェクトの両方に共通なポイントのセット(つまり、2つのオブジェクトの交点)を含んだ形状を表す GEOGRAPHY オブジェクトを返します。

こちらもご参照ください。

ST_UNIONST_DIFFERENCEST_SYMDIFFERENCE

構文

ST_INTERSECTION( <geography_expression_1> , <geography_expression_2> )
Copy

引数

geography_expression_1

GEOGRAPHY オブジェクトです。

geography_expression_2

GEOGRAPHY オブジェクトです。

戻り値

この関数は、 GEOGRAPHY 型の値を返します。

使用上の注意

  • ある入力オブジェクトのいずれかの頂点が別の入力オブジェクトの境界上にある(頂点を除く)と、出力に頂点が含まれる場合と含まれない場合が生じます。

    たとえば、 geography_expression_1POINT(1 1) で、 geography_expression_2LINESTRING(1 0, 1 2) であるとします。この場合、 geography_expression_1geography_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);
    
    Copy

    このステートメントは、次の出力を生成します。

    +--------------------------------------------+------------+----------------------------+---------------------------------+
    | 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                            |
    +--------------------------------------------+------------+----------------------------+---------------------------------+
    
    Copy

    この関数は、正規化された結果や最小限の結果を生成することが保証されていません。たとえば、出力は、実際には単一の直線セグメントを形成する複数のポイントを含んだ、 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;
Copy

この例では、次の出力が生成されます。

+-----------------------------------------------------------------------------------------------------------------------------------------+
| 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))) |
+-----------------------------------------------------------------------------------------------------------------------------------------+
Copy

次の画像は、入力オブジェクトと出力オブジェクトを表す領域の差異を示しています。

入力

出力

Areas of input objects passed to ST_INTERSECTION Areas of output objects returned by ST_INTERSECTION