ST_TOUCHES
Описание
Определяет, касаются ли две геометрические фигуры только границами (то есть имеют общие точки на границах, но их внутренние части не пересекаются). А именно:
Возвращает 1, если границы двух фигур имеют хотя бы одну общую точку, а их внутренние части совсем не пересекаются (нет перекрывающихся областей). Возвращает 0, если на границах нет общих точек или если внутренние части пересекаются (даже если границы соприкасаются).
Эта функция позволяет различать случаи «касания только границами» и «пересечения внутренних частей», например общие рёбра соседних многоугольников (касание только границами) или точки касания линии и многоугольника (касание только границами).
Синтаксис
ST_TOUCHES( <shape1>, <shape2>)
Параметры
| Параметр | Описание |
|---|---|
<shape1> | Первая геометрическая фигура для проверки касания; поддерживаются такие типы, как Point, LineString, Polygon, Circle и т. д. |
<shape2> | Вторая геометрическая фигура для проверки касания; поддерживаются такие типы, как Point, LineString, Polygon, Circle и т. д. |
Возвращаемое значение
Возвращает 1: shape1 касается shape2. Возвращает 0: shape1 не касается shape2.
Для ST_TOUCHES предусмотрены следующие особые случаи:
- Если любой из входных параметров равен NULL, возвращает NULL.
- Если входная геометрическая фигура некорректна, возвращает NULL.
- Если на вход передан пустой геометрический объект (например, POINT EMPTY), возвращает NULL.
- Если одна фигура полностью содержится внутри другой (с пересечением внутренних частей), возвращает 0, даже если их границы соприкасаются.
- Когда точка соприкасается с границей фигуры (у точки нет внутренней части), возвращает 1 («границей» точки является сама точка, которая совпадает с границей фигуры, при этом внутренние части не пересекаются).
Примеры
Точка на границе многоугольника
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 |
+---------------------------------------------------+
Два круга касаются друг друга
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 |
+------------------------------------------------------------------------------------------+