最后于 更新
ST_WITHIN
描述
判断一个几何图形(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 |
+-----------------------------------------------------------------------------------+