跳到主要内容
最后于 更新

ST_WITHIN

SinceVersion dev

描述​

判断一个几何图形(shape1)是否完全位于另一个几何图形(shape2)的内部。若 shape1 的所有点都位于 shape2 内部,则返回 1;否则返回 0。

ST_WITHIN(shape1, shape2) 在逻辑上等价于 ST_CONTAINS(shape2, shape1)。

  • 对于点:点必须位于多边形内部。多边形边界上的点返回 0。
  • 对于线:包含关系与反转参数后的 ST_CONTAINS 相同,遵循球面几何规则。
  • 对于多边形:内部多边形必须被外部多边形包含,遵循 ST_CONTAINS 使用的 S2 包含规则。

语法​

ST_WITHIN( <shape1>, <shape2>)

参数​

参数说明
<shape1>由 ST_Point、ST_GeometryFromText 等空间构造函数返回的编码几何值,类型为 VARCHAR。
<shape2>包含图形的编码值,类型为 VARCHAR。Polygon、MultiPolygon 支持 Point、LineString、Polygon、MultiPolygon 输入;Circle 只支持 Point 输入。其他合法图形组合返回 0。

返回值​

返回 BOOLEAN,在 SQL 结果中显示为 1 或 0。WKT 文本必须先通过空间构造函数转换。

返回 1:shape1 完全位于 shape2 内部。

返回 0:shape1 不位于 shape2 内部。

ST_WITHIN 存在以下边缘情况:

  • 若任一输入参数为 NULL,返回 NULL。
  • 若输入的几何图形无效(如自相交的多边形),返回 NULL。
  • 若 shape1 部分位于 shape2 的边界上,但部分在 shape2 外部,返回 0。

示例​

点在多边形内部

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