Перейти к содержимому
Последнее обновление

ST_CONTAINS

Описание​

Определяет, содержит ли одна геометрическая фигура (shape1) другую геометрическую фигуру (shape2) целиком. Возвращает 1, если shape1 содержит все точки shape2; в противном случае возвращает 0.

  • Для точек: точка должна находиться внутри многоугольника или на его границе.
  • Для линий: все точки линии должны находиться внутри многоугольника или на его границе.
  • Для многоугольников: содержащийся многоугольник должен целиком находиться внутри внешнего многоугольника (границы могут совпадать).

Синтаксис​

ST_CONTAINS( <shape1>, <shape2>)

Параметры​

ПараметрыОписание
<shape1>Геометрическая фигура, для которой проверяется, содержит ли она другую фигуру. Поддерживается тип Polygon.
<shape2>Геометрическая фигура, для которой проверяется, содержится ли она в другой фигуре. Поддерживаются такие типы, как Point, Line, Polygon и т. д.

Возвращаемое значение​

  • 1: означает, что shape1 полностью содержит shape2.
  • 0: означает, что shape1 не содержит shape2.

ST_CONTAINS обрабатывает следующие особые случаи:

  • Возвращает NULL, если хотя бы один из входных параметров равен NULL.
  • Возвращает NULL, если входная геометрическая фигура некорректна (например, самопересекающийся многоугольник).
  • Возвращает 0, если граница shape2 частично совпадает с границей shape1, но часть shape2 находится за пределами shape1.

Пример​

Многоугольник содержит точку (точка внутри)

SELECT ST_Contains(ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Point(5, 5));
+----------------------------------------------------------------------------------------+
| st_contains(st_polygon('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))'), st_point(5.0, 5.0)) |
+----------------------------------------------------------------------------------------+
| 1 |
+----------------------------------------------------------------------------------------+

Многоугольник не содержит точку (точка снаружи)

SELECT ST_Contains(ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Point(50, 50));
+------------------------------------------------------------------------------------------+
| st_contains(st_polygon('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))'), st_point(50.0, 50.0)) |
+------------------------------------------------------------------------------------------+
| 0 |
+------------------------------------------------------------------------------------------+

Многоугольник содержит линию (линия целиком внутри)

mysql> SELECT ST_Contains(  ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"),  ST_Linefromtext("LINESTRING (2 2, 8 8)"));
+-----------------------------------------------------------------------------------------------------------------+
| ST_Contains( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Linefromtext("LINESTRING (2 2, 8 8)")) |
+-----------------------------------------------------------------------------------------------------------------+
| 1 |
+-----------------------------------------------------------------------------------------------------------------+

Многоугольник не содержит линию (часть линии находится снаружи)


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

Многоугольник содержит другой многоугольник (внутренний многоугольник целиком находится внутри внешнего)

mysql> SELECT ST_Contains(  ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"),  ST_Polygon("POLYGON ((2 2, 8 2, 8 8, 2 8, 2 2))"));
+--------------------------------------------------------------------------------------------------------------------------+
| ST_Contains( ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"), ST_Polygon("POLYGON ((2 2, 8 2, 8 8, 2 8, 2 2))")) |
+--------------------------------------------------------------------------------------------------------------------------+
| 1 |
+--------------------------------------------------------------------------------------------------------------------------+

Многоугольник не содержит другой многоугольник (часть внутреннего многоугольника находится снаружи)

mysql> SELECT ST_Contains(  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_Contains( 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 |
+------------------------------------------------------------------------------------------------------------------------------+

Многоугольник и точка на границе (точка на границе многоугольника)

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

Параметр NULL (возвращает NULL)

mysql> SELECT ST_Contains(NULL, ST_Point(5, 5));
+-----------------------------------+
| ST_Contains(NULL, ST_Point(5, 5)) |
+-----------------------------------+
| NULL |
+-----------------------------------+

Самопересекающийся многоугольник в качестве параметра


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