空间数据库之所以强大,不仅是它们能存储几何图形,还因为它们能比较几何图形之间的关系
诸如"哪一个是离公园最近的自行车位?"或者"地铁线路和街道的交叉路口在哪里?"的问题,只能通过比较表示自行车位、街道和地铁线路的几何图形来回答。
OGC标准定义了以下一组用于比较几何图形的方法。
一 判断两个几何图形是否相等
ST_Equals(geometry A, geometry B)用于测试两个图形的空间相等性。
如果两个相同类型的几何图形具有相同的x、y坐标值,即如果第二个图形与第一个图形的坐标信息相等(相同),则ST_Equals()返回TRUE。
首先,让我们从nyc_subway_stations表中检索点数据的表达数据,我们只选"Broad St"的条目。
然后,将几何图形表示数据插入ST_Equals()进行测试:
SELECT name, geom, ST_AsText(geom)
FROM nyc_subway_stations
WHERE name = 'Broad St';
SELECT name,geom
FROM nyc_subway_stations
WHERE ST_Equals(geom,'0101000020266900000EEBD4CF27CF2141BC17D69516315141');
其中包含两个参数
geom:可以看作是表nyc_subway_stations的geom列
'0101...5141':是地点Broad St坐标值的精确表示
二 判断几何图形的位置关系
2.1 相交
ST_Intersects(geometry A, geometry B)
ST_Touches(geometry A, geometry B)
如果两个图形有相同的部分,即如果它们的边界或内部相交,则ST_Intersects(geometry A, geometry B)返回TRUE。
如果两个几何图形的边界相交,或者只有一个几何图形的内部与另一个几何图形的边界相交,则ST_Touches(geometry A, geometry B)将返回TRUE。
2.2 相离
ST_Disjoint(geometry A, geometry B),如果两个几何图形没有重合的部分,则它们不相交,反之亦然。
事实上测试"not intersect"通常比测试"disjoint"更有效,因为intersect测试可以使用空间索引。
2.3 交叉
ST_Crosses(geometry A, geometry B)
对于multipoint/polygon、multipoint/linestring、linestring/linestring、linestring/polygon和linestring/multipolygon的比较,如果相交生成的几何图形的维度小于两个源几何图形的最大维度,且相交集位于两个源几何图形的内部,则ST_Crosses(geometry A, geometry B)将返回TRUE。
2.4 部分重叠
ST_Overlaps(geometry A, geometry B)比较两个相同维度的几何图形,如果它们的结果集与两个源几何图形都不同但具有相同维度,则返回TRUE。
2.5 完全包含
ST_Within()和ST_Contains()测试一个几何图形是否完全位于另一个几何图形内。
如果第一个几何图形完全位于第二个几何图形内,则ST_Within(geometry A, geometry B)返回TRUE,ST_Within()测试的结果与ST_Contains()完全相反。
如果第二个几何图形完全包含在第一个几何图形内,则ST_Contains(geometry A, geometry B)返回TRUE。
三 判断距离
3.1 最短距离
ST_Distance(geometry A, geometry B)计算两个几何图形之间的最短距离,并将其作为浮点数返回。
SELECT ST_Distance(
ST_GeometryFromText('POINT(0 5)'),
ST_GeometryFromText('LINESTRING(-2 2, 2 2)'));
计算得出点到线的距离为3
3.2 某一内范围的几何图形
ST_DWithin(geometry A, geometry B, radius),如果几何图形彼此在指定的距离(半径)内,则返回true。
再次使用我们的宽街地铁站(Broad Street subway station),我们可以找到地铁站附近(10米内)的街道:
SELECT name
FROM nyc_streets
WHERE ST_DWithin(
geom,
ST_GeomFromText('POINT(583571 4506714)',26918),
10
);
在nyc_streets中找出了距离Broad St为10的3个街道