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)