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

ST_WITHIN

SinceVersion dev

Описание​

Определяет, находится ли одна геометрическая фигура (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 |
+-----------------------------------------------------------------------------------+