关系函数使用谓词来测试不同类型的空间关系。测试通过比较以下各项的关系达到此目的:
- 几何的外部 (E),即未被几何占用的所有空间
- 几何的内部 (I),即几何所占空间
- 几何的边界 (B),即几何内部和外部的分界
谓词用于测试关系。如果比较结果满足函数的条件,则谓词返回 1 或 t (TRUE);否则,返回 0 或 f (FALSE)。用于测试以确定空间关系的谓词对可具有不同类型或维度的几何对进行比较。
谓词可比较已提交几何的 x 和 y 坐标。将忽略 z 坐标和测量值(如果存在)。可将具有 z 坐标或测量值的几何与不具有 z 坐标或测量值的几何进行比较。
Clementini 等人开发的维扩展九交模型 (DE-9IM) 在维度上扩展了 Egenhofer 和 Herring 的九交模型。DE-9IM 这种数学方法定义了不同类型和维度的几何之间的成对空间关系。此模型将所有类型的几何之间的空间关系表示为其内部、边界和外部的成对交集,还考虑到生成的交集的维度。
假设有几何 a 和 b,I(a)、B(a) 和 E(a) 分别表示 a 的内部、边界和外部,I(b)、B(b) 和 E(b) 分别表示 b 的内部、边界和外部。I(a)、B(a) 和 E(a) 分别与 I(b)、B(b) 和 E(b) 的交集生成了一个 3×3 矩阵。每个交集可生成不同维度的几何。例如,两个面的边界的交集可由点和线串组成,在这种情况下,dim(维度)函数将返回最大维度 1。
dim 函数返回值 -1、0、1 或 2。值 -1 对应于未找到交集时返回的空集或 dim(Ø)。
内部 | 边界 | 外部 | |
---|---|---|---|
内部 | dim(I(a) 与 I(b) 的交集) | dim(I(a) 与 B(b) 的交集) | dim(I(a) 与 E(b) 的交集) |
边界 | dim(B(a) 与 I(b) 的交集) | dim(B(a) 与 B(b) 的交集) | dim(B(a) 与 E(b) 的交集) |
外部 | dim(E(a) 与 I(b) 的交集) | dim(E(a) 与 B(b) 的交集) | dim(E(a) 与 E(b) 的交集) |
可通过将谓词结果与表示 DE-9IM 可接受值的模式矩阵进行比较来理解或验证空间关系谓词的结果。
模式矩阵包含每个交集矩阵单元的可接受值。可用的模式值如下:
T - 必须存在交集;dim = 0、1 或 2
F - 不得存在交集;dim = -1
* - 交集是否存在无关紧要;dim = -1、0、1 或 2
0 - 交集必须存在且最大维度必须为 0;dim = 0
1 - 交集必须存在且最大维度必须为 1;dim = 1
2 - 交集必须存在且最大维度必须为 2;dim = 2
每个谓词至少包含一个模式矩阵,但是有些谓词需要多个模式矩阵来描述各种几何类型组合的关系。
针对几何组合的 ST_Within 谓词的模式矩阵具有以下形式:
b | ||||
内部 | 边界 | 外部 | ||
内部 | T | * | F | |
a | 边界 | * | * | F |
外部 | * | * | * |
简而言之,如果两个几何的内部相交,且 a 的内部和边界与 b 的外部不相交,则 ST_Within 谓词返回 TRUE。所有其他条件均无关紧要。
以下部分介绍用于空间关系的不同谓词。在这些部分的插图中,列出的第一个输入几何以黑色显示,第二个输入几何以橙色描绘。
ST_Contains
如果第一个几何完全包含第二个几何,则 ST_Contains 返回 1 或 t (TRUE)。ST_Contains 谓词返回的结果与 ST_Within 谓词的结果完全相反。
ST_Contains 谓词的模式矩阵规定两个几何的内部必须相交,并且次要几何(几何 b)的内部和边界不得与主要几何(几何 a)的外部相交。
b | ||||
内部 | 边界 | 外部 | ||
内部 | T | * | * | |
a | 边界 | * | * | * |
外部 | F | F | * |
使用 ST_Within 或 ST_Contains 可仅标识完全落入其他几何内部的几何。这有助于从选择内容中消除会影响结果的要素。在以下示例中,流动冰淇淋商贩希望确定哪个邻域的孩子(潜在客户)数量最多,以便将路线限制为前往那些区域。他将指定邻域面比作人口普查区域,此面具有的一项属性为 16 岁以下儿童的总数。
除非居住在人口普查区域 1 和人口普查区域 3 中的所有儿童都居住在落在 Westside 内部的细长区域中,否则在选择中包括这些区域会错误地增加 Westside 邻域中儿童的数量。通过指定仅包括完全位于邻域内部的人口普查区域 (ST_Within = 1),冰淇淋商贩可避免在 Westside 的那些区域浪费时间从而节约支出。
有关语法和示例,请参阅 ST_Contains。
ST_Crosses
如果交集形成了一个维度比两个源几何的最大维度小一的几何,并且交集位于两个源几何内部,则 ST_Crosses 返回 1 或 t (TRUE)。ST_Crosses 只会为 ST_MultiPoint/ST_Polygon、ST_MultiPoint/ST_LineString、ST_Linestring/ST_LineString、ST_LineString/ST_Polygon 以及 ST_LineString/ST_MultiPolygon 这些比较返回 1 或 t (TRUE)。
此 ST_Crosses 谓词模式矩阵适用于 ST_MultiPoint/ST_LineString、ST_MultiPoint/ST_MultiLineString、ST_MultiPoint/ST_Polygon、ST_MultiPoint/ST_MultiPolygon、ST_LineString/ST_Polygon 和 ST_LineString/ST_MultiPolygon。此矩阵规定内部必须相交,并且规定至少主要几何(几何 a)内部与次要几何(几何 b)外部必须相交。
b | ||||
内部 | 边界 | 外部 | ||
内部 | T | * | T | |
a | 边界 | * | * | * |
外部 | * | * | * |
此 ST_Crosses 谓词矩阵适用于 ST_LineString/ST_LineString、ST_LineString/ST_MultiLineString 和 ST_MultiLineString/ST_MultiLineString。此矩阵规定内部与内部交集的维度必须为 0(在某点相交)。如果交集的维度为 1(在某线串处相交),则 ST_Crosses 谓词会返回 FALSE,但 ST_Overlaps 谓词会返回 TRUE。
b | ||||
内部 | 边界 | 外部 | ||
内部 | 0 | * | * | |
a | 边界 | * | * | * |
外部 | * | * | * |
有关语法和示例,请参阅 ST_Crosses。
ST_Disjoint
如果两个几何的交集是空集,则 Disjoint 返回 1 或 t (TRUE)。也就是说,如果几何彼此没有相交,则它们不相交。
ST_Disjoint 谓词模式矩阵仅规定任一几何的内部和边界都不相交。
b | ||||
内部 | 边界 | 外部 | ||
内部 | F | F | * | |
a | 边界 | F | F | * |
外部 | * | * | * |
有关语法和示例,请参阅 ST_Disjoint。
ST_Equals
如果两个相同类型的几何具有相同的 x,y 坐标值,则 ST_Equals 返回 1 或 t (TRUE)。办公楼的第一层和第二层可具有相同的 x,y 坐标,因此这两层的几何相等。ST_Equals 还可识别是否错误地将两个要素中的一个放置到了另一个上。
DE-9IM 相等模式矩阵可确保内部相交以及任一几何内部的任何部分或边界都不与另一几何的外部相交。
b | ||||
内部 | 边界 | 外部 | ||
内部 | T | * | F | |
a | 边界 | * | * | F |
外部 | F | F | * |
有关语法和示例,请参阅 ST_Equals。
ST_Intersects
如果相交没有生成空集,则 ST_Intersects 返回 1 或 t (TRUE)。ST_Intersects 返回的结果与 ST_Disjoint 的结果完全相反。
如果以下任何模式矩阵的条件返回 TRUE,则 ST_Intersects 谓词返回 TRUE。
如果两个几何的内部相交,则 ST_Intersects 谓词返回 TRUE。
b | ||||
内部 | 边界 | 外部 | ||
内部 | T | * | * | |
a | 边界 | * | * | * |
外部 | * | * | * |
如果第一个几何的内部与第二个几何的边界相交,则 ST_Intersects 谓词返回 TRUE。
b | ||||
内部 | 边界 | 外部 | ||
内部 | * | T | * | |
a | 边界 | * | * | * |
外部 | * | * | * |
如果第一个几何的边界与第二个几何的内部相交,则 ST_Intersects 谓词返回 TRUE。
b | ||||
内部 | 边界 | 外部 | ||
内部 | * | * | * | |
a | 边界 | T | * | * |
外部 | * | * | * |
如果任一几何的边界相交,则 ST_Intersects 谓词返回 TRUE。
b | ||||
内部 | 边界 | 外部 | ||
内部 | * | * | * | |
a | 边界 | * | T | * |
外部 | * | * | * |
有关语法和示例,请参阅 ST_Intersects。
ST_Overlaps
ST_Overlaps 比较具有相同维度的两个几何,如果这两个几何的交集生成的几何与这两个几何都不同但维度相同,则 ST_Overlaps 返回 1 或 t (TRUE)。
仅对于相同维度的几何且只有当其交集生成相同维度的几何时,ST_Overlaps 才返回 1 或 t (TRUE)。也就是说,如果两个 ST_Polygon 的交集生成了 ST_Polygon,则 ST_Overlaps 返回 1 或 t (TRUE)。
此模式矩阵适用于 ST_Polygon/ST_Polygon、ST_MultiPoint/ST_MultiPoint 和 ST_MultiPolygon/ST_MultiPolygon 叠加。对于这些组合,如果两个几何的内部同时与另一几何的内部和外部相交,则 ST_Overlaps 谓词返回 TRUE。
b | ||||
内部 | 边界 | 外部 | ||
内部 | T | * | T | |
a | 边界 | * | * | * |
外部 | T | * | * |
以下模式矩阵适用于 ST_LineString/ST_LineString 和 ST_MultiLineString/ST_MultiLineString 叠加。在这种情况下,几何的交集必须生成维度为 1 的几何(另一 ST_LineString 或 ST_MultiLineString)。如果内部的交集的维度为 0(点),则 ST_Overlaps 谓词返回 FALSE;但 ST_Crosses 谓词返回 TRUE。
b | ||||
内部 | 边界 | 外部 | ||
内部 | 1 | * | T | |
a | 边界 | * | * | * |
外部 | T | * | * |
有关语法和示例,请参阅 ST_Overlaps。
ST_Relate
如果模式矩阵规定的空间关系存在,则 ST_Relate 返回值 1 或 t (TRUE)。值 1 或 t (TRUE) 表示几何之间存在某种空间关系。
如果几何 a 和 b 的内部或边界以任何方式相关联,则 ST_Relate 为 true。某个几何的外部与另一几何的内部或边界是否相交则无关紧要。
b | ||||
内部 | 边界 | 外部 | ||
内部 | T | T | * | |
a | 边界 | T | T | * |
外部 | * | * | * |
有关语法和示例,请参阅 ST_Relate。
ST_Touches
如果两个几何的公共点都不与两个几何的内部相交,则 ST_Touches 返回 1 或 t (TRUE)。其中至少一个几何必须是 ST_LineString、ST_Polygon、ST_MultiLineString 或 ST_MultiPolygon。
由此模式矩阵可知,如果几何的内部不相交且任一几何的边界与另一几何的内部或边界相交时,则 ST_Touches 谓词返回 TRUE。
如果几何 b 的边界与几何 a 的内部相交,但这两个几何的内部不相交,则 ST_Touches 谓词返回 TRUE。
b | ||||
内部 | 边界 | 外部 | ||
内部 | F | T | * | |
a | 边界 | * | * | * |
外部 | * | * | * |
如果几何 a 的边界与几何 b 的内部相交,但这两个几何的内部不相交,则 ST_Touches 谓词返回 TRUE。
b | ||||
内部 | 边界 | 外部 | ||
内部 | F | * | * | |
a | 边界 | T | * | * |
外部 | * | * | * |
如果两个几何的边界相交,但内部不相交,则 ST_Touches 谓词返回 TRUE。
b | ||||
内部 | 边界 | 外部 | ||
内部 | F | * | * | |
a | 边界 | * | T | * |
外部 | * | * | * |
有关语法和示例,请参阅 ST_Touches。
ST_Within
如果第一个几何完全位于第二个几何内部,则 ST_Within 返回 1 或 t (TRUE)。ST_Within 测试的结果与 ST_Contains 的结果完全相反。
ST_Within 谓词的模式矩阵规定两个几何的内部必须相交,并且主要几何(几何 a)的内部和边界不得与次要几何(几何 b)的外部相交。
b | ||||
内部 | 边界 | 外部 | ||
内部 | T | * | F | |
a | 边界 | * | * | F |
外部 | * | * | * |
有关语法和示例,请参阅 ST_Within。