メインコンテンツまでスキップ
バージョン: 4.x

ST_TOUCHES

説明

2つの幾何図形が境界接触のみを持つかどうかを判定します(すなわち、境界上に共通点が存在するが、内部の交差は無い状態)。具体的には:

2つの図形の境界に少なくとも1つの共通点があり、かつそれらの内部が完全に交差していない場合(重複する領域が無い場合)は1を返します。 境界上に共通点が無い場合、または内部交差がある場合(境界が接触していても)は0を返します。

この関数は「境界のみの接触」と「内部交差」のシナリオを区別するために使用され、隣接するポリゴンの共有エッジ(境界のみの接触)や線とポリゴンの接点(境界のみの接触)などの場合に適用されます。

構文

ST_TOUCHES( <shape1>, <shape2>)

Parameter

Parameterデスクリプション
<shape1>接触を判定する最初の幾何形状。Point、LineString、Polygon、Circle等のタイプをサポートします。
<shape2>接触を判定する2番目の幾何形状。Point、LineString、Polygon、Circle等のタイプをサポートします。

戻り値

1を返す:shape1がshape2と接触している場合。 0を返す:shape1がshape2と接触していない場合。

ST_TOUCHESには以下のエッジケースがあります:

  • 入力パラメータがNULLの場合、NULLを返します。
  • 入力された幾何形状が無効な場合、NULLを返します。
  • 入力が空の幾何オブジェクト(例:POINT EMPTY)の場合、NULLを返します。
  • 一つの形状が他の形状に完全に含まれている場合(内部交差がある場合)、境界が接触していても0を返します。
  • 点が形状の境界と接触している場合(点は内部を持たない)、1を返します(点の「境界」は自身であり、形状の境界と一致し、内部交差はありません)。

Example

Polygonの境界上のPoint

mysql> SELECT ST_TOUCHES(  ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"),  ST_Point(0, 5));
+--------------------------------------------------------------------------------------+
| ST_TOUCHES( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Point(0, 5)) |
+--------------------------------------------------------------------------------------+
| 1 |
+--------------------------------------------------------------------------------------+

ポリゴン境界上にない点(幾何図形の内部)

mysql> SELECT ST_TOUCHES(  ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"),  ST_Point(5, 5));
+--------------------------------------------------------------------------------------+
| ST_TOUCHES( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Point(5, 5)) |
+--------------------------------------------------------------------------------------+
| 0 |
+--------------------------------------------------------------------------------------+

線分は端点で接触します

mysql> SELECT ST_TOUCHES(  ST_Linefromtext("LINESTRING (0 0, 2 2)"),  ST_Linefromtext("LINESTRING (2 2, 4 0)"));
+---------------------------------------------------------------------------------------------------+
| ST_TOUCHES( ST_Linefromtext("LINESTRING (0 0, 2 2)"), ST_Linefromtext("LINESTRING (2 2, 4 0)")) |
+---------------------------------------------------------------------------------------------------+
| 1 |
+---------------------------------------------------------------------------------------------------+

線が内部で交差している(境界接触ではない、0を返す)

mysql> SELECT ST_TOUCHES(  ST_Linefromtext("LINESTRING (0 0, 10 10)"),  ST_Linefromtext("LINESTRING (0 10, 10 0)"));
+-------------------------------------------------------------------------------------------------------+
| ST_TOUCHES( ST_Linefromtext("LINESTRING (0 0, 10 10)"), ST_Linefromtext("LINESTRING (0 10, 10 0)")) |
+-------------------------------------------------------------------------------------------------------+
| 0 |
+-------------------------------------------------------------------------------------------------------+

線がポリゴン境界に接しています


mysql> SELECT ST_TOUCHES( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Linefromtext("LINESTRING (10 5, 15 5)"));
+------------------------------------------------------------------------------------------------------------------+
| ST_TOUCHES( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Linefromtext("LINESTRING (10 5, 15 5)")) |
+------------------------------------------------------------------------------------------------------------------+
| 1 |
+------------------------------------------------------------------------------------------------------------------+

線がポリゴンの内部を通過する(内部交差、0を返す)



mysql> SELECT ST_TOUCHES( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Linefromtext("LINESTRING (5 5, 15 5)"));
+-----------------------------------------------------------------------------------------------------------------+
| ST_TOUCHES( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Linefromtext("LINESTRING (5 5, 15 5)")) |
+-----------------------------------------------------------------------------------------------------------------+
| 0 |
+-----------------------------------------------------------------------------------------------------------------+

ポリゴンが境界を共有する(境界のみの接触、1を返す)

mysql> SELECT ST_TOUCHES(  ST_Polygon("POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))"),  ST_Polygon("POLYGON ((5 0, 10 0, 10 5, 5 5, 5 0))"));
+-----------------------------------------------------------------------------------------------------------------------+
| ST_TOUCHES( ST_Polygon("POLYGON ((0 0, 5 0, 5 5, 0 5, 0 0))"), ST_Polygon("POLYGON ((5 0, 10 0, 10 5, 5 5, 5 0))")) |
+-----------------------------------------------------------------------------------------------------------------------+
| 1 |
+-----------------------------------------------------------------------------------------------------------------------+

ポリゴンが部分的に重複しています(内部交差、0を返します)

mysql> SELECT ST_TOUCHES(  ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"),  ST_Polygon("POLYGON ((5 5, 15 5, 15 15, 5 15, 5 5))"));
+-----------------------------------------------------------------------------------------------------------------------------+
| ST_TOUCHES( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Polygon("POLYGON ((5 5, 15 5, 15 15, 5 15, 5 5))")) |
+-----------------------------------------------------------------------------------------------------------------------------+
| 0 |
+-----------------------------------------------------------------------------------------------------------------------------+

空の形状とポリゴン(接触なし、0を返す)

mysql> SELECT ST_TOUCHES(  ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"),  ST_GeometryFromText("POINT EMPTY"))
-> ;
+----------------------------------------------------------------------------------------------------------+
| ST_TOUCHES( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_GeometryFromText("POINT EMPTY")) |
+----------------------------------------------------------------------------------------------------------+
| NULL |
+----------------------------------------------------------------------------------------------------------+

無効な自己交差ポリゴン(NULLを返す)


mysql> SELECT ST_TOUCHES( ST_Polygon("POLYGON ((0 0, 1 1, 0 1, 1 0, 0 0))"),ST_Point(0.5, 0.5));
+------------------------------------------------------------------------------------+
| ST_TOUCHES( ST_Polygon("POLYGON ((0 0, 1 1, 0 1, 1 0, 0 0))"),ST_Point(0.5, 0.5)) |
+------------------------------------------------------------------------------------+
| NULL |
+------------------------------------------------------------------------------------+

パラメータがNULL(NULLを返す)

mysql> SELECT ST_TOUCHES(NULL, ST_Point(5, 5));
+----------------------------------+
| ST_TOUCHES(NULL, ST_Point(5, 5)) |
+----------------------------------+
| NULL |
+----------------------------------+
mysql> SELECT ST_TOUCHES(ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), NULL);
+-------------------------------------------------------------------------+
| ST_TOUCHES(ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), NULL) |
+-------------------------------------------------------------------------+
| NULL |
+-------------------------------------------------------------------------+

円は直線に接する

mysql> SELECT ST_TOUCHES(  ST_Circle(0, 0, 5),  ST_Linefromtext("LINESTRING (-10 5, 10 5)"));
+--------------------------------------------------------------------------------+
| ST_TOUCHES( ST_Circle(0, 0, 5), ST_Linefromtext("LINESTRING (-10 5, 10 5)")) |
+--------------------------------------------------------------------------------+
| 1 |
+--------------------------------------------------------------------------------+

点が円の境界と交差する


mysql> SELECT ST_TOUCHES( ST_Circle(0, 0, 5), ST_Point(5, 0));
+---------------------------------------------------+
| ST_TOUCHES( ST_Circle(0, 0, 5), ST_Point(5, 0)) |
+---------------------------------------------------+
| 1 |
+---------------------------------------------------+

2つの円が接している

mysql> SELECT ST_TOUCHES(  ST_Circle(0, 0, 5),  ST_Circle(10, 0, 5));
+--------------------------------------------------------+
| ST_TOUCHES( ST_Circle(0, 0, 5), ST_Circle(10, 0, 5)) |
+--------------------------------------------------------+
| 1 |
+--------------------------------------------------------+

点は円の内部にある(接触ではない)

mysql> SELECT ST_TOUCHES(  ST_Circle(0, 0, 5),  ST_Point(4, 0));
+---------------------------------------------------+
| ST_TOUCHES( ST_Circle(0, 0, 5), ST_Point(4, 0)) |
+---------------------------------------------------+
| 0 |
+---------------------------------------------------+

線が円と交差する場合、0を返す

mysql> SELECT ST_TOUCHES(  ST_Circle(0, 0, 5),  ST_Linefromtext("LINESTRING (-10 0, 10 0)"));
+--------------------------------------------------------------------------------+
| ST_TOUCHES( ST_Circle(0, 0, 5), ST_Linefromtext("LINESTRING (-10 0, 10 0)")) |
+--------------------------------------------------------------------------------+
| 0 |
+--------------------------------------------------------------------------------+

円がポリゴンに接している

mysql> SELECT ST_TOUCHES(  ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"),  ST_Circle(15, 5, 5));
+-------------------------------------------------------------------------------------------+
| ST_TOUCHES( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Circle(15, 5, 5)) |
+-------------------------------------------------------------------------------------------+
| 1 |
+-------------------------------------------------------------------------------------------+

円がポリゴンと交差する場合、0を返す

mysql> SELECT ST_TOUCHES(  ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"),  ST_Circle(8, 5, 3));
+------------------------------------------------------------------------------------------+
| ST_TOUCHES( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Circle(8, 5, 3)) |
+------------------------------------------------------------------------------------------+
| 0 |
+------------------------------------------------------------------------------------------+