OGC标准定义了以下一组用于比较几何图形的方法。
一、ST_Equals
ST_Equals(geometry A, geometry B)用于测试两个图形的空间相等性。
如果两个相同类型的几何图形具有相同的x、y坐标值,即如果第二个图形与第一个图形的空间形状与位置相等(空间相等性),则ST_Equals()返回TRUE。
二、ST_Intersects、ST_Disjoint、ST_Crosses和ST_Overlaps
ST_Intersects、ST_Crosses和ST_Overlaps都用于测试几何图形内部是否相交。
如果两个图形有相同的空间部分,即如果它们的边界或内部相交,则ST_Intersects(geometry A, geometry B)返回TRUE。
ST_Intersects()方法的对立方法是ST_Disjoint(geometry A, geometry B)。
如果两个几何图形没有相交的部分,则它们不相交,反之亦然。
事实上测试"not intersect"(!ST_Intersects)通常比测试"disjoint"(ST_Disjoint)更有效,因为intersect测试会自动使用空间索引。
对于multipoint/polygon、multipoint/linestring、linestring/linestring、linestring/polygon和linestring/multipolygon的比较,如果相交生成的几何图形的维度小于两个源几何图形的最大维度,且相交集位于两个源几何图形的内部,则ST_Crosses(geometry A, geometry B)将返回TRUE(其实就是判断两个几何图形是否交叉)。
ST_Overlaps(geometry A, geometry B)比较两个相同维度的几何图形,如果它们的结果集与两个源几何图形都不同但具有相同维度,则返回TRUE(其实就是判断两个几何图形是否叠置)。
三、ST_Touches
ST_Touches()测试两个几何图形是否在它们的边界上接触,但在它们的内部不相交。
如果两个几何图形的边界相交,或者只有一个几何图形的内部与另一个几何图形的边界相交,则ST_Touches(geometry A, geometry B)将返回TRUE。
四、ST_Within和ST_Contains
ST_Within()和ST_Contains()测试一个几何图形是否完全位于另一个几何图形内。
如果第一个几何图形完全位于第二个几何图形内,则ST_Within(geometry A, geometry B)返回TRUE,ST_Within()测试的结果与ST_Contains()完全相反。
如果第二个几何图形B完全包含在第一个几何图形A内,则ST_Contains(geometry A, geometry B)返回TRUE。
五、ST_Distance和ST_DWithin
一个常见的GIS问题是"找到这个物体周围距离它X的所有其他物体"。
ST_Distance(geometry A, geometry B)计算两个几何图形之间的最短距离,并将其作为浮点数返回。这对于实际报告几何图形之间的距离非常有用。
SELECT ST_Distance(
ST_GeometryFromText('POINT(0 5)'),
ST_GeometryFromText('LINESTRING(-2 2, 2 2)'));为了测试两个几何图形之间的距离是否在某个范围之内,ST_DWithin()函数提供了一个基于索引加速的功能。
这对于"在距离道路500米的缓冲区内有多少棵树?"这样的问题很有用,你不必计算实际的缓冲区,只需测试距离关系即可。
SELECT name
FROM nyc_streets
WHERE ST_DWithin(
geom,
ST_GeomFromText('POINT(583571 4506714)',26918),
10
);
Comments