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