ST_WITHIN
Описание
Определяет, находится ли одна геометрическая фигура (shape1) полностью внутри другой геометрической фигуры (shape2). Возвращает 1, если shape1 целиком находится внутри shape2; в противном случае возвращает 0.
ST_WITHIN(shape1, shape2) логически эквивалентна ST_CONTAINS(shape2, shape1).
- Для точек: точка должна находиться внутри полигона. Если точка лежит на границе полигона, возвращается 0.
- Для линий: применяются те же правила вложенности в сферической геометрии, что и для
ST_CONTAINS, с обратным порядком аргументов. - Для полигонов: внутренний полигон должен находиться внутри внешнего полигона в соответствии с правилами вложенности S2, используемыми в
ST_CONTAINS.
Синтаксис
ST_WITHIN( <shape1>, <shape2>)
Параметры
| Параметр | Описание |
|---|---|
<shape1> | Закодированное значение геометрии (VARCHAR), возвращаемое конструктором геометрии, например ST_Point или ST_GeometryFromText. |
<shape2> | Закодированная геометрия, в которой проверяется нахождение другой геометрии (VARCHAR). Polygon и MultiPolygon поддерживают входные геометрии типов Point, LineString, Polygon и MultiPolygon; Circle поддерживает входные геометрии типа Point. Для остальных допустимых сочетаний фигур возвращается 0. |
Возвращаемое значение
Возвращает BOOLEAN, который отображается как 1 или 0 в результатах SQL. Исходное представление WKT сначала необходимо преобразовать с помощью конструктора геометрии.
- 1: указывает, что shape1 полностью находится внутри shape2.
- 0: указывает, что shape1 не находится внутри shape2.
Для ST_WITHIN действуют следующие правила обработки особых случаев:
- Возвращает NULL, если хотя бы один из входных параметров равен NULL.
- Возвращает NULL, если входная геометрическая фигура некорректна (например, полигон имеет самопересечения).
- Возвращает 0, если shape1 частично лежит на границе shape2, но при этом частично выходит за её пределы.
Пример
Точка внутри полигона
SELECT ST_Within(ST_Point(5, 5), ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"));
+-------------------------------------------------------------------------------------+
| st_within(st_point(5.0, 5.0), st_polygon('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')) |
+-------------------------------------------------------------------------------------+
| 1 |
+-------------------------------------------------------------------------------------+
Точка вне полигона
SELECT ST_Within(ST_Point(50, 50), ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"));
+---------------------------------------------------------------------------------------+
| st_within(st_point(50.0, 50.0), st_polygon('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')) |
+---------------------------------------------------------------------------------------+
| 0 |
+---------------------------------------------------------------------------------------+
Линия полностью внутри полигона
SELECT ST_Within(ST_LineFromText("LINESTRING (2 2, 8 8)"), ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"));
+-----------------------------------------------------------------------------------------------------------+
| st_within(st_linefromtext('LINESTRING (2 2, 8 8)'), st_polygon('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')) |
+-----------------------------------------------------------------------------------------------------------+
| 1 |
+-----------------------------------------------------------------------------------------------------------+
Линия частично за пределами полигона
SELECT ST_Within(ST_LineFromText("LINESTRING (5 5, 15 15)"), ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"));
+-------------------------------------------------------------------------------------------------------------+
| st_within(st_linefromtext('LINESTRING (5 5, 15 15)'), st_polygon('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')) |
+-------------------------------------------------------------------------------------------------------------+
| 0 |
+-------------------------------------------------------------------------------------------------------------+
Полигон полностью внутри другого полигона
SELECT ST_Within(ST_Polygon("POLYGON ((2 2, 8 2, 8 8, 2 8, 2 2))"), ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"));
+-----------------------------------------------------------------------------------------------------------------------+
| st_within(st_polygon('POLYGON ((2 2, 8 2, 8 8, 2 8, 2 2))'), st_polygon('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')) |
+-----------------------------------------------------------------------------------------------------------------------+
| 1 |
+-----------------------------------------------------------------------------------------------------------------------+
Полигон частично за пределами другого полигона
SELECT ST_Within(ST_Polygon("POLYGON ((5 5, 15 5, 15 15, 5 15, 5 5))"), ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"));
+---------------------------------------------------------------------------------------------------------------------------+
| st_within(st_polygon('POLYGON ((5 5, 15 5, 15 15, 5 15, 5 5))'), st_polygon('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')) |
+---------------------------------------------------------------------------------------------------------------------------+
| 0 |
+---------------------------------------------------------------------------------------------------------------------------+
Точка на границе полигона
SELECT ST_Within(ST_Point(0, 5), ST_Polygon("POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))"));
+-----------------------------------------------------------------------------------+
| st_within(st_point(0.0, 5.0), st_polygon('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')) |
+-----------------------------------------------------------------------------------+
| 0 |
+-----------------------------------------------------------------------------------+
Параметр NULL (возвращается NULL)
SELECT ST_Within(ST_Point(5, 5), NULL);
+-----------------------------------+
| ST_Within(ST_Point(5, 5), NULL) |
+-----------------------------------+
| NULL |
+-----------------------------------+
Полигон с самопересечением в качестве параметра
SELECT ST_Within(ST_Point(0.5, 0.5), ST_Polygon("POLYGON ((0 0, 1 1, 0 1, 1 0, 0 0))"));
+-----------------------------------------------------------------------------------+
| st_within(st_point(0.5, 0.5), st_polygon('POLYGON ((0 0, 1 1, 0 1, 1 0, 0 0))')) |
+-----------------------------------------------------------------------------------+
| NULL |
+-----------------------------------------------------------------------------------+