postgis不仅可以用来存储空间数据,更常用的是用来比较几何图形之间的关系。例如我们想要通过手机查看离自己最近的共享单车的为止,就是通过比较停车位置、街道之间的几何关系来实现。
ST_Equals
ST_Equals(geometry A, geometry B)用于测试两个图形的空间相等性。
如果两个相同类型的几何图形具有相同的x、y坐标值,即如果第二个图形与第一个图形的坐标信息相等(相同),则ST_Equals()返回TRUE。
postgis=# select name from t1 where st_equals(geom,st_geomfromtext('point(1 1)'));
name
--------
point3
(1 row)
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 ST_Intersects更好,因为可以使用索引。
postgis=# select name from t_gis where st_equals(geom,'0101000020E610000000000000000000000000000000000000');
name
-------
Point
(1 row)
ST_Touches
ST_Touches()测试两个几何图形是否在它们的边界上接触,但在它们的内部不相交。
postgis=# select st_touches(st_geomfromtext('POLYGON((0 0, 1 0, 1 1, 0 1,0 0))'),st_geomfromtext('POLYGON((1 0, 2 0, 2 1, 1 1,1 0))'));
st_touches
------------
t
(1 row)
ST_Within和ST_Contains
ST_Within()和ST_Contains()测试一个几何图形是否完全位于另一个几何图形内。
postgis=# select st_within(st_geomfromtext('POLYGON((0 0, 1 0, 1 1, 0 1,0 0))'),st_geomfromtext('POLYGON((0 0,2 0,2 2,0 2,0 0))'));
st_within
-----------
t
(1 row)
ST_Distance和ST_DWithin
ST_Distance(geometry A, geometry B)计算两个几何图形之间的最短距离,并将其作为浮点数返回。可以用来查询某个物体周围具体xxx范围内的物体。例如:
–创建表t1:
postgis=# select name,st_astext(geom) from t1;
name | st_astext
--------+------------
point1 | POINT(0 0)
point2 | POINT(1 0)
point3 | POINT(1 1)
point4 | POINT(2 0)
point5 | POINT(2 2)
point6 | POINT(2 1)
(6 rows)
–查询点(1 ,1)具体1之内的点
postgis=# select name from t1 where st_dwithin(geom,st_geomfromtext('point(1 1)'),1);
name
--------
point2
point3
point6
(3 rows)